[스프링 부트] 30. 게시판 v5 로그인 기능 구현

lhs's avatar
Dec 01, 2024
[스프링 부트] 30. 게시판 v5 로그인 기능 구현
 

1. User

@AllArgsConstructor @NoArgsConstructor @Table(name = "user_tb") @Getter @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(unique = true, nullable = false) private String username; @Column(nullable = false) private String password; @Column(nullable = false) private String email; @CreationTimestamp private Timestamp createdAt; }
  • @Column
    • 필드를 데이터베이스의 컬럼에 매핑한다.
    • unique: 컬럼 값의 중복 여부를 설정하며, 고유 인덱스가 생성된다.
    • nullable: 컬럼이 null 값을 허용할지 여부를 설정한다.
  • @CreationTimestamp
    • 엔티티가 생성될 때, 해당 필드에 자동으로 현재 시간이 할당된다.

2. UserRepository

@RequiredArgsConstructor @Repository public class UserRepository { private final EntityManager em; public User findByUsername(String username) { Query q = em.createQuery("select u from User u where u.username = :username", User.class); q.setParameter("username", username); try { return (User) q.getSingleResult(); } catch (RuntimeException e) { throw new RuntimeException("아이디 혹은 패스워드가 일치하지 않습니다."); } } }
  • 쿼리문을 작성하여 username으로 User 엔티티를 조회한다.
  • getSingleResult 메서드를 호출할 때, 결과를 없거나 여러 건일 경우 예외가 발생한다.
  • 그러므로 try-catch를 사용해 예외가 발생할 경우 사용자 정의 예외를 발생시킨다.
  • 예외 처리를 리포지토리에서 수행하면 비즈니스 로직과의 경계가 모호해질 수 있으므로, 서비스 계층에서 처리하는 방식을 권장한다.

3. UserService

@RequiredArgsConstructor @Service public class UserService { private final UserRepository userRepository; public User 로그인(UserRequest.LoginDTO loginDTO) { User userPS = userRepository.findByUsername(loginDTO.getUsername()); if (!userPS.getPassword().equals(loginDTO.getPassword())) { throw new RuntimeException("아이디 혹은 패스워드가 일치하지 않습니다."); } return userPS; } }
  • userRepositoryfindByUsername 메서드를 호출하여 User 객체를 반환받는다.
  • 반환된 객체는 영속성 컨텍스트에서 관리되는 객체이므로, 클래스 이름 뒤에 "PS"를 붙이는 컨벤션을 사용하였다.
  • userPSloginDTOpassword를 비교하여 일치하지 않을 경우 사용자 정의 예외를 발생시킨다.

4. UserController

@RequiredArgsConstructor @Controller public class UserController { private final UserService userService; private final HttpSession session; @PostMapping("/login") public String login(UserRequest.LoginDTO loginDTO) { User sessionUser = userService.로그인(loginDTO); session.setAttribute("sessionUser", sessionUser); return "redirect:/"; } @ResponseBody @GetMapping("/test/auth") public String testAuth() { User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { return "인증안됨"; } return "인증됨 : " + sessionUser.getUsername(); } }
  • private final HttpSession session;
    • IOC에 있는 세션을 주입받는다.
  • login 메서드
    • 클라이언트로부터 x-www-form-urlencoded 타입으로 loginDTO를 받는다.
    • userService에서 처리된 후 반환된 User 객체를 세션에 저장한다.
  • testAuth 메서드
    • 로그인이 정상적으로 되었는지 확인하기 위해 만들어졌다.
    • 클라이언트가 세션에서 sessionUser를 가져온다.
    • sessionUsernull일 경우 "인증 안됨"을 반환하고, 그렇지 않으면 "인증됨 : 유저명"을 반환한다.
Share article

LHS's Study Space