-
2. 그레이들 멀티프로젝트 - 공통자원 활용(compile project)스프링개발자/301 - 아키텍처 2020. 8. 30. 04:04
[배경]
지난시간에 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이 있어서 컨플릭 있는 파일들을 일일히 삭제해줘야됐다.
'스프링개발자 > 301 - 아키텍처' 카테고리의 다른 글
5. 그레이들 멀티프로젝트 - 데이터베이스 셋업 및 활용(1) - Entity, CollectionTable, 데이터베이스값 불러오기 (0) 2020.10.05 4. 그레이들 멀티프로젝트 - 유레카서버와 페인클라이언트 Eureka FeignClient (0) 2020.08.31 3. 그레이들 멀티프로젝트 - RestTemplate (0) 2020.08.30 1. 그레이들 멀티프로젝트 - 셋업하기 (0) 2020.08.30 스프링개발자 301 - 프로젝트 아키텍처 (0) 2020.08.13