nocdev
스프링 MVC 프로젝트 톺아보기2 본문
스프링 MVC 프로젝트 톺아보기2
오늘은 지난번 포스팅에 이어 스프링 설정을 살펴보며 스프링 기본 개념과 스프링 초기화동작 원리를 살펴보려고 합니다.
개발환경
스프링프레임워크?
스프링 프레임워크에 대해서 공식 문서에서는 아래와 같이 설명합니다.
The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.
A key element of Spring is infrastructural support at the application level: Spring focuses on the "plumbing" of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.
스프링 프레임워크는 현대적인 자바 기반 엔터프라이즈 애플리케이션을 위한 포괄적인 프로그래밍 및 구성 모델을 제공합니다. 이는 모든 종류의 배포 플랫폼에서 사용할 수 있습니다.
스프링의 핵심 요소 중 하나는 애플리케이션 수준에서 인프라 지원을 제공한다는 점입니다. 스프링은 엔터프라이즈 애플리케이션의 "기본 구조"에 중점을 두어, 개발 팀이 특정 배포 환경에 불필요하게 얽매이지 않고 애플리케이션 수준의 비즈니스 로직에 집중할 수 있게 해줍니다.
간략하게 요약하자면 귀찮은건 프레임워크에게 맞기고 개발자는 개발에 집중할 수 있게끔 설계된 프레임워크 로 요약할 수 있습니다.
스프링프레임워크의 주요 기능
IOC(Inversion of Control, 제어의 역전)
애플리케이션의 흐름을 제어하는 책임이 개발자가 아니라 프레임워크에 있다는 의미로, 일반적으로 자바의 클래스를 이용해 객체를 생성할 때 객체가 필요한 곳에서 개발자가 직접 생성하고 호출하였을 것 입니다. 하지만 IOC의 개념을 도입한 스프링에서는 객체의 생성, 호출, 소멸을 스프링 컨테이너에게 제어권을 넘겨 스프링 컨테이너가 흐름을 제어할 수 있게 합니다. 이 때 객체의 생성, 호출, 소멸 등은 java가 제공하는 java reflection API를 이용해 수행하게 됩니다.
DI(Dependency Injection, 의존성 주입)
DI는 객체 간의 의존 관계를 외부에서 주입하는 설계 패턴입니다. 객체가 자신이 필요한 다른 객체(의존성)를 직접 생성하지 않고 외부에서 받아서 사용하도록 하는 개념입니다. 이로 인해 객체 간의 결합도가 줄어들고, 유연성과 테스트 용이성이 높아집니다.
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)
비즈니스 로직과는 직접적인 관련이 없지만, 반복적으로 사용되는 기능(횡단 관심사, cross-cutting concerns)을 모듈화하여 비즈니스 로직과 분리하는 프로그래밍 패러다임입니다.
횡단 관심사란 여러 곳에서 공통적으로 발생하는 기능을 의미합니다. 예를 들어, 로깅, 트랜잭션 관리, 보안, 예외 처리 같은 기능들은 애플리케이션 곳곳에 걸쳐 적용됩니다. 이러한 코드를 각각의 클래스에 모두 작성하는 것은 코드 중복을 유발하고 유지보수를 어렵게 만듭니다.
AOP는 이런 횡단 관심사를 중앙에서 관리할 수 있게 하여, 비즈니스 로직과 공통 기능을 분리하고 가독성과 유지보수성을 높여줍니다.
IOC 컨테이너(Inversion of Control Container)
IOC로 인해 생성된 객체(bean)들이 저장되는 공간입니다. 스프링에서는 BeanFactory 인터페이스 안에 저장된 bean들에 대한 관리 메서드가 포함됩니다. 개발자가 직접 BeanFactory 인터페이스에 접근하지는 않고 해당 인터페이스를 확장한 ApplicationContext 인터페이스를 구현한 클래스를이용해 bean에 접근하게 됩니다.
Bean
스프링 IoC 컨테이너에서 관리하는 객체를 의미합니다. 스프링에서 애플리케이션의 구성 요소는 Bean으로 등록되고, 컨테이너는 이 Bean들의 생성, 관리, 의존성 주입 등을 담당합니다. 스프링에서 Bean은 단순히 스프링 컨테이너에 의해 생성되고 관리되는 자바 객체입니다. Bean은 애플리케이션의 핵심 구성 요소로, 컨테이너는 이를 생성하고 필요한 곳에 주입합니다.
프로젝트 살펴보기
아래는 프로젝트를 살펴보며 스프링프레임워크의 동작 원리와 순서에 대해서 설명합니다.
web.xml
웹 애플리케이션을 실행시킬 때 함께 올라가야할 설정(설명)들을 정의한 파일으로 서버(WAS)가 실행될 때 web.xml을 해석하며, 이 때 스프링에서 사용하는 객체(Bean)를 생성하여 IOC 컨테이너에 저장합니다.
web.xml의 기본설정입니다. 위에서부터 살펴보도록 하겠습니다.
context-param
웹 애플리케이션 전체에서 사용되는 전역 파라미터를 설정합니다.
- <param-name> : 설정할 파라미터의 이름입니다. 여기서는 파라미터 이름이 contextConfigLocation입니다.
- <param-value> : 파라미터의 값입니다. 여기서는 /WEB-INF/spring/root-context.xml으로, 스프링의 Root Context 설정 파일 경로를 나타냅니다. 이 설정 파일은 애플리케이션 전반에 걸쳐 공유되는 빈 정의를 포함합니다.
listener
WAS가 실행될 때 동작할 클래스를 정의합니다.
- <listener-class> : 리스너 클래스의 FQCN(패키지 경로를 포함한 완전한 클래스명)을 지정합니다. 해당태그 안에 들어올 수 있는 클래스는 ServletContextListener 인터페이스를 implements한 클래스만 가능합니다. 스프링에서는 ContextLoaderListener 클래스를 사용합니다.
ServletContextListener 인터페이스는 WAS가 실행될 때 동작하는 이벤트 리스너와, WAS가 종료될 때 동작하는 이벤트 리스너를 추상메서드로 포함하고 있습니다.
contextInitialized : WAS가 실행될 때 동작하는 메서드
contextDestroyed : WAS가 종료될 때 동작하는 메서드
org.springframework.web.context.ContextLoaderListener 클래스는 WAS가 실행될 때 스프링 IOC컨테이너(ApplicationContext)를 생성하고 초기화를 담당합니다.
해당 클래스의 인스턴스 생성은 WAS에서 담당하게 되며 WAS에서 기본 생성자를 호출한 뒤 contextInitialized 메서드가 실행되게 됩니다. 해당 메서드는 부모 클래스인 ContextLoader 클래스가 가지고있는 initWebApplicationContext 메서드를 실행하며 해당 메서드에서 configureAndRefreshWebApplicationContext 메서드를 호출하게 됩니다.
이 때, IOC컨테이너에 bean을 등록하기 위해 xml파일을 읽고 파싱하게 되는데 xml의 경로를 읽는 전역 파라미터의 이름이 contextConfigLocation 입니다.
contextConfigLocation 파라미터를 읽어들이게 되면 <param-value>에 정의된 xml파일을 파싱하여 내부에 xml 형태로 정의된 클래스들을 bean으로 등록하여 IOC컨테이너 내에 적재하게 됩니다.
servlet
서블릿을 정의하는 태그로, 웹 애플리케이션에서 사용되는 특정 서블릿을 설정할 수 있습니다.
- <servlet-name> : 서블릿의 이름을 지정합니다. 여기서는 appServlet으로 설정되어 있습니다.
- <servlet-class> : 서블릿 클래스의 FQCN(패키지 경로를 포함한 완전한 클래스명)을 지정합니다. 해당태그 안에 들어올 수 있는 클래스는 HttpServlet 클래스를 상속한한 클래스만 가능합니다. 여기서는 스프링의 DispatcherServlet이 사용됩니다.
- <init-param> : 서블릿에서 사용할 초기화 파라미터를 설정합니다.
- <param-name> : 설정할 파라미터의 이름입니다. 여기서는 파라미터 이름이 contextConfigLocation입니다.
- <param-value> : 파라미터의 값입니다. 여기서는 /WEB-INF/spring/appServlet/servlet-context.xml으로, 스프링의 서블릿 관련 설정 파일 경로를 나타냅니다. 이 설정 파일은 해당 서블릿 내부에서만 사용하는 빈 정의를 포함합니다.
- <load-on-startup>: 서블릿이 언제 로드되는지를 설정합니다. 1로 설정된 경우, 애플리케이션이 시작될 때 즉시 서블릿이 로드됩니다. 숫자가 작을수록 더 우선적으로 로드됩니다.
DispatcherServlet 클래스는 스프링의 IOC컨테이너에 의해 객체가 생성되며 이 때
servlet-mapping
서블릿 태그로 정의한 서블릿에 대해 특정 url에 대한 매핑을 설정할 수 있습니다.
- <servlet-name> : 서블릿 이름을 지정합니다. 여기서는 appServlet이라는 이름으로 등록한 서블릿을 지정합니다.
- <url-pattern> : 해당 서블릿이 처리할 요청의 URL 패턴을 지정합니다. 여기서는 /로 설정되어 있어, 애플리케이션의 모든 요청을 appServlet이 처리하게 됩니다. 이는 프론트 컨트롤러 패턴을 적용하는 방식으로, 모든 요청이 이 서블릿을 거쳐가게 됩니다.
org.springframework.web.servlet.DispatcherServlet 클래스는 클래스의 인스턴스가 생성될 때 IOC컨테이너에 bean을 등록하기 위해 xml파일을 읽고 파싱하게 되는데 xml의 경로를 읽는 전역 파라미터의 이름이 contextConfigLocation 입니다. 이 때 부모 클래스인 FrameworkServlet 클래스에서 contextConfigLocation라는 전역변수를 사용하여 xml의 경로를 읽어 들이고, createWebApplicationContext메서드에서 xml 형태로 정의된 클래스들을 bean으로 등록하여 WebApplicationContext에 bean으로 등록하게 됩니다.
마무리
이번 포스팅에서는 스프링 설정을 살펴보며 스프링 기본 개념과 스프링 초기화동작 원리를 살펴보았습니다. 다음 포스팅에는 스프링 context 설정 xml파일을 보며 bean 설정 방법과 사용방법을 살펴보도록 하겠습니다.
'개발 > spring' 카테고리의 다른 글
스프링 Bean(빈) (0) | 2024.10.12 |
---|---|
스프링 MVC 프로젝트 톺아보기3 (0) | 2024.10.11 |
스프링 MVC 프로젝트 톺아보기1 (1) | 2024.10.04 |