inblog logo
|
codingb
    Spring

    로그인 / 로그아웃

    coding S's avatar
    coding S
    Mar 14, 2024
    로그인 / 로그아웃

    로그인 쿼리 만들기 - UserRepository / why final?

    @RequiredArgsConstructor @Repository // new BoardRepository -> IoC 컨테이너에 등록 시킴 public class UserRepository { private final EntityManager em; //비밀번호 해쉬 때문에 username밖에 못써서 password는 x public User findByUsername(String username) { Query query = em.createQuery("select u from User u where u.username = :username", User.class); query.setParameter("username", username); return (User) query.getSingleResult(); } }
    💡
    근데 password 해쉬 안하기로 함! 이건 취소 !

    [ why final? ]

    notion image
    notion image
     
     

    로그인 쿼리 만들기 - UserRepository

    @RequiredArgsConstructor @Repository public class UserRepository { private final EntityManager em; //비밀번호 해쉬 때문에 username밖에 못써서 password는 x public User findByUsernameAndPassword(UserRequest.LoginDTO requestDTO) { Query query = em.createQuery("select u from User u where u.username = :username and u.password = :password", User.class); query.setParameter("username", requestDTO.getUsername()); query.setParameter("password", requestDTO.getPassword()); return (User) query.getSingleResult(); } }
     

    테스트 하기!

    notion image
    @Import(UserRepository.class) //IoC 등록 코드 @DataJpaTest //Datasource/(connection pool), EntityManager public class UserRepositoryTest { @Autowired //애를 걸면 userRepository를 DI 걸 수 있다. 테스트라 new가 안 된다는 듯 private UserRepository userRepository; @Test public void findByUsername_test() { //given UserRequest.LoginDTO requestDTO = new UserRequest.LoginDTO(); requestDTO.setUsername("ssar"); requestDTO.setPassword("1234"); //when User user = userRepository.findByUsernameAndPassword(requestDTO); //then Assertions.assertThat(user.getUsername()).isEqualTo("ssar"); } }
    notion image
     

    나중에 서비스에서 할 로직 (?)

    @Test public void findByUsername_test() { //given String username = "ssar"; String password = "1234"; //when User user = userRepository.findByUsername(username); if (user == null) { System.out.println("아이디 혹은 비밀번호가 틀렸습니다"); } else { if (user.getPassword().equals(password)) { System.out.println("로그인 되었습니다"); } else { System.out.println("비밀번호가 틀렸습니다."); } } //then }
    notion image
     

     
    @Test public void findByUsername_test() { //given String username = "ssar"; String password = "12344"; //when User user = userRepository.findByUsername(username); if (user == null) { System.out.println("아이디 혹은 비밀번호가 틀렸습니다"); } else { if (user.getPassword().equals(password)) { System.out.println("로그인 되었습니다"); } else { System.out.println("비밀번호가 틀렸습니다."); } } //then }
    notion image
     

     
    @Test public void findByUsername_test() { //given String username = "ssar1"; String password = "1234"; //when User user = userRepository.findByUsername(username); if (user == null) { System.out.println("아이디 혹은 비밀번호가 틀렸습니다"); } else { if (user.getPassword().equals(password)) { System.out.println("로그인 되었습니다"); } else { System.out.println("비밀번호가 틀렸습니다."); } } //then }
    notion image
     
     

    로그인 DTO 만들기

    public class UserRequest { @Data public static class LoginDTO { private String username; private String password; } }
     

    UserController

    @RequiredArgsConstructor @Controller public class UserController { private final UserRepository userRepository; private final HttpSession session; @PostMapping("/login") public String login(UserRequest.LoginDTO requestDTO) { User sessionUser = userRepository.findByUsernameAndPassword(requestDTO); // if (sessionUser == null) { // return "redirect:/login-form"; // } session.setAttribute("sessionUser", sessionUser); return "redirect:/"; }
    💡
    지금은 그냥 throw 날려서 하자…
     

    header.mustache

    <ul class="navbar-nav"> {{#sessionUser}} <li class="nav-item"> <a class="nav-link" href="/board/save-form">글쓰기</a> </li> <li class="nav-item"> <a class="nav-link" href="/user/update-form">회원정보보기</a> </li> <li class="nav-item"> <a class="nav-link" href="/logout">로그아웃</a> </li> {{/sessionUser}} {{^sessionUser}} <li class="nav-item"> <a class="nav-link" href="/join-form">회원가입</a> </li> <li class="nav-item"> <a class="nav-link" href="/login-form">로그인</a> </li> {{/sessionUser}} </ul>
     

     
    @GetMapping("/logout") public String logout() { session.invalidate(); return "redirect:/"; }
     
    Share article

    codingb

    RSS·Powered by Inblog