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

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

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

πŸ“Œ Intro.

  • β†˜οΈŽ @RequireArgsConstructorλŠ” Lombokμ—μ„œ μ œκ³΅ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, 클래슀의 final둜 μ„ μ–Έλœ ν•„λ“œλ‚˜ @NonNull둜 μ§€μ •λœ ν•„λ“œμ— λŒ€ν•΄ ν•„μˆ˜ μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성함.

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

1. final ν•„λ“œλ§Œ 포함.

  • β†˜οΈŽ final둜 μ„ μ–Έλœ ν•„λ“œκ°€ λŒ€μƒμ΄ 됨.
  • β†˜οΈŽ final이 μ•„λ‹Œ ν•„λ“œλŠ” μƒμ„±μžμ— ν¬ν•¨λ˜μ§€ μ•ŠμŒ.

2. @NonNull ν•„λ“œ 포함.

  • β†˜οΈŽ @NonNull μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 ν•„λ“œλ„ 포함됨.
  • β†˜οΈŽ @NonNull이 뢙은 ν•„λ“œλŠ” μƒμ„±μžμ—μ„œ null 체크λ₯Ό μžλ™μœΌλ‘œ 좔가함.

3. 주둜 μ˜μ‘΄μ„± μ£Όμž…μ— μ‚¬μš©.

  • β†˜οΈŽ Springμ—μ„œ μƒμ„±μž 기반 μ˜μ‘΄μ„± μ£Όμž…(Constructor-based Dependency Injection)에 자주 μ‚¬μš©λ¨.

βœ…2️⃣ μƒμ„±μž μžλ™ 생성 예제.

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

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class MyService {
    private final MyRepository myRepository;
    private final String name; // μƒμ„±μž 포함.
    private int age; // μƒμ„±μž ν¬ν•¨λ˜μ§€ μ•ŠμŒ.
}
  • β†˜οΈŽ μœ„ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같은 μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성함:
    public MyService(MyRepository myRepository, String name) {
      this.myRepository = myRepository;
      this.name = name;
    }
    

2. @NonNull ν•„λ“œ μ‚¬μš©.

import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class MyService {
    @NonNull
    private final MyRepository myRepository; // @NonNull null 체크 μΆ”κ°€.
    private final String name; // μƒμ„±μžμ— 포함.
    private int age; // μƒμ„±μžμ— ν¬ν•¨λ˜μ§€ μ•ŠμŒ.
}
  • β†˜οΈŽ μƒμ„±λœ μƒμ„±μžλŠ” @NonNull ν•„λ“œμ— λŒ€ν•΄ null 체크λ₯Ό 포함함.
    public MyService(MyRepository myRepository, String name) {
      if (myRepository == null) {
          throw new NullPointerException("myRepository is marked @NonNull but is null");
      }
      this.myRepository = myRepository;
      this.name = name;
    }
    

3. Springκ³Ό ν•¨κ»˜ μ‚¬μš©.

πŸ“Œ Springμ—μ„œλŠ” @RequiredArgsConstructorλ₯Ό μ‚¬μš©ν•˜λ©΄ μƒμ„±μž μ£Όμž… μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 있음.

  • β†˜οΈŽ 일반적인 μƒμ„±μž μ£Όμž…
    @Service
    public class MyService {
      private final MyRepository myRepository;
        
      public MyService(MyRepository myRepository) {
          this.myRepository = myRepository;
      }
    }
    
  • β†˜οΈŽ @RequiredArgsConstructor μ‚¬μš©
    @Service
    @RequiredArgsConstructor
    public class MyService {
      private final MyRepository myRepository;
    }
    
  • β†˜οΈŽ Spring이 μžλ™μœΌλ‘œ MyRepositoryλ₯Ό μ£Όμž…ν•¨.
  • β†˜οΈŽ μ½”λ“œκ°€ κ°„κ²°ν•΄μ§€κ³ , μ˜μ‘΄μ„± μ£Όμž… μ‹œ 더 가독성이 쒋아짐.

βœ…3️⃣ μž₯점.

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

  • β†˜οΈŽ ν•„μˆ˜ μƒμ„±μžλ₯Ό 직접 μž‘μ„±ν•  ν•„μš”κ°€ 없어짐.

2. λΆˆλ³€ 객체 생성에 적합.

  • β†˜οΈŽ final ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή ν•„λ“œλ₯Ό λΆˆλ³€μœΌλ‘œ μœ μ§€ν•  수 있음.

3. Spring과의 ν˜Έν™˜μ„±.

  • β†˜οΈŽ μƒμ„±μž 기반 μ˜μ‘΄μ„± μ£Όμž…μ—μ„œ ν™œμš©λ„κ°€ λ†’μŒ.

βœ…4️⃣ 주의점.

1. final ν•„λ“œλ§Œ 포함.

  • β†˜οΈŽ μƒμ„±μžμ— ν¬ν•¨λ˜μ§€ μ•ŠλŠ” ν•„λ“œ(final이 μ•„λ‹Œ ν•„λ“œ)에 값을 μ„€μ •ν•˜λ €λ©΄ Setter λ˜λŠ” λ‹€λ₯Έ 방법을 μ‚¬μš©ν•΄μ•Ό 함.

2. @NonNull둜 null 체크 ν•„μš”.

  • β†˜οΈŽ @NonNull ν•„λ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ null 값이 듀어가도 μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•ŠμŒ.

πŸš€ 정리.

  • β†˜οΈŽ @RequiredArgsConstructorλŠ” μƒμ„±μž μ£Όμž…μ„ κ°„κ²°ν•˜κ²Œ ν•˜κ³ , λΆˆλ³€μ„±μ„ μœ μ§€ν•˜λ©΄μ„œ μ½”λ“œλ₯Ό κΉ”λ”ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ„λ‘ λ„μ™€μ€Œ.
  • β†˜οΈŽ Springκ³Ό Lombok을 ν•¨κ»˜ μ‚¬μš©ν•  λ•Œ κ°€μž₯ 많이 μ“°μ΄λŠ” Lombok μ–΄λ…Έν…Œμ΄μ…˜ 쀑 ν•˜λ‚˜μž„.