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