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 ν•„λ“œλ„ μ΄ˆκΈ°ν™”ν•  수 있음.