๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring๐Ÿ€/๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ

[JPA] ๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ - user (DTO)

by @ENFJ 2023. 2. 11.
์ •ํ™•ํ•˜์ง€ ์•Š๋Š” ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—”ํ‹ฐํ‹ฐ๋ฅผ ๋‹ค ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ๊ทธ ๋‹ค์Œ์€ 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์— ๊ฒŒ์† ์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค.

 

UserSignUpDTO ์ฝ”๋“œ

UserEntity ์ฝ”๋“œ๐Ÿ‘‡

UserEntity ์ฝ”๋“œ

 

์ด๊ฒŒ ๋ฐฉ๊ธˆ ๋งํ–ˆ๋˜ ๊ทธ ๋‚ด์šฉ์ด๋‹ค.