BE/Java

[Java] 롬복과 어노테이션 프로세서

baek-dev 2025. 3. 8. 13:10

⚡ 1. 롬복(Lombok)이란?

Lombok(롬복)반복적인 보일러플레이트(Boilerplate) 코드를 자동으로 생성하는 Java 라이브러리입니다.

예를 들어, Getter, Setter, 생성자, toString() 등을 직접 작성할 필요 없이 어노테이션만으로 자동 생성할 수 있습니다.

 

📌 Lombok을 사용하면 코드가 간결해지고 유지보수가 쉬워짐

import lombok.Getter;
import lombok.Setter;

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

📌 위 코드 실행 시 자동으로 getName(), setAge() 등의 메서드가 생성됨

 

⚡ 2. Lombok은 어떻게 동작할까? (어노테이션 프로세서)

✅ 1) Lombok의 핵심 동작 방식

 

Lombok은 컴파일 타임(Compile-Time) 에 작동하는 어노테이션 프로세서(Annotation Processor) 를 사용합니다.

 

💡 기본 개념

1️⃣ 개발자가 @Getter, @Setter 같은 Lombok 어노테이션을 코드에 추가

2️⃣ Java 컴파일러가 어노테이션 프로세서 를 실행

3️⃣ Lombok의 Annotation Processor(AP) 가 클래스 코드를 분석

4️⃣ 바이트코드를 수정하여 필요한 메서드를 자동으로 추가

5️⃣ 최종적으로 JVM이 실행할 수 있는 바이트코드가 생성됨

 

📌 즉, Lombok은 Java 소스를 직접 수정하는 것이 아니라, 컴파일 중간 과정에서 바이트코드를 조작하여 메서드를 추가함!

 

✅ 2) 어노테이션 프로세서(Annotation Processor)란?

컴파일러가 특정 어노테이션을 감지하고, 해당 어노테이션에 맞는 코드를 자동 생성하는 기능

Lombok은 Java의 javax.annotation.processing 패키지를 활용하여 구현됨

Spring의 @ComponentScan, JPA의 @Entity 등도 내부적으로 어노테이션 프로세서를 사용

 

⚡ 3. Lombok의 어노테이션 프로세싱 과정

🏗 Lombok의 어노테이션 프로세서 흐름

1. 개발자가 @Getter, @Setter 추가
      ↓
2. Java 컴파일러가 Lombok 어노테이션 발견
      ↓
3. Lombok의 Annotation Processor가 실행됨
      ↓
4. AST(Abstract Syntax Tree) 분석 후 Getter/Setter 메서드 추가
      ↓
5. 최종적으로 변경된 바이트코드가 생성됨

📌 Lombok은 바이트코드를 직접 수정하여 개발자가 작성하지 않은 메서드를 추가하는 방식으로 동작함!

 

⚡ 4. Lombok의 주요 어노테이션과 동작 방식

✅ 1) @Getter & @Setter

클래스의 필드에 대해 자동으로 Getter/Setter 메서드를 생성

import lombok.Getter;
import lombok.Setter;

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

📌 컴파일 후

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; }
}

 

✅ 2) @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

자동으로 생성자(Constructor)를 추가

import lombok.*;

@NoArgsConstructor  // 기본 생성자
@AllArgsConstructor // 모든 필드를 포함한 생성자
@RequiredArgsConstructor // final 필드만 포함한 생성자
public class User {
    private String name;
    private final int age;
}

📌 컴파일 후

public class User {
    private String name;
    private final int age;

    public User() {} // @NoArgsConstructor

    public User(String name, int age) { // @AllArgsConstructor
        this.name = name;
        this.age = age;
    }

    public User(int age) { // @RequiredArgsConstructor (final 필드만 포함)
        this.age = age;
    }
}

 

✅ 3) @ToString

클래스의 필드를 포함하는 toString() 메서드를 자동 생성

import lombok.ToString;

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

📌 컴파일 후

public class User {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "User(name=" + this.name + ", age=" + this.age + ")";
    }
}

 

✅ 4) @Builder

빌더 패턴을 자동 생성

import lombok.Builder;

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

📌 컴파일 후

public class User {
    private String name;
    private int age;

    public static UserBuilder builder() {
        return new UserBuilder();
    }

    public static class UserBuilder {
        private String name;
        private int age;

        public UserBuilder name(String name) {
            this.name = name;
            return this;
        }

        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }

        public User build() {
            return new User(name, age);
        }
    }
}

사용 예제:

User user = User.builder().name("Alice").age(30).build();

 

⚡ 5. Lombok이 적용되는 시점 (컴파일 과정)

1️⃣ 개발자가 Lombok 어노테이션을 추가 (@Getter, @Setter, @Builder 등)

2️⃣ Java 컴파일러가 Lombok의 어노테이션 프로세서를 실행

3️⃣ Lombok이 AST(Abstract Syntax Tree)를 수정하여 자동으로 메서드를 추가

4️⃣ 바뀐 코드가 최종 바이트코드로 변환되어 실행 가능

 

📌 중요한 점은 Lombok이 “소스 코드 자체”를 수정하는 것이 아니라, “컴파일 과정에서 바이트코드를 수정”하는 방식으로 동작한다는 것!

 

⚡ 6. Lombok 설정 및 사용 방법

✅ 1) Lombok 라이브러리 추가 (Gradle & Maven)

// build.gradle
dependencies {
    implementation 'org.projectlombok:lombok:1.18.30'
    annotationProcessor 'org.projectlombok:lombok:1.18.30'
}
<!-- Maven -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

📌 주의: IDE(예: IntelliJ, Eclipse)에서 Lombok 플러그인을 설치해야 함.

 

⚡ 7. Lombok을 사용하면 안 되는 경우

상황 대안
리플렉션(Reflection) 사용 시 명시적으로 Getter/Setter 선언
코드 가독성이 중요한 경우 직접 메서드 작성
JPA(Entity) 사용 시 @Setter 사용 주의 (불변성 유지)

 

⚡ 8. 결론

Lombok은 컴파일 타임에 어노테이션 프로세서를 사용하여 바이트코드를 수정하는 방식으로 동작

반복적인 Getter, Setter, 생성자, toString() 등을 자동 생성하여 코드 간결화

빌더 패턴, 생성자 자동 생성 기능을 활용하여 가독성 및 유지보수성 향상

단, JPA 등에서는 무분별한 Setter 사용을 지양해야 함

 

🚀 Lombok을 잘 활용하면 개발 생산성을 크게 높일 수 있다

 

 

 

 

출처 : ChatGPT

'BE > Java' 카테고리의 다른 글

[Java] StringTokenizer  (0) 2025.03.16
[Java] 네이버 포매터(Naver Formatter)  (0) 2025.03.11
[Java] Java Collections Framework  (0) 2025.03.06
[Java] Mockito  (0) 2025.01.21
[Java] Servlet  (2) 2025.01.10