Java Spring Boot(4) 프로젝트

제이 용·2025년 11월 12일

어제 일정에 대한 CRUD가 작성이 완료되었기 때문에 오늘은 유저에 대한 CRUD를 작성을 할 것이다.

기존 일정 CRUD와 패턴을 똑같기 때문에 만드는데는 큰 지장이 없었다.

다만 유저의 필드가 채워지게 되면서 스캐줄에 있는 작성 유저명이 이제 유저 고유의 식별자를 갖게된다 라는 요구사항이 있었다.

이 말은 곧 기존 필드에 String userName 대신 '유저 고유 식별자'가 들어가게 된다는 뜻이다.

이는 연관관계 매핑에 대한 문제와 같으며, 필드에 적용할 줄 아느냐에 대한 물음과 같이 느껴졌다.

@Entity
public class Schedule {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
	private String userName;
    private String title;
    private String content;
}
  • 기존 코드가 위와 같다면,
// 유저와 N:1 관계 설정
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id") // 외래키로 저장될 컬럼명
    private User user;
  • String userName을 지우고 위 코드를 추가하면 된다.

  • 다만 위 필드가 바뀌게 되면 서비스에 사용된 DTO들도 수정을 해줘야될 소요가 있다.

  • 서비에는 기존에 getUserName이었던 코드를 getUser().getUserName()으로 바꿔주면 된다.

  • 또한 User에 대한 값들을 써야하기에 UserRepositroy 또한 필드에 추가를 해주어야한다.


이어서 로그인 인증을 시작하였고 작성된 코드는 다음과 같다.

Serivce
//로그인 기능
    @Transactional(readOnly = true)
    public void login(UserLoginRequest request, HttpSession session) {
        User user = userRepository.findByEmail(request.getEmail()).orElseThrow(
                () -> new ResponseStatusException(HttpStatus.UNAUTHORIZED,"비밀번호가 올바르지 않습니다.")
        );
        if(!user.getPassword().equals(request.getPassword())){
            throw new ResponseStatusException(HttpStatus.UNAUTHORIZED,"비밀번호가 올바르지 않습니다.");
        }

        session.setAttribute("userId", user.getId());
        session.setAttribute("userName", user.getUserName());
        session.setAttribute("email", user.getEmail());
    }

    //로그아웃 기능
    @Transactional
    public void logout(HttpSession session) {
        session.invalidate();
    }
  • 서비스에서는 다음과 같이 설정하였다.
Controller
//로그인 기능
    @PostMapping("/users/login")
    public ResponseEntity<Void> login(@RequestBody UserLoginRequest request, HttpSession session) {
        userService.login(request,session);
        return ResponseEntity.status(HttpStatus.OK).build();
    }

    //로그아웃 기능
    @PostMapping("/users/logout")
    public ResponseEntity<Void> logout(HttpSession session) {
        userService.logout(session);
        return ResponseEntity.status(HttpStatus.OK).build();
    }
  • 컨트롤러에서는 다음과 같이 설정하였다. 로그아웃 기능은 솔직히 서비스에 생성할 필요가 없겠다고 느꼈다.
  • 다만 아직 로그인/아웃만 구현을 하였지, 이를 통해 일정에 적용하진 않은 상태라 제대로 이뤄진건지는 아직 모르겠다.

  • 다른 팀원을 보니 @SessionAttribute 어노테이션을 통해 정말 간결하게 만든 것을 보았는데, 내 작업을 통해 한 것보다 훨씬 가독성이 좋아보였고 수정소요도 적은 것처럼 보였다.

  • 열심히 하는 것도 좋지만 중간중간 체크해가면서 좋은 방법이 있으면 그방법을 채택하는 것도 좋아보인다.

  • 내일 방향성이 맞는지 다시 한번 확인해볼 필요가 있을 것 같다.

  • 아직 강의를 보고 따라하는 느낌이 있어서인지 각 코드에 기능들의 감이 아직 잘 오지 않는다. 다시 뜯어서 한줄한줄 어떤 역할을 하는지 해석해보아야겠다.


내일은 로그인/로그아웃 기능을 활용해 일정 생성에 권한을 제한 시키는 작업을 진행할 것이고, 일부 불필요한 코드들을 없애는 작업, 위 전체를 통으로 예외 처리하는 것 까지 도전해보려고 한다.

0개의 댓글