ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot Maven Multi Module 개발환경 설정하기
    Server/Spring Boots 2020. 11. 11. 19:17

     

    spring.io/guides/gs/multi-module/

     

    Creating a Multi Module Project

    this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

    spring.io

    멀티 모듈 프로젝트로 개발하게 되면 여러가지 장점이 있다.

     

    공통의 모듈을 한 곳에서 관리함으로써 중복되는 소스 코드를 최소화하게 되며, 이에 따라 개발 할 때는 자신이 개발해야 하는 부분에 좀 더 촛점을 둘 수 있다. 장점에 대한 소개는 제쳐두고, 환경 세팅에 대해 고민해봤다.

     


    1. maven parent project의 생성

     

    아래는 jt-root의 pom.xml 파일이다.

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.****</groupId>
      <artifactId>jt-root</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
      <modules>
      	<module>****-backoffice</module>
      	<module>****-backoffice-api</module>
      	<module>****-backoffice-core</module>
      </modules>
    </project>

     

    root 혹은 parent의 maven project는 packaging을 pom으로 갖는다. 

     

    생성시에는 Maven Project로 생성할 수 있다.

    simple project를 체크해주자. (보다 간편하게 프로젝트를 생성할 수 있다.)

     

    packaging은 pom으로 선택해주자.


    2. 하위 프로젝트(Maven Module Project)의 생성

     

    크게 생성하는 방법은 두가지다. 첫번째 방법은 Maven Module로 생성하는 것이다.

    가장 표준적인 방법이지만 이 방법으로는 깡통 자바 메이븐 프로젝트가 하위프로젝트로 생성이 되므로, 만약 Spring Boot를 하위 프로젝트로 만들고자 하는 경우 수동으로 Spring boot 프로젝트처럼 세팅을 해주어야 한다. (pom.xml, application.properties 등)

     

    두번째 방법은 Spring Starter Project로 생성하는 것이다. 


     

    이 방법으로 할 경우에는 default location이 아닌 parent project의 하위 경로에 생성을 하여야 한다. 그리고 parent project에 module로 등록을 해야 한다.

     


    api를 만들기 위해서 mybatis - mysql 를 이용하여 db에서 data를 가져오는 mapper와 service를 생성한다. 이 때 api 프로젝트가 아니라 core 프로젝트에 넣는다.

     

     공식 가이드를 보면 알겠지만, library 프로젝트 (내가 세팅한 환경에서는 core 프로젝트) 또한 스프링 부트 프로젝트이다.

     

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
        https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.3.2.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.example</groupId>
    	<artifactId>multi-module-library</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>multi-module-library</name>
    	<description>Demo project for Spring Boot</description>
    
    	<properties>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    			<exclusions>
    				<exclusion>
    					<groupId>org.junit.vintage</groupId>
    					<artifactId>junit-vintage-engine</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>

    즉, library 프로젝트는 독립으로 돌아갈 수 있는 프로젝트인 셈.

     


    Core project의 구성

     

    이렇게 구성하면 mapper와 service, xml 파일, 심지어는 controller 까지도 core에 두고 개발이 가능하다. 

     

    api 서버의 구성

     

    @SpringBootTest
    @ContextConfiguration(classes=****BackofficeApiApplication.class)
    public class ClickPaidServiceTest 
    {
    	Logger logger = LoggerFactory.getLogger(ClickPaidServiceTest.class);
    	
    	@Autowired
    	ClickPaidService cps;
    	
    	@Test
    	public void test()
    	{
    		int a = cps.selectCount(Date.valueOf("2020-10-21"), 20);
    		logger.info(""+a);
    	}
    }

    다만 core 프로젝트를 참조하는 다른 프로젝트에서 JUnit을 통해 단위 테스트를 할 때는 ContextConfiguration을 통해 Application.class 를 지정해주어야 한다. 그렇지 않으면 중복되는게 있다고 에러 메세지가 뜬다.

     


    application.properties 등 api에 중복되는 파일이 존재하는 경우, core의 파일이 아니라 api의 파일을 우선적으로 선택하여 실행한다.

    댓글

Designed by Tistory.