티스토리 뷰

요즘? MSA가 많은 IT 선도기업들 사이에서 사용이 되면서 보수적인 IT 회사들도 그 장점에 혹해서 기존의 Monolithic Architecture에서 탈피하고 싶어하는 움직임을 보이고 있다. 스프링 개발팀은 이렇게 추세가 변할것을 예상하고  Monolithic Architecture에서 Micro Service Architecture로 전환을 용이하게 할 수 있도록 springboot와 spring cloud 프로젝트를 시작했고 현재 이것들은 MSA를 하기 위해서는 필수적인 요소가 되었다. 

 

springboot는 spring과 다른것이 아닌 spring을 경량화한 마이크로서비스 프레임워크라고 보면 된다.

 

기업에서는 변화를 바라지만 또 변화를 바라지 않는다. 이게 무슨 X소리인가 싶겠지만 그렇다.. 즉 기존에 잘 쓰던 프레임워크가 있는데 아무런 문제없이 잘 사용하고 있었다. 수년간 쌓아놓은 수많은 자체 공통기능들이 내재되어 있는데 이걸 포기하기는 싫고 유행하는 MSA도 쓰고 싶은 상황인것이다. 원래 프레임워크의 기능들은 모두 가져가서 개발자들이 개발을 하는데는 전혀 문제가 없어야 하고 어플리케이션 아키텍처만 변경이 되어야 하는 상황이다.

 

그래서 spring web project에서 springboot project로 변경하되 기존의 기능들은 모두 가져가는 작업에 대해 써본다. 

 

AS-IS 프로젝트는 maven web project 이다. JDK11, spring 4.3.x, spring security 4.2.x, servlet 3.0.1, mybatis 3.4.x 등등의 기술셋을 사용한다. 또한 수많은 라이브러리들이 프로젝트 안에 있다. 급하게 바꿔야 했기에 기존의 공통기능들을 그대로 들고 가기 위해서는 라이브러리 종속성때문에 이 모든것의 버전을 바꿀수는 없었고 꼭 필요한 스펙의 버전만 바꿨다. 

 

예를들면 servlet 3.0.1 에서 servlet 3.1.0 으로 교체를 하였는데 교체를 한 이유는 다음과 같다. 

 

  [출처 : http://tomcat.apache.org/whichversion.html]


springboot에 내장된 톰캣의 버전이 8.5 이다 보니 Servlet 스펙 같은 경우는 올릴수밖에 없었다. 

 

이왕 springboot로 전환을 하는김에 springboot 2.x 버전으로 올리고 싶었는데 여기 저기에서 라이브러리 종속성 이슈(jackson version이 가장 문제가 되었었다..)가 발생을 하여 결국에 선택한 버전은 1.4.2 version 이다. 위에서 언급한 기술셋과는 가장 잘 어울리는 버전인것 같다. 아쉽기는 하지만 나중에 더 시간을 들여서 2.x로 올리며 종속성 이슈에 대해 분석하고 고쳐야겠다. 

 

springboot 의 버전을 정했으면 이제 springboot 관련 dependency, plugin을 pom.xml 에 정의를 해준다.

(maven 프로젝트명을 ABC 라고 한다면 구조는 parent인 ABC와 child로 ABC-web, ABC-common 이 있다. )

 

pom.xml (parent) - ABC

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>OingDaddy</groupId>
  <artifactId>OingDaddy</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>
  <name>OingDaddy</name>
  <description>OingDaddy</description>
  
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
    <relativePath/>
  </parent>
  ...

 

AS-IS 프로젝트 구조가 parent-child 구조이고 이 구조에서 parent에 spring-boot-starter-parent를 추가한다. 

 

pom.xml (child) - ABC-web

<dependencies>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
  </dependency>
        ...
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
  </dependency>

 

child에서는 spring-boot-starter-web과 security를 사용하기 위한 spring-boot-starter-security 를 추가했다.

또한 기본 view를 JSP로 사용하기 위해 jstl 과 tomcat-embed-jasper 를 추가해 줘야 한다.

 

springboot dependency 추가가 끝났다면 빌드를 위한 플러그인을 추가해줘야한다. 

 

pom.xml (child) - ABC-web

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <mainClass>abc.Application</mainClass>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
	
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-war-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <warSourceDirectory>src/main/webapp</warSourceDirectory>
        <failOnMissingWebXml>false</failOnMissingWebXml>
      </configuration>
    </plugin>
  </plugins>
</build>

 

springboot는 기동을 위한 Main 클래스가 존재해야 하는데 그것에 대한 위치를 정의할 수 있다. 이렇게 정의하지 않는다면 META-INF/MANIFEST.MF 파일을 만들어서 그곳에서 정의를 해줘야 한다. 

또한 springboot web project는 jar로 만들수도 있고 war로 만들수도 있는데 war로 선택을 했고 web.xml이 없어도 war파일 실행이 정상적으로 되게끔 failOnMissingWebXml 을 false로 설정을 하였다. 

 

pom.xml (child) - ABC-common

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.4</version>
    </plugin>
  </plugins>
</build>

 

공통으로 사용될 프로젝트는 jar로 빌드를 하면 된다. jar로 말기 위한 플러그인을 하나 추가시켜준다. 

 

이정도로 한다면 pom.xml 에서 하는 전환작업은 끝이 났다. maven update!

 

 

이제 web.xml 을 없애고 그걸 springboot 안으로 녹여내보자!

 

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (1) - pom.xml

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (2) - web.xml

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (3) - 파일 추가 및 변경

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (4) - logback

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (5) - 빌드 및 실행

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (6) - XML config to JAVA

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31