๐ปSpring MVC Project
- ์คํ๋ง ๊ธฐ๋ฐ MVC ์น ํ๋ก์ ํธ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด๋ค.
- model, view, controller ์ ํ์ ์ด๋์ ๋ ๊ตฌํํ์ฌ ์ ๊ณตํ๋ค.
๐ป์ค์ ํ์ผ : servlet-context.xml
- Spring ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์น ์ปจํ ์คํธ ์ค์ ์ ๋ด๋นํ๋ XML ์ค์ ํ์ผ์ด๋ค.
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์น ๊ตฌ์ฑ๊ณผ ๊ด๋ จ๋ ์ค์ ์ ํฌํจํ๊ณ ์๋ค.
- ๊ฒฝ๋ก : src > main > webapp > WEB-INF > sping > appServlet
๊ตฌ์กฐ
๋ค์์คํ์ด์ค
servlet-context.xml ํ์ผ์์ beans๋ ๋ค์์คํ์ด์ค์ ํจ๊ป ์ฌ์ฉํด์ผํด์ <beans:beans> ์ ๊ฐ์ ํํ๋ก ์ฐ์ฌ์ ธ์๋ค. ํ์ผ๋ง๋ค ๋ค์์คํ์ด์ค๋ฅผ ์๋ตํ๊ฑฐ๋ ๋ช ์๋ฅผ ํด์ค์ผํ๋ ๋ถ๋ถ์ด ๋ค๋ฅด๋ค.
View Resolver
Spring MVC์์ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํํ๋ ๋ทฐ ์ด๋ฆ์ ์ค์ ๋ทฐ๋ก ๋ณํํ๋ ์ญํ ์ด๋ค.
prefix ์์ฑ์ ๋ทฐ ์ด๋ฆ์ ์์ ๋ถ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค. ์๋ฅผ ๋ค์ด, ์ปจํธ๋กค๋ฌ์์ ๋ฐํํ ๋ทฐ ์ด๋ฆ์ด "home"์ด๋ผ๋ฉด, ์ด ๊ฒฝ๋ก์ ์กฐํฉํ์ฌ "/WEB-INF/views/home.jsp"๋ก ์ค์ ๋ทฐ์ ๊ฒฝ๋ก๋ฅผ ํ๋ค.
suffix ์์ฑ์ ๋ทฐ ์ด๋ฆ์ ๋ค์ ๋ถ์ผ ํ์ฅ์๋ฅผ ์ง์ ํ๋ค. ์๋ฅผ ๋ค์ด, ".jsp"๋ก ์ค์ ๋์ด ์๋ค๋ฉด ์ต์ข
์ ์ผ๋ก "/WEB-INF/views/home.jsp"๋ก ๋ทฐ์ ๊ฒฝ๋ก๊ฐ ๊ฒฐ์ ๋๋ค.
๐ป๊ธฐ๋ณธ ์์ ์ฝ๋
ํจํค์ง๋ช | ํ์ผ๋ช |
com.test.spring.controller | |
Ex01Controller.java | |
views | |
ex01.jsp |
Ex01Controller.java
package com.test.spring.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class Ex01Controller implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.setViewName("ex01");
request.setAttribute("name", "susukkang");
mv.addObject("age", 26); //๊ถ์ฅ
return mv;
}
}
์ด์ Servlet์์๋ doGet์ด๋ doPost๋ก ์๋ธ๋ฆฟ ํธ์ถ๋ฉ์๋๋ก ์ฌ์ฉํ์๋ค.
Spring MVC ํ๋ก์ ํธ์์๋ handleRequest๋ฅผ ์ด์ฉํ๋ค.
์ด์ Servlet์์๋ RequsetDispatcher ์์ forward()๋ก ๋ทฐ(JSP)๋ฅผ ํธ์ถํ์๋ค.
Spring MVC ํ๋ก์ ํธ์์๋ ModelAndView ๋ฅผ ์ด์ฉํ๋ค.
setViewName ๋ฉ์๋๋ฅผ ํตํด ๋ทฐ์ ์ด๋ฆ์ "ex01"๋ก ์ค์ ํ๋ฉฐ, ์ค์ ๋ทฐ๋ฅผ ์ฐพ์๊ฐ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์์์ ์ค์ ํ ViewResolver(๋ทฐ ๋ฆฌ์กธ๋ฒ)๋ก ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ์์ฒญ ๊ฒฐ๊ณผ๋ก ์ฌ์ฉ๋ ๋ทฐ๋ฅผ ์ฐพ๋ ์ญํ ์ ๋ด๋นํ๋ค.
mv.addObject
ModelAndView์ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค. ๋ชจ๋ธ ๋ฐ์ดํฐ๋ ๋ทฐ์ ์ ๋ฌ๋์ด ํ๋ฉด์ ํ์๋๋ ๋ฐ์ดํฐ์ด๋ค. Sertvlet ๋ ์ฌ์ฉํ request.setAttribute ์ ๊ฐ์ ์ญํ ์ ํ๋ค. addObject๊ฐ ์คํ๋ง์์ ๋ง๋ ๋ฉ์๋์ด๋ฏ๋ก ์ด ๋ฉ์๋ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
ex01.jsp
<div>์ด๋ฆ: ${name}</div>
<div>๋์ด: ${age}</div>
์ Controller์์ setAttribute์ addObject๋ก ๋๊ฒผ๋ name, age๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
โ dispatcherservlet โ
frontcontroller
web.xml
๐ป์์กด ์ฃผ์ ์์ ์ฝ๋
ํจํค์ง๋ช | ํ์ผ๋ช |
com.test.spring.controller | |
Ex02Controller.java | |
com.test.spring.persistence | |
SpringDAO.java(I) | |
SpringDAOImpl.java(c) | |
SpringDTO.java | |
views | |
ex02.jsp |
Ex02Controller.java
package com.test.spring.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.test.spring.persistence.SpringDAO;
import com.test.spring.persistence.SpringDAOImpl;
public class Ex02Controller implements Controller{
//1. ๋ฉค๋ฒ๋ณ์ ์น๊ฒฉ
private SpringDAO dao;
//2. ์์ฑ์ ์์ฑ
public Ex02Controller(SpringDAO dao) {
this.dao = dao;
}
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
int count = dao.getCount();
ModelAndView mv = new ModelAndView();
mv.addObject("count", count);
mv.setViewName("ex02");
return mv;
}
}
Controller ์ ๋ฌด ์ค DB์์ ์ ํ ๋ DAO์๊ฒ ์์์ ํ๋ค.
์ด ๋ง์ Ex02Controller ๊ฐ์ฒด๊ฐ SpringDAO ๊ฐ์ฒด๋ฅผ ์์กดํ๋ค๋ ์๋ฏธ์ด๋ค.
์์กด ๊ฐ์ฒด๋ ์คํ๋ง์์ ์์ฑํ๋๋ก ๋ง๋ค์ด์ค๋ค.
์์ฑ ๋ฐฉ๋ฒ์ ์๋ ๊ธ์ ์ฐธ๊ณ ํ๋ค.
ex02.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>Ex02</h1>
<div>count: ${count}</div>
</body>
</html>
Controller์์ addObject๋ก ์ ๋ฌ๋ฐ์ count๋ฅผ ์ถ๋ ฅํ๋ค.
SpringDAO.java(I)
package com.test.spring.persistence;
import com.test.spring.domain.SpringDTO;
public interface SpringDAO {
int getCount();
int add(SpringDTO dto);
}
Controller ๊ฐ์ฒด์ DB ๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ์ด์ด์ฃผ๋ ์ญํ ์ด๊ธฐ์ interface๋ก ์์ฑํ๋ค.
Controller ์์ ์ฌ์ฉํ ๋ฉ์๋๋ช ๋ง ๊ธฐ์ฌ๋์ด ์๋ค.
SpringDAOImpl.java
package com.test.spring.persistence;
import com.test.spring.domain.SpringDTO;
public class SpringDAOImpl implements SpringDAO{
@Override
public int getCount() {
return 100; //select ์์
๊ฒฐ๊ณผ๋ผ๊ณ ๊ฐ์
}
@Override
public int add(SpringDTO dto) {
//DB์ Insert ํ๋ค๊ณ ๊ฐ์
System.out.println("insert ์๋ฃ");
System.out.println(dto);
return 1;
}
}
SpringDAO.java์์ ์ ์ํ ๋ฉ์๋๋ฅผ ์ด ํ์ผ์์ ๊ตฌํํ๋ค.
SpringDTO.java
package com.test.spring.domain;
import lombok.Data;
@Data
public class SpringDTO {
private String name;
private String age;
private String address;
}
DB์ ์๋ ์ปฌ๋ผ๋ช ๊ณผ ๊ฐ๊ฒ ๋ณ์๋ช ์ ์ ์ธํ๋ค.
servlet-context.xml
<beans:bean name="/ex02.do" class="com.test.spring.controller.Ex02Controller">
<beans:constructor-arg ref="dao"></beans:constructor-arg>
</beans:bean>
Ex02Controller ๋ฅผ ์คํํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
+์๋ฒ ์คํ์ ์๋ฌ
Problem Occured ์๋ฌ๊ฐ ๋ฐ์ํ ๋๊ฐ ์๋ค.
์ด๋ด ๋๋ ํ๋ก์ ํธ ํ๋จ์ Servers - ์คํ์ค์ธ ์๋ฒ ๋๋ธํด๋ฆญ - Modules ๋ฅผ ํ์ธํ๋ค.
์คํ์ค์ธ ํ๋ก์ ํธ Path๊ฐ ๊ฒน์น์ง ์๋์ง ํ์ธํ๋ค.
๊ฒน์น๋ค๋ฉด Root Context๋ฅผ ๋ณ๊ฒฝํ๋ ํ๋์ ํ๋ก์ ํธ๋ ์คํ์ ์ค์งํ๋ ํ๋ค.
Root Context ์์ ํ๊ธฐ
๋ณ๊ฒฝํ ํ๋ก์ ํธ ํด๋ฆญ ํ ์ฐ์ธก Edit ํด๋ฆญ
Path ์์ ํ๊ธฐ
'/' ์ฌ๋์๋ ์์ง๋ง๊ณ ๊ผญ ๋ฃ์ด์ค์ผํ๋ค!
์๋ฒ ์คํ ์ค์งํ๊ธฐ
์คํ์ค์ธ ์๋ฒ ์ฐํด๋ฆญ - Add and Remove
์คํ์ ์ํ๋ฉด ํ๋ก์ ํธ ํด๋ฆญ ํ Add๋ฅผ ํ๊ณ ์ค์ง๋ฅผ ์ํ๋ฉด ํ๋ก์ ํธ ํด๋ฆญ ํ Remove๋ฅผ ํ๋ค.
์ผ์ชฝ(Available) : ์คํ ์ค์ง
์ค๋ฅธ์ชฝ(configured) : ์คํ์ค