개발/[Spring] 블로그 만들기

[코드로 배우는 스프링 웹 프로젝트] 5강. 스프링 MVC의 기본 구조

ee2ee2 2021. 12. 9. 23:36
728x90
반응형

해당 프로젝트는 코드로 배우는 스프링 웹 프로젝트(개정판)을 기반으로 진행됩니다.


스프링은 하나의 기능을 위해서만 만들어진 프레임워크가 아니라, '코어(Core)'라고 할 수 있는 프레임워크에서 여러 서브 프로젝트를 결합해서 다양한 상황에 대처할 수 있도록 개발되었다.

 

스프링 MVC는 스프링의 서브 프로젝트이다.
즉, 별도의 설정이 존재할 수 있다는 말이다.


스프링 MVC 프로젝트의 내부 구조 (코드로 알아보기)

1. 프로젝트 생성하기

프로젝트 생성 > Spring Legacy Project > Spring MVC Project 생성 >프로젝트 명 : ex01 > 'org.zerock.controller' 패키지 생성

생성 완료 모습

2. pom.xml 수정하기

  • 스프링 버전을 5.0.7로 변경
  • lombok 기능을 이용해서 코드를 작성하고 테스트
  • Java 설정 등을 이용하려면 서블릿 3.0 이상 사용 권장
  • Maven 컴파일 옵션을 1.8로 변경하고 프로젝트 우클릭 'Maven >  update Project'

위 내용을 pom.xml에 추가 및 수정한다.

	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
    
        
    ... 생략 ...
    	
        <!-- JAVA 설정등을 이용하려면 서블릿 3.0 이상을 권장함. -->
		<!-- 
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope> 
		</dependency> 
		-->

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
		</dependency>
    
    	<!-- lombok 사용을 위한 라이브러리 추가 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.0</version>
			<scope>provided</scope>
		</dependency>         



... 생략 ....

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>

반영 확인

 

프로젝트 실행

정상적으로 실행되는 것을 확인

 

위와 같이 정상 실행되는 것이 확인된다. 다만, 웹 프로젝트는 가능하면 절대 경로를 이용하는 것이 바람직하므로 Tomcat의 'Modules' 메뉴를 이용해서 '/'경로로 프로젝트가 실행될 수 있도록 한다.

Server > Tomcat 더블 클릭

Tomcat의 'Modules' 메뉴 수정 전

 

http://localhost:8080/controller/
/ 경로는 찾을 수 없음

 

Tomcat의 'Modules' 메뉴 수정 후 재실행

 

'/' 경로 인식 완료

 


 

예제 프로젝트의 로딩 구조

: 프로젝트 구동시 관여하는 XML은 web.xml, root-context.xml, servlet-context.xml이 있다.

web.xml :  Tomcat 구동과 관련된 설정 파일
root-context.xml : Spring Core등 일반 JAVA 영역
servlet-context.xml : Spring MVC 등 Web 관련 영역

 

1. 프로젝트의 구동은 web.xml부터 시작!

web.xml 일부

<context-param>에는 root-context.xml의 경로가 설정되어 있고, <listener>에는 스프링 MVC의 ContextLoaderListener가 등록되어 있는 것을 볼 수 있다. (ContextLoaderListener가 가장 먼저 실행된다.)

 

프로젝트 구동시 가장 먼저 ContextLoaderListener의 로그가 출력됨을 확인 가능

 

2. root-context.xml 처리

: root-context.xml이 처리되면 파일에 있는 빈(Bean) 설정들이 동작한다.  즉, 객체(Bean)들은 스프링의 영역(Context) 안에 생성되고, 객체들 간의 의존성이 처리된다.

 

3. DispatcherServlet의 동작

: 스프링 MVC에서 사용하는 DispatcherServlet이라는 서블릿 관련 설정이 동작한다. 이는 내부적으로 웹 관련 처리의 준비작업을 진행하며, servlet-context.xml 파일을 기반으로 한다.

web.xml 일부

프로젝트 구동 후 로그 일부를 보면,

XmlWebApplicationContext 를 이용해서, servlet-context.xml을 로딩하고 해석한다.

이 과정에서 등록된 객체(Bean) 들은 기존에 위에서 만들어진 객체들과 같이 연동된다.

 


 

스프링 MVC의 기본 사상

: 스프링 개발자들은 직접적으로 Servlet/JSP(HTTPServletRequest/HTTPServletResponse 등) 의 API를 사용할 필요성이 준다. 스프링은 중간에 연결 역할을 하기 때문에 이러한 코드를 작성하지 않고도 원하는 기능을 구현할 수 있는 유용함이 있다.

 


모델 2와 스프링 MVC

모델 2와 스프링 MVC에 상세 내용은 아래 글을 참고하세요.

2021.12.08 - [[정리]/IT Keyword] - [Design Pattern] MVC패턴이란? (Model-View-Controller) |(Model1, Model2 비교)

 

[Design Pattern] MVC패턴이란? (Model-View-Controller) |(Model1, Model2 비교)

MVC(Model - View - Controller) : 어플리케이션을 세 개의 영역으로 나누고, 각 구성요소에 고유한 역할을 두는 개발 방식이다. MVC 패턴을 잘 사용하면, 사용자의 인터페이스로부터 비즈니스 로직을 분

ee2ee2.tistory.com

 

스프링 MVC 기본 구조

1) 사용자의 Request는 Front-Contoller인 DispatcherServlet을 통해서 처리한다.
모든 Request는 DispacherServlet이 받는다.


2~3) HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾는 역할을 한다. 적절한 컨트롤러가 찾아지면 HandlerAdapter를 이용해서 해당 컨드롤러를 동작시킨다.

(HandlerMapping 인터페이스를 구현한 여러 객체들 중 RequestMappingHandlerMapping 같은 경우는 개발자가 @RequestMapping 어노테이션이 적용된 것을 기준으로 판단한다.)


4) Controller는 개발자가 작성하는 클래스로 실제 Request를 처리하는 로직을 작성한다. Controller는 다양한 타입의 결과를 반환하는데 이에 대한 처리는 ViewResolver를 이용한다.

5) ViewResolversms Controller가 반환한 결과를 어떤 View를 통해서 처리하는 것이 좋을지 해석하는 역할을 한다.
servlet-context.xml


6~7) View는 실제로 응답 보내야하는 데이터를 JSP 등을 이용해서 생성하는 역할을 하며, 만들어진 응답은 DispatcherServlet을 통해서 전송된다.