Spring Framework

✒️ 2025-06-30 11:36 내용 수정


Spring Framework

엔터프라이즈급 Java 어플리케이션 개발을 위한 오픈소스 경량급 프레임워크

JSP/Servlet과 Spring

  1. JSP/Servlet

    • 비즈니스 로직과 화면에 표시될 로직이 혼재되어 가독성이 떨어짐
    • 반복되는 Servlet 패턴으로 인해 유사한 패턴의 Servlet이 계속 증가함
    • 객체를 직접 생성(new)하기에 강한 결합을 가져 의존성 관리가 어려움
    • 설정의 복잡도가 매우 높음
  2. Spring MVC

    • 비즈니스 로직이 분리되어 있음(Service 등의 계층에서 담당)
    • IoC로 Spring이 객체를 대신 만들어 관리
    • DI를 통해 객체의 의존성을 자동으로 프레임워크가 처리
    • 설정 복잡도를 낮춤
항목 JSP/Servlet (MVC1/MVC2) Spring MVC
패턴 구조 MVC1: JSP가 View와 Controller 둘 다 담당MVC2: 하나의 서블릿이 Controller 역할 후 JSP로 포워딩 명확한 MVC 분리 + Front‐Controller (DispatcherServlet) 패턴 적용
요청 흐름 URL → 서블릿 → 비즈니스 로직 → JSP (forward) → 응답 URL → DispatcherServletHandlerMappingControllerModelViewResolver → View → 응답
뷰(View) 처리 JSP 내 자바 코드 포함 가능 (스크립틀릿) JSP, Thymeleaf 등 템플릿 엔진 사용.
JSP는 점차 사용 줄어듦
비즈니스 로직 위치 서블릿, JSP 내부에 혼합 → 유지보수 어려움 서블릿(DispatcherServlet)은 흐름 제어, 컨트롤러는 요청 처리, 실제 로직은 @Service 등 별도 서비스 계층에서 처리
재사용성 및 확장성 코드 재사용 및 확장 어려움
로직과 화면이 뒤섞임
AOP, DI, Bean 관리 기반 구조로 모듈화·확장성 우수
설정 방식 XML(web.xml) + @WebServlet 애너테이션 사용 Java Config / XML / Spring Boot 자동 설정(@SpringBootApplication)으로 선언적 설정
DI/AOP 등 지원 직접 객체 생성(new).
POJO 활용 어려움
Spring IoC 컨테이너와 DI으로 의존성 자동 관리.
트랜잭션, AOP, 메시지 리소스, 이벤트 기능 등 내장
템플릿 엔진 지원 JSP (스크립틀릿 가능) Thymeleaf, FreeMarker, JSP 등 다양한 옵션 제공
사용성 소규모/단순 프로젝트에 적합하지만, 코드 유지보수 어려움 기업/대규모 프로젝트에 적합, 설정 많지 않아도 Spring Boot로 빠르게 시작 가능

특징

1. 의존성 주입(DI : Dependency Injection)

2. 제어 역전(IoC : Inversion of Control)

3. 관심 지향 프로그래밍(AOP : Aspect Oriented Programming)

4. POJO : Plane Old Java Object


Spring Container/IoC Container와 Bean

1. Bean

2. Spring Container

  1. BeanFactory : 가장 기본 IoC 컨테이너로, Bean 생명주기 관리및 의존성 주입(DI) 기능을 제공한다.

    • Lazy-loading 방식(요청 받는 시점에 인스턴스 생성)을 사용한다.
      • App 구동 시 bean 요청 시점에 생성한다.
  2. ApplicationContext : BeanFactory 확장 컨테이너다.

    • 별도의 설정 정보를 참고하여 IoC를 적용한 Bean의 생성 및 관계 설정 등의 제어 작업을 총괄한다.
    • 객체 생성, 관계 설정, 자동 설정, AOP 지원, 이벤트 관리 등을 지원한다.
    • Pre-loading 방식(즉시 인스턴스 생성)을 사용한다.
  3. BeanPostProcessor : Bean 인스턴스 생성 후 초기화 전후 처리 방식을 담당하는 인터페이스다.


Spring 프로젝트 디렉터리와 파일

공통

spring_directories_intellij.png

project-root/
├── pom.xml / build.gradle        ← 빌드/라이프사이클 정의, 의존성 관리
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com.example.project/    ← 시작 패키지 (주요 코드 위치)
    │   │       ├── ProjectApplication.java  ← @SpringBootApplication, 진입점
    │   │       ├── controller/              ← @Controller / @RestController
    │   │       ├── service/                 ← @Service 비즈니스 로직
    │   │       ├── repository/             ← @Repository, DAO 계층
    │   │       ├── model/                  ← Entity 또는 DTO
    │   │       └── config/                 ← 설정 클래스 (WebConfig 등)
    │   └── resources/
    │       ├── application.properties/.yml ← 환경 설정 파일
    │       ├── static/                     ← 정적 리소스(CSS, JS, 이미지)
    │       ├── templates/                  ← Thymeleaf, Mustache 등의 템플릿
    │       └── messages/, META-INF/        ← 로케일, 추가 리소스
    └── test/
        ├── java/com/example/project/      ← 단위 테스트 코드
        └── resources/                     ← 테스트 전용 리소스
이름 설명
src/main/java 서버 Java 파일
src/main/resources Java 설정 파일 및 자원 파일
src/main/resources/static 정적 자원(CSS, JS 등)
src/main/resources/templates HTML, JSP 파일 등 View에 해당하는 파일
application.properties 웹 서버 설정
src/test/java 단위 테스트용 Java 파일
src/test/resources src/test/java 설정 파일
pom.xml 라이브러리 의존성 관리

Spring Tools 4 사용 시

이름 설명
src/main/webapp/WEB-INF/views 외부에 공개하지 않는 HTML, JSP 등 View 파일의 저장 위치
src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml web과 관련된 Spring 설정 파일
src/main/webapp/WEB-INF/spring/root-context.xml Spring 객체 설정 파일

spring directory.png


Spring 구동 순서

  1. 웹 어플리케이션이 실행되면 Tomcat(WAS)에 의해 web.xml이 실행된다.
  2. web.xml에 등록된 ContextLoaderListener가 생성된다.
  3. ContextLoaderListener에서 root-context.xml을 호출한다.
  4. root-context.xml에 등록된 설정대로 Spring Container가 구동 되며 Bean들이 작동한다.
  5. 처리 후에는 DispatcherServlet이 생성되어 XmlWebApplicationContext 객체를 이용해 servlet-context.xml을 로딩하고 해석한다.
  6. 클라이언트가 request를 URL로 보내면 View(MVC) 에서 이를 받는다.
  7. 클라이언트의 request를 DispatcherServlet가 받아 HandlerMapping에서 요청 처리를 담당할 Controller를 찾는다.
  8. 적절한 Controller를 찾으면 Mapper가 정보를 다시 DispatcherServlet으로 보내고, DispatcherServlet은 해당 정보를 가지고 HandlerAdapter를 호출한다.
  9. HandlerAdapterController를 통해 Service에서 비즈니스 로직으로 View에게 전달할 DTO와 DAO 정보가 저장된 Model 객체를 받는다.
  10. Controller의 처리가 완료되면 다시 DispatcherServlet으로 View 정보를 전달한다.
  11. DispatcherServlet전달 받은 정보를 ViewResolver에게 전달한다.
  12. ViewResolver는 View 정보에 맞는 View 객체를 찾고 응답에 필요한 데이터를 생성한다.
  13. DispatcherServletVeiwResolver가 처리한 결과를 클라이언트에게 응답으로 보낸다.

spring_structure.png

관련 클래스

클래스 설명
DispatcherServlet SpringMVC의 핵심으로 클라이언트의 HTTP 요청을 가장 먼저 받아 적절한 Controller로 보내는 역할을 하는 Servlet
ContextLoaderListener SpringApplicationContext를 생성하고 로드하며, 어플리케이션 전반에 걸쳐 사용되는 Bean을 정의한 rootContext를 초기화
ApplicationContext 별도의 설정 정보를 참고하여 IoC를 적용한 Bean의 생성 및 관계 설정 등의 제어 작업을 총괄함
ServletConfig DispatcherServlet이 사용할 설정을 지정
HandlerMapping 요청을 처리할 Controller를 찾아주는 역할
RequestMappingHandlerMapping @RequestMapping Annotation을 기반으로 URL과 Controller 메소드를 mapping하는 Bean
RequestMappingHandlerAdapter Controller 메소드의 실행을 처리하고 반환값을 적절한 HTTP 응답으로 변환
ViewResolver View의 논리적인 이름을 실제 View로 mapping

Spring에서 제공하는 HandlerMapping의 mapping 방법

방법 설명
BeanNameUrlHandlerMapping Bean의 이름에 있는 URL을 HTTL 요청 URL과 비교하여 일치하는 Bean을 찾음
가장 직관적이고 사용하기 쉬움
ControllerBeanNameHandlerMapping BeanName 방법과 유사하지만 Bean 이름을 URL 형태로 짓지 않아도 Bean 이름 앞에 자동으로 URL/ 형태로 mapping
ControllerClassNameHandlerMapping Bean의 클래스 이름을 URL에 mapping
클래스 이름(Controller 부분 제외)을 URL에 mapping
SimpleUrlHandlerMapping Bean의 property에 mapping 정보를 저장하며, URL과 Controller mapping 정보를 한 곳에 저장할 수 있음
SimpleUrlHandlerMapping Bean을 등록해야 사용할 수 있음
DefaultAnnotationHandlerMapping @RequestMapping Annotation을 사용해서 클래스, 메소드 단위로도 URL을 mapping