2. 그레이들 멀티프로젝트 - 공통자원 활용(compile project)
[배경]
지난시간에 mono repo를 셋업했다.
이번에는 그 장점을 살려서 여러 application의 공유자원이 있는 resources 모듈을 만들어본다.
1. 부모Module과 자식Module
Intellij에서 우리의 root directory인 monorepo를 우클릭하여 자바 모쥴을 만든다.
spring-applications라고 이름지어주고, 지난 시간에 만든 어플리케이션 2개를 하위경로에 넣어둔다.

spring-resources라는 모듈을 만들고, shared-entities라는 sub모듈을 하나 만든다.
이후에 root경로에 있는 settings.gradle을 다음과 같이 바꾼다
rootProject.name = 'monorepo'
include 'spring-resources:shared-entities'
include 'spring-applications:main-application'
include 'spring-applications:weather-application'

폴더그림의 왼쪽아래에 파란색 네모가 있다. 인텔리제이가 module로 잘 인식하고 있다.
총 여섯개의 모쥴이 있어야 한다.
monorepo, spring-applications, main-application, weather-application, spring-resources, shard-entities
기존에 동작했던 어플리케이션이 여전히 자바,스프링부트 어플로써 잘 작동하는지 확인해보자.
모듈로 인식이 되지 않았다면, 스프링 어플로 인식하지 못한다.
또한 빌드하면, 각각의 어플리케이션에 jar파일이 생성되는것도 확인하자? 안된다
2. 자원공유 Module 활용하기
shared-entities에 model 패키지를 만들고, 다음의 User 클래스를 만든다.
package com.example.monorepo.model;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
@Data
public class User {
@NotNull
String id;
String name;
@Min(value = 0)
int age;
}
다음으로는, main-application에 rest controller를 하나 생성한다.
package com.example.monorepo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/main")
public class MainController {
@GetMapping(value = "/demo")
public String demo(){
return "hello world";
}
}
Get이므로, 브라우저에서도 http://localhost:8080/main/demo 를 들어가보면, hello world가 출력됨을 볼 수 있다.
위에서 만든 User 엔티티를 참조하려고 해보자.

리스트에 없다.
main-application의 build.gradle에 다음의 프로젝트 의존성을 추가한다.
compile project
dependencies {
compile project(":spring-resources:shared-entites")
}
이후에 컨트롤러로 돌아가보면

우리가 만든 User 클래스를 import할 수 있다.
weather-application/build.gradle또한 프로젝트 의존성을 업데이트 해준다.

이렇게 하면, 어플리케이션간의 의존성은 없고, 어플리케이션에서 spring-resources만 참고하면 된다.
좀 더 간편하게 관리할 수 있고, 반복되는 코드를 줄일 수 있다.
3. Postman 확인
@RestController
@RequestMapping(value = "/main")
public class MainController {
@GetMapping(value = "/demo")
public User demo(){
User myUser = new User();
myUser.setAge(10);
myUser.setName("2nd prince");
myUser.setId("1");
return myUser;
}
}

소스코드
https://github.com/2ndPrince/monorepo/tree/monorepo_shared_resources
[TroubleShooting]
1. gitignore파일을 만들기 전에 .gradle 디렉토리를 올려버렸더니 merge conflict이 있어서 컨플릭 있는 파일들을 일일히 삭제해줘야됐다.