씨네
공부하는 개발자 강씨네
씨네
  • 분류 전체보기 (460)
    • Web (21)
      • HTML (11)
      • CSS (10)
    • JS 관련 (49)
      • JavaScript (27)
      • JQuery (22)
    • TS 관련 (15)
      • TypeScript (15)
    • NodeJS (7)
      • NodeJS (7)
    • 따라하며 배우는 시리즈 (23)
      • NodeJS & ReactJS Basic (23)
      • NodeJS & ReactJS Movie (0)
      • NodeJS & ReactJS Youtube (0)
      • NodeJS & ReactJS ChatBot (0)
    • SPA (14)
      • React (14)
      • Vue (0)
      • Anguler (0)
    • Java 관련 (118)
      • Java (52)
      • JDBC (6)
      • JSP & Servlet (18)
      • Spring Legecy (38)
      • SpringBoot (4)
    • Python (26)
      • Python (20)
      • PyMongo (1)
      • Django (5)
    • Git (24)
      • Github (24)
    • RDB (22)
      • Oracle (21)
      • MySQL (1)
    • NoSQL (5)
      • MongoDB (5)
    • OS (4)
      • Linux (4)
    • 빅데이터 (2)
      • hadoop (2)
    • IDE (20)
      • eclipse (11)
      • VSCODE (4)
      • VisualStudio (1)
      • IntelliJ (1)
      • PyCharm (1)
      • DBeaver (2)
    • Install (3)
      • Tomcat (1)
      • Docker (1)
      • Anaconda (1)
    • 오류&에러 (28)
      • TS (2)
      • NodeJS (7)
      • SQL (8)
      • Java (1)
      • Spring (4)
      • Git (6)
      • 기타 (0)
    • 알고리즘 (67)
      • 수열 (1)
      • 백준(backjoon) (39)
      • Programmers (27)
    • 자격증 (5)
      • SQLD (5)
    • 기타 (2)
    • IT유튜브로 지식쌓기 (2)

공지사항

인기 글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
씨네

공부하는 개발자 강씨네

[Spring] Spring MVC & TODO (@RequestMapping @RequestParam @ModelAttribute @SessionAttribute)
Java 관련/Spring Legecy

[Spring] Spring MVC & TODO (@RequestMapping @RequestParam @ModelAttribute @SessionAttribute)

2022. 3. 29. 09:57
728x90

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를 작성해서 나중에 까먹지 않고 작업을 마무리 할수 있도록 도와줍니다

728x90

'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
    'Java 관련/Spring Legecy' 카테고리의 다른 글
    • [Spring] encodingFilter로 한글 설정하기
    • [Spring] Spring Legacy Project
    • [Spring] AOP(@Component)
    • [Spring] AOP(before, after, after-returning, after-throwing, around)
    씨네
    씨네
    개발자 씨네가 공부하는 내용을 기록 겸 공유하는 블로그입니다!

    티스토리툴바