๐ ๋ชฉ์
์ค๊ฐ ํ๋ก์ ํธ ๋ ์งํํ๋ ์นด๋ฉ๋ผ ์ปค๋ฎค๋ํฐ ์ฌ์ดํธ๋ฅผ Spring์ผ๋ก ์ด๊ดํ๋ ๊ฒ
์ค๋ฌด์์ ์ด๋ค ๋ฒ์ ์ ์ฌ์ฉํ ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ฒ์ ์ ์ฐ์ต
์์์ ์ผ๋ SpringMVC2์ ๋ํ ์ค๋ช ์ด ์๊ฐ๋ณด๋ค ์ดํดํ๊ธฐ ํ๋ ๊ฒ ๊ฐ์ Refresh!!
๐ DispatcherServlet (FrontController)
DispatcherServlet์ MVC2 ํจํด์์ ์ ์ผํ๊ฒ ์ฌ์ฉํ๋ ์๋ธ๋ฆฟ์ด๋ค. ๊ทธ๋ฅ ์ด๊ฒ ์์ผ๋ฉด ๋ญ ํ ์๊ฐ ์์
Spring์์๋ FrontController ๋์ DispatcherServlet์ ์ฌ์ฉํ๋ค.
๋ฒ์ 1์์๋ ๊ฐ๋ฐ์๊ฐ ๋ง๋ DispatcherServlet์ ์ฌ์ฉํ๋ค.
๐ก import com.spring.controller.common.DispatcherServlet
DispatcherServlet.java
package com.spring.controller.common;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import com.spring.controller.common.DispatcherServlet;
// FrontController
// ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ์๋ธ๋ฆฟ์ผ๋ก์, Front Controller ๋์์ธ ํจํด์ ๋ฐ๋ฅธ๋ค.
// ์ฃผ์ ์ญํ ์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ๋ชจ๋ ์์ฒญ์ ๋ฐ์ ํด๋น ์์ฒญ์ ๋ง๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์คํํ๊ณ ,
// ์คํ๋ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํํ ๋ทฐ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ๋ค.
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private HandlerMapping handler; // ํธ๋ค๋ฌ ๋งคํ์ ๋ด๋นํ๋ ๊ฐ์ฒด
private ViewResolver viewResolver; // ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ๋ด๋นํ๋ ๊ฐ์ฒด
// init-method="init"
// ์๋ธ๋ฆฟ์ด ์ด๊ธฐํ๋ ๋ ํธ์ถ๋๋ ๋ฉ์๋๋ก, ๋ฉค๋ฒ ๋ณ์ ์ด๊ธฐํ๋ฅผ ๋ด๋นํ๋ค.
// 1. ๋ฉค๋ฒ๋ณ์ ์ด๊ธฐํ
// 2. ์์ฑ์
// 3. setter
// 4. @Autowired
// 5. DI(์์กด์ฃผ์
)
// 6. init() ๋ฉ์๋
public void init() {
handler = new HandlerMapping(); // ํธ๋ค๋ฌ ๋งคํ ๊ฐ์ฒด ์์ฑ
viewResolver = new ViewResolver(); // ๋ทฐ ๋ฆฌ์กธ๋ฒ ๊ฐ์ฒด ์์ฑ
viewResolver.setPrefix("./"); // ๋ทฐ ํ์ผ์ ๊ฒฝ๋ก(prefix) ์ค์
viewResolver.setSuffix(".jsp"); // ๋ทฐ ํ์ผ์ ํ์ฅ์(suffix) ์ค์
}
// ํด๋ผ์ด์ธํธ์ GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
// ํด๋ผ์ด์ธํธ์ POST ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
// ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋
private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ํด๋ผ์ด์ธํธ์ ์์ฒญ URI๋ฅผ ์ถ์ถ
String uri = request.getRequestURI();
String cp = request.getContextPath();
String command = uri.substring(cp.length());
System.out.println("FC : " + command); // ์ถ์ถ๋ ์์ฒญ URI๋ฅผ ์ฝ์์ ์ถ๋ ฅ
// ํธ๋ค๋ฌ ๋งคํ์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ง๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ฐ์ ธ์ด
Controller controller = handler.getController(command);
// ํด๋น ์ปจํธ๋กค๋ฌ์ execute() ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ๋ฐํ๋ ๋ทฐ ์ ๋ณด๋ฅผ ์ ์ฅ
String view = controller.execute(request, response);
// ๋ฐํ๋ ๋ทฐ ์ ๋ณด๊ฐ ".do"๋ก ๋๋๋ ๊ฒฝ์ฐ, ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ทฐ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ธ์ด
if (view.contains(".do")) {
view = viewResolver.getView(view);
}
// ํด๋ผ์ด์ธํธ์๊ฒ ๋ทฐ๋ก ๋ฆฌ๋ค์ด๋ ํธํ์ฌ ์๋ตํจ
response.sendRedirect(view);
}
}
web.xml
- web-app ์๋ฆฌ๋จผํธ: XML ํ์ผ์ ๋ฃจํธ ์๋ฆฌ๋จผํธ๋ก, Java EE ์คํค๋ง์ ๋ค์์คํ์ด์ค๋ฅผ ์ ์ธํ๋ค.
- servlet ์๋ฆฌ๋จผํธ: ์ด ์๋ฆฌ๋จผํธ๋ ์๋ธ๋ฆฟ์ ์ ์ํ๋ฉฐ, ์ฌ๊ธฐ์๋ DispatcherServlet์ ์ ์ํ๊ณ ์๋ค. ์ด๋ servlet-name์ผ๋ก๋ "dispatcherServlet"์, servlet-class๋ก๋ com.spring.controller.common.DispatcherServlet ํด๋์ค๋ฅผ ์ง์ ํ๋ค.
- servlet-mapping ์๋ฆฌ๋จผํธ: ์ด ์๋ฆฌ๋จผํธ๋ ์๋ธ๋ฆฟ๊ณผ URL ํจํด์ ๋งคํํ๋ค. DispatcherServlet๊ณผ "*.do" URL ํจํด์ ๋งคํํ์ฌ, ".do" ํ์ฅ์๋ฅผ ๊ฐ์ง๋ ๋ชจ๋ URL ์์ฒญ์ DispatcherServlet์ผ๋ก ์ ๋ฌํ๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>com.spring.controller.common.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
๐ Controller(Action)
SpringMVC2 ๋ฒ์ 1์์๋ Controller๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ๋ค.
์ผ๋ฐ์ ์ธ ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค์ด๋ฉฐ ์์ฑํ Controller๋ฅผ ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก implementsํ๋ค.
Java์์๋ ActionForward๋ฅผ ํตํด View์ ์ ๋ฌํ์์ง๋ง Spring์์๋ ViewResolver๋ฅผ ์ด์ฉํ๋ค.
Controller.java (์ธํฐํ์ด์ค)
package com.spring.controller.common;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
// Action
public interface Controller {
// ActionForward → String
String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
LoginAction.java
package com.spring.controller.member;
import java.io.IOException;
import com.spring.controller.common.Controller;
import com.spring.model.member.MemberDAO;
import com.spring.model.member.MemberDTO;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
// ๋ก๊ทธ์ธ ์ก์
์ ์ฒ๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ ํด๋์ค
public class LoginAction implements Controller {
// execute ๋ฉ์๋ ์ฌ์ ์
@Override
public String execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// ํ์ ์ ๋ณด๋ฅผ ๋ด์ DTO ๊ฐ์ฒด ์์ฑ
MemberDTO memberDTO = new MemberDTO();
// ํ์ DAO ๊ฐ์ฒด ์์ฑ
MemberDAO memberDAO = new MemberDAO();
// ์์ฒญ์ผ๋ก๋ถํฐ ํ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ฐ์ ธ์ DTO ๊ฐ์ฒด์ ์ค์
memberDTO.setId(request.getParameter("memberId"));
memberDTO.setPw(request.getParameter("memberPw"));
// DAO๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ ๋ณด ์กฐํ
memberDTO = memberDAO.selectOne(memberDTO);
// ํ์ ์ ๋ณด๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ
if(memberDTO != null) {
// ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋
return "mainPageAction.do";
}
// ํ์ ์ ๋ณด๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ
else {
// ์ด์ ํ์ด์ง๋ก ๋์๊ฐ
return "goBack.do";
}
}
}
๐ HandlerMapping
HandlerMapping ์ญ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ง๋ HandlerMappingํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
์์กด ์ฃผ์ ์ ์์ฑ์๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ค.
HandlerMapping.java
package com.spring.controller.common;
import java.util.HashMap;
import java.util.Map;
import com.spring.controller.member.JoinAction;
import com.spring.controller.member.JoinPageAction;
import com.spring.controller.member.LoginPageAction;
import com.spring.controller.member.LogoutAction;
import com.spring.controller.member.MainPageAction;
// ์์ฒญ URI์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋งคํํ๋ ํธ๋ค๋ฌ ํด๋์ค
public class HandlerMapping {
private Map<String, Controller> mappings; // ์์ฒญ URI์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ฅํ๋ ๋งต
// ์์ฑ์: ํธ๋ค๋ฌ ๋งคํ์ ์ด๊ธฐํํ๋ ๋ฉ์๋
public HandlerMapping() {
mappings = new HashMap<String, Controller>(); // ๋งต ์์ฑ
// ๋งต์ ์์ฒญ URI์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋งคํํ์ฌ ์ถ๊ฐ
mappings.put("/main.do", new MainPageAction()); // ๋ฉ์ธ ํ์ด์ง ์์ฒญ ๋งคํ
mappings.put("/joinPage.do", new JoinPageAction()); // ํ์ ๊ฐ์
ํ์ด์ง ์์ฒญ ๋งคํ
mappings.put("/join.do", new JoinAction()); // ํ์ ๊ฐ์
์์ฒญ ๋งคํ
mappings.put("/loginPage.do", new LoginPageAction()); // ๋ก๊ทธ์ธ ํ์ด์ง ์์ฒญ ๋งคํ
mappings.put("/logout.do", new LogoutAction()); // ๋ก๊ทธ์์ ์์ฒญ ๋งคํ
}
// ์์ฒญ URI์ ํด๋นํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
public Controller getController(String commend) {
return mappings.get(commend);
}
}
๐ ViewResolver
๋ง์ง๋ง์ธ ViewResolver ๋ํ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ ํด๋์ค์ด๋ค.
ViewResolver๋ HandlerMapping๊ณผ๋ ๋ค๋ฅด๊ฒ Setter๋ฅผ ์ด์ฉํด ์์กด ์ฃผ์ ์ ํ๋ค.
ViewResolver.java
package com.spring.controller.common;
// ๋ทฐ ๋ฆฌ์กธ๋ฒ ํด๋์ค
public class ViewResolver {
public String prefix; // ๋ทฐ ํ์ผ์ ๊ฒฝ๋ก(prefix)
public String suffix; // ๋ทฐ ํ์ผ์ ํ์ฅ์(suffix)
// prefix ์ค์ ๋ฉ์๋
public void setPrefix(String prefix) {
this.prefix = prefix;
}
// suffix ์ค์ ๋ฉ์๋
public void setSuffix(String suffix) {
this.suffix = suffix;
}
// ์ค์ ๋ทฐ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
public String getView(String view) {
return prefix + view + suffix;
}
}
๐ก ๊ฒฐ๋ก
์ค๋ ์ด๊ด ์์ ์ ํ๋ฉด์ ์์ง Spring์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
๋ธ๋ก๊ทธ ํฌ์คํ ์ ํ๋ฉด์ ๋๋์ ์ ๋ฐฐ์ด ๋ด์ฉ์ ์ ์ฉ์ํค๋ฉด์ ๋ญ๊ฐ ๋ถ์กฑํ์ง ์๊ฐํ๊ณ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ค์ ๋ณต๊ธฐํ๋ ์์ผ๋ก ํด์ผ ํ ๊ฒ ๊ฐ๋ค๋ ๊ฒ์ด๋ค.
์์ผ๋ก SpringMVC2์์์ Controller ํํธ์ ๋ํด ๋ฒ์ ๋ณ๋ก ๋ค์ ์ ๋ฆฌ๋ฅผ ํด์ผ ํ ๊ฒ ๊ฐ๋ค.
'JAVA > Practice' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Command ๊ฐ์ฒด๋ฅผ ์ด์ฉํ Controller (0) | 2024.03.14 |
---|---|
[MAVEN] SpringMVC2 ๋ฒ์ 2 ์ฐ์ต (Controller) (0) | 2024.03.07 |
[Spring] .xml (์ค์ ํ์ผ)์ ๊ตฌ์กฐ (0) | 2024.02.29 |
์๋ฐ(Java)์์ ResultSet ํด๋์ค (0) | 2023.12.20 |
[Program] MVCํจํด์ ์ด์ฉํ ์ํ๊ธฐ (0) | 2023.12.13 |
๋๊ธ