[SpringBoot] build.gradle 이 강조되고 반복되는 중요한 이유를 깨달았다.
난 여태까지 코끼리에 대해서 굉장히 무감각했었던 것 같다.
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 은 컴파일 시 추가적인 소스 삽입이 가능.
그것이 큰 차이인 것이다! 오!
오늘도 하나 배워갔으니 됐다 :)