inblog logo
|
LHS's Study Space
    스프링부트

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

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

    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; } }
    • userRepository의 findByUsername 메서드를 호출하여 User 객체를 반환받는다.
    • 반환된 객체는 영속성 컨텍스트에서 관리되는 객체이므로, 클래스 이름 뒤에 "PS"를 붙이는 컨벤션을 사용하였다.
    • userPS와 loginDTO의 password를 비교하여 일치하지 않을 경우 사용자 정의 예외를 발생시킨다.

    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를 가져온다.
      • sessionUser가 null일 경우 "인증 안됨"을 반환하고, 그렇지 않으면 "인증됨 : 유저명"을 반환한다.
    Share article
    Contents
    1. User2. UserRepository3. UserService4. UserController

    LHS's Study Space

    RSS·Powered by Inblog