티스토리 뷰

0. out / build 폴더의 차이

IntelliJ 에서 Gradle 기반의 프로젝트를 개발하면, 아래 그림과 같이 build 와 out 이 나누어져 있는 걸 볼 수 있습니다.

열어보면 둘다 빌드한 클래스 파일들을 가지고 있는데 무슨 차이인가 의하할 수 있습니다.

결론부터 말하자면, gradle build 시에는 build 폴더에, IntelliJ 에서 빌드시에는 out 폴더에 build 파일이 생성되게 됩니다.

IntelliJ 의 Project Setting 에 보면, Project > Project compiler output 에 out 폴더가 지정되어 있는 것을 볼 수 있습니다.

 

그래서 Gradle clean 을 하게 되면, out폴더는 삭제되지 않고 build 폴더만 삭제됩니다.
intellij preference 에서 gradle 을 검색하면 build / test 에서 intellij 를 사용할지 gradle 을 사용할 지 선택할 수 있습니다. intellij 를 선택하면 out 폴더에 잇는 classes 를 gradle 이라면 build 에 있는 파일을 사용합니다. 

preference 에 gradle 검색후 gradle 탭을 선택해보세요


1. gradle 과 intellij 의 차이

intellij 를 이용한 빌드와 테스트가 gradle 에 비해서 빠르기 때문에 intellij 를 이용해 테스트하는 것을 선호합니다. 하지만 intellij 로 작동 안되는 부분이 있는데 대표적으로 bytecode instrumentation 입니다. 

 hybernate의 bytecode enhancer 는 이미 컴파일 된 클래스에 최신 버전인 bytebuddy 를 사용하여 일부 바이트 코드를 조작하고 추가합니다. gradle / maven 을 이용하는 경우에는 런타입에 수행할 수 있지만. intellij 는 gradle 을 이용해 컴파일 하지 않고 AFAIK 기반의 자체적인 컴파일러를 사용합니다. 따라서 컴파일 이후에 실행되는 바이트 코드 조작은 intellij 를 이용한 컴파일 과정에서는 우회되고 결과적으로 사용할 수 없습니다.

  여기서 의문이 생기는 부분이 lombok 은 어떻게 작동할 수 있느냐인데, lombok 은 APT(annotation processing) 플러그인이기 때문에 코드 조작이 가능합니다.  APT 플러그인은 소스코드 생성하는 단계에서 작동합니다. 따라서 intellij 컴파일 과정에 매우 깊숙히 침투하여 작동한다고 생각할 수 있습니다. 


참고

intellij bytecode instrumentation:  https://youtrack.jetbrains.com/issue/IDEA-159903

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함