๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš€ ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค 6๊ธฐ ์ง€์› ๊ธฐ๋ก

[ํ”„๋ฆฌ์ฝ”์Šค] JDK16์—์„œ ์ •์‹์œผ๋กœ ๋‚˜์˜จ "๋ ˆ์ฝ”๋“œ"์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

by dev_writer 2023. 11. 5.

 

์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค 2์ฃผ ์ฐจ ํ”„๋ฆฌ์ฝ”์Šค ๋ฏธ์…˜์„ ํ•˜๋ฉด์„œ JDK17์˜ ํŠน์ง•์„ ์‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ (record)์— ๋Œ€ํ•ด ์ ‘ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

์‚ฌ์šฉํ•˜๋ฉด์„œ ๋Š๋‚€ ์ ์€, ๊ธฐ์กด์— ์ž‘์„ฑํ–ˆ๋˜ DTO๋ฅผ ์‰ฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

(DTO๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ๋ณด์‹œ๋ ค๋ฉด ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)


๊ธฐ์กด์˜ DTO

๋จผ์ €, ๊ธฐ์กด์— ์‚ฌ์šฉํ–ˆ๋˜ DTO ์ฝ”๋“œ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public class CarResponse {

    private final String name;
    private final int position;
    
    private CarResponse(final String name, final int position) {
        this.name = name;
        this.position = position;
    }
    
    public static CarResponse of(final String name, final int position) {
        return new CarResponse(name, position);
    }
    
    public String getName() {
        return name;
    }
    
    public int getPosition() {
        return position;
    }
}

 

  • final ํ•„๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ์ž๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • (์ปค์Šคํ…€์ด์ง€๋งŒ) ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ํ•„๋“œ์— ๋Œ€ํ•œ getter ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ ˆ์ฝ”๋“œ ๋„์ž… ํ›„

public record CarResponse(String name, int position) {

    public static CarResponse of(final String name, final int position) {
        return new CarResponse(name, position);
    }
}

// ํ•„๋“œ ์‚ฌ์šฉ ์˜ˆ์‹œ
// DTO: carResponse.getName()
// ๋ ˆ์ฝ”๋“œ: carResponse.name()
  • ํ•„๋“œ ์ •์˜๋ฅผ ํด๋ž˜์Šค ์ด๋ฆ„ ์˜†์— ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ปค์Šคํ…€ํ•œ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ์ด์™ธ์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํ•„์š” ์—†์–ด์ง‘๋‹ˆ๋‹ค.

์ด๋ ‡๋“ฏ DTO๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์žˆ์–ด ๋ ˆ์ฝ”๋“œ๋Š” ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์žฅ๋‹จ์ ๋“ค์ด ์žˆ๋Š”์ง€, ํŠน์ง•์€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค!


๋ ˆ์ฝ”๋“œ์˜ ์žฅ์  & ํŠน์ง•

1. ์ฝ”๋“œ ์ž‘์„ฑ๋Ÿ‰ ์ถ•์†Œ

๊ฐ€์žฅ ์™€๋‹ฟ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์— DTO๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋˜ ์ฝ”๋“œ ์ž‘์„ฑ๋Ÿ‰์ด ํš๊ธฐ์ ์œผ๋กœ ์ค„์–ด๋“ค์—ˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•จ

๊ธฐ์กด DTO ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ ๋’ค, final ์†์„ฑ์„ ๋ถ™์ด๊ณ  setter๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•ด์•ผ๋งŒ ์ด๊ฒƒ์ด ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ DTO์˜ ๋ชฉ์  (๋ฐ์ดํ„ฐ ์ „๋‹ฌ)์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ๋ ˆ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€์ž„์„ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ํ•˜์ง€ ์•Š์•„๋„ ๋ถˆ๋ณ€ ๊ฐ์ฒด์ž„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡๊ธฐ์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์—๋„ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

3. getter, toString, hashCode, equals ์ง€์›

๊ธฐ๋ณธ์ ์ธ getter, toString, hashCode, equals ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  toString, hashCode, equals๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค.

4. ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ์ง€์›

์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์†Œ ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ตฌํ˜„ ์˜ˆ์‹œ์ด์ง€๋งŒ.. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ๋ด์ฃผ์‹œ๋ฉด ๋  ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค!

5. ์ฝคํŒฉํŠธ ์ƒ์„ฑ์ž (compact constructor) ์ง€์›

์ƒ์„ฑ ์‹œ ํŠน์ • ์กฐ๊ฑด์„ ๊ฑธ๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

public record HelloWorld(String message) {
    public HelloWorld {
        java.util.Objects.requireNonNull(message); // message์— null์ด ๋“ค์–ด๊ฐˆ ์‹œ NPE๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    }
}

 

์ด ์™ธ์—๋„ ์ค‘์ฒฉ ๋ ˆ์ฝ”๋“œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‘๊ฑฐ๋‚˜ (์•”๋ฌต์ ์œผ๋กœ static์ž…๋‹ˆ๋‹ค.), ์ œ๋„ค๋ฆญ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‘˜ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 


๋ ˆ์ฝ”๋“œ์˜ ๋‹จ์  & ์ œ์•ฝ์‚ฌํ•ญ

1. ์ธ์Šคํ„ด์Šค ํ•„๋“œ ์ƒ์„ฑ ๋ถˆ๊ฐ€

๋ ˆ์ฝ”๋“œ์—์„œ๋Š” ์ธ์Šคํ„ด์Šค ํ•„๋“œ ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ •์  ํ•„๋“œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

2. ์ƒ์„ฑ์ž ์ ‘๊ทผ์ž ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ

๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์•„์˜ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ •์  ํŒฉํ† ๋ฆฌ๋งŒ์œผ๋กœ DTO๋ฅผ ๋งŒ๋“ค์–ด์™”์—ˆ๋Š”๋ฐ, ์ด ์ ์ด ์‚ด์ง ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.

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

๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


์‚ฌ์šฉ ํ›„๊ธฐ

๋งค์šฐ ํš๊ธฐ์ ์œผ๋กœ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋“ค์„ ์—†์• ์ฃผ๊ณ , ๋ถˆ๋ณ€์„ ๋ณด์žฅํ•ด์„œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋น„๋‹จ DTO ๋ฟ ์•„๋‹ˆ๋ผ, ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ์ ์—์„œ VO (Value Object)๋กœ๋„ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ์œ„์˜ ๋‹จ์ , ์ œ์•ฝ์‚ฌํ•ญ์ด ์žˆ์–ด๋„ ๊ดœ์ฐฎ์œผ๋ฉด์„œ & JDK16 ์ด์ƒ์˜ ์ž๋ฐ”๋กœ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜ƒ

 

ํ‹€๋ฆฐ ์ ์ด ์žˆ๋‹ค๋ฉด ๋ฐ”๋กœ ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

์ฐธ๊ณ  ๋ฌธ์„œ