나만보는페이지

[intelliJ] lombok 생성 코드 확인하기 본문

IntelliJ

[intelliJ] lombok 생성 코드 확인하기

pplenty 2020. 4. 13. 01:27

왜 lombok 을 사용할까?

롬복(lombok)의 동작원리는 간단하게 말해 컴파일 시점에 바이트 코드를 변환하여 원하는 부분을 주입해주는 방식이다.
때문에 우린 Getter, Setter, Constructor 등을 롬복 어노테이션을 추가함으로써 의미 없는 반복적인(귀찮은) 코드를 생성하지 않아도 되고 코드를 읽는데 한층 수월해진다.

게터 함수 이름이?

하지만 가끔 변수를 선언 하다가, @Getter 를 사용하게 되면, 게터 함수의 이름이 헷갈릴 때가 있기도 하다.
내가 적용한 롬복 어노테이션이 어떻게 반영되는지, 혹은 어떻게 동작하는지 알고 싶을 때가 있다.
비교적 간단한 @Getter@Setter 같은 경우에는, 해당 객체에서 IDE 의 자동완성 기능을 이용해 메서드 목록을 보면 알 수 있긴 하지만 @NonNull 이나 @Builder 같은 경우는 코드가 어떤식으로 변할지 상상이 가질 않는다.

Structure 를 이용한 함수명 확인

IntelliJ 에서 정말 간단하게 생성된 함수를 확인할 수 있는 방법이 있다. Structure (⌘ 7) 를 이용하는 것이다.

  • 아래와 같이 @AllArgsConstructor@Getter 2개의 롬복 어노테이션을 적용한 도메인 클래스가 있다.

    @AllArgsConstructor
    @Getter
    public class Member {
        int id;
        String name;
        int age;
        boolean active;
    }
  • Structure 를 확인해보면 아래에 빨간 네모 부분이 롬복에 의해 생성된 함수 및 생성자이다.
    이렇게 심플하게 해당 함수나 생성자의 구조를 확인해볼 수 있다.(함수명, 파라미터 타입, 반환 타입 등)
    Member.java Structure

Decompiler 를 이용해 변환된 코드를 직접 확인

IDE 에서 기본적으로 제공되는 디컴파일러를 이용해 직접 바이트코드를 확인하는 방법이다. 별도의 프로그램을 이용해도 상관없다.
먼저 해당 java 파일의 컴파일된 output 파일이 어디에 생성되는지를 확인하여야 한다. 아래 캡쳐 부분은 gradle 환경에서 기본 설정 기준으로 작성하였다.

  • {프로젝트 루트}/build/classes/{java 소스와 동일한 경로} 에 Member.class 파일이 생성되어 있는 것을 확인할 수 있다.
    class file location

  • 해당 파일을 열어보면 디컴파일된 변환된 코드를 확인할 수 있다. 참고로 현재 파일을 다시 컴파일(recompile) 하는 단축키는 ⇧ ⌘ F9 이다.(메뉴 - Build - Recompile)
    decompiler에 의해 decompile 된 Member.class 파일이다.

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

public class Member {
    int id;
    String name;
    int age;
    boolean active;

    public Member(final int id, final String name, final int age, final boolean active) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.active = active;
    }

    public int getId() {
        return this.id;
    }

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public boolean isActive() {
        return this.active;
    }
}

  • 많이 사용되진 않지만 @NonNull 어노테이션이 어떤식으로 코드를 생성하는지 확인해보자.

    @Getter
    public class Member {
        int id;
        String name;
        public String nickname(@NonNull String prefix) {
            return prefix + " " + name;
        }
    }
  • 코드를 확인해보니 아래와 같이 if-else 문으로 감싸고, NullPointerException 을 던져주는 부분이 삽입되었다.
    @NonNull 의 RetentionPolicy 는 CLASS 로 클래스 파일에도 어노테이션이 남아있다.
    @NonNull 디컴파일


  • 자주 사용되는 @Builder 는 어떻게 변환될까?

    @Builder
    public class Member {
        int id;
        String name;
        int age;
    }
  • 내부 스태틱 빌더 클래스를 만들고 toString 함수까지 만들어준다는 것을 확인할 수 있다.
    @Builder 디컴파일

정리

실제 생성되는 바이트 코드를 눈으로 확인함으로써, 사용하는 lombok 어노테이션에 확신을 가지고 사용할 수 있게 되었다.

Reference

Comments