Home > Spring > πŸƒ[Spring] `@AllArgsConstructor`은 λ¬΄μ—‡μΌκΉŒμš”?

πŸƒ[Spring] `@AllArgsConstructor`은 λ¬΄μ—‡μΌκΉŒμš”?
Spring Framework

πŸƒ[Spring] @AllArgsConstructor은 λ¬΄μ—‡μΌκΉŒμš”?

πŸ“Œ Intro.

  • β†˜οΈŽ @AllArgConstructorλŠ” Lombokμ—μ„œ μ œκ³΅ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ λͺ¨λ“  ν•„λ“œλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ κ°–λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성해 쀌.

βœ…1️⃣ μ£Όμš” νŠΉμ§•.

1. λͺ¨λ“  ν•„λ“œλ₯Ό ν¬ν•¨ν•œ μƒμ„±μž μΆ”κ°€.

  • β†˜οΈŽ ν΄λž˜μŠ€μ— μ„ μ–Έλœ λͺ¨λ“  ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성함.
  • β†˜οΈŽ μˆ˜λ™μœΌλ‘œ μƒμ„±μžλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ μ½”λ“œκ°€ 간결해짐.

2. 주둜 객체 생성에 μ‚¬μš©.

  • β†˜οΈŽ μ˜μ‘΄μ„± μ£Όμž…, DTO 클래슀 생성 λ“± 객체 생성 μ‹œ ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” κ²½μš°μ— μœ μš©ν•¨.

3. Builder νŒ¨ν„΄κ³Ό ν˜Έν™˜.

  • β†˜οΈŽ @AllArgsConstructorλŠ” 주둜 Builder νŒ¨ν„΄κ³Ό ν•¨κ»˜ μ‚¬μš©λ˜μ–΄ 객체 μ΄ˆκΈ°ν™” 방식을 μœ μ—°ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€.

βœ…2️⃣ μ‚¬μš© 예제.

1. κΈ°λ³Έ μ‚¬μš©.

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class MyClass {
    private String name;
    private int age;
}
  • β†˜οΈŽ μœ„ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같은 μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성함.
    public MyClass(String name, int age) {
      this.name = name;
      this.age = age;
    }
    

2. μ—”ν‹°ν‹° ν΄λž˜μŠ€μ—μ„œμ˜ μ‚¬μš©.

  • β†˜οΈŽ JPAμ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ λ§€ν•‘λ˜λŠ” μ—”ν‹°ν‹° ν΄λž˜μŠ€μ—μ„œ 객체λ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œ μœ μš©ν•¨.
    ```java
    import jakarta.persistence.Entity;
    import lombok.AllArgsConstructor;

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

- β†˜οΈŽ μœ„ μƒμ„±μžλ₯Ό 톡해 μ‰½κ²Œ μ—”ν‹°ν‹° 객체λ₯Ό μ΄ˆκΈ°ν™”ν•  수 있음.
```java
User user = new User(1L, "Alice", "alice@example.com");

3. DTO 객체 생성에 ν™œμš©.

  • β†˜οΈŽ 데이터λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜ 응닡할 DTO 객체λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 데 μ‚¬μš©λ¨.
    ```java
    import lombok.AllArgsConstructor;

@AllArgsConstructor
public class UserDTO {
private String username;
private String email;
}


- β†˜οΈŽ `new UserDTO("Alice", "alice@example.com")`와 같은 ν˜•νƒœλ‘œ 객체λ₯Ό 생성할 수 있음.

## βœ…3️⃣ `@AllArgsConstructor`와 λ‹€λ₯Έ Lombok μ–΄λ…Έν…Œμ΄μ…˜.
### 1. `@NoArgsConstructor`
- β†˜οΈŽ λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성.

### 2. `@RequiredArgsConstructor`
- β†˜οΈŽ `final` λ˜λŠ” `@NonNull`둜 μ„ μ–Έλœ ν•„λ“œλ§Œ ν¬ν•¨ν•˜λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성.

### 3. `@Builder`와 μ‘°ν•©.
- β†˜οΈŽ Builder νŒ¨ν„΄μ„ 톡해 가독성과 μœ μ—°μ„±μ„ 높일 수 있음.
```java
import lombok.AllArgsConstructor;
import lombok.Builder;

@AllArgsConstructor
@Builder
public class MyClass {
    private String name;
    private int age;
}
  • β†˜οΈŽ MyClass.builder().name("Alice").age(25).builder(); ν˜•νƒœλ‘œ 객채 생성 κ°€λŠ₯.

βœ…4️⃣ μž₯점.

1. μ½”λ“œμ˜ κ°„κ²°ν™”.

  • β†˜οΈŽ μƒμ„±μžλ₯Ό μˆ˜λ™μœΌλ‘œ μž‘μ„±ν•  ν•„μš” 없이 λͺ¨λ“  ν•„λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•΄μ€Œ.

2. μœ μ§€λ³΄μˆ˜μ„± ν–₯상.

  • β†˜οΈŽ 클래슀 ν•„λ“œκ°€ 변경될 경우 μƒμ„±μž μ½”λ“œλ„ μžλ™μœΌλ‘œ λ³€κ²½λ˜λ―€λ‘œ 일관성을 μœ μ§€ν•  수 있음.

3. 객체 μ΄ˆκΈ°ν™” 용이.

  • β†˜οΈŽ 객체λ₯Ό ν•œ λ²ˆμ— μ΄ˆκΈ°ν™”ν•˜λŠ”λ° μœ μš©ν•˜λ©° DTO, μ—”ν‹°ν‹°, VO 클래슀 λ“± λ‹€μ–‘ν•œ κ³³μ—μ„œ ν™œμš© κ°€λŠ₯.

βœ…5️⃣ 주의점.

1. ν•„λ“œ 개수 증가 μ‹œ 가독성 μ €ν•˜.

  • β†˜οΈŽ ν•„λ“œκ°€ λ§Žμ€ 경우 μƒμ„±μž λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œλ₯Ό 잘λͺ» μ‚¬μš©ν•  κ°€λŠ₯성이 있음.
    • β†˜οΈŽ 이런 경우 @Builder μ‚¬μš©μ„ ꢌμž₯.

      2. JPA와 ν•¨κ»˜ μ‚¬μš©ν•  λ•Œ.

  • β†˜οΈŽ JPA μ—”ν‹°ν‹° ν΄λž˜μŠ€μ—μ„œ @AllArgsConstructorλŠ” λͺ¨λ“  ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜λ―€λ‘œ κΈ°λ³Έ μƒμ„±μž(@NoArgsConstructor)도 ν•¨κ»˜ μΆ”κ°€ν•΄μ•Ό λ¦¬ν”Œλž™μ…˜κ³Ό ν˜Έν™˜λ¨.
    @AllArgsConstructor
    @NoArgsConstructor
    public class User
    

πŸš€ 정리

  • β†˜οΈŽ @AllArgsConstructorλŠ” λͺ¨λ“  ν•„λ“œλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜μ—¬ μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚΄.
    • β†˜οΈŽ 주둜 DTO, μ—”ν‹°ν‹° 클래슀의 객체 μ΄ˆκΈ°ν™”μ— μ‚¬μš©λ˜λ©°, Builder νŒ¨ν„΄κ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ λ”μš± νš¨κ³Όμ μž„.