끄적끄적

Gradle 명령어로 프로젝트 만들고 실행시키기(with multimodule) 본문

개발/java & spring

Gradle 명령어로 프로젝트 만들고 실행시키기(with multimodule)

코리이 2022. 10. 25. 18:30

서론

필자는 회사에서 주로 node.js(nest.js) 기반으로 개발을 하는데 최근에 어느 신입 개발자 친구와 이야기를 나누다가 이상한 소리를 들었다. 

신입: node 는 터미널을 사용해서 만들어야 해서 더 어려운것 같아요.
나: Spring 쓰면 터미널 사용 안해도 되나요?? 앱을 실행시키고 싶으면 어떻게 하나요?
신입: IntelliJ 에서 다 개발 가능해요. 그냥 안에서 스타트 누르면 다 가능해요.
나: 터미널에서 따로 빌드는 안하나요?? CI 는요?? 배포할 때는 필요하잖아요.
신입: 굳이 할 필요 없어요. CI/CD 는 제가 만들지 않아서 잘 모르겠네요. docker 쓰면 굳이 필요 없지 않아요?
나: ?????????

 

무슨 소리인가 싶었는데 인텔리제이에서 많은 기능을 제공해주다보니 터미널이 필요 없다는 이상한 소리를 하고 있었다.

풀어서 이야기 하자면 gradle 프로젝트로 spring app 을 개발했는데 gradle 로 빌드 할 줄 모르고 jar 파일로 직접 배포할 줄 모른다는 이야기다.

필자도 spring 으로 딥하게 앱을 만들어본 기억은 없지만(단순 외주정도만 진행) 저게 개소리라는 것 즈음은 알 수 있을 것 같다.

그래서 이번에 스프링 공부를 조금 해보고 있어서 intellij 를 사용하지 않고 빌드하는 과정에 대해서 이야기해보고자 한다.

gradle

gradle 설치는 mac 에서는 brew 로 쉽게 설치 가능하다.

$ brew install gradle

새로운 프로젝트에서 gradle init 을 해보자

$ gradle init

그러면 어디선가 익숙한 형태의 프로젝트가 생성된 것을 알 수 있을 것이다.

그렇다. 우리가 IDE 로 새로운 프로젝트를 생성하면 생기는 그 형태이다.

그러면 이 프로젝트를 가지고 이전 포스팅 에서 설정한 대로 gradle 멀티 모듈 프로젝트로 spring boot app 을 만들고 다음을 진행하도록 하자.

gradle wrapper

gradle 프로젝트를 실행시키면 gradle/wrapper 및 gradlew, gradle.bat 파일이 생기는 것을 알 수 있다.

gradle 과 같은 패키지 매니저를 사용할 때 A 라는 프로젝트에서는 6 버전을 쓰고, B 라는 프로젝트에서는 7 버전을 쓰는 경우 분명히 버전때문에 꼬일 것이다.

그래서 프로젝트별로 gradle 버전을 사용할 수 있도록 만들어준 것이다. 여기서 gradlew 는 mac 혹은 linux 계열에서 사용하면 되고 gradle.bat 은 window 에서 사용 가능하다.

그럼 내장 gradle 을 가지고 빌드를 해보자. 이전 포스팅에서 진행한 root 폴더로 우선 이동해주자. 그 후에 아래 명령어를 통해 실행해본다.

# window 인 경우에는 gradle.bat 을 이용하면 된다.
$ ./gradlew build
$ ls ./api/build/libs

그러면 아래처럼 jar 파일로 빌드가 완료된 것을 확인할 수 있다.

 

이 jar 파일을 실행해보자.

또한 아래 처럼 spring properties 를 따로 지정해서 띄워줄 수도 있으니 필요한 경우 사용하면 된다. 예시로 application-sample.properties 를 만들어서 port 만 9091 로 변경해서 실행시켜 보았다.

$ java -jar ./api/build/libs/api-0.0.1.jar \
--spring.config.location=./application-sample.properties

아래처럼 정상적으로 실행되는 걸 확인할 수 있을 것이다.

이제 이 빌드 파일을 배포할 서버에 복사해서 사용하면 수동 배포가 완료 되는 것이다. (CD 도구들을 쓰면 더 편하겠지만)

 

추가적으로 자주 사용하는 명령어는 아래가 있다.

# clean
./gradlew clean

# 테스트
./gradlew test
./gradlew clean test # 클린 후 테스트

# 멀티모듈 빌드 & 테스트
./gradlew :multi-module:build
./gradlew :multi-module:test

결론

결국 대부분의 개발이 개발-> 빌드 -> 빌드 파일 실행 이라는 기본적인 프로세스로 진행된다. node(ts) 로 개발해도 마찬가지고 go 로 개발해도 동일한 프로세스로 진행된다.

하지만 IDE 가 좋아지고 고도화되면서 기본적인 것조차 모르는 사람이 있다는 것이 나름 충격이였다. 필자도 기본적인 것을 대충 넘어가고 있는지 한번 더 돌아보는 계기가 되었던 것 같다.