티스토리 뷰

Java/Effective Java

[Item39] Lombok 알아보기

ryumodern 2022. 3. 22. 21:41

Item39는 명명 패턴보다 애노테이션을 사용하라 말한다

좁게 보면 명명 패턴에 해당하는 내용이지만 넓게 보면 직접 지정하지 말고 책임을 갖고 있는 도구에게 위임하라는 것이다

JUnit4 이전까지는 테스트 코드를 작성할 때 테스트 돌릴 메서드의 이름을 testXX처럼 지어야 했다고 한다

test로 시작한다고 해서 특별히 힘든 것은 아니다

다만 test로 시작하지 않으면 테스트가 돌아가지 않는 것이 문제다

 

JUnit4는 이 문제를 @Test 애노테이션으로 해결한다

@Test는 테스트용임을 표시하는 marker annotation이고 이를 처리하는 annotation processor가 따로 있다

애노테이션 프로세서가 없다면 무용지물이니 IDE 세팅에서 활성화 시키는 것이 필요하다

 

Compiler -> annotation processor

 

gradle을 사용하고 있다면 build.gradle에 아래와 같은 활성 코드가 들어간다

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

 

자바 프로그래머에게 애노테이션 프로세서의 가장 큰 혜택을 받고 있는 것으로 롬복을 예로 들 수 있다

자바는 개떡 같이 짜지 않는다면 타입 안정성이 보장되고 내부로 들어가면 C/C++ 베이스기에 성능도 어느 정도 보장되고

레퍼런스도 많고 범용적인 프로그램에 최강이라 할 수 있지만 치명적인 단점으로 boiler plate가 너무 많다

자바를 좋아하는 입장에서도 이는 무시할 수 없으며 코틀린에서는 엘비스 연산자(?.)를 활용해 간단하게 풀 수 있는 문제도

옵셔널 체이닝을 통해 길고 긴 코드가 만들어진다

뿐만 아니라 getter, setter .. 등등의 필수적이지만 작성하기 귀찮은 코드들이 많다

IDE가 발전함에 따라 자동으로 만들어주기도 하지만

여전히 소스에서 중요한 코드보다 중요치 않은 코드가 차지하는 자리가 많아지는 일이 흔하다

 

롬복을 사용하면 수 많은 boiler plate를 애노테이션 기반으로 생성할 수 있는데 롬복의 애노테이션 프로세서 덕분이다

동작 원리는 아래의 블로그를 참고해보자

 

Lombok은 어떻게 동작되나? 간단정리

개인적으로 개발관련 내용을 정리하는 잊지말자 블로그 입니다.

free-strings.blogspot.com

 

개발 공부 초기 시절에는 코드 짜고 IDE로 컴파일 돌리고 run 버튼만 누르면 땡이었는데

얼마 전에 백기선님의 더 자바 강의를 보고 간단하게나마 자바의 구성, 동작 원리를 살펴보며 신세계를 경험했다

직접 작성한 *.java 코드는 컴파일을 거쳐 *.class가 되고 클래스 로더에 의해 JVM 위로 올라가 execution engine이 실행한다

GC가 우리 대신 메모리 청소도 해주고 클래스 로더는 우리 코드뿐만 아니라 자바가 제공하는 기본 API들도 올려준다

 

여기서 롬복은 한 발 더 깊게 들어간다

자바의 컴파일러는 도구 하나가 뿅 하고 완성 시키는게 아니라 아래의 API들을 활용해 컴파일을 수행한다

- Language Model API

- Annotation Processing API

- Compiler Tree API

 

Language Model은 큼지막한 단위로 이건 필드고, 저건 메서드고, 요건 애노테이션이고 등등을 나타내고

Annotation Processing은 애노테이션으로 지정된 놈들을 처리하는 특별한 처리기이고

Compiler Tree는 인터페이스를 AST(Abstract Syntax Tree)로 제공한다

 

https://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/index.html

 

간단히 보면 소스를 다 분해해서 필드, 메서드, 인터페이스 등등을 의미 별로 나눠서 트리를 만들고

Visitor 패턴을 이용해 들러가면서 추가 작업을 수행하여 바이트 코드를 만들고 완성된 형태의 *.class로 만들어준다

이 과정에서 Lombok의 처리기가 동작하여 @Getter가 붙어 있으면

Syntax Tree를 통해 필드 변수들을 돌아서 'getField'로 바이트 코드를 만들어버린다

private으로 선언된 필드 변수 또한 getter가 생성되는데 Reflection API 같은 것을 사용하지 않으면 허용되지 않는 접근이다

롬복은 컴파일 타임에 자바 내부용으로 사용되는 internal API를 사용하기 때문에 private이고 뭐고 다 만들어버린다

이 때문에 롬복은 해킹이다라는 소리가 나오기도 한다

 

그렇다고 해서 롬복을 쓰지 않으면 마땅한 대안도 없고

해킹이지만 나온 지 10년도 넘은 프로젝트기에 별 걱정 없이 사용해도 될 것 같다

명명 패턴보다 애노테이션임을 알아보다가 롬복을 깔짝 알아보았다

댓글
링크
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday