ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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이 있어서 컨플릭 있는 파일들을 일일히 삭제해줘야됐다.

Designed by Tistory.