스펙도 쌓니

[SpringBoot] build.gradle 이 강조되고 반복되는 중요한 이유를 깨달았다.

군포망나니 2024. 11. 5. 22:39

난 여태까지 코끼리에 대해서 굉장히 무감각했었던 것 같다.

SpringBoot3 를 공부하던 중에 책과 소스가 그대로였다고 생각하고 실행해보니 JPA 로 테이블이 잘 생성이 되지만 데이터가 들어가지 않는 문제 상황이 발생하였다. 

 

에러가 발생하지 않아 책과 일일히 비교할 수밖에 없었다. 

하지만 그대로 똑같다고 생각한 난 

아마도 build.gradle 의 문제가 아닐까 라는 생각을 해봐 훑어봤다. 

근데 분명 책에서 의존성의 5가지 키워드에 대해 봤던 기억을 떠올렸다. 

impleametation

testImplementation

runtimeOnly

complieOnly

annotaionProcessor 

 

한 번 쓱 보고 지나갔기에 모두 기억하지 못했지만

각 개념에 대한 설명에 '컴파일' '런타임' 이라는 단어가 반복됐다는 것을 기억했다. 

 

지금 내가 하고 있던 것은 /test 메서드를 매핑하고 Member 객체를 만들어 실행할 때마다 테이블을 생성하고 데이터를 넣는 JPA를 구현한 아주 간단한 과제다. 

 

근데 빌드 ? 컴파일 ? 런타임 ? 이것과 관련이 있겠다 싶은 난 내가 적은 (자동완성)소스가 책의 소스와 다르다는 것을 알았다. 

 

내 소스

    implementation 'org.projectlombok:lombok'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.h2database:h2'

 

저자의 소스

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'com.h2database:h2'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

 

역시.. 

바꿔주니 실행만 잘 되었습니다. 

 

                   annotationProcessor 'org.projectlombok:lombok'

 

요것의 문제였다. 

 

그런데 의문이 들었다.

implementation 은 컴파일 시점과 런타임 모두 가능하고 

annotaionProcessor 은 컴파일시에 애너테이션을 처리할 때 사용한다. 

또한 compliOnly 는 런타임에는 포함되지 않아야 하고 컴파일 시에만 필요하다. 

 

나는 implementation 이거니까 

잘 동작해야만 맞지 않나?

 

그래서 힘을 빌리고자 한다. 어디에? 다른 훌륭한 개발자에게! 

 

https://mirr-coding.tistory.com/65

 

[Spring] Annotation Processor

mapstruct processor 를 implementation 을 통해 의존성을 부여하였을 때 다음과 같은 예외가 발생하였습니다.  우선 문서에 나와있는대로 annotationProcessor 를 통해 의존성을 받아오니 정상동작은 하였지

mirr-coding.tistory.com

 

보니까 impleamentation 은 컴파일 시에 경로만 설정하는 것이라, 추가적인 소스 삽입 즉 수정을 못한다. 

하지만 annotationProcessor 은 컴파일 시 추가적인 소스 삽입이 가능. 

 

그것이 큰 차이인 것이다! 오!

 

오늘도 하나 배워갔으니 됐다 :)