[Spring] Lombok 이해하기 - @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

2025. 11. 4. 13:26·Spring

Lombok이란 ? 

Lombok은 자바에서 반복적으로 작성해야 하는 코드를 자동으로 생성해주는 라이브러리이다. 생성자, getter/setter, equals/hashCode, builder 등을 어노테이션 한 줄로 자동 생성할 수 있어 코드 양을 크게 줄이고 가독성을 높인다. 

 

특히, Spring에서는 DI (의존성 주입)과 엔티티 생성에 필요한 생성자를 깔끔하게 만들어주기 때문에 거의 필수적으로 사용된다. 


생성자 관련 어노테이션 

Lombok은 총 3가지 생성자 어노테이션을 제공하며, 각 각 생성하는 생성자의 형태가 다르다. 

 

1) @NoArgsConstructor

파라미터가 없는 기본 생성자를 만들어준다. 

@NoArgsConstructor
public class User {
	private String name;
	private String email;
}

 

위 코드에서 `User()` 기본 생성자가 자동으로 생성된다. 

 

2) @AllArgsConstructor 

모든 필드를 매개변수로 받는 생성자를 만들어준다. 자동으로 `User(String name, String email)` 생성자가 생성된다. 

@AllArgsConstructor
public class User {
	private String name;
	private String email;
}

 

언제 @NoArgsConstructor를 사용하고, 언제 @AllArgsConstructor를 사용할까 ?

`@NoArgsConstructor` 는 파라미터 없는 기본 생성자가 필요할 때 사용하며, JPA 엔티티처럼 프레임워크가 객체를 만들어야 하는 경우에 필수적이다. `@AllArgsConstructor` 는 모든 필드를 한 번에 넣어 객체를 만들 때 쓰며, 주로 DTO나 테스트 코드에서 편하게 사용된다. 엔티티에서는 `@AllArgsConstructor`를 거의 사용하지 않는다. 

 

3) @RequiredArgsConstructor 

`final` 필드 또는 `@NotNull` 이 붙은 필드만을 매개변수로 가지는 생성자를 만들어 준다. 

@RequiredArgsConstructor
public class UserService {
	private final UserRepository userRepository;
}

위 경우 자동으로 아래 생성자가 만들어진다. 

public UserService(UserRepository userRepository) { 
	this.userRepository = userRepository; 
}

왜 final 필드만 포함되나 ? 

final 필드는 한 번 초기화 되면 바꿀 수 없는 불변 필드이다. 반드시 생성자를 통해 값이 들어와야 객체가 완전하게 만들어진다. 그리고 @RequiredArgsConstructor는 이런 필드만 자동으로 생성자 매개변수에 넣어준다. 

 

Repository를 생성자에 넣는 이유 

서비스는 Repository 없이는 동작할 수 없다. 생성자를 통해 Repository를 전달하면 객체가 생성되는 시점에 반드시 값이 들어간다. 

위의 코드의 경우 UserService가 사용자 정보 조회나 저장을 하려면 반드시 UserRepository가 필요하다. 생성자에 넣으면 객체 생성 시점에 반드시 주입되기 때문에 null이 될 일이 없다. final로 선언하면 한 번 초기화 후에 변경이 불가하다. 생성자를 통해 초기화하면, 이후 다른 코드에서 실수로 repository를 바꾸는 것을 방지할 수 있다. 

 

'Spring' 카테고리의 다른 글

[Spring] Spring AI와 LangChain4j 비교  (0) 2025.11.24
[Spring] 임베디드 타입 (@Embeddable, @Embedded)  (0) 2025.11.10
[Spring] 데이터 유효성 검증 (Validation) 이해하기  (0) 2025.11.04
[Spring] DTO 활용 패턴 - toEntity(), from() 정적 팩토리 메서드  (0) 2025.10.13
[Spring] 외부 API 연동하기 (RestTemplate vs. WebClient vs. OpenFeign)  (0) 2025.10.05
'Spring' 카테고리의 다른 글
  • [Spring] Spring AI와 LangChain4j 비교
  • [Spring] 임베디드 타입 (@Embeddable, @Embedded)
  • [Spring] 데이터 유효성 검증 (Validation) 이해하기
  • [Spring] DTO 활용 패턴 - toEntity(), from() 정적 팩토리 메서드
erika0915
erika0915
백엔드 개발자가 되고 싶어요 .
  • erika0915
    erikoding
    erika0915
  • 전체
    오늘
    어제
    • 분류 전체보기 (78)
      • 프로젝트 (13)
        • 끼니콩 (3)
        • 덕메랑 (3)
        • handDoc (7)
        • Haeil (0)
      • Java (9)
        • 클린코더스 (0)
      • Spring (30)
      • Redis (3)
      • CS (7)
        • 운영체제 (3)
        • 컴퓨터구조 (0)
        • 네트워크 (4)
      • DevOps (2)
      • 코딩테스트 (0)
      • Tech (14)
        • TDD (1)
        • 정리 (5)
        • 우테코 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    jira
    promtail
    springboot
    Spring
    코드레빗
    도커
    redis
    파인튜닝
    운영체제
    레디스
    스프링
    git
    AI
    몽고디비
    CoolSMS
    깃
    스프링부트
    STT
    지라
    자바
    OS
    Network
    coderabbit
    java
    docker
    TDD
    MongoDB
    네트워크
    github
    깃허브
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
erika0915
[Spring] Lombok 이해하기 - @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

티스토리툴바