Spring Framework를 SpringBoot로 마이그레이션 하기 - 2

cometeYoon·2025년 1월 6일

SpringBoot

목록 보기
2/2

참고만 하세요. 과정 기록용입니다.

챗 GPT에게 마이그레이션 방법을 물어보기로 했다.

기존 프로젝트는 삭제 후 새로 만들면서 myBatis Framework를 추가하지 않아서 나는 오류가 있어 기존 dependencie에 myBatis만 더 추가해 주었다.


1. pom.xml → build.gradle / pom.properties → application.properties

1) 방법은 마이그레션 1 에서와 동일하다. 일단 SpringBoot version 과 dependency-management는 최신버전으로 설정해 주었다.

2) pom.properties 파일의 내용을 application.properties에 통합해준다.

<pom.properties>

#Generated by Maven Integration for Eclipse
#Fri Jan 12 16:34:16 KST 2024
m2e.projectLocation=C\:\\Users\\ITWILL\\git\\Table_zzimkong\\Table_zzimkong
m2e.projectName=Table_zzimkong
groupId=com.table
artifactId=zzimkong
version=1.0.0-BUILD-SNAPSHOT

<application.properties>

# Application Configuration
	spring.application.name=Table_zzimkong
# Maven Project Information
	project.groupId=com.table
	project.artifactId=zzimkong
	project.version=1.0.0-SNAPSHOT
# Project Path (MacOS)
	project.location=/Users/ITWILL/git/Table_zzimkong/Table_zzimkong
  • 여기서 모두 추가하면 안된다!! Maven 방식에서 gradle 방식으로 변환중이기 때문이다. Maven Project Information,Project Path 이두부분은 제거해준다.
# Application Configuration
	spring.application.name=Table_zzimkong
  • 결과적으로 Application Configuration 한가지만 추가해주면 된다.
group = 'com.table'
version = '1.0.0-SNAPSHOT'
  • group 과 version은 build.gradle에 위의 방식으로 이미 추가되어 있다.

2. mybatis-config.xml → 파일 그대로 사용 / application.properties

1) mybatis-config.xml 파일은 그대로 사용 가능하다.

  • 경로 : src/main/resources/mybatis-config.xml

2) application.properties(application.yml)에서 myBatis 경로를 추가해준다.

mybatis.config-location=classpath:/mybatis-config.xml

3. log4j.xml → log4j2.xml / log4jdbc.log4j2.properties → build.gradle,application.properties

1) log4j.xml파일을 log4j2.xml에 맞게 변환해준다.

<log4j.xml>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>
	<!-- Application Loggers -->
	<logger name="com.table.zzimkong">
		<level value="info" />
	</logger>
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>
	<logger name="org.springframework.web">
		<level value="info" />
	</logger>
	<!-- 이 부분부터 항목 추가 -->
	<!-- SQL Logger 추가 -->
	<!-- 1. jdbc.sqlonly : SQL 쿼리 문장에 대한 로그(전달인자 포함한 문장 표시) -->
	<logger name="jdbc.sqlonly" additivity="false">
		<level value="info" />
		<appender-ref ref="console" />
	</logger>
	<!-- 2. jdbc.sqltiming : SQL 문장과 실행에 소요된 시간(밀리초)에 대한 로그 -->
	<logger name="jdbc.sqltiming" additivity="false">
		<level value="info" />
		<appender-ref ref="console" />
	</logger>
	<!-- 3. jdbc.audit : JDBC 호출 정보에 대한 로그(ResultSet 결과값 제외) => 내용 많음 -->
<!-- 	<logger name="jdbc.audit" additivity="false"> -->
<!-- 		<level value="info" /> -->
<!-- 		<appender-ref ref="console" /> -->
<!-- 	</logger> -->
	<!-- 4. jdbc.result : ResultSet 객체 내용을 포함한 JDBC 호출 정보에 대한 로그 => 내용 많음 -->
<!-- 	<logger name="jdbc.result" additivity="false"> -->
<!-- 		<level value="info" /> -->
<!-- 		<appender-ref ref="console" /> -->
<!-- 	</logger> -->	
	<!-- 5. jdbc.resultsettable : SELECT 실행 결과(데이터 테이블 = ResultSet 객체 내용) 에 대한 로그 -->
	<logger name="jdbc.resultsettable" additivity="false">
		<level value="info" />
		<appender-ref ref="console" />
	</logger>
	<!-- 여기까지 항목 추가 -->
	<!-- Root Logger -->
	<root>
		<priority value="warn" />
		<appender-ref ref="console" />
	</root>	
</log4j:configuration>

<log4j2.xml>

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <!-- Appenders -->
    <Appenders>
        <!-- Console Appender -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%-5p: %c - %m%n" />
        </Console>
    </Appenders>
    <!-- Loggers -->
    <Loggers>
        <!-- Application Loggers -->
        <Logger name="com.table.zzimkong" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <!-- 3rd Party Loggers -->
        <Logger name="org.springframework.core" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <Logger name="org.springframework.beans" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <Logger name="org.springframework.context" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <Logger name="org.springframework.web" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <!-- SQL Loggers -->
        <!-- 1. jdbc.sqlonly : SQL 쿼리 문장에 대한 로그(전달인자 포함한 문장 표시) -->
        <Logger name="jdbc.sqlonly" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <!-- 2. jdbc.sqltiming : SQL 문장과 실행에 소요된 시간(밀리초)에 대한 로그 -->
        <Logger name="jdbc.sqltiming" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <!-- 3. jdbc.audit : JDBC 호출 정보에 대한 로그(ResultSet 결과값 제외) => 내용 많음 -->
        <!--
        <Logger name="jdbc.audit" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <Logger name="jdbc.result" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        -->
        <!-- 5. jdbc.resultsettable : SELECT 실행 결과(데이터 테이블 = ResultSet 객체 내용) 에 대한 로그 -->
        <Logger name="jdbc.resultsettable" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <!-- 여기까지 항목 추가 -->
        <!-- Root Logger -->
        <Root level="warn">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

2) log4jdbc.log4j2.properties 파일의 dependence를 build.gradle에 추가해준다.

implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'

3)log4jdbc.log4j2.properties 파일의 내용을 application.properties 에 통합해준다.

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
logging.level.net.sf.log4jdbc=DEBUG

4. web.xml / root-context.xml / servlet-context.xml → application.properties 추가

Spring Boot에서 기본적으로 제공되어 제거가 가능한 요소들은 추가하지 않았다.

1) web.xml

<web.xml>

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="Http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param> <!-- spring의 루트 애플리케이션 컨텍스트를 지정 -->
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener><!--  루트 컨텍스트를 로드 -->
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- Processes application requests -->
	<!-- Spring MVC의 DispatcherServlet을 설정하고, 해당 서블릿이 사용할 컨텍스트 파일 경로를 지정 -->
	<servlet><!--  서블릿 이름(appServlet)과 서블릿 초기화 파라미터를 정의 -->
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>		
	<servlet-mapping><!-- DispatcherServlet이 처리할 URL 패턴(/)을 지정 -->
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<!-- POST 방식 파라미터에 대한 한글 등의 인코딩 처리를 위한 필터 설정 -->
	<!-- CharacterEncodingFilter를 통해 POST 요청 시 UTF-8로 인코딩 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>	
	<!-- 필터가 모든 요청(/*)에 대해 동작하도록 설정 -->
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
  • Root Spring Container
    • context-param : Spring의 루트 애플리케이션 컨텍스트를 지정
    • listener : ContextLoaderListener를 통해 루트 컨텍스트를 로드
  • DispatcherServlet
    • Spring MVC의 DispatcherServlet을 설정하고, 해당 서블릿이 사용할 컨텍스트 파일 경로를 지정합니다.
    • servlet : 서블릿 이름(appServlet)과 서블릿 초기화 파라미터를 정의
    • servlet-mapping : DispatcherServlet이 처리할 URL 패턴(/)을 지정
  • CharacterEncodingFilter
    • filter : CharacterEncodingFilter를 통해 POST 요청 시 UTF-8로 인코딩
    • filter-mapping : 필터가 모든 요청(/*)에 대해 동작하도록 설정

<application.properties>

# CharacterEncodingFilter
spring.web.encoding.charset=UTF-8
spring.web.encoding.enabled=true
spring.web.encoding.force=true
  • Root Spring Container
    - UTF-8인코딩 설정 추가해줌
  • DispatcherServlet / CharacterEncodingFilter
    • DispatcherServlet : 자동으로 설정해줌
    • CharacterEncodingFilter : 기본적으로 지원함

2) root-context.xml

<root-context.xml>

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	<!-- Root Context: defines shared resources visible to all other web components -->
	<!-- HikariCP 라이브러리 사용을 위한 설정(커넥션풀 설정) -->
	<!-- 1. HikariCP 를 활용한 DB 접속 정보 설정 위해 HikariConfig 객체 설정(JDBC 기본 설정) -->
	<!-- com.zaxxer.hikari 패키지의 HikariConfig 클래스 지정 및 속성 설정 -->
	<!-- <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> -->
	<!-- <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> -->
	<!-- <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/study_spring5"></property> -->
	<!-- <property name="username" value="root"></property> -->
	<!-- <property name="password" value="1234"></property> -->
	<!-- </bean> -->
	<!-- SQL 로그를 위한 log4jdbc 라이브러리 관련 DBCP 정보 변경(driverClassName, jdbcUrl 속성만 
		변경) -->
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
		<property name="jdbcUrl"
			value="jdbc:log4jdbc:mysql://itwillbs.com:3306/c5d2308t2"></property>
		<property name="username" value="c5d2308t2"></property>
		<property name="password" value="1234"></property>
	</bean>
	<!-- 2. HikariCP 를 통해 커넥션을 관리하는 DataSource 객체(HikariDataSource) 설정 -->
	<!-- 생성자 파라미터(<constructor-arg ref="">)로 1번에서 생성한 HikariConfig 객체 전달 -->
	<!-- 주의! 1단계에서 입력한 정보가 일치하지 않을 경우 서버 실행 시점에 현재 단계에서 예외 발생 -->
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
		<constructor-arg ref="hikariConfig"></constructor-arg>
	</bean>
	<!-- 3. Connection 객체 생성, 쿼리 전달 및 결과 리턴 등의 작업을 수행할 SQLSessionFactory 객체 
		설정 -->
	<!-- MyBatis - Spring 연결을 담당하며, 내부적으로 SQLSession 객체를 통해 작업 수행 -->
	<!-- 주의! 1) 이전에 이미 DataSource 객체 설정이 완료되어 있어야 함 2) <bean> 태그의 id 값, class 
		값은 고정 3) <property> 태그의 name 속성의 dataSource, configLocation, mapperLocations 
		이름 고정 4) dataSource 속성의 ref 속성값은 2번에서 설정한 id 속성값 사용 5) configLocation, mapperLocations 
		속성(항목)에 지정된 각각의 파일(xml)이 실제 위치에 생성되어 있어야 함 (설정 항목 중 classpath 가 가리키는 기본 위치 
		: src/main/resources 패키지) -->
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation"
			value="classpath:/mybatis-config.xml"></property>
		<property name="mapperLocations"
			value="classpath:/com/table/zzimkong/mapper/*Mapper.xml"></property>
	</bean>
	<!-- >>>>>>>>>>>>>>>>>>>>> 트랜잭션 설정 추가 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
	<!-- 내부 property 태그에 2번에서 설정한 datasource 객체지정 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!--  tx:anotation-driven 태그를 통해 생성한 트랜잭션 관리 객체 지정 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
	<!-- 4. MyBatis 연동에 사용될 객체(클래스)들의 패키지 위치 지정(기본 루트 패키지 지정) -->
	<mybatis-spring:scan
		base-package="com.table.zzimkong" />
</beans>

<application.properties>

# HikariConfig
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://itwillbs.com:3306/c5d2308t2
spring.datasource.username=c5d2308t2
spring.datasource.password=1234
# DataSource
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# SqlSessionFactory Bean
mybatis.config-location=classpath:/mybatis-config.xml
mybatis.mapper-locations=classpath:/com/table/zzimkong/mapper/*Mapper.xml
  • Transaction Manager
    • SpringBoot에서 기본적으로 제공된다.

3) servlet-context.xml

<servlet-context.xml>

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />
	<tx:annotation-driven/>
	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />
	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
		<!-- 폼에 파일 업로드 위해서 설정하면 그거 자동을 처리해주는놈 아이디값은 약속된거 써야됨-->
	<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="maxUploadSize" value="10485760"></beans:property>
		<beans:property name="defaultEncoding" value="UTF-8"></beans:property>
	</beans:bean>
	<context:component-scan base-package="com.table.zzimkong" />
</beans:beans>

<application.properties>

# View Resolver
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
# Multipart Resolver
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.default-encoding=UTF-8
  • Annotation-driven / tx:annotation-driven
    • SpringBoot에서 자동으로 활성화 된다.
  • resources mapping
    • SpringBoot에서 기본적으로 제공 된다.
  • context:component-scan
    • @SpringBootApplication을 통해 자동으로 처리된다.

기본적인 설정파일은 모두 수정되었다. refresh gradle project를 실행해보면 오류는 생기지 않는다. 다음은 boot Dashboar에서 실행했을 때 생기는 오류를 수정해볼 생각이다.

profile
개발블로그

0개의 댓글