스프링/백엔드

Compile과 implementation의 차이점

지팡구 2022. 1. 30. 21:23

현재 인프런이라는 강의 서비스에 CTO로 계신 김동욱님의 책인 '스프링부트와 AWS로 혼자 구현하는 웹 서비스' 라는 책을 통해 다시 웹 백엔드 부분을 공부하고 있다.(유툽에서 분명히 많이 본 이름이였는데, 아 그분? 하면서 얼굴이 떠올랐다. 그분이 그 분인거 같다....)

 

책에서는 인텔리제이와, JPA, JUnit테스트, Gradle, 소셜로그인, AWS 인프라로 무중단 배포까지를 망라해 책을 공부하는 독자들에게 지식을 전수해준다. 이 책이 끝판왕 개발 서적은 아니지만 더 깊은 내용을 공부하고 싶다면 다른 책을 찾아봐야한다. (인프런의 김영한-JPA수업 추천)

 

해당 책은 이미 서버 개발자(주니어 급)를 꿈꾸는 학생 또는 취준생이라면 한 번쯤은 봤거나, 접해볼 만한 책일 것이다.

내가 여기서 얻고자 하는 것은   책을 통해 간단한 미니 프로젝트를 통해 스프링에 대한 감각찾기를 중점으로 부족한 부분을 채워나가고자 서점에서 책을 구입해 공부를 하고있다. 

 

과거에 김영한님의 Spring 강의와 JPA강의도 들었고, 한동안 너무 스프링을 안하다 보니 감각이 너무 무뎌져서 다시 그 감각을 찾고자 한다.

                                      

이 책을 통해 공부를 하는 중에 궁금한 것이 생겨 이렇게 정리를 해본다.

 

우선 책에서는 라이브러리를 임포트할 때 여기서는 compile을 사용했는데,  일반적으로 내가 과거에 스프링을 했을 때는 implementation을 사용했었다. 그래서 문득 차이가 궁금해 찾아보았고,  그 내용은 다음과 같다.

 

https://docs.gradle.org/에서 참고한 자료

우선  gradle 공식 문서를 해석해보면

implementation은 프로젝트에 의해 노출되는 API의 일부가 아닌, 프로젝트의 소스 프로덕션을 컴파일 할 떄, 요구되어지는(필요한) 의존성들을 말한다.  예시로 프로젝트는 내부의 영속성 계층의 구현을 위해 하이버네이트를 사용한다.

 

api(compile)는 implementaion와 비슷하지만 프로젝트에 의해 노출이 된다는 점이 다르다. 예시로 프로젝트는  Guave를 사용하며, Guava 클래스 속의 메서드 시그니쳐와 함께 공용 인터페이스를 노출한다.

(직독한 해석이 맞나?...)

 

출처 : https://bluayer.com/13

그림을 통해 이해를 해보자면 A를 의존하고 있는 모듈이 B,C 라고 가정해본다.

(모듈의 구조는 좌측의 Example of modules와 같다고 가정) 

 

1. Compile(api)를 사용하는 경우

A라는 모듈을 수정하면,  이 모듈을 직접 혹은 간접 의존하고 있는 B와 C는 모두 재빌드 되어야 함.

 

2. Implementaion을 사용하는 경우

B라는 모듈을 수정하면, 직접 의존하고 있는 B만 재빌드 함.


compile은 상위 모듈까지 가져온다

>> compile은 implementation 보다 더 많은 라이브러리를 빌드한다. 

(이 말이 즉슨 만약에 내가 필요한 기능을 라이브러리를 통해 빌드할 때, 불필요한 라이브러리까지 가지고 온다는 말인가? implementation이 그럼 compile보다 속도가 더 빠르겠네? )

 

덕분에 implementaion의 장점 중 하나가 빠르다라는 이점이 있다.

연결된 dependency가 줄어들고, change하는 것이 있더라도 recompile을 적게 하니 소요하는 시간이 적다.

 

결국 api의 노출의 차이가 정답이다. compile은 연결된 api가 모두 노출되고, implementaion은 노출되지 않는데,  아무래도 api가 노출되면 api로직에서 유효성 검사 및 기타 원하지 않는 형태의 데이터가 들어와 보안의 위협이 발생한다. 

 

결국 gradle 3.0이상 부터는 compile의 사용을 권장하지 않으며, compile은 api로 deprecated 되었다.

(중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지는....)

그래서 상위 모듈까지 전부 사용하고 싶을 땐 compile 대신 api를 사용하고, 일반적인 상황에서는 implementaion을 사용하는 것이 좋다. 

 

참고 )

https://stackoverflow.com/questions/44493378/whats-the-difference-between-implementation-api-and-compile-in-gradle

 

What's the difference between implementation, api and compile in Gradle?

After updating to Android Studio 3.0 and creating a new project, I noticed that in build.gradle there is a new way to add new dependencies instead of compile there is implementation and instead of

stackoverflow.com

 

https://docs.gradle.org/current/userguide/dependency_management_for_java_projects.html#sec:configurations_java_tutorial

 

Managing Dependencies of JVM Projects

How does Gradle know where to find the files for external dependencies? Gradle looks for them in a repository. A repository is a collection of modules, organized by group, name and version. Gradle understands different repository types, such as Maven and I

docs.gradle.org

https://www.redhat.com/ko/topics/security/api-security

 

API 보안이란?

API 보안은 사용자가 소유하는 API와 사용하는 API 모두의 무결성을 보호합니다.

www.redhat.com