1. 패키지 구조 변경
- user, board 패키지를 만들어 해당 컨트롤러들 옮기기
2. joinForm.mustache 화면 확인하기
- 클라이언트로부터 받아야 할 정보 : username, password, email
- /join으로 post 요청하기
- input태그에서 name속성은 사용자가 입력한 데이터를 서버로 보낼 때, 그 데이터의 이름을 정의
→ 서버 측에서 해당 데이터를 식별하는데 사용
- button의 submit 타입
버튼을 클릭하면 폼(form)이 자동으로 제출
폼에 입력된 데이터가 서버로 전송되고, 서버는 이 데이터를 처리할 수 있게 되는 것을 의미
3. User에 User_tb 만들기
- id : pk키, 자동 생성 설정
- @ENTITY : JPA에서 엔티티 클래스를 정의할 때 사용되는 어노테이션
해당 클래스가 데이터베이스의 테이블과 매핑되는 엔티티 클래스임을 나타냄
- @TABLE(name =’?’)
JPA에서 엔티티 클래스가 매핑될 데이터베이스 테이블을 지정하는 어노테이션
테이블의 이름을 명시
package shop.mtcoding.blog.user; import jakarta.persistence.*; import lombok.Data; @Data // getter, setter, toString @Entity // DB의 테이블과 매핑되는 클래스임을 알려줌 @Table(name = "user_tb") public class User { // user_tb @Id // PK키 설정 @GeneratedValue(strategy = GenerationType.IDENTITY) // 자동 생성 설정 private int id; // user_id private String username; // user 아이디 private String password; // 비밀번호 private String email; // 이메일 }
4. DTO(Data Transfer Object)
- 데이터 전송을 위한 객체
클라이언트로부터 받는 데이터를 받는 통신 데이터
주로 여러 계층 간에 데이터를 전송할 때 사용
- 데이터를 캡슐화하고 전송할 때 필요한 필드들을 담고 있는 일종의 가방
통신으로 전송되는 것을 항아리에 담아서 관리하는 것
- 응답은 다 파일로 할 것이기에 DTO를 만들지 않음
5. UserRequest로 JoinDTO 만들기
- 요청 관련 정보들 한번에 관리 가능
- @Data하는 이유
DTO 클래스는 주로 데이터를 전송하거나 저장하기 위한 용도로 사용
→ 필드들의 Getter와 Setter가 필요
- id : 클라이언트로부터 받을 정보가 아님
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; } }
6. 컨트롤러의 역할
1) 요청 받기 (URL(LOCATION) - URI(IDENTIFY) 포함)
2) 데이터(바디)는 DTO로 받음 - 데이터 타입 x.www.form.urlencoded
3) 기본 mime 전략
4) 유효성 검사하기(body 데이터가 있으면)
5) 클라이언트가 View만 원하는지? 혹은 DB처리 후 view도 원하는지?
6) View만 원하면 View만 응답하면 끝
7) DB처리를 원하면 모델에게 위임(DAO:서비스)한 후 View를 응답하면 끝
7. UserController에 join 주소 만들기
- UserRequest에 있는 JoinDTO를 requestDTO로 정보 받아오기
package shop.mtcoding.blog.user; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; /*컨트롤러 1. 요청받기 (URL(LOCATION) - URI(IDENTIFY) 포함) 2. 데이터(바디)는 DTO로 받음 - 데이터타입 x.www.form.urlencoded 3. 기본 mime 전략 4. 유효성 검사하기(body 데이터가 있으면) 4. 클라이언트가 View만 원하는지? 혹은 DB처리후 view도 원하는지? 5. View만 원하면 View만 응답하면 끝 7. DB처리를 원하면 모델에게 위임(DAO:서비스)한 후 View를 응답하면 끝 * */ @Controller public class UserController { @PostMapping("/join") public String join(UserRequest.JoinDTO requestDTO){ System.out.println(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:/"; } }
버퍼로 받아야 되는 데이터는 버퍼로 받아야 함
4. Model-View-Controller (MVC) 아키텍처 패턴
- 각 레이어(구성 요소) 역할을 분리하여 유지 보수와 확장이 용이하도록 구조화
- 컨트롤러 : 사용자의 요청을 받아서 처리
- 모델 : 비즈니스 로직(자바 코드)을 담당
- 뷰 : 사용자에게 결과를 보여주는 역할을 담당
- URI 또는 URL로 요청을 받음
- 클라이언트(브라우저 등)가 서버에 HTTP 요청을 보냄.
- 요청은 특정 URI 또는 URL에 매핑되어 있는 컨트롤러로 전달됨.
- 데이터는 DTO로 받음
- 컨트롤러는 HTTP 요청에서 필요한 데이터를 추출하거나 DTO(데이터 전송 객체) 형태로 받음.
- DTO는 클라이언트가 전송한 데이터를 캡슐화하고, 해당 데이터를 처리하는 데 사용됨.
- 다른 레이어(모델)에 위임해서 처리
- 컨트롤러는 비즈니스 로직을 처리하는 모델 레이어에 요청을 위임함.
- 비즈니스 로직은 데이터의 처리, 검증, 저장 등을 수행하며 필요에 따라 데이터베이스와 상호 작용할 수 있음.
- 처리 결과를 뷰를 통해 반환 또는 바로 뷰를 반환
- 모델에서 처리된 결과는 다시 컨트롤러로 반환됨.
- 컨트롤러는 이 결과를 뷰에 전달하여 사용자에게 보여줄 화면을 생성함.
- 뷰는 주로 HTML 페이지 또는 JSON과 같은 형식으로 클라이언트에게 응답을 생성함.
- 생성된 응답은 클라이언트에게 전송되어 화면이나 데이터가 표시됨.
⇒ 컨트롤러 : 요청을 받고 응답(요청 URL 응답 HTML OR JSON)
6. UserController에서 유효성 검사하기
- username의 길이는 3자 이상
package shop.mtcoding.blog.user; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @Controller public class UserController { @PostMapping("/join") public String join(UserRequest.JoinDTO requestDTO){ System.out.println(requestDTO); // 1. 유효성 검사 if(requestDTO.getUsername().length() < 3) { return "error/400"; } //2. 모델에게 위임하기 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:/"; } }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>클라이언트가 요청을 잘못하였습니다. 400</h1> </body> </html>
오류 코드
100 → 기다려
200 → 굳
300 → 딴 거 줄게
400 → 너(클라이언트) 잘못했어 // 보통 유효성 검사 실패
500 → 내가(서버) 잘못했어
Share article