로그인 구현 : findByUsernameAndPassword() 만들기

Jan 30, 2024
로그인 구현 : findByUsernameAndPassword() 만들기

1. loginForm.mustache 확인하기

  • 필요한 정보 : username, password
notion image
notion image
 

2. UserRequest에 LoginDTO 만들기

  • 로그인 정보를 담을 가방 만들기
  • id는 자동 생성 - 클라이언트로부터 받을 정보가 아님
  • 로그인 시 email은 필요 없음
package shop.mtcoding.blog.user; import lombok.Data; /** * DTO = Data Transfer Object * DTO 클래스는 주로 데이터를 전송하거나 저장하기 위한 용도로 사용 * 주로 필드들의 Getter와 Setter가 필요 * * @Data Getter, Setter, EqualsAndHashCode, ToString 등의 메서드를 간편하게 생성 */ public class UserRequest { // 요청 DTO(정보를 담을 가방) // 회원가입 정보를 담을 가방 @Data public static class JoinDTO { // id는 자동생성 - 클라이언트로부터 받을 정보가 아님 private String username; private String password; private String email; } // 로그인 정보를 담을 가방 @Data public static class LoginDTO { // id는 자동생성 - 클라이언트로부터 받을 정보가 아님 // 로그인시 email은 필요 없음 private String username; private String password; } }
 

3. UserRepository에 findByUsernameAndPassword() 구현하기

  • DB에 있는 username과 password를 입력받은 값과 비교하기
Query query = em.createNativeQuery("쿼리", 클래스명.class); // 알아서 매핑해줌
package shop.mtcoding.blog.user; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @Repository // 내가 new 하지 않아도 메모리에 띄울 수 있음 public class UserRepository { private EntityManager em; // 컴포지션 public UserRepository(EntityManager em) { // 생성자 this.em = em; } @Transactional // DB에 변경을 초래할 떄 사용 public void save(UserRequest.JoinDTO requestDTO) { // 컨트롤러는 정보를 전달하면서 때리고 위임함 System.out.println("UserRepository에 save메서드 호출됨"); Query query = em.createNativeQuery("insert into user_tb(username, password, email) values (?, ?, ?)"); query.setParameter(1, requestDTO.getUsername()); query.setParameter(2, requestDTO.getPassword()); query.setParameter(3, requestDTO.getEmail()); query.executeUpdate(); } // select문은 @Transactional 안해도 됨 public User findByUsernameAndPassword(UserRequest.LoginDTO requestDTO) { System.out.println("UserRepository에 findByUsernameAndPassword메서드 호출됨"); Query query = em.createNativeQuery("select * from user_tb where username=? and password=?", User.class); // 알아서 매핑해줌 query.setParameter(1, requestDTO.getUsername()); query.setParameter(2, requestDTO.getPassword()); User user = (User) query.getSingleResult(); return user; } }
notion image
 
notion image
notion image
 

5.인증안됨 오류 401 만들기

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>인증에 실패하였습니다. 401</h1> </body> </html>
 

6. UserController에서 유효성검사, 인증검사 하기

package shop.mtcoding.blog.user; import jakarta.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @Controller public class UserController { private UserRepository userRepository; // null 이기에 생성자 만들기 private final HttpSession session; public UserController(UserRepository userRepository, HttpSession session) { //IOC 컨테이너에서 써치해서 찾아서 넣어줌 this.userRepository = userRepository; this.session = session; } // 생성자를 만들어서 디폴트 생성자를 없애버림 @GetMapping("/joinForm") public String joinForm() { return "user/joinForm"; } @PostMapping("/join") public String join(UserRequest.JoinDTO requestDTO) { System.out.println("requestDTO: " + requestDTO); // 1. 유효성 검사 if (requestDTO.getUsername().length() < 3) { return "error/400"; } // 모델에 위임하기 // insert into user_tb(username, password, email) values (?, ?, ?) userRepository.save(requestDTO); return "redirect:/loginForm"; //리다이렉션불러놓은게 있어서 다시부른거 } @GetMapping("/loginForm") public String loginForm() { return "user/loginForm"; } // 원래는 get요청이나 예외 post요청하면 됨 // 민감한 정보는 쿼리 스트링에 담아보낼 수 없음 @PostMapping("/login") public String login(UserRequest.LoginDTO requestDTO) { System.out.println(requestDTO); // 유효성 검사 if (requestDTO.getUsername().length() < 3) { return "error/400"; } // select * from user_tb where username=? and password=? User user = userRepository.findByUsernameAndPassword(requestDTO); // DB에 조회할때 필요하니까 데이터를 받음 System.out.println(requestDTO); // 인증 검사 if (user == null) { // 인증 안됨 return "error/401"; } else { // 인증됨 session.setAttribute("sessionUser", user); return "redirect:/"; } } @GetMapping("/user/updateForm") public String updateForm() { return "user/updateForm"; } @GetMapping("/logout") public String logout() { return "redirect:/"; } }
 

7. DB에 없는 ID, PASSWORD로 접속시 오류가 터짐

notion image
notion image
Share article

vosw1