Lombok을 활용한 Java 객체 정의와 메서드 생성 방법

2SEONGA·2024년 12월 31일
2

Java

목록 보기
1/13

Lombok 원리

  • Lombok
    컴파일 시점에 바이트코드를 조작하여 필요한 메서드와 기능을 자동으로 추가해주는 라이브러리
  • 과정
    Annotation Processor를 사용하여 소스코드의 Abstract Syntax Tree (AST)를 조작하는 방식

  1. Javac (컴파일러) : 자바 소스 파일을 파싱하여 AST를 생성
  2. Lombok Annotation Processor : 파싱된 AST를 동적으로 수정하고 그 AST에 필요한 메서드 주입
  3. Javac : 수정된 AST를 기반으로 최종 바이트코드 생성

Lombok 어노테이션 사용법

1. @AllArgsConstructor : 모든 필드를 받는 생성자 자동 생성

@AllArgsConstructor는 클래스에 정의된 모든 필드를 매개변수로 받는 생성자를 자동으로 생성하며 생성자 접근 제어자도 설정 가능

@AllArgsConstructor
class Person {
    private String name;
    private int age;
}

이렇게 하면 Person 클래스에 nameage를 받는 생성자가 자동으로 생성

Person person = new Person("Seonga", 24);

2. @Getter / @Setter : 자동 getter / setter 메서드 생성

Lombok의 @Getter@Setter는 각각 클래스의 모든 필드에 대해 get()set() 메서드 자동으로 생성

@AllArgsConstructor
class Person {
    @Getter @Setter private String name;
    @Getter @Setter private int age;
}

3. @ToString : 자동 toString() 메서드 생성

@ToString 어노테이션은 객체의 toString() 메서드를 자동으로 생성하며 필요한 필드를 포함 또는 제외 가능

@ToString
class Person {
    private String name;
    private int age;
}
Person(name=Seonga, age=24)

필드를 제외하고 싶으면 exclude 옵션을 사용하고, 포함하고 싶은 필드는 of 옵션으로 지정

@ToString(exclude = {"age"})
class Person {
    private String name;
    private int age;
}

4. @RequiredArgsConstructor : 필수 필드를 받는 생성자 자동 생성

@RequiredArgsConstructorfinal 필드나 @NonNull이 있는 필드만을 받는 생성자 자동으로 생성

@RequiredArgsConstructor
class Person {
    private final String name;
    private int age;
}

이 코드는 name을 매개변수로 받는 생성자를 생성합니다. age는 나중에 @Setter를 통해 설정 가능


5. @NoArgsConstructor : 인자 없는 생성자 생성

@NoArgsConstructor는 인자가 없는 기본 생성자 생성

@NoArgsConstructor
class Person {
    private String name;
    private int age;
}

이렇게 하면 Person 객체를 생성할 때 인자 없이 생성 가능

Person person = new Person();

6. @EqualsAndHashCode : 동등성 비교 메서드 (equalshashCode) 생성

@EqualsAndHashCodeequalshashCode 메서드를 자동으로 생성하며 필요에 따라 비교할 필드를 선택 또는 제외 가능

@EqualsAndHashCode
class Member {
    private int id;
    private String name;
    private String email;
}

이렇게 하면 Member 객체는 id, name, email을 기준으로 equalshashCode 메서드 생성

세부 설정:

  • @EqualsAndHashCode(of = {"id", "name"}) : idname만으로 동등성 비교
  • @EqualsAndHashCode(exclude = {"email"}) : email 필드는 비교에서 제외

7. @FieldDefaults : 필드에 대한 접근 제어자 일괄 적용

@FieldDefaults는 클래스의 모든 필드에 대해 기본 접근 제어자를 설정 가능

@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
class Person {
    String name;
    int age;
}

이렇게 하면 nameage 필드는 private final로 설정


8. @Builder : 빌더 패턴을 통한 객체 생성

@Builder는 빌더 패턴을 사용하여 객체를 생성하며 필드값을 순차적으로 설정한 후 build() 메서드를 호출하여 객체 생성

@Builder
class Player {
    private String name;
    private int age;
    private String address;
    private int winCount = 0;
    private int failCount = 0;
}

빌더 패턴을 사용한 객체 생성

Player player = Player.builder()
    .name("Seonga")
    .age(24)
    .address("Seoul")
    .winCount(10)
    .failCount(10)
    .build();

빌더는 필드 설정 순서에 구애받지 않으며, 조건부 설정이나 validation도 가능


9. @Slf4j : 로깅을 위한 슬프로그 사용

@Slf4j는 클래스에 SLF4J 로깅 기능을 추가하며 log 객체를 자동으로 생성

Slf4j = Simple Logging Facade for Java

  • Logback, Log4j 와 같은 Logging Framework 들에 대한 Facade(추상체) 제공
  • Logging Framework 변경에도 아무런 문제없이 로깅 수행
@Slf4j
class Person {
    private String name;
    private int age;

    public void greet() {
        log.info("Hello, my name is {}", name);
    }
}

이렇게 하면 log 객체를 통해 쉽게 로깅 가능

다만, log.info, .warn, .error 어떤 메서드든 상관없이
꼭 두번째 파라미터는 Throwable 로 전달해야 stack trace가 자동으로 기록

logger.error("User : {}", user, ex);

객체 생성 방법 3가지

Lombok을 활용하여 객체를 생성하는 3가지 방법

1. 생성자

  • 기본 생성자 : @NoArgsConstructor
  • 필수 필드 생성자 : @RequiredArgsConstructor
  • 모든 필드 생성자 : @AllArgsConstructor

2. 빌더 패턴

@Builder를 사용하면 객체 생성 시 필드값을 설정하고 build()를 통해 객체 생성

3. 정적 팩토리 메서드

정적 팩토리 메서드를 사용하여 객체를 생성하는 방법으로 객체 생성 방식에 제약을 두거나 유연성 증대

@AllArgsConstructor(access = AccessLevel.PRIVATE)
class Person {
    private int id;
    private String name;

    public static Person of(MakePersonDto dto) {
        return new Person(dto.getId(), dto.getName());
    }
}

Person.of(dto)와 같은 방식으로 객체 생성 가능


Lombok을 활용한 목적에 맞는 클래스 정의

1. DTO (Data Transfer Object)

DTO는 주로 데이터를 전송하기 위해 사용되는 객체
DTO를 정의할 때는 데이터를 불러오거나 설정할 수 있어야 하므로 @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor, @ToString, @EqualsAndHashCode 등을 함께 사용하는 경우가 대다수

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PersonDto {
    private String name;
    private int age;
}

@Data 어노테이션은 @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 모두 포함하므로 DTO 객체를 정의할 때 매우 유용

profile
(와.. 정말 Chill하다..)

0개의 댓글