블로그 만들기 6. 로그인 구현 : 가방에 담긴 정보를 DB에 담기

Feb 05, 2024
블로그 만들기 6. 로그인 구현 : 가방에 담긴 정보를 DB에 담기

1. 컨트롤러의 역할

  • 요청 받기 (URL(LOCATION) - URI(IDENTIFY) 포함)
  • 데이터(body)는 DTO로 받음
  • 기본 mime 전략 - 데이터 타입 x.www.form.urlencoded (키=값&키=값)
  • 유효성 검사하기(body 데이터가 있으면)
  • 클라이언트가 View만 원하는지? →View만 응답하면 끝
혹은 DB 처리 후 view도 원하는지? → 모델에게 위임(DAO:서비스)한 후 View를 응답하면 끝
 

2.유효성 검사하기

  • 유효성 검사를 하지 않으면 사용자가 조건에 맞지 않는 데이터를 DB에 INSERT 할 수 있음
  • 백엔드에서는 무조건 유효성 검사가 필요함!
  • GET(SELECT) 요청시) DB에 변경을 주지 않고 단순 조회만 하기 때문에 유효성 검사를 안해도 됨
  • 400.mustache 안해도 되는 이유 : ViewResolve 설정(앞 뒤 경로)이 되어 있음
notion image
 

3. UserRpository 만들어 DB에 작업하기

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 // IoC에 new하는 방법 public class UserRepository { // DB에 접근할 수 있는 매니저 객체 // 스프링이 만들어서 IoC에 넣어둔다. // DI에서 꺼내 쓰기만 하면된다. private EntityManager em; // 생성자 주입 (DI 코드) public UserRepository(EntityManager em) { this.em = em; } @Transactional // db에 write 할때는 필수 public void save(UserRequest.JoinDTO requestDTO){ Query query = em.createNativeQuery("insert into user_tb(username, password, email, created_at) values(?,?,?, now())"); query.setParameter(1, requestDTO.getUsername()); query.setParameter(2, requestDTO.getPassword()); query.setParameter(3, requestDTO.getEmail()); query.executeUpdate(); } }
 

5. 유효성 검사하기

  • 아이디가 3자 이하이면 오류 400 반환하기
  • error 400 페이지 간단히 구현하기
무조건 templates폴더 안에 있어야지 안 그러면 인식을 못함!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>클라이언트가 요청을 잘못함 400</h1> </body> </html>
package shop.mtcoding.blog.user; import org.springframework.context.annotation.ComponentScan; 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 public UserController(UserRepository userRepository) { //IOC 컨테이너에서 써치해서 찾아서 넣어줌 this.userRepository = userRepository; } // 생성자를 만들어서 디폴트 생성자를 없애버림 @PostMapping("/join") public String join(UserRequest.JoinDTO requestDTO) { System.out.println(requestDTO); // 1. 유효성 검사 if (requestDTO.getUsername().length() < 3) { return "error/400"; } userRepository.save(requestDTO); // 모델에 위임하기 return "redirect:/loginForm"; //리다이렉션불러놓은게 있어서 다시부른거 } @GetMapping("/joinForm") // view만 원함 public String joinForm() { return "user/joinForm"; } @GetMapping("/loginForm") // view만 원함 public String loginForm() { return "user/loginForm"; } @GetMapping("/user/updateForm") public String updateForm() { return "user/updateForm"; } @GetMapping("/logout") public String logout() { return "redirect:/"; } }
notion image
notion image
Share article

vosw1