Lombok의 주요 Annotation

StrayCat·2026년 2월 10일

@Getter / @Setter

// Lombok 사용 전

public class User {
    private String name;
    
    public String getName() { // @Getter
        return name;
    }
    
    public void setName(String name) { // @Setter
        this.name = name;
    }
}

// Lombok 사용 후

@Getter @Setter
public class User {
    private String name;
} 

@Data

가장 많은 일을 합니다. 아래 메서드들을 한 번에 자동 생성합니다.

// @Data가 자동으로 만들어주는 것들
getter / setter       // getAccess_token(), setAccess_token()
equals() / hashCode() // 객체 동등성 비교
toString()            // 디버깅용 문자열 출력

@NoArgsConstructor / @AllArgsConstructor

기본 생성자와 모든 필드를 파라미터로 가진 오버로딩된 생성자를 만들어 줍니다.

//기본 동작
// Lombok 사용 전
public class User {
    private String name;
    private int age;
    
    public User() {}  // 기본 생성자
    
    public User(String name, int age) {  // 모든 필드 생성자
        this.name = name;
        this.age = age;
    }
}

// Lombok 사용 후
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private int age;
}
@NoArgsConstructor
public class User {
    private String name;
    private int age;
}

// 생성되는 코드
public User() {}

// 사용
User user = new User();  // 파라미터 없음
@AllArgsConstructor
public class User {
    private String name;
    private int age;
}

// 생성되는 코드
public User(String name, int age) {
    this.name = name;
    this.age = age;
}

// 사용
User user = new User("홍길동", 20);  // 모든 필드를 파라미터로

그러면 생성자에 파라미터를 직접 주입하는 것과, 기본생성자로 객체를 선언하고 setter를 통해 값을 주입하는 것은 어떤 차이가 있는가?

// 생성자 주입 - 불변 객체

@AllArgsConstructor
public class User {
    private final String name;  // final 가능
    private final int age;
}
User user = new User("홍길동", 20);
// user.setName("김철수");  // 불가능 - 안전함

// Setter 주입 - 가변 객체

@NoArgsConstructor
@Setter
public class User {
    private String name;  // final 불가
    private int age;
}
User user = new User();
user.setName("홍길동");
user.setAge(20);
user.setName("김철수");  // 가능 - 언제든 변경됨

실제 사용 용례

@Getter  // getter, setter 중 getter 만 사용
@AllArgsConstructor
public class User {
    private final String name;
    private final int age;
}
// 생성 후 변경 불가 및 참조 가능
// Entity 등


Q & A

Q : @RequiredArgsConstructor랑 @NoArgsConstructor는 해당 클래스에서 어떤게 필요할때 사용하는거지? 선정 기준이 헷갈리네.

A :

주입받을 final 필드가 있으면 @RequiredArgsConstructor, 필드가 아예 없거나 기본 생성자가 필요하면 @NoArgsConstructor

@RequiredArgsConstructor

  • final 필드를 파라미터로 받는 생성자를 자동 생성합니다.
@RequiredArgsConstructor
public class AuthController {

    private final AuthService authService;  // final 필드 → 생성자 주입 대상

    // Lombok이 아래 생성자를 자동 생성해줌
    // public AuthController(AuthService authService) {
    //     this.authService = authService;
    // }
}

언제 사용하는가?

  • Spring의 생성자 주입(@Autowired 대체) 이 필요할 때
  • 주입받아야 할 final 의존성이 있는 Service, Controller 클래스

@NoArgsConstructor

  • 파라미터가 없는 기본 생성자를 자동 생성합니다.
@NoArgsConstructor
@AllArgsConstructor
static class AuthResponse {

    private String access_token;  // final 아님

    // Lombok이 아래 생성자를 자동 생성해줌
    // public AuthResponse() {}
    // public AuthResponse(String access_token) { this.access_token = access_token; }
}

언제 사용하는가?

  • JSON 직렬화/역직렬화 (Jackson)가 필요한 DTO, Response 클래스
  • JPA Entity 클래스 (JPA 스펙이 기본 생성자를 요구함)

Q. 그러면, Dto타입들은 기본적으로 @NoArgsConsructor 필요하다고 보면 되겠네.

A :

JSON 역직렬화가 필요한 DTO, 즉 클라이언트 → 서버 방향 (Request Body) 을 받는 DTO에 @NoArgsConstructor가 필수입니다. (RequestDto)

// Request DTO → @NoArgsConstructor 필수
// 클라이언트에서 JSON을 받아온 뒤 자바에서 역직렬화를 필요로 하고
// 이 때 기본생성자를 요구함 (Jackson이 객체를 만들 때 필요함)

@Data
@NoArgsConstructor
public class LoginRequest {
    private String user_id;
    private String password;
}

// Response DTO → @NoArgsConstructor 없어도 동작은 함
// 단, 관례적으로 붙여두는 경우가 많음 (Dto에 대한 표시로서)
@Data
@AllArgsConstructor
public class AuthResponse {
    private String access_token;
}
profile
알면 좋은 것보단 잊어버리기 싫은 것들을 기록합니다.

0개의 댓글