Home > Backend Development > πŸ“š[Backend Development] πŸš€ @RequiredArgsConstructor - Lombok

πŸ“š[Backend Development] πŸš€ @RequiredArgsConstructor - Lombok
Backend Development Server Lombok

πŸš€ @RequiredArgsConstructor - Lombok

@RequiredArgsConstructorλŠ” ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ μ΄ˆκΈ°ν™”λ˜μ–΄μ•Ό ν•˜λŠ” ν•„λ“œλ§Œμ„ λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€.
μ΄λ•Œ λŒ€μƒμ΄ λ˜λŠ” ν•„λ“œλŠ” final둜 μ„ μ–Έλœ ν•„λ“œμ΄κ±°λ‚˜ @NonNull이 뢙은 ν•„λ“œμž…λ‹ˆλ‹€.

λ˜ν•œ μƒμ„±μžμ— μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•  수 μžˆλ„λ‘ ν•˜λŠ” onConstructor μ˜΅μ…˜λ„ ν•¨κ»˜ μ§€μ›ν•©λ‹ˆλ‹€.

πŸ“Œ 핡심 μš”μ•½

  • final ν•„λ“œ β†’ 무쑰건 μƒμ„±μžμ— 포함
  • @NonNull ν•„λ“œ β†’ μƒμ„±μžμ— 포함 + null 체크
    // μ˜ˆμ‹œ
    @RequiredArgsConstructor
    public class Monster {
    
      private final String name;
      private final MonsterStage stage;
    
      @NonNull
      private MonsterAttribute attribute;
    
      private int hp;
    }
    

↓ Lombok이 μƒμ„±ν•˜λŠ” μƒμ„±μž

public Monster(String name,
               MonsterStage stage,
               MonsterAttribute attribute) {
    this.name = name;
    this.stage = stage;
    this.attribute = attribute;
}
  • onConstructor β†’ μƒμ„±μžμ— μ–΄λ…Έν…Œμ΄μ…˜ μΆ”κ°€ κΈ°λŠ₯ (예: @Autowired)
    // μ˜ˆμ‹œ
    @RequiredArgsConstructor(onConstructor_ = @Autowired)
    public class MonsterService {
      private final MonsterRepository repository;
    }
    

🚨 μ£Όμ˜ν•  점 (μ€‘μš”)

β€œλͺ¨λ“  μƒμ„±μžλ₯Ό λŒ€μ²΄ν•œλ‹€β€λŠ” κ°œλ…μ€ μ•„λ‹˜

  • ❌ 선택 ν•„λ“œκ°€ λ§Žμ„ λ•ŒλŠ” λΆ€μ‘±ν•  수 있음
  • ❌ μƒμ„±μž λ‚΄λΆ€μ—μ„œ 검증 λ‘œμ§μ„ λ„£κΈ° 어렀움
  • ❌ Entityμ—μ„œ λ¬΄λΆ„λ³„ν•˜κ²Œ μ“°λ©΄ 도메인 무결성 μ•½ν™” κ°€λŠ₯

βœ… int hp ν•„λ“œκ°€ ν•„μˆ˜λ‘œ μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ•„λ„ λ˜λŠ” 이유

// μ˜ˆμ‹œ
@RequiredArgsConstructor
public class Monster {

    private final String name;
    private final MonsterStage stage;

    @NonNull
    private MonsterAttribute attribute;

    private int hp;
}

이 μ§ˆλ¬Έμ„ μ΄ν•΄ν•˜λ©΄ Java 객체 생성 원리 + Lombok 섀계 철학이 ν•œ λ²ˆμ— μ •λ¦¬λ©λ‹ˆλ‹€.

κ²°λ‘ λΆ€ν„° λ§ν•˜λ©΄:
private int hp;λŠ” β€œμžλ°” νƒ€μž… νŠΉμ„±μƒ μžλ™μœΌλ‘œ μ΄ˆκΈ°ν™”λ˜λ©°, Lombok μž…μž₯μ—μ„œλŠ” β€˜λ°˜λ“œμ‹œ μƒμ„±μžμ—μ„œ λ°›μ•„μ•Ό ν•  ν•„μˆ˜ 값’이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.”

λ‹¨κ³„λ³„λ‘œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

1️⃣ μžλ°” κ°μ²΄λŠ” β€œμžλ™ μ΄ˆκΈ°ν™”(default initialization)”가 μžˆλ‹€

βœ”οΈŽ Java의 μΈμŠ€ν„΄μŠ€ ν•„λ“œ κΈ°λ³Έκ°’

  • νƒ€μž…: int, κΈ°λ³Έκ°’: 0
  • νƒ€μž…: long, κΈ°λ³Έκ°’: 0L
  • νƒ€μž…: boolean, κΈ°λ³Έκ°’: false
  • νƒ€μž…: Object, κΈ°λ³Έκ°’: null

2️⃣ Lombok의 관점: β€œν•„μˆ˜ μ΄ˆκΈ°ν™”λž€ 무엇인가?”

Lombok은 μ΄λ ‡κ²Œ μ •μ˜ν•©λ‹ˆλ‹€:

β€œμƒμ„±μžμ—μ„œ λ°˜λ“œμ‹œ 값을 λ°›μ•„μ•Όλ§Œ 정상적인 객체 μƒνƒœκ°€ λ˜λŠ” ν•„λ“œβ€

κ·Έλž˜μ„œ Lombok이 β€œν•„μˆ˜β€λ‘œ λ³΄λŠ” 기쀀은 λ”± 2κ°€μ§€

  1. final ν•„λ“œ
    β†’ μƒμ„±μž μ•„λ‹ˆλ©΄ μ΄ˆκΈ°ν™” λΆˆκ°€ ❌
  2. @NonNull ν•„λ“œ
    β†’ null이면 의미 μ—†λŠ” μƒνƒœ ❌

3️⃣ hpλŠ” μ™œ ν•„μˆ˜κ°€ μ•„λ‹Œκ°€?

이유 1. 기본값이 μ‘΄μž¬ν•œλ‹€.

  • int β†’ 0
  • JVM이 μžλ™ 보μž₯

이유 2. final이 μ•„λ‹ˆλ‹€.

  • μƒμ„±μž 이후에도 κ°’ λ³€κ²½ κ°€λŠ₯
  • β€œλ°˜λ“œμ‹œ 생성 μ‹œμ μ— μ •ν•΄μ Έμ•Ό ν•œλ‹€β€λŠ” 계약이 μ—†μŒ

이유 3. 도메인 μ˜λ―Έμƒ β€˜μ΄ˆκΈ°κ°’β€™μ΄ μœ νš¨ν•  μˆ˜λ„ 있음

  • 예λ₯Ό λ“€μ–΄ μ’…μ‘±(MonsterSpecies) λ‹¨κ³„μ—μ„œλŠ” hpλŠ” β€œκΈ°λ³Έ μŠ€νƒ―β€, λ‚˜μ€‘μ— μΈμŠ€ν„΄μŠ€ 생성 μ‹œ μ„ΈνŒ….