Home > Spring > ๐Ÿƒ[Spring] `@NoArgsConstructor`์€ ๋ฌด์—‡์ผ๊นŒ์š”?

๐Ÿƒ[Spring] `@NoArgsConstructor`์€ ๋ฌด์—‡์ผ๊นŒ์š”?
Spring Framework

๐Ÿƒ[Spring] @NoArgsConstructor์€ ๋ฌด์—‡์ผ๊นŒ์š”?

๐Ÿ“Œ Intro.

  • โ†˜๏ธŽ @NoArgsConstructor๋Š” Lombok์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

โœ…1๏ธโƒฃ ์ฃผ์š” ํŠน์ง•.

1. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ถ”๊ฐ€.

  • โ†˜๏ธŽ @NoArgsConstructor๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋จ.
  • โ†˜๏ธŽ ์ž๋™ ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ํ•„๋“œ ์ดˆ๊ธฐํ™” ๋กœ์ง์ด ์—†๋Š” ๊ธฐ๋ณธ์ ์ธ ์ƒ์„ฑ์ž์ž„.

2. ์ฃผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ์— ์‚ฌ์šฉ.

  • โ†˜๏ธŽ JPA, Jackson ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•จ.

3. final ํ•„๋“œ์™€ ํ˜ธํ™˜ ๊ฐ€๋Šฅ.

  • โ†˜๏ธŽ ๊ธฐ๋ณธ์ ์œผ๋กœ final ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ.
  • โ†˜๏ธŽ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด @NoArgsConstructor(force = true)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

โœ…2๏ธโƒฃ ์‚ฌ์šฉ ์˜ˆ์ œ.

1. ๊ธฐ๋ณธ ์‚ฌ์šฉ.

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class MyClass {
    private String name;
    private int age;
}
  • โ†˜๏ธŽ ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•จ.
    public MyClass() {
    }
    

2. JPA์—์„œ์˜ ์‚ฌ์šฉ.

  • โ†˜๏ธŽ JPA์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์— ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•จ.
    • โ†˜๏ธŽ @NoArgsConstructor๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ.
      ```java
      import jakarta.persistence.Entity;
      import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor
public class User {
private Long id;
private String username;
}

- โ†˜๏ธŽ JPA๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์ˆ˜์ž„.

### 3. force ์†์„ฑ ์‚ฌ์šฉ (final ํ•„๋“œ์™€ ํ•จ๊ป˜)
- โ†˜๏ธŽ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” `final` ํ•„๋“œ ์ดˆ๊ธฐํ™”๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š์Œ.
  - โ†˜๏ธŽ ํ•˜์ง€๋งŒ `@NoArgsConstructor(force = true)`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด `final` ํ•„๋“œ๋„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.
```java
import lombok.NoArgsConstructor;

@NoArgsConstructor(force = true)
public class MyClass {
    private final String name; // ๊ธฐ๋ณธ๊ฐ’: null
    private final int age; // ๊ธฐ๋ณธ๊ฐ’: 0
}
  • โ†˜๏ธŽ ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•จ.
    public MyClass() {
      this.name = null;
      this.age = 0;
    }
    
  • โ†˜๏ธŽ force = true๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด final ํ•„๋“œ๋„ ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋ฏ€๋กœ ํŠน์ • ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•จ.

โœ…3๏ธโƒฃ Spring๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ.

Spring์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ํ™œ์šฉ.

๐Ÿ“Œ Spring์—์„œ JSON ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ JPA ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•จ.

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class UserDTO {
    private String username;
    private String email;
}
  • โ†˜๏ธŽ JSON ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Jackson ๋“ฑ)๊ฐ€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DTO ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•จ.
  • โ†˜๏ธŽ @NoArgsConstructor๋ฃฐ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ด๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Œ.

โœ…4๏ธโƒฃ ์žฅ์ .

1. ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”.

  • โ†˜๏ธŽ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Œ.

    2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ.

  • โ†˜๏ธŽ JPA, Jackson ๋“ฑ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์‰ฝ๊ฒŒ ํ˜ธํ™˜๋จ.

    3. ํŠน์ˆ˜ ์ƒํ™ฉ ์ง€์›.

  • โ†˜๏ธŽ force - true๋ฅผ ํ†ตํ•ด final ํ•„๋“œ๋„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Œ.

โœ…5๏ธโƒฃ ์ฃผ์˜์ .

1. force = true ์‚ฌ์šฉ ์‹œ ์ดˆ๊ธฐํ™” ์ฃผ์˜.

  • โ†˜๏ธŽ final ํ•„๋“œ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’(null ๋˜๋Š” 0)์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Œ.

    2. JPA์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ ‘๊ทผ ์ œํ•œ์ž.

  • โ†˜๏ธŽ JPA์—์„œ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ protected ์ด์ƒ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    

๐Ÿš€ ์ •๋ฆฌ.

  • โ†˜๏ธŽ @NoArgsConstructor๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” Lombok ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, JPA์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜ธํ™˜์„ฑ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•จ.
    • โ†˜๏ธŽ ์ถ”๊ฐ€๋กœ force ์˜ต์…˜์„ ํ†ตํ•ด final ํ•„๋“œ๋„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Œ.