
Spring MVC
- 스프링 MVC 프레임워크는 스프링 기반으로 사용할 수 있다.
- 스프링이 제공하는 트랜잭션처리가 DI 및 AOP 적용 등을 쉽게 사용할 수 있도록 돕는다.
- 스트럭츠와 같은 프레임워크와 스프링 프레임워크를 연동하기 위해 추가 적인 설정을 하지 않아도 된다.
- 스프링 프레임워크에서 지원하는 Spring MVC는 모델-뷰-컨트롤러(MVC) 구현을 포함하여 도메인 모델코드와 웹 폼을 깔끔하게 분리할 수 있도록 하고 스프링 프레임워크의 다른 모든 기능과 통합할 수 있게 하며 DI와 선 언적인 방식으로 MVC 기반의 웹 프로그램 개발을 효율적으로 할 수 있도 록 지원한다.
특징
- Spring Framework의 다른 모듈과의 연계 용이
- 컨트롤러, command 객체, 모델 객체, Validator 등 각각의 역할에 대한 명확한 분리
- Form 객체 없이 사용자 지정 가능한 데이터 바인딩과 유효성 체크 지원
- 어떠한 View 기술과도 연계가 용이
- Tag lib통한 Message 출력, Theme 적용 등과 입력 폼을 보다 쉽게 구현
장점
1) 스프링 MVC 프레임워크는 스프링 기반으로 사용할 수 있다.
2) 스프링이 제공하는 트랜젝션 처리가 DI 및 AOP 적용 등을 손쉽게 사용할 수 있다.
3) 스트럿츠와 같은 프레임워크와 스프링프레임워크를 연동하기 위해 추가적인 설정을 하지 않아도 된다
주요 구성요소
-DispatcherServlet : 클라이언트의 요청을 전달 받는다. 컨트롤러에게 클라이언트의 요청을 전달하고 컨트롤러가 리턴한 결과값을 View에 전달하여알맞은 응답을 생성한다.
-HandlerMapping : 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지를 결정한다. RequestURL과 Controller 클래스의 맵핑을 관리한다.
-Controller : 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려준다. 비즈니스 로직을 호출하여 처리 결과 ModelAndView 인스턴스를 반환한다.
-ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.
-ViewResolver : 컨트롤러의 처리결과를 생성할 뷰를 결정한다.

다이나믹 웹 프로젝트를 이용하여 MVC패턴의 스프링 프로젝트를 만들어 보겠습니다!

다이나믹 웹프로젝트를 만들기위해 프로젝트 이름을 작성하고 원래는 바로 Finish를 눌렀지만 Next를 눌러주세요!
(아마 스프링 설치하면서 다이나믹 웹프로젝트 오류가 있을수 있습니다...!)


src\main\java를 지우고 Add Folder로 src폴더를 만들어주세요!
아마 삭제 안하고 Edit로 수정해도 될겁니다!!
그리고 아래쪽에 Default output folder가 build\classes인지도 잘 확인해주세요!
그다음 Next를 누르겠습니다.

Content director에 WebContent로 수정해주시고 Generate web.xml 체크하고 만들게요.
(만약 Generate web.xml을 체크하지 않고 만들었다면 만들어진 프로젝트 우클릭 - Java EE Tools - Generate Depolyment Descriptor stub 을 클릭하면 만들어집니다)
(만드는데 좀 오래걸리네요,, 컴퓨터 문제인가)

이화면 다 기억나시나요??
메이븐으로 만들건데요.
프로젝트 우클릭 후 Configure - Convert to Maven Project를 클릭합니다.
그러고 Finish를 눌러서 메이븐으로 만들어주세요!
그러면 pom.xml이 만들어집니다.
pom.xml에 디펜던시를 추가해야합니다.(</build>와</project> 사이에 작성해주시면됩니다 - 26번라인)
dependency :
org.springframework.spring-web
org.springframework.spring-webmvc
//pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Spring07_HelloMVC</groupId>
<artifactId>Spring07_HelloMVC</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
<!-- TODO : 00.dependency 추가 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.6</version>
</dependency>
</dependencies>
</project>

WebContent 아래에 index.html파일을 만들겠습니다.



WEB-INF 아래에 web.xml이 있는데 같은 경로에 hello-servlet.xml파일과 applicationContext.xml 파일을 Spring Bean Configuration File로 만들어주세요.
(저는 파일이름에 .xml 안적었는데 적어도 됩니다!)

그다음 web.xml로 이동해서 welcom파일 전부다 삭제하고 <listener>를 추가합니다!
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>Spring07_HelloMVC</display-name>
<!-- TODO : 01.listener -->
<!-- 서버 올라갈때 어떤애들 먼저 올려줄지 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- TODO : 02.DispatcherServlet -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<!-- /*.do 아님!! -->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
이후에는 hello-servlet.xml로 이동해주세요.

Namespaces로 이동해서 context와 mvc를 체크해주세요.
이후 소스로 이동해서 다음 코드를 작성합니다.
//hello-servlet.xml
<context:component-scan base-package="com.hello.mvc" />
<mvc:annotation-driven />


src 아래
com.hello.mvc.controller.HelloController
com.hello.mvc.biz.HelloBiz
com.hello.mvc.dao.HelloDao
를 만듭니다.

그리고 각각 biz에는 @Service / controller에는 @Controller / Dao에는 @Repository 를 어노테이션 걸어주면 각각의 클래스는 biz는 Service로 등록되고 controller는 Controller로 등록이 되면 Dao는 Repository로 등록이 됩니다.
//HelloController.java
package com.hello.mvc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.hello.mvc.biz.HelloBiz;
@Controller
public class HelloController {
// TODO : 05.Biz(@Service) 호출
@Autowired
private HelloBiz biz;
// TODO : 04.handlerMapping을 통해, /hello.do로 넘어온 요청이 Controller의 해당 method를 찾아옴
@RequestMapping("/hello.do")
public String getHello(Model model) {
// TODO : 09.return받은 값을 model 객체에 담아서 전달(ModelAndView)
model.addAttribute("message", biz.getHello());
// TODO : 10.view
return "/WEB-INF/views/hello.jsp";
}
@RequestMapping("/bye.do")
//public ModelAndView getBye(@RequestParam("name") String nickname) {
public ModelAndView getBye(String name) {
ModelAndView mav = new ModelAndView();
mav.setViewName("/WEB-INF/views/bye.jsp");
mav.addObject("message", "bye, " + name);
return mav;
}
}
//HelloDao.java
package com.hello.mvc.dao;
import org.springframework.stereotype.Repository;
@Repository
public class HelloDao {
// TODO : 07.Dao에서 return (db랑 연결하는 코드가 들어감)
public String getHello() {
return "Spring";
}
}
// HelloBiz.java
package com.hello.mvc.biz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hello.mvc.dao.HelloDao;
@Service
public class HelloBiz {
// TODO : 06.Dao(@Repository) 호출
@Autowired
private HelloDao dao;
public String getHello() {
// TODO : 08. Biz에서 return
return "Hello, " + dao.getHello();
}
}
@RequestMapping
- url을 class 또는 method와 mapping시켜주는 역할
@RequestParam
- key=value 형태로 넘어오는 파라미터를 mapping된 method의 파라미터로 지정
@ModelAttribute
- form tag를 통해 넘어온 model을 mapping된 method의 파라미터로 지정
@SessionAttribute
- session에서 model의 정보를 유지하고 싶을 경우 사용

WebContent/WEB-INF/views 경로에 bye.jsp와 hello.jsp를 만들어주세요!(views폴더도 만들어야합니다)
//hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- TODO : 11.화면에 출력 -->
<h1>${message }</h1>
</body>
</html>
//bye.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${message }</h1>
</body>
</html>
이제 모든 코드가 작성되었습니다. 실행해 볼까요??

이런 화면이 나올겁니다.

hello를 누르면 이런 화면이

bye를 누르면 이런 화면이 나올겁니다.
이제 순서대로
00. dependency 추가
// pom.xml
<!-- TODO : 00.dependency 추가 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.6</version>
</dependency>
</dependencies>
01. listener
// web.xml
<!-- TODO : 01.listener -->
<!-- 서버 올라갈때 어떤애들 먼저 올려줄지 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
02. DispatcherServlet
<!-- TODO : 02.DispatcherServlet -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<!-- /*.do 아님!! -->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
03. package 읽어서 객체 생성
// hello-servlet.xml
<!-- TODO : 03.package 읽어서 객체생성 -->
<context:component-scan base-package="com.hello.mvc" />
<mvc:annotation-driven />
04. handlerMapping
// HelloController.java
// TODO : 04.handlerMapping을 통해, /hello.do로 넘어온 요청이 Controller의 해당 method를 찾아옴
@RequestMapping("/hello.do")
public String getHello(Model model) {
05. biz(@Service)호출
// HelloController.java
// TODO : 05.Biz(@Service) 호출
@Autowired
private HelloBiz biz;
06. Dao(@Repository)호출
// HelloBiz.java
// TODO : 06.Dao(@Repository) 호출
@Autowired
private HelloDao dao;
07. Dao에서 return
// HelloDao.java
// TODO : 07.Dao에서 return (db랑 연결하는 코드가 들어감)
public String getHello() {
return "Spring";
}
08. Biz에서 return
// HelloBiz.java
public String getHello() {
// TODO : 08. Biz에서 return
return "Hello, " + dao.getHello();
}
09. return받은 값을 model 객체에 담아서 전달
// HelloController.java
// TODO : 09.return받은 값을 model 객체에 담아서 전달(ModelAndView)
model.addAttribute("message", biz.getHello());
10. view
// TODO : 10.view
return "/WEB-INF/views/hello.jsp";
11. 화면에 출력
// hello.jsp
<!-- TODO : 11.화면에 출력 -->
<h1>${message }</h1>
실행시 프로젝트가 돌아가는 구조에 대해서 간략하게 적어 두었습니다.
자 그럼 이제 window - preferences의 검색창에 todo라고 작성해봅니다

General - Editors - Structured Text Edito - Task Tags로 들어와서 Enable searching for Task Tags를 체크해주세요!

아래쪽 Java - Compiler - Task Tags로 들어와보면 TODO라고 작성한것이 잘 작성되어있습니다.
이제 Apply해주세요!
Window - Show view - Tasks를 Open합니다(만약 없다면 Other에서 Tasks검색하시면됩니다)

그러면 지금까지 주석을 달아 놓은 TODO가 모두 나옵니다!
더블클릭하면 해당 코드로 이동이됩니다!
근데 다른 프로젝트에 작성한 것도 모두 나오기 때문에 주의해주세요~!
혹시 안되시는 분들은

이거 클릭해보시거나
프로젝트 우클릭해서 Maven - update project해보시면 될수도 있습니다!
TODO는 만약 작업을 할때 코드를 작성하다가 뭔가 부족한 코드를 작성하고 나중에 다시 작성하려고 할때 다시 알려주기 위함입니다.
혹시라도 작업을 하다가 잘 안되는 부분이 생기거나 뒤로 미뤄야 하는 부분이 생기면 TODO를 작성해서 나중에 까먹지 않고 작업을 마무리 할수 있도록 도와줍니다
'Java 관련 > Spring Legecy' 카테고리의 다른 글
[Spring] encodingFilter로 한글 설정하기 (0) | 2022.03.31 |
---|---|
[Spring] Spring Legacy Project (0) | 2022.03.30 |
[Spring] AOP(@Component) (0) | 2022.03.28 |
[Spring] AOP(before, after, after-returning, after-throwing, around) (0) | 2022.03.27 |
[Spring] AOP(Aspect Oriented Programming) (0) | 2022.03.26 |