Home > Backend Development > πŸ“š[Backend Development] λΉŒλ” νŒ¨ν„΄ μ‚¬μš©μ‹œ @AllArgsConstructor(access = AccessLevel.PRIVATE)을 ν™œμš©ν•˜λŠ” 이유

πŸ“š[Backend Development] λΉŒλ” νŒ¨ν„΄ μ‚¬μš©μ‹œ @AllArgsConstructor(access = AccessLevel.PRIVATE)을 ν™œμš©ν•˜λŠ” 이유
Backend Ddevelopment Springboot Framework

β€œπŸ“š[Backend Development] λΉŒλ” νŒ¨ν„΄ μ‚¬μš©μ‹œ @AllArgsConstructor(access = AccessLevel.PRIVATE)을 ν™œμš©ν•˜λŠ” μ΄μœ β€

🍎 Intro.

  • λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•  λ•Œ, @AllArgsConstructor(access = AccessLevel.PRIVATE)λ₯Ό μΆ”κ°€ν•˜λŠ” 이유λ₯Ό μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

βœ…1️⃣ @AllArgsConstructorκ°€ ν•˜λŠ” μ—­ν• .

  • @AllArgsConstructorλŠ” λͺ¨λ“  ν•„λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•  경우, μƒμ„±μžλ₯Ό 직접 ν˜ΈμΆœν•˜μ§€ μ•Šκ³  λΉŒλ”λ₯Ό 톡해 객체λ₯Ό μƒμ„±ν•˜λŠ” 것이 λͺ©μ μž…λ‹ˆλ‹€.
  • λ”°λΌμ„œ, μƒμ„±μžμ˜ μ ‘κ·Ό μ œν•œμ„ private으둜 μ„€μ •ν•˜λ©΄, λΉŒλ”λ₯Ό ν†΅ν•œ μƒμ„±λ§Œ ν—ˆμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ…2️⃣ λΉŒλ” νŒ¨ν„΄ 적용 μ‹œ, @AllArgsConstructor(access = AccessLevel.PRIVATE)κ°€ ν•„μš”ν•œ 이유

❌ 잘λͺ»λœ 예제 (λΉŒλ” νŒ¨ν„΄ μ‚¬μš©ν–ˆμ§€λ§Œ, μƒμ„±μžλ„ public)

@AllArgsConstructor // (기본값이 PUBLIC)
@Builder
public class Comment {
    private Long commentId;
    private String content;
    private Long articleId;
    private Long parentCommentId;
    private Long writerId;
    private Boolean deleted;
    private LocalDateTime createdAt;
}

βœ… 문제점:

  • @AllArgsConstructor의 κΈ°λ³Έ μ ‘κ·Ό μ œμ–΄μžκ°€ publicμ΄λ―€λ‘œ, λΉŒλ”λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  μƒμ„±μžλ₯Ό 직접 ν˜ΈμΆœν•˜μ—¬ 객체λ₯Ό λ§Œλ“€ 수 있음.
  • λΉŒλ”λ₯Ό μ‚¬μš©ν•˜λŠ” λͺ©μ μ΄ 객체 생성 μ‹œ 가독성을 높이고 μ„ νƒμ μœΌλ‘œ ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™” ν•  수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•¨μΈλ°, μƒμ„±μžκ°€ public이면 λΉŒλ” μ‚¬μš©μ„ κ°•μ œν•  수 μ—†μŒ.

πŸ› οΈ ν•΄κ²° 방법(@AllArgsConstructor(access = AccessLevel.PRIVATE))

@AllArgsConstructor(access = AccessLevel.PRIVATE) // μƒμ„±μžλ₯Ό PRIVATE으둜 μ„€μ •
@Builder
public class Comment {
    private Long commentId;
    private String content;
    private Long articleId;
    private Long parentCommentId;
    private Long writerId;
    private Boolean deleted;
    private LocalDateTime createdAt;
}

βœ… μ΄λ ‡κ²Œ ν•˜λ©΄:

  • 객체λ₯Ό 직접 μƒμ„±ν•˜λŠ” 것을 막고, λΉŒλ”λ₯Ό ν†΅ν•œ μƒμ„±λ§Œ κ°€λŠ₯ν•˜λ„λ‘ μ œν•œ κ°€λŠ₯.
  • λΆˆν•„μš”ν•œ μƒμ„±μž ν˜ΈμΆœμ„ 막고, 가독정이 쒋은 λΉŒλ” νŒ¨ν„΄μ„ κ°•μ œν•  수 있음.
  • 객체의 ν•„λ“œκ°€ λ§Žμ•„μ§ˆμˆ˜λ‘, λΉŒλ” νŒ¨ν„΄μ΄ 더 μœ μš©ν•˜κ²Œ λ™μž‘ν•˜κ²Œ 됨.

βœ…3️⃣ 정리 - ν•„μš”ν•œ 이유.

문제점 ν•΄κ²° 방법
@AllArgConstructor 기본값이 publicμ΄λ―€λ‘œ, 직접 μƒμ„±μž 호좜이 κ°€λŠ₯함. @AllArgsConstructor(access = AccessLevel.PRIVATE)λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±μž μ ‘κ·Ό μ œν•œ.
λΉŒλ”λ₯Ό μ‚¬μš©ν•΄λ„ μƒμ„±μžλ₯Ό 직접 ν˜ΈμΆœν•  수 μžˆμ–΄ 일관성이 떨어짐. λΉŒλ”λ₯Ό κ°•μ œν•˜μ—¬ 가독성 및 μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μž„.
객체 ν•„λ“œκ°€ λ§Žμ•„μ§ˆ 경우, μƒμ„±μž ν˜ΈμΆœλ³΄λ‹€ λΉŒλ” νŒ¨ν„΄μ΄ 더 μœ λ¦¬ν•¨. λΉŒλ”λ₯Ό κ°•μ œν•˜μ—¬ 더 가독성이 쒋은 μ½”λ“œ μœ μ§€ κ°€λŠ₯.
  • βœ… 즉, @AllArgsCOnstructor(access = AccessLevel.PRIVATE)λ₯Ό μ‚¬μš©ν•˜λ©΄, λΉŒλ”λ₯Ό ν†΅ν•œ 객체 생성을 κ°•μ œν•˜μ—¬ μ½”λ“œ 일관성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.