// 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가 자동으로 만들어주는 것들
getter / setter // getAccess_token(), setAccess_token()
equals() / hashCode() // 객체 동등성 비교
toString() // 디버깅용 문자열 출력
기본 생성자와 모든 필드를 파라미터로 가진 오버로딩된 생성자를 만들어 줍니다.
//기본 동작
// 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 : @RequiredArgsConstructor랑 @NoArgsConstructor는 해당 클래스에서 어떤게 필요할때 사용하는거지? 선정 기준이 헷갈리네.
A :
주입받을
final필드가 있으면@RequiredArgsConstructor, 필드가 아예 없거나 기본 생성자가 필요하면@NoArgsConstructor
final 필드를 파라미터로 받는 생성자를 자동 생성합니다.@RequiredArgsConstructor
public class AuthController {
private final AuthService authService; // final 필드 → 생성자 주입 대상
// Lombok이 아래 생성자를 자동 생성해줌
// public AuthController(AuthService authService) {
// this.authService = authService;
// }
}
언제 사용하는가?
@Autowired 대체) 이 필요할 때final 의존성이 있는 Service, Controller 클래스@NoArgsConstructor
@AllArgsConstructor
static class AuthResponse {
private String access_token; // final 아님
// Lombok이 아래 생성자를 자동 생성해줌
// public AuthResponse() {}
// public AuthResponse(String access_token) { this.access_token = access_token; }
}
언제 사용하는가?
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;
}