์ ํํ์ง ์๋ ๋ด์ฉ์ด ํฌํจ๋์ด ์์ ์ ์์ต๋๋ค.
์ํฐํฐ๋ฅผ ๋ค ๋ง๋ค๊ณ ๋์ ๊ทธ ๋ค์์ DTO ๋ฅผ ๋ง๋ค์๋ค.
๊ทธ ์ด์ ๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ๋ค.
ํด๋ผ์ด์ธํธ! ์ฆ ๋ธ๋ผ์ฐ์ ์ ์ฌ์ฉ์๋ฅผ ๋งํ๋ค.
๊ทธ๋ ๋ค๋ฉด ํด๋ผ์ด์ธํธ ๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ด๋ ์ฌ์ดํธ๋ฅผ ์ ์ํ๋ค๊ณ ์๊ฐํด๋ณด์.
๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ์ ๊ทธ ํด๋ฆญํ๋ฉด(์์ฒญ) ์๋ ์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ DB์ ์๋ ๊ฐ์ ๋ถ๋ฌ์์(์๋ต)
ํ๋ฉด์ ๋ฟ๋ ค์ฃผ๊ฒ(๋ณด์ฌ์ง๊ฒ) ๋๋ค.
๊ฐ๋ฐ์ controller ์์ผ๋ก ํ๋ db ์์ผ๋ก ํ๋ ์๊ด์ด ์์ง๋ง,
DB์์ ---> controller ๋ก ๊ฐ๋ฐํ๋๊ฒ ๊ฐ์ธ์ ์ผ๋ก ํธํ๊ฒ ๊ฐ๋ค.
ํ์ฌ Entity ! ์ฆ DB ๋ ์ง๋ ๊ธ์์ ๋ง๋ค์ด ๋ณด์๊ณ , ์ด์ DTO ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ๋ค.
(์ฐธ๊ณ ๋ก ์์ ์ฌ์ง๊ณผ ์๋ ์ฌ์ง์ด ์กฐ๊ธ ํ๋ฆฐ๋ฐ ์ด๊ฑด ๊ตฌ๊ธ ๊ฒ์์ฐฝ์ 'MVC ๋ชจ๋ธ' ๊ด๋ จํด์ ์ฐพ์๋ณด๋ฉด ๋๋ค.)
์ง๋ ์๊ฐ user entity๋ฅผ ๋ง๋ค์์ผ๋
DTO๋ฅผ ๋ง๋ค์ด ๋ณผ๊ฑด๋ฐ ๊ทธ๋ผ ๋๋์ฒด DTO๊ฐ ๋ญ์ง ๋ถํฐ ๊ฐ๋จํ๊ฒ ์์์ผ ๋์ง ์์๊น?
DTO ๋ ? (Data Transfer Object)
๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ก, DTO๋ ๋ก์ง์ ๊ฐ์ง์ง ์๋ ์์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด(Getter ์ Setter ๋ง๊ฐ์ง ํด๋์ค) ์ด๋ค.
??? ๊ณ์ธต๊ฐ..? ์ฌ๊ธฐ์ ๊ณ์ธต์
controller ๊ณ์ธต , service ๊ณ์ธต, repository ๊ณ์ธต... ์ ๋งํ๋ค.
์ํ! ๊ทธ๋์ ์์ ์ฌ์ง์ด ๊ฐ ๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ํ๊ธฐ์ํด ์ฌ์ฉํ๋ ๊ฐ์ฒด๋๊น ๊ฐ๊ฐ ์ฌ์ด์ DTO๊ฐ ์๊ตฌ๋~ ๋ผ๊ณ
์ดํด ํ ์ ์๋ค.
+ ์ ์ ๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ db์ ๋ฃ๋ ๊ณผ์
-> ์ ์ ๊ฐ ์์ ์ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ์ฌ form ์ ์๋ ๋ฐ์ดํฐ๋ฅผ DTO์ ๋ฃ์ด์ ์ ์กํ๋ค.
ํด๋น DTO๋ฅผ ๋ฐ์ ์๋ฒ๊ฐ entity๋ฅผ ์ด์ฉํ์ฌ DB์ ์ง์ด ๋ฃ๋๋ค.
๊ทธ๋ฌ๋๊น DTO๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ ๊ณ์ธต๊ฐ ์ฃผ๊ณ ๋ฐ์๋ ์ง๊ฒ๋ค๋ฆฌ? ์ ๊ฐ์ ์ญํ ์ ํด์ฃผ๋ ๋ ์์ด๊ตฌ๋!๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์ด์ DTO ํจํค์ง ์์ ํด๋์ค๋ค์ ๋ง๋ค์ด๋ณด์.
๋ค์๊ณผ ๊ฐ์ด DTO๋ฅผ ์์ฑํ์๋ค.
LoginRequestDTO: ๋ก๊ทธ์ธ ์์ฒญ ๋ถ๋ถ์ ๋ด๋นํ๋ DTO
LoginResponseDTO: ๋ก๊ทธ์ธ ์๋ต ๋ถ๋ถ์ ๋ด๋นํ๋ DTO
UserSignUpDTO : ํ์๊ฐ์ ์์ฒญ ๋ด๋นํ๋ DTO
UserSignUpResponseDTO: ํ์๊ฐ์ ์๋ต ๋ด๋นํ๋ DTO
๋ณด๋ค ์ํผ ํฌ๊ฒ ์์ฒญ(Request) / ์๋ต(Response) ์ผ๋ก ๋๋์๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ํ์๊ฐ์ ์์ฒญ์ ๋ด๋นํ๋ DTO ์ธ UserSignUpDTO ๋ถํฐ ๋ง๋ค์ด๋ณด์.
๋๋ ์ผ๋ง์ ๊น์ง DTO์ ๋ํด ์ ์์ง ๋ชปํ๋๋ฐ ๋ด๊ฐ ์ง๊ธ ์๋ ์์ค์์ ์ค๋ช ํ์๋ฉด,,
DTO๋ฅผ ๋ง๋ค๋๋ ์ฐ์ ์ด๋ค ๊ฐ์ด ๋ค์ด๊ฐ๋์ง๋ง ์๊ฐํ๋ฉด ๋๋ค.
์ ์ด๊ฒ ๋ฌด์จ๋ง์ด๋๋ฉด,, ์ํฐํฐ(entity)๋ ์ด ์ฌ์ดํธ์์ ์ฌ์ฉ๋๋ ์ ์ฒด ๋ฐ์ดํฐ ๊ฐ๋ค์ ์๊ฐํด์ผ๋๋ค๋ฉด,
DTO๋ ์ํฐํฐ์ ์๋ ๊ฐ๋ค ์ค์์ ์ง๊ธ ๋์ ์ญํ ์ธ DTO ๊ฐ๋ง ์ฌ์ฉํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
UserSignUpDTO ์ ์ฒด ์ฝ๋
package com.example.projectpicker.user.dto;
import com.example.projectpicker.user.entity.UserEntity;
import lombok.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
@Setter @Getter @ToString
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "email") // email ๋ง ๋น๊ตํด๋ผ. ๊ตณ์ด ๋น๋ฒ,์ด๋ฆ๊น์ง ๋น๊ตํ ํ์x
@Builder
// ํ์๊ฐ์
์ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๊ฐ์ฒด ( ํด๋ผ์ด์ธํธ ----> DB )
public class UserSignUpDTO {
@NotBlank // null ๊ณผ ""(empty), " "(blank) ๋ชจ๋ ํ์ฉํ์ง ์์.
@Email
private String email; // ํ์ ์ด๋ฉ์ผ
@NotBlank
@Size(min = 8, max = 20) // 8~20์ ์ฌ์ผ ํ๋ค.
private String password; // ํ์ ๋น๋ฐ๋ฒํธ
@NotBlank
@Size(min = 2, max = 5) // 2~5์ ์ฌ์ผ ํ๋ค.
private String userName; // ํ์ ์ด๋ฆ
// ์ํฐํฐ๋ก ๋ณ๊ฒฝํ๋ ๋ฉ์๋
public UserEntity toEntity(){
return UserEntity.builder()
.userEmail(this.email) //ํด๋ผ์ด์ธํธ๋ก ๋ถํฐ ๋ฐ์ email ์ ๋ณด๋ฅผ UserEntity๊ฐ ๋ณ๊ฒฝ
.userPassword(this.password)
.userName(this.userName)
.build();
}
}
๊ฐ๋ฐ์๋ ์ญ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ดํดํ๋๊ฒ ๋ ๋น ๋ฅผ๊ฒ ๊ฐ์์ ์ฝ๋๋ก ๋ฐ๋ก ๋ค์ด๊ฐ๋ณด๊ฒ ๋ค.
@์ด๋ ธํ ์ด์ ์ ์ผ๋จ ๋ค ๋ฌด์ํ๊ณ ๋ณด๋ฉด,
private String email; // ํ์ ์ด๋ฉ์ผ
private String password; // ํ์ ๋น๋ฐ๋ฒํธ
private String userName; // ํ์ ์ด๋ฆ
์ด๋ ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค. ๊ทธ๋ฌ๋๊น ํ์๊ฐ์ ์์ฒญํ ๋ ํ์ํ ๋ฐ์ดํฐ๊ฐ ๋ญ์ง๋ฅผ ์๊ฐํด๋ณด๋ฉด
๋ ํ์์ ์ด๋ฉ์ผ , ํ์ ๋น๋ฐ๋ฒํธ, ํ์ ์ด๋ฆ ๋ง ์๋ค๋ฉด ํ์๊ฐ์ ์ ํ ์ ์๋ ํ์ด์ง๋ฅผ ๋ง๋ค๊ฑฐ์ผ! ์ด๋ค.
๋ญ ์ถ๊ฐ์ ์ผ๋ก ์๋ ์์ผ์ ๋ฃ๊ณ ์ถ์ด ํ๋ฉด ์ฌ๊ธฐ์ ๋ฃ์ผ๋ฉด ๋๋ค!.
๋จ, ์ด์ ์๊ฐ์ entity ์๋ ์๋ ์์ผ์ ๋ํ ์ฝ๋๋ฅผ ๋ฃ์ด์ผ ํ๋ค.
// ์ํฐํฐ๋ก ๋ณ๊ฒฝํ๋ ๋ฉ์๋ ๋ถ๋ถ ์ฝ๋์ ๋ํด ์ค๋ช ํ์๋ฉด,, ๋ค์ ์ด ์ฌ์ง์ ๋ด์ผ๋๋ค.
์ฐ๋ฆฌ๋ ํ์ฌ DTO ๋ฅผ ๋ง๋ค๊ณ ์๋ค. (DTO ์ค์์๋ ํ์๊ฐ์ ์ ์์ฒญํ๋ Request ์ฆ,!! Client ์์ DB ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๋ DTO ๋ฅผ ๋ง๋ค๊ณ ์๋ ๊ฒ์ด๋ค.)
๊ทธ๋ ๋ค๋ฉด ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค๊ณ ์๋ ํ์๊ฐ์ ์์ฒญ DTO ๋ DTO --> DB ๋ฐฉํฅ์ด๋๊น
DTO๋ฅผ entity๋ก ๋ณ๊ฒฝํ๋ ๋ฉ์๋๊ฐ ํ์ํ๋ค! ๋๊ฒ์ด๋ค.
๋ง์ฝ DTO๋ฅผ entity ํ ์์ผ์ฃผ๋ ์ฝ๋๊ฐ ์์๋ค๋ฉด ? entity๋ก ๊ฐ ์ ๋ฌ ๋ชปํ๊ณ DTO์ ๊ฒ์ ์์์ ๊ฒ์ด๋ค.
UserEntity ์ฝ๋๐
์ด๊ฒ ๋ฐฉ๊ธ ๋งํ๋ ๊ทธ ๋ด์ฉ์ด๋ค.