![[블로그 만들기] 7. 로그인 구현 : 회원가입 때 입력한 정보 가져오기](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255B%25EB%25B8%2594%25EB%25A1%259C%25EA%25B7%25B8%2520%25EB%25A7%258C%25EB%2593%25A4%25EA%25B8%25B0%255D%25207.%2520%25EB%25A1%259C%25EA%25B7%25B8%25EC%259D%25B8%2520%25EA%25B5%25AC%25ED%2598%2584%2520%253A%2520%25ED%259A%258C%25EC%259B%2590%25EA%25B0%2580%25EC%259E%2585%2520%25EB%2595%258C%2520%25EC%259E%2585%25EB%25A0%25A5%25ED%2595%259C%2520%25EC%25A0%2595%25EB%25B3%25B4%2520%25EA%25B0%2580%25EC%25A0%25B8%25EC%2598%25A4%25EA%25B8%25B0%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3DCoding_study&w=2048&q=75)
- username와 password 정보 가져오기
- findByUsernameAndPassword() 구현하기
- User 테이블은 Entity 타입이라 User.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; } }
2. LoginDTO 만들기
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. login() 만들기
- @PostMapping을 사용하는 이유
조회문은 원래 get요청이나 민감한 정보는 쿼리 스트링에 담아보낼 수 없음
→ 예외! post 요청하기!
민감한 정보는 BODY 데이터로 보냄
- findByUsernameAndPassword() 호출해서 유효성 검사하기
조회 값이 없음 = 인증되지 않음 : error 401
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>인증에 실패하였습니다. 401</h1> </body> </html>
- 조회가 되면 private final HttpSession session; 이 필요함 → 생성자 필요
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); // 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에 조회할때 필요하니까 데이터를 받음 // 인증 검사 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:/"; } }
4. 로그인 완료

Share article