๐Ÿ˜ผ DTO(: Data Transfer Object)

public class AccountResponseDto {
    private final Long id;
    private final String username;
    private final String nickname;
}

DTO๋Š” ๊ณ„์ธต๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค์ด๋‹ค. ๋”ฐ๋ผ์„œ DTO์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€ํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณดํ†ต์˜ DTO ํด๋ž˜์Šค ํ•„๋“œ๋Š” final ์†์„ฑ์„ ๊ฐ–๊ฑฐ๋‚˜ setter๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋˜ํ•œ DTO ํด๋ž˜์Šค๋Š” ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋งŒ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

 

๐Ÿ˜ผ ๋ ˆ์ฝ”๋“œ(record)๋ž€?

public record AccountResponseDto(
    Long id,
    String username,
    String nickname
) { }

Record๋Š” ๋ฐ์ดํ„ฐ๋งŒ์„ ํฌํ•จํ•˜๋Š” ๋ถˆ๋ณ€(immutable)ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” Java 14๋ถ€ํ„ฐ ๋„์ž…๋œ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์ด๋‹ค.

๊ธฐ์กด Java์—์„œ DTO๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์„ฑ์ž, getter, equals(), hashcode(), toString() ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ(์ž๋™ ์ƒ์„ฑ ์ฝ”๋“œ)๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋‚˜, Record๋Š” ์ด๋Ÿฐ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

 

๐Ÿซง ๋ ˆ์ฝ”๋“œ ํŠน์ง•

1. ๋ถˆ๋ณ€์„ฑ

Record๋Š” ๋ชจ๋“  ํ•„๋“œ๋ฅผ final๋กœ ์„ ์–ธํ•ด ํ•œ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๊ทธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ํ•„๋“œ์— ๋”ฐ๋กœ final์„ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ํ•„๋“œ ๊ฐ’ ๋ณ€๊ฒฝ์‹œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. getter ๊ธฐ๋ณธ ์ œ๊ณต

๊ธฐ๋ณธ์ ์œผ๋กœ getter๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, getX()๊ฐ€ ์•„๋‹Œ x()๋กœ ๋„ค์ด๋ฐ ์ฒ˜๋ฆฌ๋œ๋‹ค.

// ๋ ˆ์ฝ”๋“œ
public record SignupRequestDto(String username, String password, String nickname) { }

// ๋ฉ”์ธํ•จ์ˆ˜
public class Main {
	public static void main(String[] args) {
    	SignupRequestDto request = new SignupRequestDto("username@gmail.com", "password1!", "nickname");
        String username = request.username();
    }
}

 

2. ํ‘œ์ค€ ๋ฉ”์„œ๋“œ ์ž๋™ ์ œ๊ณต

equals, hashcode, toString ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ œ๊ณต๋˜๋ฉฐ, ์„œ๋กœ ๋‹ค๋ฅธ record๊ฐ€ ํ•„๋“œ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•œ๋‹ค.

๋‹จ, == ๊ธฐํ˜ธ๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

public void test() {
    SignupRequestDto requestDto1 = new SignupRequestDto("username@gmail.com", "password1!", "nickname");
    SignupRequestDto requestDto2 = new SignupRequestDto("username@gmail.com", "password1!", "nickname");

    System.out.println(requestDto1 == requestDto2); // false
    System.out.println(requestDto1.equals(requestDto2)); // true
    System.out.println(requestDto1.hashCode() == requestDto2.hashCode()); // true
}

 

3. annotation ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Record๋„ Bean Validation์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

public record SignupRequestDto(
    @NotNull @Email String username,
    @NotNull @Pattern(regexp = PASSWORD_REGEXP) String password,
    @NotNull @Pattern(regexp = NICKNAME_REGEXP) String nickname
) { }

 

4. Compact Construct

์ƒ์„ฑ์ž์— ์กฐ๊ฑด์‹์„ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

public record SignupRequestDto(String username, String password, String nickname) {
	public SignupRequestDto {
    	Objects.requireNonNull(username);
        Objects.requireNonNull(password);
        Objects.requireNonNull(nickname);
    }
}

 

3. ์ƒ์† ๋ถˆ๊ฐ€๋Šฅ

Record๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†์œผ๋ฉฐ, ์ƒ์†๋˜๋„๋ก ํ•  ์ˆ˜ ์—†๋‹ค.

 

๐Ÿค” ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์€ ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ?

  • ๋ถˆ๋ณ€์„ฑ ๋ณด์žฅ
    • ์ƒ์†์„ ๊ธˆ์ง€ํ•จ์œผ๋กœ์จ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋ฐฉ์ง€ํ•ด ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๋†’์ธ๋‹ค.
  • ๊ฐ„๊ฒฐ์„ฑ๊ณผ ๋ช…๋ฃŒ์„ฑ
    • ์ƒ์†์„ ๊ธˆ์ง€ํ•˜๋ฉด ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•ด์ง€๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ๋‹ค.
  • ์ถ”์ƒํ™”์˜ ๋ช…ํ™•์„ฑ
    • record๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ํ™€๋”(data holder) ์—ญํ• ์„ ํ•œ๋‹ค. ์ƒ์†์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์—ญํ• ์ด ๋ช…ํ™•ํ•ด์ง€๊ณ , ์ž˜๋ชป๋œ ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ฑ๋Šฅ ํ–ฅ์ƒ
    • ์ƒ์†์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

4. Lombok ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Record์— Lombok ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ @Builder๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์–ด๋…ธํ…Œ์ด์…˜์€ ๋Œ€๋ถ€๋ถ„ Record์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋  ์ผ์ด ์ž˜ ์—†๋‹ค.

(@Setter๊ฐ™์ด ํ•„๋“œ์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ์€ ์ง€์–‘)

// ๋ ˆ์ฝ”๋“œ
@Builder
public record LoginRequestDto(String username, String password) {}

// ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
public class Test {
    public void test() {
        LoginRequestDto dto = LoginRequestDto.builder()
            .username("username@gmail.com")
            .password("password1!")
            .build();
    }
}

 

๐Ÿซง DTO๋ฅผ ๋ ˆ์ฝ”๋“œ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•œ ์ด์œ 

1. ๊ฐ„๊ฒฐ์„ฑ

DTO ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ „์šฉ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ: ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก

 

2.  ๋ช…ํ™•ํ•œ ์˜๋„

Record๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๋ฐ์ดํ„ฐ ์ „์šฉ์ž„์„ ๋ช…ํ™•ํžˆ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

3. ๋ถˆ๋ณ€์„ฑ

Record๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•ด ๋ฒ„๊ทธ ๋ฐœ์ƒ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

 

๐Ÿ†š Class vs Record ์ฝ”๋“œ  ๋น„๊ต

๊ธฐ์กด: class๋กœ Reponse DTO ์ƒ์„ฑ

record์™€ ๋ช…ํ™•ํ•œ ๋น„๊ต๋ฅผ ์œ„ํ•ด ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ X

public class AccountResponseDto {
    private final Long id;
    private final String username;
    private final String nickname;

    @Builder
    public AccountResponseDto(Long id, String username, String nickname) {
        this.id = id;
        this.username = username;
        this.nickname = nickname;
    }
    
    public static AccountResponseDto from(Account account) {
        return AccountResponseDto.builder()
            .id(account.getId())
            .username(account.getUsername())
            .nickname(account.getNickname())
            .build();
    }
    
    public Long getId() {
        return id;
    }
    
    public String getUsername() {
        return username;
    }
    
    public String getNickname() {
		return nickname;
    }
    
    @Override
    public boolean equals(Object o) {
        // ...
    }

    @Override
    public int hashCode() {
        // ...
    }

    @Override
    public String toString() {
        // ...
    }
}

 

 

์ˆ˜์ •: record๋กœ Reponse DTO ์ƒ์„ฑ

์–ด๋…ธํ…Œ์ด์…˜ ์—†์ด getter, equals(), hashCode(), toString() ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค.

public record AccountResponseDto(
    Long id,
    String username,
    String nickname
) {

    public static AccountResponseDto from(Account account) {
        return new AccountResponseDto(account.getId(), account.getUsername(),
            account.getNickname());
    }
}

๊ธฐ์กด: class๋กœ Request DTO ์ƒ์„ฑ

public class SignupRequestDto {

    @NotNull(message = "์ด๋ฉ”์ผ์€ ํ•„์ˆ˜ ์ž…๋ ฅ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.")
    @Email(message = "์œ ํšจํ•˜์ง€ ์•Š์€ ์ด๋ฉ”์ผ ํ˜•์‹์ž…๋‹ˆ๋‹ค.")
    private String username;

    @NotNull(message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ•„์ˆ˜ ์ž…๋ ฅ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.")
    @Pattern(regexp = PASSWORD_REGEXP, message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์˜๋ฌธ, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž ํฌํ•จ 10์ž ์ด์ƒ 25์ž ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
    private String password;

    @NotNull(message = "๋‹‰๋„ค์ž„์€ ํ•„์ˆ˜ ์ž…๋ ฅ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.")
    @Pattern(regexp = NICKNAME_REGEXP, message = "๋‹‰๋„ค์ž„์€ 2์ž ์ด์ƒ 10์ž ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
    private String nickname;
    
    public SignupRequestDto() {}

    @Builder
    public SignupRequestDto(String username, String password, String nickname) {
        this.username = username;
        this.password = password;
        this.nickname = nickname;
    }

    public Account toEntity(PasswordEncoder passwordEncoder) {
        return Account.builder()
            .username(username)
            .password(passwordEncoder.encode(password))
            .nickname(nickname)
            .build();
    }
    
    public String getUsername() {
        return username;
    }
    
    public String getPassword() {
        return password;
    }
    
    public String getNickname() {
        return nickname;
    }
    
    @Override
    public boolean equals(Object o) {
        // ...
    }

    @Override
    public int hashCode() {
        // ...
    }

    @Override
    public String toString() {
        // ...
    }
}

 

์ˆ˜์ •: record๋กœ Request DTO ์ƒ์„ฑ

public record SignupRequestDto(
    @NotNull @Email String username,
    @NotNull @Pattern(regexp = PASSWORD_REGEXP) String password,
    @NotNull @Pattern(regexp = NICKNAME_REGEXP) String nickname
) {

    public Account toEntity(PasswordEncoder passwordEncoder) {
        return Account.builder()
            .username(username)
            .password(passwordEncoder.encode(password))
            .nickname(nickname)
            .build();
    }
}

 

๐Ÿ˜ผ ์ •๋ฆฌ

DTO๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ„์ธต๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‹จ์ˆœํžˆ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๊ฐ’๋งŒ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. DTO์—๋Š” ํŠน์ •ํ•œ ๋กœ์ง์ด ํฌํ•จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ค‘์— ๋ณ€ํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

Recod๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•„๋“œ์— final์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  getter์™€ equals, hashCode, toString ๋ฉ”์„œ๋“œ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํŽธ๋ฆฌํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ด์ค€๋‹ค.

๋”ฐ๋ผ์„œ ์˜จ์ „ํžˆ ๋ฐ์ดํ„ฐ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค๋Š” DTO๋ฅผ Record๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด, DTO๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•  ํŠน์ง•๋“ค์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

JEP 395: Records

JEP 395: Records OwnerGavin BiermanTypeFeatureScopeSEStatusClosedโ€‰/โ€‰DeliveredRelease16Componentspecificationโ€‰/โ€‰languageDiscussionamber dash dev at openjdk dot java dot netRelates toJEP 359: Records (Preview)JEP 384: Records (Second Preview)Reviewed

openjdk.org

 

[TIL] DTO class๋ฅผ record๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

์ธํ„ฐ๋„ท์„ ๊ฒ€์ƒ‰ํ•˜๋˜ ๋„์ค‘, DTO๋ฅผ ์“ฐ๋Š” ์ด์œ ์™€ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ๊ธ€์ด ์žˆ์–ด์„œ ์ฝ์–ด๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.๊ฑฐ๊ธฐ์„œ DTO๋ฅผ class๋กœ ์ƒ์„ฑํ•˜์ง€ ๋ง๊ณ , record๋กœ ๋งŒ๋“ค๋ฉด ์ข‹๋‹ค๋Š” ๋‚ด์šฉ์ด ์žˆ์—ˆ๋‹ค.DTO๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋‹ค

velog.io

 

'Record'๋กœ DTO๋งŒ๋“ค๊ธฐ

java-v16 Record์— ๋Œ€ํ•œ ์ž๋ฐ” ๊ณต์‹๋ฌธ์„œ 'ํด๋ฆญ' ๊ฒฐ๋ก ๋ถ€ํ„ฐ >๋ ˆ์ฝ”๋“œ ์‚ฌ์šฉ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ถˆ๋ณ€์„ฑ์„ ์š”๊ตฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์ ํ•ฉ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ๊ฐ„๊ฒฐํ•จ์„ ์šฐ์„ ์‹œํ•  ๋•Œ ์œ ๋ฆฌ >ํด๋ž˜์Šค ์‚ฌ์šฉ ๋ณต์žกํ•œ ๋กœ์ง

velog.io

 

์™œ Response DTO๋ฅผ Java์˜ Record ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋Š”๊ฐ€? | Street Drop

์•ˆ๋…•ํ•˜์„ธ์š”. ์ŠคํŠธ๋ฆฟ ๋“œ๋ž์—์„œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ๋Š” ์œค ์˜(Yun Young) ์ž…๋‹ˆ๋‹ค.

docs.street-drop.com

 

์ž๋ฐ”์˜ Record๋กœ DTO๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž - 2

1. ๋‹ค์‹œ ๊ธ€์„ ์“ด ์ด์œ  ์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ Record์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ž‘์„ฑํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค Record๋ฅผ ๋ณด๋ ค๊ณ  ์ฐพ์•„์ฃผ์‹œ๋Š” ๋ถ„๋“ค์ด ๋งŽ๋”๋ผ๊ตฌ์š”. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ์ง์ ‘ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•ด์„œ ์ ๊ทน

s7won.tistory.com