롬복

szlee·2025년 1월 13일

@Getter, @Setter

// Lombok 사용 전
public class User {

    private String name;
    private int age;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
}

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

@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

@NoArgsConstructor // 매개변수가 없는 기본 생성자
@AllArgsConstructor // 모든 필드를 매개변수로 받는 생성자
@RequiredArgsConstructor // final 또는 @NonNull 필드만을 매개변수로 받는 생성자
public class User {
    private final String name; // final 필드는 RequiredArgsConstructor에 포함
    private int age;
}
public class User {

    private final String name;
    private int age;
    
    // @NoArgsConstructor
    // final 필드가 있어서 기본 생성자를 만들 수 없음
    // 만약 name이 final이 아니었다면 아래처럼 생성 가능
    // public User() {}
    
    // @RequiredArgsConstructor
    // final 또는 @NonNull 필드만을 매개변수로 받는 생성자
    public User(String name) {
        this.name = name;
    }
    
    // @AllArgsConstructor
    // 모든 필드를 매개변수로 받는 생성자
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
  • name 필드가 final이기 때문에 @NoArgsConstructor는 실제로 생성될 수 없다. final 필드는 반드시 생성자에서 초기화되어야 하기 때문이다.
  • @RequiredArgsConstructor는 name 필드만을 매개변수로 받는 생성자를 생성합니다. age는 final이 아니므로 포함되지 않는다.
  • @AllArgsConstructor는 모든 필드(name, age)를 매개변수로 받는 생성자를 생성한다.

@AllArgsConstructor
모든 필드를 매개변수로 받는 생성자를 자동으로 생성한다.

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

// 사용할 때
User user = new User("홍길동", 25, "hong@gmail.com");
  • 모든 필드를 초기화해야 하는 경우
  • 불변 객체를 만들 때
  • DTO 클래스를 만들 때

@NoArgsConstructor
매개변수가 없는 기본 생성자를 생성한다.

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

// 사용할 때
User user = new User();
  • JPA 엔티티 클래스에서 (JPA는 기본 생성자를 필요로 함)
  • 직렬화/역직렬화가 필요한 클래스에서
  • 프레임워크에서 리플렉션을 사용할 때

@RequiredArgsConstructor
final이나 @NonNull로 표시된 필드만을 매개변수로 받는 생성자를 생성한다.

@RequiredArgsConstructor
public class User {
    private final String name;  // 생성자에 포함됨
    private int age;           // 생성자에 포함되지 않음
    @NonNull
    private String email;      // 생성자에 포함됨
}

// 사용할 때
User user = new User("홍길동", "hong@gmail.com");
  • 의존성 주입(DI)이 필요한 스프링 컴포넌트 클래스에서
  • 필수 필드와 선택적 필드가 혼합되어 있는 경우
  • 불변성을 보장해야 하는 일부 필드가 있는 경우

@Builder

빌더 패턴 구현

@Builder
public class User {
    private String name;
    private int age;
    private String email;
}

// 사용할 때
User user = User.builder()
    .name("홍길동")
    .age(25)
    .email("hong@gmail.com")
    .build();

빌더 패턴
복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴

빌더 패턴을 사용하는 이유
생성자의 제약사항 해결

// 생성자를 사용할 경우의 문제점
User user1 = new User("John", 25, "john@email.com", "123-456"); // 매개변수가 많으면 가독성이 떨어짐
User user2 = new User("Jane", null, "jane@email.com", null);    // null을 직접 넣어야 함

불변성 보장
객체를 생성한 후에는 변경할 수 없게 만들 수 있음
setter 메서드가 필요 없어짐

유연성
선택적 매개변수가 많을 때 유용
필요한 값만 설정 가능

@Builder
public class User {
    private String name;
    private int age;
    private String email;
    private String phone;
    
    // Lombok이 아래의 코드를 자동으로 생성
    public static class UserBuilder {
        private String name;
        private int age;
        private String email;
        private String phone;
        
        UserBuilder() {}
        
        public UserBuilder name(String name) {
            this.name = name;
            return this;
        }
        
        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }
        
        public UserBuilder email(String email) {
            this.email = email;
            return this;
        }
        
        public UserBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }
        
        public User build() {
            return new User(this);
        }
    }
}
// 빌더 패턴 사용 예시
User user = User.builder()
        .name("John")
        .age(25)
        .email("john@email.com")
        // .phone() // 선택적으로 제외 가능
        .build();

빌더 활용
필수 값 지정

@Builder
public class User {
    @NonNull private String name;  // 필수값으로 지정
    private int age;
    private String email;
}

기본값 설정

@Builder
public class User {
    private String name;
    @Builder.Default
    private int age = 20;  // 기본값 설정
    private String email;
}

특정 필드만 빌더 생성

@Builder(builderMethodName = "customBuilder")
public class User {
    private String name;
    @Builder.Include  // 이 필드만 빌더에 포함
    private int age;
    private String email;
}

@Builder와 @NoArgsConstructor를 함께 사용할 때는 @AllArgsConstructor도 같이 사용해야한다!

profile
🌱

0개의 댓글