⟡ 개요

회사에서 담당하고 있는 서비스의 마이그레이션 작업을 높은 완성도로 마무리하기 위한 목적과,
퇴근 후 별도로 진행하는 학습 내용들을 스스로 정리하고 축적하기 위해 작성하는 기록입니다.
초보 개발자 관점에서 정리하는 흐름이지만, 기술적 오류나 더 나은 방향이 있다면
언제든지 피드백을 제안해 주시면 적극 반영하겠습니다.🫶
⟡ 개발환경
| AS-IS | TO-BE |
| JDK 1.7 | JDK 17 |
| Maven 2.9 | Gradle 8.8 |
| Spring Framework 4.2.5 (XML 기반) | Spring Boot 3.3.2 |
| MyBatis 3.3.0 | MyBatis 3.5.13 |
| Tomcat 7 | Embedded Tomcat |
| MariaDB | |
| JSP, EL, JSTL 기반 SSR(Server Side Rendering) | |
| HTML, CSS, JavaScript, jQuery | |
| Eclipse | IntelliJ or VSCode |
| Linux(사내 Cloud) | |
SpringFramework
특징 : 모든 것을 명시적으로 선언하는 XML 중심의 방식이다.
SpringBoot
관례를 따르고 필요한 것만 재정의 하는 Java와 자동구성 설정 중심이다.
web.xml
배포 서술자 / Tomcat같은 서블릿 컨테이너(WAS)가 읽는 파일
웹 어플리케이션의 가장 핵심적인 진입점 설정
• 애플리케이션의 진입점 :
톰캣이 .war 파일을 읽을 때 가장 먼저 참조하는 파일이다.
• 리스너 등록 :
스프링의 핵심 컨테이너(root-context.xml)를 로드하기 위한 ContextLoaderListener를 톰캣에 등록한다.
• 서블릿 등록 :
모든 웹 요청을 받아 스프링으로 전달할 DispatcherServlet을 톰캣에 등록한다.
• 필터 등록 :
springSecurityFilterChain(스프링 시큐리티)이나 한글 인코딩 필터 등을 톰캣에 등록한다.
• 프로필 설정 :
태그를 이용해 현재 활성화할 프로필(e.g, local, dev)를 지정한다.
• 경로 :
src/main/webapp/WEB-INF/web.xml 표준 규격이며 절대 변경하면 안됨
🌱 Springframework ➡ SpringBoot
- web.xml은 필요 없어지며 삭제 하는 파일이다.
- @SpringBootApplication 어노테이션이 붙은 Main클래스(*.Application.java)가 모든 역할을 대신한다.
- main(Stringp[] args) 메소드 : 톰캣 서버를 직접 실행시킨다.
- @EnableAutoConfiguration: spring-boot-starter-web의존성 감지, DispatcherServlet과 필요한 필터 등 자동으로 등록
✅ 체크 포인트
- DispatcherServlet, ContextLoaderListener, 필터(인코딩, 보안 필터) 등 web.xml에 정의된 항목을 Java Config으로 이동
- web.xml의 context-param로 지정한 contextConfigLocation이 있다면 ?
해당 XML을 로드하는 코드를 작성하거나 XML을 Java Config로 변환.
AS-IS(web.xml) ➡ TO-BE(Spring Boot)
| <listener> (ContextLoaderListener) |
SpringApplication.run(..) (자동) |
| <servlet> (DispatcherServlet) |
spring-boot-starter-web (자동) |
| <filter> (EncodingFilter, SecurityFilter) |
spring-boot-starter-web(자동) @Configuration 클래스(커스텀 필터) |
| <context-param> (프로필 지정) |
application.properties의 spring.profiles.active=dev..local.. |
root-context.xml or applicationContext.xml(루트 컨텍스트)
애플리케이션 전역(서비스/DAO 등) 빈(bean)들을 정의하는 곳. ContextLoaderListener가 로드하며, DispatcherServlet에 의해 만들어지는 WebApplicationContext와 구분되는 Root ApplicationContext를 담당한다.
• 선언 내용:
DataSource(DB연결), TransactionManager(트랜잭션), MyBatis(SqlSessionFactoryBean), @Service 및 @Repository 컴포넌트 스캔
• 경로:
/WEB-INF/applicationContext.xml. 또는 web.xml의 context-param contextConfigLocation에 지정한 경로
(예: /WEB-INF/spring/root-context.xml, /WEB-INF/spring/\*.xml, classpath:applicationContext.xml)
빌드 환경에서는 src/main/webapp/WEB-INF/ 또는 src/main/resources WAR로는 WEB-INF/classes 쪽으로 배치되기도 함
파일의 물리적 위치 자체는 web.xml의 contextConfigLocation으로 변경 지정 가능하므로 "절대 변경 불가"는 아님.
다만 명시 없이 컨테이너 기본 동작에 의존하는 경우에는 /WEB-INF/applicationContext.xml을 기대하므로, 파일을 다른 곳으로 옮기면 contextConfigLocation을 같이 수정해야 함.
🌱 Springframework ➡ SpringBoot
- 해당 XML파일은 삭제된다.
- application.properties : Datasource, TransactionManager, MyBatis 설정은 spring-boot-starter-data-jdbc나 mybatis-spring-boot-starter가 자동으로 생성해준다.그렇기 때문에 application.properties에 연결 정보만 적으면 된다.
- @Configuration Java 클래스 : 자동 설정이 불가능한 빈은 @Configuration 어노테이션을 붙힌 Java 클래스에서 @Bean 메소드로 직접 정의한다.
✅ 체크 포인트
- 서비스/DAO/트랜잭션 빈을 Java Config로 옮기고, MyBatis/Mapper/TransactionManager 설정을 Spring Boot 방식(spring.datasource.\*, @MapperScan)으로 전환
servlet-context.xml(서블릿 컨텍스트)
web.xml의 DispactcherServlet이 로드하는 웹 계층(Web Layer)전용 빈을 정의한다.
주로 사용자 요청 처리와 뷰(View)렌더링에 관련된 빈을 선언한다.
root-context.xml을 부모 컨텍스트로 가진다.
• 선언 내용 :
@Controller 컴포넌트 스캔, ViewResolver(JSP경로 설정), Interceptor, 정적 리소스(JS/CSS)매핑, <mvc:annoation-driven/>(웹 MVC기능 활성화)
• 경로 :
기본 경로는 없다. web.xml의 <servlet>태그 안에 <init-param>으로 명시하면 된다.
🌱 Springframework ➡ SpringBoot
- 해당 XML파일은 삭제된다.
- spring-boot-starter-web(자동) : <mvc:annotation-driven>과 같은 핵심 기능은 전부 자동으로 활성화 된다.
- application.properties : JSP ViewResolver 설정은 spring.mvc.view.prefix와 spring.mvc.view.suffix프로퍼티스로 대체 괸다.
- @Configuration Java 클래스 : Interceptor나 HandlerExceptionResolver 등 복잡한 웹 설정은 @Configuration 클래스에서 인터페이스를 구현하여 정의한다.
✅ 체크 포인트
- ViewResolver(예: InternalResourceViewResolver), 메시지 컨버터, static resource mapping 등을 WebMvcConfigurer 구현으로 옮겨야 함.
spring-security.xml 또는 security-context.xml(Spring Security설정)
보안 필터체인, 인증과 인가 설정, URL보호와 UserDetailsService, password encoder 등 보안 관련 빈 정의하고 보통 web.xml에서 DelegatingFilterProxy로 springSecurityFilterChain을 연결한다.
• 경로 :
관례적으로 WEB-INF/spring/security-context.xml 또는 WEB-INF/spring/security.xml
DelegatingFilterProxy가 web.xml에 선언되어 있으면 bean 이름과 매칭된다.
DelegatingFilterProxy를 web.xml에서 사용 중이라면 필터 이름과 빈 이름 매칭 규칙을 지켜야 한다.
필터 정의를 삭제하면 보안이 동작하지 않으므로 주의.
(즉, 위치 자체는 바꿀 수 있지만 web.xml과의 연동을 변경하면 동작 불가)
🌱 Springframework ➡ SpringBoot
- Boot + Spring Security는 SecurityFilterChain 빈(@Bean)으로 Java Config 방식으로 구성하거나 WebSecurityConfigurerAdapter(이전 버전) 방식으로 대체 , application.properties로 일부 설정 가능하다.
Boot는 필터 등록을 자동화한다.
✅ 체크 포인트
- 기존 필터 매핑과 URL 패턴, 세션 정책, 인증 매커니즘을 Java Config로 옮기고 테스트(로그인/권한) 케이스를 마련.
*.properties(환경 설정 파일)
DB 접속 정보나, API 키, 서버 IP등 환경별로 달라지는 설정값을 XML에서 분리하는 파일들
root-context.xml에서 <context:property-placeholder location="..." /> 태그를 통해 로드된다.
Maven 프로필을 사용해 src/main/resources-local, src/main/resources-dev 등으로 분리하여 관리한다.
• 경로 :
보통 src/main/resources(빌드시 WEB-INF/classes)에 두며, WAR의 경우 WEB-INF/classes에 복사된다.
또는 WEB-INF/config/ 같은 프로젝트별 관습 경로도 흔한 편
파일 위치는 애플리케이션이 classpath:로 찾는지, ServletContext를 통해 찾는지에 따라 다.르다.
명시 없이 classpath 기본 검색을 이용한다.면 src/main/resources(즉 WAR의 WEB-INF/classes)에 있어야 한다.
🌱 Springframework ➡ SpringBoot
- application.properties 또는 .yml
- 스프링 부트의 표준 설정 파일이다. 스프링 부트가 시작될 때 자동으로 로드되며 별도의 태그는 필요 없다.
- 레거시의 프로필 기능은 application-{profile}.properties 파일로 대체된다.
- --spring.profiles.active=local 옵션을 주면 application.properties를 먼저 읽고, application-{profile}.properties의 내용으로 덮어쓴다.
✅ 체크 포인트
- 기존 properties에 있는 키들을 application.properties로 통합하고, 민감 정보는 Vault/환경변수로 대체 고려 해야 함.
log4j.xml , logback.xml(로깅 설정)
로그 레벨(DEBUG, INFO, ERROR), 로그 파일 위치, 로그 패턴 등을 정의한다.
• 경로 : src/main/resources/log4j.xml 혹은 logback.xml
위치는 classpath에 존재해야 자동 로드되므로 classpath 루트에 두는 관습을 지키는 것이 안전하다.
컨테이너나 시스템 프로퍼티로 경로를 지정하면 다른 위치도 가능.
🌱 Springframework ➡ SpringBoot
- 거의 동일하지만 스프링 부트 표준 이름 사용을 권장한다.
- 스프링 부트 기본으로 Logback을 사용 하기 때문에 src/main/resources/ 경로에 logback-spring.xml 이름의 파일을 생성하면 자동으로 인식한다.
- 간단 로그 레벨 설정은 application.properties 에서도 가능하다.
✅ 체크 포인트
- 로그 포맷, 파일 경로, 롤링 정책을 Boot 방식으로 재설정하고, 환경별로 로그 레벨을 제어할 수 있게 구성한다.
'🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤' 카테고리의 다른 글
| 👩🏻💻 Springframwork Mig 기록 : 레거시 프로젝트에 단위 테스트 도입하기(feat.실패하고 배운 이야기) (1) | 2026.01.01 |
|---|---|
| 👩🏻💻 Springframwork Mig 기록 : Spring Boot에서 Jasypt 자동 암복호화가 동작하는 원리 (0) | 2025.12.23 |
| 👩🏻💻 Springframwork Mig 기록 : @RequiredArgsConstructor와 의존성 주입, 언제 안전하고 언제 위험한가 (1) | 2025.12.22 |
| 👩🏻💻 Springframwork Mig 기록 : 폐쇄망 환경에서 Gradle 빌드 설정 삽 질기 (0) | 2025.12.22 |
| 👩🏻💻 Springframwork Mig 기록 : 레거시 코드 고도화 작업 계획 (0) | 2025.12.09 |