diff --git a/README.md b/README.md new file mode 100644 index 0000000..f9f1bae --- /dev/null +++ b/README.md @@ -0,0 +1,158 @@ +# ๐Ÿ“˜ 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` ์„ค์ •.