노트

Lombok

Project Lombok

백엔드#spring · 연결된 개념 7개

쉽게 말하면

Lombok은 이름·주소를 매번 손으로 적는 대신 자동완성이 채워 주듯, 게터·생성자·toString 같은 뻔한 반복 코드를 어노테이션 한 줄로 컴파일할 때 넣어 주는 자바 라이브러리예요.

비유가 깨지는 곳 자동으로 채워진 칸은 눈에 안 보여서 숨은 동작이 생겨요. 엔티티에 @Data를 쓰면 toString·hashCode가 양방향 연관을 따라가 무한 순환하거나 지연 로딩을 건드려요.

Lombok은 게터·세터·생성자·toString 같은 반복 코드를 어노테이션으로 대신 생성해 주는 자바 라이브러리다. 컴파일할 때 어노테이션 처리기(annotation processor)가 바이트코드(bytecode)에 메서드를 넣는다. 스프링과는 별개 라이브러리라 따로 추가한다.

자주 쓰는 어노테이션

  • @Getter, @Setter: 필드 접근자
  • @NoArgsConstructor, @AllArgsConstructor: 기본 생성자, 전체 필드 생성자
  • @RequiredArgsConstructor: final 필드만 받는 생성자. 스프링의 생성자 주입과 짝이 잘 맞는다(의존성 주입 (DI))
  • @ToString, @EqualsAndHashCode
  • @Data: @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
  • @Builder: 빌더 API 생성(빌더 패턴)
  • @Slf4j: private static final Logger log 필드 생성(로그 레벨과 Logback)
@Service
@RequiredArgsConstructor
@Slf4j
public class OrderService {
    private final OrderRepository orders;     // 생성자 주입
    private final PaymentClient payments;
}

주의

  • 엔티티에 @Data를 쓰지 않는다. toString·hashCode가 양방향 연관을 따라가 무한 순환하거나 지연 로딩을 건드리고, 변경되는 필드로 hashCode를 만들면 컬렉션에서 엔티티를 잃는다. 엔티티는 @Getter와 보호된 기본 생성자 정도만 둔다(JPA 연관관계 매핑)
  • @Setter를 무분별하게 열면 어디서나 상태를 바꿀 수 있어 불변식(invariant)이 깨진다. 의도가 드러나는 메서드를 둔다(변수·컬렉션 캡슐화)
  • 자바 16 이후 단순 데이터 운반 객체(DTO, Data Transfer Object)는 record로 대부분 대체할 수 있다(2026 기준)
  • 생성된 코드가 보이지 않아 디버깅이 헷갈릴 수 있다. IDE 플러그인과 delombok으로 확인한다

반복 코드를 줄이는 도구지만, 줄인 대가로 숨은 동작이 생긴다는 점에서 누수 추상화의 법칙을 기억해 둔다.

출처: Project Lombok: @Data · 생성자 애너테이션 · 기능 목록

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • JDBC와 JdbcTemplate

    JDBC(Java Database Connectivity)는 자바가 여러 DB와 통신하기 위한 표준 API이고, Hibernate·MyBatis·스프링 JDBC 모두 그 위에 있다. JdbcTemplate은 스프링이 JDBC의 반복 작업(연결 열고 닫기, 예외 변환, 결과 순회)을 대신해 주는 클래스다.

  • 스프링 빈과 IoC 컨테이너

    스프링 빈은 스프링 IoC(Inversion of Control, 제어의 역전) 컨테이너가 만들고, 의존성을 연결하고, 생명주기(lifecycle)를 관리하는 평범한 자바 객체(POJO, Plain Old Java Object)다. 컨테이너(ApplicationContext)는 이 빈들을 담는 공간이고, 내가 new로 만든 객체는 컨테이너가 모른다.

  • Bean Validation

    Bean Validation은 객체 필드에 제약 어노테이션(constraint annotation)을 붙여 입력을 검증하는 자바 표준이다(Jakarta Validation, 구현체는 Hibernate Validator). 스프링은 컨트롤러 파라미터에 @Valid가 붙으면 바인딩 직후 검증을 실행한다.

  • Spring Data 리포지터리와 쿼리 메서드

    Spring Data는 인터페이스만 선언하면 구현체를 런타임에 만들어 주는 영속성 추상화(persistence abstraction)다. JpaRepository<엔티티, ID타입>을 상속하면 저장·조회·삭제·페이징이 바로 생기고, 메서드 이름 규칙만으로 쿼리를 만들 수도 있다.

  • 스프링과 장고 비교

    스프링과 장고는 같은 문제(요청 처리, 의존성 관리, 부가 기능 분리, DB 접근)를 각 언어의 성격에 맞게 다르게 푼다. 스프링은 명시적인 IoC(Inversion of Control) 컨테이너와 프록시 기반 AOP(Aspect-Oriented Programming)를, 장고는 설정 파일·import·데코레이터·미들웨어 같은 파이썬다운 장치를 쓴다.

보기 옵션