목차
1 오늘 학습 흐름
2 Spring MVC 프로젝트 구조
3 pom.xml과 Spring MVC 의존성
4 web.xml의 역할
5 DispatcherServlet
6 ContextLoaderListener
7 Root Context와 Servlet Context
8 Controller
9 @RequestMapping
10 Model
11 ModelAndView
12 @RequestParam
13 Service 역할의 HelloBiz
14 DAO 역할의 HelloDao
15 View와 JSP 이동
16 전체 요청 흐름
17 오늘 학습한 핵심 정리
1 오늘 학습 흐름
1) Spring08_HelloMVC 실습
(1) 오늘 실습 내용
오늘은 Spring MVC의 가장 기본적인 요청 처리 흐름을 학습했다.
사용자가 브라우저에서 요청을 보내면 DispatcherServlet이 요청을 받고, Controller가 처리한 뒤 JSP 화면으로 응답하는 구조를 확인했다.
(2) 이전 수업과의 연결
이전까지는 Spring의 IoC, DI, Annotation, AOP를 중심으로 학습했다.
오늘은 그 개념들이 실제 웹 프로젝트에서 어떻게 연결되는지 확인하는 단계였다.
(3) 핵심 목표
오늘의 핵심은 Spring MVC에서 Controller, Model, View가 각각 어떤 역할을 하는지 이해하는 것이다.
특히 기존 Servlet MVC와 비교했을 때, Spring MVC에서는 DispatcherServlet이 Front Controller 역할을 담당한다는 점이 중요하다.
2 Spring MVC 프로젝트 구조
1) 전체 구조
(1) src
src 폴더에는 Java 코드가 들어간다.
이번 프로젝트에서는 com.hello.mvc.controller 패키지와 com.hello.mvc.model 패키지가 있다.
(2) controller 패키지
controller 패키지에는 HelloController 클래스가 있다.
이 클래스는 사용자의 요청을 받아 처리하는 Controller 역할을 한다.
(3) model 패키지
model 패키지에는 HelloBiz와 HelloDao 클래스가 있다.
HelloBiz는 비즈니스 로직을 처리하는 역할이고, HelloDao는 데이터 처리 역할이다.
(4) WebContent
WebContent에는 실제 웹에서 사용하는 파일들이 들어간다.
index.html, bye.jsp, WEB-INF 폴더 등이 포함된다.
(5) WEB-INF
WEB-INF는 외부에서 직접 접근할 수 없는 서버 내부 설정 영역이다.
web.xml, Spring 설정 파일, view JSP 파일 등을 넣을 수 있다.
3 pom.xml과 Spring MVC 의존성
1) pom.xml
(1) pom.xml의 역할
pom.xml은 Maven 프로젝트의 설정 파일이다.
프로젝트에서 사용할 라이브러리와 빌드 설정을 관리한다.
(2) packaging
이번 프로젝트는 war 방식으로 패키징된다.
war는 Web Application Archive의 줄임말로, 웹 애플리케이션을 배포할 때 사용하는 형식이다.
2) Spring MVC 관련 의존성
(1) spring-web
spring-web은 Spring에서 웹 애플리케이션을 만들기 위한 기본 기능을 제공한다.
웹 요청, 웹 컨텍스트, 웹 관련 Spring 기능을 사용할 때 필요하다.
(2) spring-webmvc
spring-webmvc는 Spring MVC 구조를 사용하기 위한 핵심 라이브러리이다.
DispatcherServlet, Controller, ModelAndView, ViewResolver 같은 Spring MVC 기능이 이 모듈을 통해 제공된다.
(3) servlet-api
servlet-api는 Servlet, HttpServletRequest, HttpServletResponse 같은 웹 요청 처리 객체를 사용하기 위해 필요하다.
다만 실제 실행 환경인 Tomcat이 servlet-api를 제공하므로 Maven에서는 provided 범위로 설정한다.
4 web.xml의 역할
1) web.xml
(1) web.xml의 의미
web.xml은 웹 애플리케이션의 배포 서술자이다.
웹 애플리케이션이 실행될 때 어떤 Servlet을 등록하고, 어떤 URL 패턴을 어떤 Servlet에 연결할지 설정한다.
(2) Spring MVC에서의 역할
Spring MVC에서는 web.xml에 DispatcherServlet을 등록한다.
DispatcherServlet은 사용자의 요청을 가장 먼저 받는 Front Controller 역할을 한다.
(3) welcome-file
web.xml에는 처음 접속했을 때 보여줄 시작 페이지를 설정할 수 있다.
이번 프로젝트에서는 index.html이 시작 화면 역할을 한다.
5 DispatcherServlet
1) DispatcherServlet의 개념
(1) DispatcherServlet
DispatcherServlet은 Spring MVC의 핵심 Servlet이다.
사용자의 모든 요청을 먼저 받아서 알맞은 Controller로 보내는 역할을 한다.
(2) Front Controller
DispatcherServlet은 Front Controller 패턴을 사용한다.
Front Controller는 모든 요청을 하나의 중앙 Controller가 먼저 받은 뒤, 알맞은 처리 대상으로 분배하는 구조이다.
(3) 기존 Servlet MVC와의 차이
기존에는 개발자가 직접 Servlet을 만들고 command 값으로 요청을 분기했다.
Spring MVC에서는 DispatcherServlet이 먼저 요청을 받고, @RequestMapping 정보를 보고 알맞은 Controller 메소드를 찾아 실행한다.
2) URL 매핑
(1) *.do
이번 프로젝트에서는 DispatcherServlet이 *.do 요청을 처리하도록 설정되어 있다.
즉, hello.do, bye.do 같은 요청이 들어오면 DispatcherServlet이 먼저 받는다.
(2) 요청 처리 흐름
사용자가 hello.do를 요청하면 DispatcherServlet이 요청을 받는다.
그 다음 @RequestMapping("/hello.do")가 붙은 Controller 메소드를 찾아 실행한다.
(3) 핵심
사용자는 Controller를 직접 호출하는 것이 아니다.
요청은 먼저 DispatcherServlet으로 들어가고, DispatcherServlet이 Controller를 찾아 호출한다.
6 ContextLoaderListener
1) ContextLoaderListener의 개념
(1) ContextLoaderListener
ContextLoaderListener는 웹 애플리케이션이 시작될 때 Spring의 Root ApplicationContext를 생성하는 역할을 한다.
(2) applicationContext.xml
web.xml에서 contextConfigLocation으로 /WEB-INF/applicationContext.xml을 지정하면, ContextLoaderListener가 이 설정 파일을 읽어 Root Context를 생성한다.
(3) 사용 목적
Root Context에는 보통 Service, DAO처럼 웹 화면과 직접 관련 없는 공통 Bean을 등록한다.
여러 DispatcherServlet이 있어도 공통으로 사용할 수 있는 Bean들을 관리하는 영역이다.
7 Root Context와 Servlet Context
1) Root Context
(1) Root Context의 역할
Root Context는 웹 애플리케이션 전체에서 공통으로 사용하는 Spring 컨테이너이다.
보통 Service, DAO, 공통 설정 Bean을 관리한다.
(2) 생성 시점
웹 애플리케이션이 시작될 때 ContextLoaderListener가 Root Context를 만든다.
2) Servlet Context
(1) Servlet Context의 역할
Servlet Context는 DispatcherServlet이 사용하는 Spring 컨테이너이다.
보통 Controller, ViewResolver, HandlerMapping처럼 웹 MVC 처리와 관련된 Bean을 관리한다.
(2) hello-servlet.xml
DispatcherServlet 이름이 hello라면 기본적으로 /WEB-INF/hello-servlet.xml 설정 파일을 찾는다.
이 파일에는 Spring MVC와 관련된 설정이 들어갈 수 있다.
3) 둘을 나누는 이유
(1) 역할 분리
Root Context는 공통 비즈니스 영역을 관리한다.
Servlet Context는 웹 요청 처리 영역을 관리한다.
(2) 이해하기 쉽게 말하면
Root Context는 Service와 DAO의 공간이다.
Servlet Context는 Controller와 View 처리의 공간이다.
(3) 오늘 실습의 의미
오늘은 이 두 컨텍스트가 Spring MVC 프로젝트에서 어떻게 설정되는지 확인했다.
Spring MVC는 단순히 Controller 하나만 있는 구조가 아니라, 웹 애플리케이션이 실행될 때 여러 설정과 컨테이너가 함께 동작하는 구조이다.
8 Controller
1) HelloController
(1) Controller 역할
HelloController는 사용자의 요청을 처리하는 Spring MVC Controller이다.
클래스 위에 @Controller가 붙어 있어 Spring이 이 클래스를 Controller Bean으로 인식한다.
(2) @Controller
@Controller는 해당 클래스가 웹 요청을 처리하는 Controller라는 의미이다.
@Component 계열 Annotation이기 때문에 Component Scan 대상이 된다.
(3) HelloBiz 주입
HelloController는 HelloBiz를 필드로 가지고 있고, @Autowired를 통해 Spring이 자동으로 주입한다.
Controller가 직접 new HelloBiz를 하지 않고, Spring 컨테이너에서 관리하는 HelloBiz Bean을 받아 사용한다.
2) Controller의 역할
(1) 요청 받기
Controller는 사용자의 요청을 받는다.
예를 들어 hello.do, bye.do 같은 요청을 처리한다.
(2) 필요한 로직 호출
Controller는 직접 모든 일을 처리하지 않는다.
필요한 경우 Biz 또는 Service 계층을 호출해 로직 처리를 맡긴다.
(3) 데이터 담기
처리 결과를 Model 또는 ModelAndView에 담는다.
이 데이터는 JSP에서 사용할 수 있다.
(4) View 반환
마지막으로 어떤 JSP로 이동할지 View 이름을 반환한다.
DispatcherServlet은 이 View 정보를 이용해 JSP로 forward한다.
9 @RequestMapping
1) @RequestMapping의 의미
(1) @RequestMapping
@RequestMapping은 URL 요청과 Controller 메소드를 연결하는 Annotation이다.
사용자가 특정 URL로 요청을 보내면, Spring은 @RequestMapping 값을 보고 실행할 메소드를 찾는다.
(2) hello.do
@RequestMapping("/hello.do")가 붙은 메소드는 hello.do 요청을 처리한다.
(3) bye.do
@RequestMapping("/bye.do")가 붙은 메소드는 bye.do 요청을 처리한다.
2) 기존 command 방식과 비교
(1) 기존 Servlet 방식
기존 Servlet MVC에서는 하나의 Servlet에서 command 값을 꺼내 if문으로 요청을 분기했다.
예를 들어 command=list, command=detail 같은 값을 직접 비교했다.
(2) Spring MVC 방식
Spring MVC에서는 @RequestMapping으로 URL과 메소드를 직접 연결한다.
command 값을 직접 비교하는 코드가 줄어든다.
(3) 장점
URL마다 처리 메소드를 분리할 수 있어 코드가 더 명확해진다.
요청이 늘어나도 if문이 길어지는 문제를 줄일 수 있다.
10 Model
1) Model의 의미
(1) Model
Model은 Controller에서 View로 데이터를 전달하기 위한 객체이다.
Controller가 Model에 데이터를 담으면 JSP에서 그 데이터를 사용할 수 있다.
(2) addAttribute
model.addAttribute는 View로 전달할 데이터를 저장하는 메소드이다.
예를 들어 model.addAttribute("message", res)를 사용하면 JSP에서 message라는 이름으로 값을 꺼낼 수 있다.
(3) request.setAttribute와 비슷한 역할
기존 Servlet에서는 request.setAttribute로 데이터를 JSP에 전달했다.
Spring MVC에서는 Model을 사용해 비슷한 역할을 수행한다.
2) hello.do 흐름
(1) biz.getHello 호출
hello.do 요청이 들어오면 Controller는 HelloBiz의 getHello 메소드를 호출한다.
(2) 결과 저장
반환받은 값을 model.addAttribute("message", res)로 Model에 담는다.
(3) JSP 이동
Controller는 hello.jsp 경로를 반환한다.
JSP에서는 message 값을 출력할 수 있다.
11 ModelAndView
1) ModelAndView의 의미
(1) ModelAndView
ModelAndView는 데이터와 View 정보를 함께 담는 객체이다.
Model은 데이터 전달에 집중하고, ModelAndView는 데이터와 이동할 View 이름을 함께 관리한다.
(2) addObject
addObject는 View로 전달할 데이터를 저장한다.
mav.addObject("message", "Bye, " + nickname)처럼 작성하면 JSP에서 message를 사용할 수 있다.
(3) setViewName
setViewName은 이동할 View 경로를 지정한다.
mav.setViewName("/WEB-INF/views/bye.jsp")처럼 작성하면 해당 JSP로 이동한다.
2) bye.do 흐름
(1) 파라미터 받기
bye.do 요청에서는 name 파라미터를 받는다.
이 값은 @RequestParam을 통해 nickname 변수에 저장된다.
(2) 메시지 생성
Controller는 "Bye, " + nickname 형태로 메시지를 만든다.
(3) ModelAndView 반환
메시지를 ModelAndView에 담고, 이동할 JSP 경로를 지정한 뒤 반환한다.
3) Model과 ModelAndView 비교
(1) Model
Model은 데이터만 담고, View 이름은 메소드의 return 문자열로 따로 반환한다.
(2) ModelAndView
ModelAndView는 데이터와 View 이름을 하나의 객체에 함께 담아 반환한다.
(3) 선택 기준
간단한 화면 이동과 데이터 전달은 Model을 사용해도 충분하다.
데이터와 View 정보를 한 번에 묶어 반환하고 싶을 때는 ModelAndView를 사용할 수 있다.
12 @RequestParam
1) @RequestParam의 의미
(1) @RequestParam
@RequestParam은 요청 파라미터를 Controller 메소드의 매개변수로 받아올 때 사용하는 Annotation이다.
URL이나 form에서 넘어온 key=value 형태의 값을 메소드 파라미터에 연결한다.
(2) 실습 예시
@RequestParam("name") String nickname은 요청 파라미터 중 name 값을 꺼내 nickname 변수에 넣는다는 뜻이다.
(3) 요청 예시
bye.do?name=inseok처럼 요청하면 name 값인 inseok이 nickname 변수에 들어간다.
2) @RequestParam을 사용하는 이유
(1) 코드가 간단해진다
기존 Servlet에서는 request.getParameter("name")을 직접 작성해야 했다.
Spring MVC에서는 @RequestParam을 사용해 메소드 파라미터에서 바로 값을 받을 수 있다.
(2) 의미가 명확하다
어떤 요청 파라미터를 받는지 메소드 선언부에서 바로 확인할 수 있다.
(3) 주의할 점
기본적으로 해당 파라미터가 없으면 오류가 발생할 수 있다.
필요한 경우 required 옵션이나 defaultValue를 사용할 수 있다.
13 Service 역할의 HelloBiz
1) HelloBiz
(1) @Service
HelloBiz에는 @Service가 붙어 있다.
@Service는 해당 클래스가 비즈니스 로직을 처리하는 Service 계층의 Bean이라는 의미이다.
(2) Controller와 DAO 사이
HelloBiz는 Controller와 DAO 사이에서 동작한다.
Controller가 직접 DAO를 호출하지 않고, Biz 또는 Service를 통해 로직을 처리하는 구조를 만든다.
(3) HelloDao 주입
HelloBiz는 HelloDao를 필드로 가지고 있고, @Autowired로 주입받는다.
이 역시 직접 new를 하지 않고 Spring이 의존성을 자동으로 연결한다.
2) Service 계층의 의미
(1) 비즈니스 로직 처리
Service 계층은 실제 업무 로직을 담당한다.
예를 들어 게시판이라면 글 작성 규칙, 로그인이라면 인증 처리 흐름이 Service 계층에 들어간다.
(2) 역할 분리
Controller는 요청과 응답 흐름을 담당한다.
Service는 로직을 담당한다.
DAO는 DB 접근을 담당한다.
(3) 오늘 실습의 의미
HelloBiz의 로직은 아직 단순하지만, Spring MVC에서 Controller, Service, DAO를 분리하는 기본 구조를 확인할 수 있었다.
14 DAO 역할의 HelloDao
1) HelloDao
(1) @Repository
HelloDao에는 @Repository가 붙어 있다.
@Repository는 해당 클래스가 데이터 접근 계층의 Bean이라는 의미이다.
(2) DAO 역할
DAO는 Data Access Object의 줄임말이다.
DB나 외부 저장소에 접근하는 역할을 담당한다.
(3) 오늘 실습
HelloDao의 getHello 메소드는 현재 null을 반환한다.
아직 실제 DB 연결은 없지만, 구조상으로는 데이터 접근 계층을 담당하는 위치이다.
2) @Repository의 의미
(1) Bean 등록
@Repository도 @Component 계열 Annotation이다.
Component Scan 대상이 되면 Spring Bean으로 등록된다.
(2) 계층 의미
@Repository를 사용하면 이 클래스가 데이터 접근 계층이라는 의미가 명확해진다.
(3) 이후 확장
나중에 MyBatis나 JDBC와 연결하면 HelloDao에서 실제 DB 조회를 처리할 수 있다.
15 View와 JSP 이동
1) View
(1) View의 역할
View는 사용자가 보는 화면이다.
Spring MVC에서는 JSP가 View 역할을 할 수 있다.
(2) Controller와 View
Controller는 처리 결과를 Model에 담고 View 이름을 반환한다.
DispatcherServlet은 이 View 이름을 기준으로 JSP 화면을 보여준다.
2) WEB-INF 아래 JSP
(1) WEB-INF의 특징
WEB-INF 아래의 JSP는 사용자가 URL로 직접 접근할 수 없다.
서버 내부에서 forward를 통해서만 접근할 수 있다.
(2) 사용하는 이유
사용자가 JSP를 직접 호출하지 못하게 하고, 반드시 Controller를 거쳐서 화면에 접근하게 만들 수 있다.
이렇게 하면 요청 처리 흐름을 Controller 중심으로 관리할 수 있다.
(3) 오늘 실습과 연결
Controller에서 /WEB-INF/views/hello.jsp 또는 /WEB-INF/views/bye.jsp 같은 경로를 반환한다.
이 구조는 사용자가 직접 JSP를 여는 것이 아니라 Controller가 데이터를 준비한 뒤 JSP로 이동시키는 방식이다.
16 전체 요청 흐름
1) hello.do 요청 흐름
(1) 사용자가 hello.do 요청
사용자가 브라우저에서 hello.do를 요청한다.
(2) DispatcherServlet이 요청 수신
web.xml의 *.do 매핑에 따라 DispatcherServlet이 요청을 받는다.
(3) HelloController 실행
DispatcherServlet은 @RequestMapping("/hello.do")가 붙은 getHello 메소드를 실행한다.
(4) HelloBiz 호출
HelloController는 HelloBiz의 getHello 메소드를 호출한다.
(5) HelloDao 호출
HelloBiz는 HelloDao의 getHello 메소드를 호출한다.
(6) Model에 데이터 저장
Controller는 결과를 model.addAttribute("message", res)로 저장한다.
(7) JSP로 이동
Controller가 반환한 View 경로를 기준으로 JSP가 실행된다.
2) bye.do 요청 흐름
(1) 사용자가 bye.do 요청
사용자가 bye.do?name=값 형태로 요청한다.
(2) 파라미터 처리
@RequestParam("name")을 통해 name 파라미터가 nickname 변수에 저장된다.
(3) ModelAndView 생성
Controller는 ModelAndView 객체를 만들고 message 값을 담는다.
(4) View 지정
setViewName으로 bye.jsp 경로를 지정한다.
(5) JSP 응답
DispatcherServlet은 ModelAndView 정보를 이용해 JSP로 이동하고, JSP는 message 값을 출력한다.
17 오늘 학습한 핵심 정리
1) Spring MVC 구조
(1) DispatcherServlet
모든 요청을 먼저 받는 Front Controller이다.
요청을 알맞은 Controller 메소드로 전달한다.
(2) Controller
사용자의 요청을 처리한다.
필요한 로직을 호출하고, View로 전달할 데이터를 준비한다.
(3) Model
Controller에서 View로 데이터를 전달할 때 사용한다.
기존 request.setAttribute와 비슷한 역할로 이해할 수 있다.
(4) View
사용자가 보는 화면이다.
이번 실습에서는 JSP가 View 역할을 한다.
2) Annotation 정리
(1) @Controller
해당 클래스를 Spring MVC Controller로 등록한다.
(2) @Service
비즈니스 로직을 담당하는 Service 계층 Bean으로 등록한다.
(3) @Repository
데이터 접근을 담당하는 DAO 계층 Bean으로 등록한다.
(4) @Autowired
필요한 Bean을 Spring이 자동으로 주입한다.
(5) @RequestMapping
URL 요청과 Controller 메소드를 연결한다.
(6) @RequestParam
요청 파라미터를 메소드 매개변수로 받아온다.
3) Model과 ModelAndView
(1) Model
데이터는 Model에 담고, View 이름은 문자열로 반환한다.
(2) ModelAndView
데이터와 View 이름을 하나의 객체에 함께 담아 반환한다.
(3) 공통점
둘 다 Controller에서 JSP로 데이터를 전달하는 데 사용된다.
4) 기존 Servlet MVC와 Spring MVC 비교
(1) 기존 Servlet MVC
개발자가 직접 Servlet을 만들고 command 값으로 요청을 분기했다.
request.setAttribute로 데이터를 담고 RequestDispatcher로 forward했다.
(2) Spring MVC
DispatcherServlet이 요청을 먼저 받고, @RequestMapping으로 Controller 메소드를 찾아 실행한다.
Model이나 ModelAndView로 데이터를 전달한다.
(3) 차이점
Spring MVC는 요청 분기와 객체 관리를 Spring이 도와준다.
그래서 Controller 코드는 필요한 요청 처리 메소드 중심으로 더 깔끔하게 작성할 수 있다.
5) 계층 분리
(1) Controller
요청을 받고 응답 흐름을 결정한다.
(2) Service 또는 Biz
실제 비즈니스 로직을 처리한다.
(3) DAO
DB나 저장소 접근을 담당한다.
(4) View
사용자에게 결과 화면을 보여준다.
6) 오늘 배운 점
(1) Spring MVC는 DispatcherServlet 중심 구조이다
사용자의 요청은 Controller로 바로 가는 것이 아니라 DispatcherServlet을 먼저 거친다.
DispatcherServlet은 Spring MVC에서 요청 흐름을 관리하는 핵심 객체이다.
(2) @RequestMapping으로 요청을 메소드에 연결한다
기존 Servlet에서는 command 값을 if문으로 비교했다.
Spring MVC에서는 @RequestMapping을 사용해 URL과 메소드를 직접 연결한다.
(3) Model은 View로 데이터를 보내는 상자이다
Controller에서 만든 데이터를 JSP로 보내기 위해 Model을 사용한다.
JSP는 Model에 담긴 값을 출력한다.
(4) ModelAndView는 데이터와 화면 정보를 함께 담는다
ModelAndView를 사용하면 전달할 데이터와 이동할 JSP 정보를 하나의 객체로 관리할 수 있다.
(5) 계층 분리가 중요하다
HelloController, HelloBiz, HelloDao는 각각 Controller, Service, DAO 역할을 나누어 가진다.
지금은 코드가 단순하지만, 프로젝트가 커질수록 이런 역할 분리가 중요해진다.
(6) 앞으로의 흐름
오늘은 Spring MVC의 가장 기본적인 HelloMVC 구조를 학습했다.
이후에는 이 구조를 바탕으로 게시판, 회원가입, 로그인, DB 연동, MyBatis 연동 같은 기능으로 확장할 수 있을 것 같다.
'멀티캠퍼스' 카테고리의 다른 글
| [2026.06.24] - TIL 58일차 개발자를 위한 UI/UX 특강 정리 (0) | 2026.06.25 |
|---|---|
| [2026.06.23] - TIL 57일차(Spring MVC03 게시판 프로젝트 완성) (0) | 2026.06.25 |
| [2026.06.19] - TIL 55일차 Spring AOP 실습 정리 (0) | 2026.06.25 |
| [2026.06.18] - TIL 54일차 Spring Annotation 기반 DI와 AOP 개념 정리 (0) | 2026.06.18 |
| [2026.06.17] - TIL 53일차 Spring Bean 설정 심화 복습 정리 (0) | 2026.06.18 |