# ๐Ÿ“˜ Legacy Spring MVC (AS-IS) to Spring Boot 4.0.7 (TO-BE) ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ ๋ณธ ๋ฌธ์„œ๋Š” ๋ ˆ๊ฑฐ์‹œ Spring MVC ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ(`first_old`)๋ฅผ ์ตœ์‹  **Spring Boot 4.0.7 (Java 21, Jakarta EE 10)** ํ™˜๊ฒฝ(`first`)์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ  ์‚ฌ์–‘, ์•„ํ‚คํ…์ฒ˜ ๋ณ€๊ฒฝ์ , ์„ค์ • ๋งคํ•‘ ๋ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋‚ด์—ญ์„ ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋งค๋‰ด์–ผ์ž…๋‹ˆ๋‹ค. --- ## 1. AS-IS vs TO-BE ๋น„๊ต ์•„ํ‚คํ…์ฒ˜ | ๊ตฌ๋ถ„ | AS-IS (`first_old`) | TO-BE (`first`) | ๋ณ€๊ฒฝ ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‚ฌ์œ  | | :--- | :--- | :--- | :--- | | **Java Version** | Java 8 (1.8) | **Java 21 (LTS)** | ํ˜„๋Œ€์ ์ธ Java LTS ์ŠคํŽ™ ํ™œ์šฉ ๋ฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ | | **Framework** | Spring Framework 3.2.18 | **Spring Boot 4.0.7** | ์Šคํ”„๋ง ๋ถ€ํŠธ ์ƒํƒœ๊ณ„ ํ†ตํ•ฉ ๋ฐ ๋‚ด์žฅ ์„œ๋ฒ„/์ž๋™ ์„ค์ • ์ ์šฉ | | **Servlet Spec** | Java EE / Servlet 2.5 (`javax.servlet.*`) | **Jakarta EE 10 (`jakarta.servlet.*`)** | Java EE โ†’ Jakarta EE ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ‘œ์ค€ ๋ณ€๊ฒฝ ๋Œ€์‘ | | **View Engine & JSTL** | JSTL 1.2 (`http://java.sun.com/jsp/jstl/core`) | **Jakarta JSTL (`jakarta.tags.core`)** | `tomcat-embed-jasper` ๋ฐ Jakarta ์ŠคํŽ™ ํƒœ๊ทธ๋ฆฝ ์ ์šฉ | | **ORM / Data Access** | MyBatis 3.2.2 + egovframework `EgovAbstractMapper` | **MyBatis Spring Boot Starter 4.0.1** | ์ „์ž์ •๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ ์ข…์†์„ฑ ์ œ๊ฑฐ ๋ฐ ์Šคํ”„๋ง ๋ถ€ํŠธ ์Šคํƒ€ํ„ฐ ํ†ตํ•ฉ | | **Database Connection Pool**| Commons DBCP 1.4 | **HikariCP** | Spring Boot ๊ธฐ๋ณธ ๊ณ ์„ฑ๋Šฅ ์ปค๋„ฅ์…˜ ํ’€ ์ ์šฉ | | **SQL Logging** | `log4jdbc-remix` (`0.2.7`) | **`log4jdbc-log4j2` (`1.16`)** | Java 21 ๋ฐ ์ตœ์‹  JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๊น… ํ˜ธํ™˜์„ฑ ํ™•๋ณด | | **์„ค์ • ๋ฐฉ์‹ (Config)** | XML ๊ธฐ๋ฐ˜ (`web.xml`, `context-*.xml`, `action-servlet.xml`) | **Java Config & YAML (`application.yml`, `WebMvcConfig`)** | XML ์„ค์ • ์™„์ „ ํ๊ธฐ ๋ฐ ๊ฐ€๋…์„ฑ/์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ | | **์™ธ๋ถ€/๋ ˆ๊ฑฐ์‹œ ๋ชจ๋“ˆ** | egovframework(2.7/3.5), Nexacro/Xplatform XAPI, Log4j 1.x | **๋ชจ๋‘ ์ œ๊ฑฐ (ํ‘œ์ค€ Spring Boot ์‚ฌ์šฉ)** | ๋ถˆํ•„์š”ํ•œ ๊ณ ์ „ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋ฒค๋” ์ข…์†์„ฑ ์ œ๊ฑฐ | --- ## 2. ์˜์กด์„ฑ (`pom.xml`) ์ •๋น„ ๋‚ด์—ญ ### 2.1. ์ œ๊ฑฐ๋œ ๋ ˆ๊ฑฐ์‹œ ์˜์กด์„ฑ (AS-IS) - `egovframework.rte.*` (์ „์ž์ •๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ ๋Ÿฐํƒ€์ž„ ๋ชจ๋“ˆ ์ „๋ฉด ์ œ๊ฑฐ) - `com.nexacro:nexacro-xapi`, `com.tobesoft:xplatform-xapi` (๋ ˆ๊ฑฐ์‹œ UI ๋ชจ๋“ˆ ์ œ๊ฑฐ) - `commons-dbcp`, `org.apache.tomcat:tomcat-dbcp` (Commons DBCP ์ œ๊ฑฐ) - `org.lazyluke:log4jdbc-remix`, `log4j:log4j:1.2.15` (๊ตฌํ˜• ๋กœ๊น… ๋ชจ๋“ˆ ์ œ๊ฑฐ) - `javax.servlet:servlet-api`, `javax.servlet.jsp:jsp-api`, `javax.servlet:jstl` (javax ์ŠคํŽ™ ์ œ๊ฑฐ) ### 2.2. ์‹ ๊ทœ ์ถ”๊ฐ€/๋Œ€์ฒด๋œ ์˜์กด์„ฑ (TO-BE) ```xml org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 4.0.1 com.oracle.database.jdbc ojdbc11 runtime org.bgee.log4jdbc-log4j2 log4jdbc-log4j2-jdbc4.1 1.16 org.apache.tomcat.embed tomcat-embed-jasper jakarta.servlet.jsp.jstl jakarta.servlet.jsp.jstl-api org.glassfish.web jakarta.servlet.jsp.jstl ``` --- ## 3. XML ์„ค์ • โ†’ Java Config / YAML ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋งคํ•‘ ### 3.1. `web.xml` ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ - **CharacterEncodingFilter**: Spring Boot์˜ `server.servlet.encoding.charset=UTF-8` ์ž๋™ ์„ค์ •์œผ๋กœ ๋Œ€์ฒด. - **DispatcherServlet**: `ServletInitializer.java` ๋ฐ Spring Boot ๋‚ด์žฅ ํ†ฐ์บฃ ์ž๋™ ์„œ๋ธ”๋ฆฟ ๋“ฑ๋ก์œผ๋กœ ๋Œ€์ฒด. ### 3.2. `context-datasource.xml` & `context-mapper.xml` โ†’ `application.yml` ```yaml spring: datasource: driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy url: jdbc:log4jdbc:oracle:thin:@localhost:1521:xe username: YOUR_USERNAME password: YOUR_PASSWORD mybatis: config-location: classpath:/config/mybatis-config.xml mapper-locations: classpath:/mapper/**/*_SQL.xml type-aliases-package: first ``` ### 3.3. `action-servlet.xml` โ†’ `WebMvcConfig.java` - **ViewResolver (JSP ๋ทฐ)**: `application.yml`์— `spring.mvc.view.prefix=/WEB-INF/jsp/`, `spring.mvc.view.suffix=.jsp` ์„ค์ • ์ถ”๊ฐ€. - **ArgumentResolver & Interceptor**: `WebMvcConfigurer` ๊ตฌํ˜„ ํด๋ž˜์Šค์—์„œ Java ์ฝ”๋“œ๋กœ ๋“ฑ๋ก. ```java @Configuration @EnableSpringDataWebSupport public class WebMvcConfig implements WebMvcConfigurer { @Autowired private LoggerInterceptor loggerInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loggerInterceptor) .addPathPatterns("/**"); } @Override public void addArgumentResolvers(List resolvers) { resolvers.add(new CustomMapArgumentResolver()); } } ``` --- ## 4. ์ฝ”๋“œ ๋ ˆ๋ฒจ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ### 4.1. `javax.*` โ†’ `jakarta.*` ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ผ๊ด„ ๋ณ€๊ฒฝ - **AS-IS**: `import javax.servlet.http.HttpServletRequest;` - **TO-BE**: `import jakarta.servlet.http.HttpServletRequest;` ### 4.2. JSP JSTL ํƒœ๊ทธ๋ฆฝ URI ๋ณ€๊ฒฝ - **AS-IS (Sun URI)**: ```jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> ``` - **TO-BE (Jakarta URI)**: ```jsp <%@ taglib prefix="c" uri="jakarta.tags.core" %> <%@ taglib prefix="fn" uri="jakarta.tags.functions" %> <%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %> ``` --- ## 5. ์ฃผ์š” ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… & ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ### 5.1. Pageable ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ๋ฐ ์Œ์ˆ˜ ์ธ๋ฑ์Šค ์ฒ˜๋ฆฌ ๋ฒ„๊ทธ - **๋ฌธ์ œ**: ๊ฒŒ์‹œํŒ ์ฒซ ์ง„์ž… ์‹œ `PAGE_INDEX` ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ `0`์œผ๋กœ ์ „๋‹ฌ๋˜์–ด DAO ํŽ˜์ด์ง• ์ฟผ๋ฆฌ์˜ ์‹œ์ž‘ ๋ฒˆํ˜ธ(`START`)๊ฐ€ ์Œ์ˆ˜(`-9`)๋กœ ๊ณ„์‚ฐ๋˜์–ด SQL ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ. - **ํ•ด๊ฒฐ**: `AbstractDAO` ๋‚ด์—์„œ `pageIndex` ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€ (`if (pageIndex < 1) pageIndex = 1;`), `WebMvcConfig`์— `@EnableSpringDataWebSupport` ์ ์šฉ. ### 5.2. ClassCastException ๋ฐ ๋ฐ์ดํ„ฐ ํ˜•๋ณ€ํ™˜ ์˜ˆ์™ธ - **๋ฌธ์ œ**: DAO ์กฐํšŒ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ์‹œ `ArrayList`๋ฅผ `Map`์œผ๋กœ ํƒ€์ž… ์บ์ŠคํŒ…์„ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜, `Integer` ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ `(String)`์œผ๋กœ ๊ฐ•์ œ ํ˜•๋ณ€ํ™˜ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ. - **ํ•ด๊ฒฐ**: DAO ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ `List>`๋กœ ์ •๊ทœํ™”ํ•˜๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”์ถœ ์‹œ `String.valueOf()`๋ฅผ ํ†ตํ•ด ์•ˆ์ „ํ•œ ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ์ ์šฉ. ### 5.3. log4jdbc DriverSpy ์—ฐ๋™ ์—๋Ÿฌ - **๋ฌธ์ œ**: `net.sf.log4jdbc.sql.jdbcapi.DriverSpy` ์„ค์ • ์‹œ `log4jdbc.log4j2.properties` ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•œ ์ดˆ๊ธฐํ™” ์‹คํŒจ. - **ํ•ด๊ฒฐ**: `src/main/resources/log4jdbc.log4j2.properties` ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ `log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator` ์„ค์ •.