어제 일정에 대한 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 어노테이션을 통해 정말 간결하게 만든 것을 보았는데, 내 작업을 통해 한 것보다 훨씬 가독성이 좋아보였고 수정소요도 적은 것처럼 보였다.
열심히 하는 것도 좋지만 중간중간 체크해가면서 좋은 방법이 있으면 그방법을 채택하는 것도 좋아보인다.
내일 방향성이 맞는지 다시 한번 확인해볼 필요가 있을 것 같다.
아직 강의를 보고 따라하는 느낌이 있어서인지 각 코드에 기능들의 감이 아직 잘 오지 않는다. 다시 뜯어서 한줄한줄 어떤 역할을 하는지 해석해보아야겠다.
내일은 로그인/로그아웃 기능을 활용해 일정 생성에 권한을 제한 시키는 작업을 진행할 것이고, 일부 불필요한 코드들을 없애는 작업, 위 전체를 통으로 예외 처리하는 것 까지 도전해보려고 한다.