로그인 / 로그아웃

coding S's avatar
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