Home > Backend Development > πŸ“š[Backend Development] `@NoArgsConstructor`와 `@AllArgsConstructor` μ–΄λ…Έν…Œμ΄μ…˜

πŸ“š[Backend Development] `@NoArgsConstructor`와 `@AllArgsConstructor` μ–΄λ…Έν…Œμ΄μ…˜
Backend Ddevelopment Annotation Lombok

πŸ“š[Backend Development] @NoArgsConstructor와 @AllArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜

πŸ“¦ @NoArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜.

@NoArgsConstructorλŠ” νŒŒλΌλ―Έν„°κ°€ μ—†λŠ” κΈ°λ³Έ μƒμ„±μž(no-arg constructor)λ₯Ό μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ£ΌλŠ” Lombok μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.

βœ… 1. @NoArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ λ¬΄μ—‡μΈκ°€μš”?

@NoArgsConstructorλŠ” Lombok 라이브러리의 μ–΄λ…Έν…Œμ΄μ…˜ 쀑 ν•˜λ‚˜λ‘œ, public MyClass() {}와 같이 μ•„λ¬΄λŸ° μΈμžλ„ λ°›μ§€ μ•ŠλŠ” μƒμ„±μž μ½”λ“œλ₯Ό 컴파일 μ‹œμ μ— μžλ™μœΌλ‘œ μƒμ„±ν•΄μ€λ‹ˆλ‹€.

βœ… 2. @NoArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ μ–Έμ œ μ‚¬μš©ν•˜λ‚˜μš”?

JPA Entity 클래슀λ₯Ό λ§Œλ“€ λ•Œ 거의 항상 μ‚¬μš©λ©λ‹ˆλ‹€.
λ˜ν•œ, JSON 데이터λ₯Ό 객체둜 λ³€ν™˜ν•˜λŠ” 라이브러리(e.g, Jackson)λ₯Ό μ‚¬μš©ν•  λ•Œλ„ ν•„μš”ν•©λ‹ˆλ‹€.

βœ… 3. @NoArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ μ–΄λ””μ„œ μ‚¬μš©ν•˜λ‚˜μš”?

클래슀(Class) λ ˆλ²¨μ—μ„œ μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

βœ… 4. @NoArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ‚˜μš”?

클래슀 μœ„μ— μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ£ΌκΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.
JPA Entityμ—μ„œλŠ” protected μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 쒋은 νŒ¨ν„΄μž…λ‹ˆλ‹€.

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@Entiry
@NoArgsConstructor(access = AccessLevel.PROTECTED) // protected κΈ°λ³Έ μƒμ„±μžλ₯Ό μžλ™ 생성
public class Product {
    
    @Id
    private Long id;
    private String name;
    
    /*
     // μ•„λž˜ μƒμ„±μžκ°€ 컴파일 μ‹œμ μ— μžλ™μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€.
     protected Product() {
     }
     */
}

βœ… 5. @NoArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ μ™œ μ‚¬μš©ν•˜λ‚˜μš”?

@NoArgsConstructorλ₯Ό μ‚¬μš©ν•˜λŠ” 주된 μ΄μœ λŠ” ν”„λ ˆμž„μ›Œν¬μ˜ μš”κ΅¬μ‚¬ν•­μ„ λ§Œμ‘±μ‹œν‚€κ³  객체 μƒμ„±μ˜ μ•ˆμ •μ„±μ„ 높이기 μœ„ν•¨μž…λ‹ˆλ‹€.

  • ν”„λ ˆμž„μ›Œν¬ ν˜Έν™˜μ„± : JPA와 같은 ν”„λ ˆμž„μ›Œν¬λŠ” λ‚΄λΆ€μ μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ κΈ°λ³Έ μƒμ„±μžλ₯Ό ν•„μš”λ‘œ ν•©λ‹ˆλ‹€. @NoArgsConstructorλŠ” 이 μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±μ‹œμΌœμ€λ‹ˆλ‹€.
  • μ•ˆμ „μ„± : @NoArgsConstructor(access = AccessLevel.PROTECTED)둜 μ„€μ •ν•˜λ©΄, κ°œλ°œμžκ°€ new Product() 처럼 μ‹€μˆ˜λ‘œ λΆˆμ™„μ „ν•œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 것을 막을 수 μžˆμŠ΅λ‹ˆλ‹€. 객체 생성은 @Builderλ‚˜ 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œ 등을 μ‚¬μš©ν•˜λ„λ‘ κ°•μ œν•˜μ—¬ μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ λ†’μž…λ‹ˆλ‹€.
  • μ½”λ“œ κ°„κ²°μ„± : κ°œλ°œμžκ°€ 직접 μƒμ„±μž μ½”λ“œλ₯Ό μž‘μ„±ν•  ν•‘μš”κ°€ μ—†μ–΄ μ½”λ“œκ°€ κΉ”λ”ν•΄μ§‘λ‹ˆλ‹€.

πŸ“¦ @AllArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜.

@AllArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜λŠ” 클래슀의 λͺ¨λ“  ν•„λ“œλ₯Ό 인자둜 λ°›λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ£ΌλŠ” Lombok μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.

βœ… 1. @AllArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ λ¬΄μ—‡μΈκ°€μš”?

@AllArgsConstructorλŠ” Lombok 라이브러리의 μ–΄λ…Έν…Œμ΄μ…˜ 쀑 ν•˜λ‚˜λ‘œ, ν΄λž˜μŠ€μ— μ„ μ–Έλœ λͺ¨λ“  ν•„λ“œλ₯Ό νŒŒλΌλ―Έν„°λ‘œ μˆœμ„œλŒ€λ‘œ λ°›λŠ” μƒμ„±μž μ½”λ“œλ₯Ό 컴파일 μ‹œμ μ— μžλ™μœΌλ‘œ μƒμ„±ν•΄μ€λ‹ˆλ‹€.

βœ… 2. @AllArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ μ–Έμ œ μ‚¬μš©ν•˜λ‚˜μš”?

  • 클래슀의 λͺ¨λ“  ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•˜λŠ” 객체λ₯Ό λ§Œλ“€ λ•Œ.
  • λ‹€λ₯Έ μ–΄λ…Έν…Œμ΄μ…˜, 특히 @Builder와 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ 객체 생성을 더 νŽΈλ¦¬ν•˜κ²Œ λ§Œλ“€κ³  싢을 λ•Œ.
  • μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection) ν…ŒμŠ€νŠΈ λ“±μ—μ„œ λͺ¨λ“  ν•„λ“œλ₯Ό μ™ΈλΆ€μ—μ„œ μ£Όμž…λ°›μ•„μ•Ό ν•  λ•Œ.

βœ… 3. @AllArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ μ–΄λ””μ„œ μ‚¬μš©ν•˜λ‚˜μš”?

클래슀(Class) λ ˆλ²¨μ— μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

βœ… 4. @AllArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ‚˜μš”?

클래슀 μœ„μ— μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ£ΌκΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

import lombok.AllArgsConstructor;

@AllArgsConstructor // 이 μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ•„λž˜ μƒμ„±μž μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ λ§Œλ“­λ‹ˆλ‹€.
public class Product {
    
    private Long id;
    private String name;
    
    /*
     // μ•„λž˜ μƒμ„±μžκ°€ 컴파일 μ‹œμ μ— μžλ™μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€.
     public Product(Long id, String name) {
         this.id = id;
         this.name = name;
     }
     */
}

βœ… 5. @AllArgsConstructor μ–΄λ…Έν…Œμ΄μ…˜μ€ μ™œ μ‚¬μš©ν•˜λ‚˜μš”?

@AllArgsConstructorλ₯Ό μ‚¬μš©ν•˜λŠ” 주된 μ΄μœ λŠ” μ½”λ“œμ˜ κ°„κ²°μ„±κ³Ό νŽΈμ˜μ„± λ•Œλ¬Έμž…λ‹ˆλ‹€.

  • λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈ μ½”λ“œ 제거 : ν΄λž˜μŠ€μ— ν•„λ“œκ°€ μΆ”κ°€λ˜κ±°λ‚˜ μˆœμ„œκ°€ 변경될 λ•Œλ§ˆλ‹€ μƒμ„±μž μ½”λ“œλ₯Ό 직접 μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ„ μ—†μ• μ€λ‹ˆλ‹€.
  • @Builderμ™€μ˜ μ‹œλ„ˆμ§€ : @Builder μ–΄λ…Έν…Œμ΄μ…˜μ€ 객체λ₯Ό 생성할 λ•Œ λͺ¨λ“  ν•„λ“œλ₯Ό λ°›λŠ” μƒμ„±μžλ₯Ό ν•„μš”λ‘œ ν•©λ‹ˆλ‹€. 이 λ•Œ @AllArgsConstructorλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ κ°œλ°œμžκ°€ 직접 μƒμ„±μžλ₯Ό μž‘μ„±ν•  ν•„μš” 없이 빑더 νŒ¨ν„΄μ„ μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.