Lombok은 자바에서 반복적이고 보일러플레이트 코드를 줄여주는 라이브러리로, 특히 **스프링(Spring)**에서 자주 사용됩니다. Lombok을 사용하면 getter, setter, 생성자, equals, hashCode, toString 등의 메서드를 자동으로 생성할 수 있어 코드가 간결해지고, 유지보수성도 크게 향상됩니다.
스프링에서는 Lombok을 사용해 DTO, 엔티티 클래스, 서비스 로직 등에서 필요한 메서드를 자동으로 생성하여 코드의 중복을 줄일 수 있습니다. 아래에서는 자주 사용되는 Lombok 어노테이션과 그 역할을 설명하고, 스프링에서 어떻게 활용되는지 설명하겠습니다.
Lombok 설정하기
Lombok을 사용하려면 프로젝트에 Lombok 의존성을 추가해야 합니다. Maven 또는 Gradle을 사용하는 스프링 프로젝트에서 Lombok을 설정하는 방법은 다음과 같습니다.
Maven 설정 (pom.xml):
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version> <!-- 최신 버전 사용 권장 -->
<scope>provided</scope>
</dependency>
Gradle 설정 (build.gradle):
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.24' // 최신 버전 사용 권장
annotationProcessor 'org.projectlombok:lombok:1.18.24'
}
의존성 추가 후 프로젝트를 빌드하면 Lombok이 자동으로 설정됩니다.
1. @Getter / @Setter
• 설명: @Getter와 @Setter는 클래스의 필드에 대해 getter와 setter 메서드를 자동 생성합니다.
• 어디서 사용: DTO, 엔티티 클래스 등에서 객체의 필드를 접근하거나 수정할 때 사용합니다.
사용 시
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private String name;
private String email;
}
• 이 코드를 사용하면 자동으로 getName(), setName(), getEmail(), setEmail() 메서드가 생성됩니다.
사용하지 않을 시
public class User {
private String name;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
• 차이점: Lombok을 사용하면 직접 getter/setter 메서드를 작성할 필요가 없어 코드가 간결해집니다.
2. @ToString
• 설명: @ToString은 클래스에 대해 toString() 메서드를 자동으로 생성해줍니다. 객체의 모든 필드 값을 문자열로 반환합니다.
• 어디서 사용: 객체를 디버깅하거나 로그에 출력할 때 유용합니다.
사용 시
import lombok.ToString;
@ToString
public class User {
private String name;
private String email;
}
• 이 코드를 사용하면 toString() 메서드가 자동으로 생성되고, 예를 들어 User{name='John', email='john@example.com'}과 같은 형식으로 출력됩니다.
사용하지 않을 시
public class User {
private String name;
private String email;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
}
• 차이점: Lombok을 사용하면 직접 toString() 메서드를 작성할 필요가 없어 코드가 간결해집니다.
3. @NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor
• 설명:
• @NoArgsConstructor: 매개변수 없는 기본 생성자를 자동으로 생성합니다.
• @AllArgsConstructor: 모든 필드를 매개변수로 받는 생성자를 자동으로 생성합니다.
• @RequiredArgsConstructor: final 필드나 @NonNull 필드만을 받는 생성자를 자동으로 생성합니다.
• 어디서 사용: DTO나 엔티티 클래스에서 생성자를 간편하게 생성할 때 사용됩니다.
사용 시
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
@NoArgsConstructor // 기본 생성자
@AllArgsConstructor // 모든 필드를 매개변수로 받는 생성자
@RequiredArgsConstructor // final 필드만 받는 생성자
public class User {
private final String name;
private String email;
}
• @NoArgsConstructor는 기본 생성자를, @AllArgsConstructor는 모든 필드를 매개변수로 받는 생성자를, @RequiredArgsConstructor는 final 필드만을 받는 생성자를 생성합니다.
사용하지 않을 시
public class User {
private final String name;
private String email;
public User() {
// 기본 생성자
}
public User(String name, String email) {
this.name = name;
this.email = email;
}
public User(String name) {
this.name = name;
}
}
• 차이점: Lombok을 사용하면 생성자를 일일이 작성할 필요 없이 자동으로 생성되므로, 코드가 간결해집니다.
4. @Data
• 설명: @Data는 **@Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor**를 모두 포함하는 종합적인 어노테이션입니다. 객체에 필요한 기본적인 메서드들을 자동으로 생성해줍니다.
• 어디서 사용: DTO, 엔티티 클래스에서 자주 사용됩니다.
사용 시
import lombok.Data;
@Data
public class User {
private final String name;
private String email;
}
• @Data를 사용하면 자동으로 getter/setter, toString(), equals(), hashCode(), 생성자가 생성됩니다.
사용하지 않을 시
public class User {
private final String name;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(name, user.name) && Objects.equals(email, user.email);
}
@Override
public int hashCode() {
return Objects.hash(name, email);
}
}
• 차이점: Lombok을 사용하면 자동으로 모든 필수 메서드가 생성되므로 코드가 훨씬 간결해지고, 반복 작업을 줄일 수 있습니다.
5. @EqualsAndHashCode
• 설명: @EqualsAndHashCode는 객체 간의 equals() 및 hashCode() 메서드를 자동 생성합니다. 객체의 동등성 비교와 해시 값 생성에 사용됩니다.
• 어디서 사용: 객체의 동등성 비교가 필요한 클래스에서 사용됩니다.
사용 시
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class User {
private String name;
private String email;
}
• 이 코드를 사용하면 equals()와 hashCode() 메서드가 자동으로 생성됩니다.
사용하지 않을 시
public class User {
private String name;
private String email;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(name, user.name) && Objects.equals(email, user.email);
}
@Override
public int hashCode() {
return Objects.hash(name, email);
}
}
• 차이점: Lombok을 사용하면 자동으로 equals()와 hashCode() 메서드가 생성되므로, 수동으로 작성할 필요가 없습니다.
6. @Builder
• 설명: @Builder는 빌더 패턴을 자동으로 구현하는 어노테이션으로, 복잡한 객체 생성을 유연하게 할 수 있습니다. 객체를 생성할 때 체이닝 방식으로 값을 설정할 수 있습니다.
• 어디서 사용: 값이 많은 객체나 선택적 매개변수가 있는 객체를 만들 때 유용합니다.
사용 시
import lombok.Builder;
@Builder
public class User {
private String name;
private String email;
}
• 빌더 패턴을 사용하면 다음과 같이 객체를 생성할 수 있습니다:
User user = User.builder()
.name("John")
.email("john@example.com")
.build();
사용하지 않을 시
public class User {
private String name;
private String email;
public static class UserBuilder {
private String name;
private String email;
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder email(String email) {
this.email = email;
return this;
}
public User build() {
return new User(this.name, this.email);
}
}
}
• 차이점: Lombok의 @Builder를 사용하면 빌더 패턴을 자동으로 구현할 수 있으므로, 수동으로 작성하는 번거로움을 덜 수 있습니다.
7. @NonNull
• 설명: @NonNull은 해당 필드나 메서드 매개변수가 null이 될 수 없도록 자동으로 검증해줍니다. null일 경우 자동으로 **NullPointerException**을 던집니다.
• 어디서 사용: null 체크가 필요한 필드나 매개변수에서 사용됩니다.
사용 시
import lombok.NonNull;
public class User {
private String name;
public User(@NonNull String name) {
this.name = name;
}
}
• name이 null이면 자동으로 **NullPointerException**이 발생합니다.
사용하지 않을 시
public class User {
private String name;
public User(String name) {
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name;
}
}
• 차이점: Lombok의 @NonNull을 사용하면 null 체크 로직을 수동으로 작성할 필요가 없어 코드가 간결해집니다.
Lombok 어노테이션 | 설명 |
@Getter/@Setter | 필드에 대한 getter/setter 메서드를 자동으로 생성합니다. |
@ToString | toString() 메서드를 자동으로 생성하여 객체의 필드 값을 문자열로 반환합니다. |
@NoArgsConstructor | 기본 생성자를 자동으로 생성합니다. |
@AllArgsConstructor | 모든 필드를 매개변수로 받는 생성자를 자동으로 생성합니다. |
@RequiredArgsConstructor | final 필드나 @NonNull 필드를 받는 생성자를 생성합니다. |
@Data | @Getter, @setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 포함합ㄴ디ㅏ. |
@EqualsAndHashCode | equals()및 hashCode() 메서드를 자동으로 생성합니다. |
@Builder | 빌더 패턴을 자동으로 구현합니다. |
@NonNull | 필드나 매개변수가 null일 수 없도록 체크하고, NullProinterException을 자동으로 던집니다. |
Lombok을 사용하면 객체와 관련된 반복적인 코드를 자동으로 생성해주어 코드가 훨씬 간결해지고, 유지보수성을 높일 수 있습니다.
'spring' 카테고리의 다른 글
[Spring] CustomError 작성법 (0) | 2024.10.20 |
---|---|
[Spring] 주요 Annotation (3) | 2024.10.19 |
[Spring] Bean (1) | 2024.10.12 |
[Spring] Spring과 Tomcat (0) | 2024.10.12 |
[Spring] DTO (0) | 2024.10.04 |