-
[๊ฐ์] ์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ 1SPRING/INFLEARN 2023. 3. 13. 20:02
์๋ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ - ์ธํ๋ฐ | ๊ฐ์
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ํ์ํ ๋ชจ๋ ์น ๊ธฐ์ ์ ๊ธฐ์ด๋ถํฐ ์ดํดํ๊ณ , ์์ฑํ ์ ์์ต๋๋ค. ์คํ๋ง MVC์ ํต์ฌ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ๋ ๊น์ด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์์ต๋๋ค., -
www.inflearn.com
1. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ดํด
โป ์น ์๋ฒ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ
- ์น์์๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ HTTPํ๋กํ ์ฝ ์ฌ์ฉ
-> ๊ฑฐ์ ๋ชจ๋ ํํ์ ๋ฐ์ดํฐ ์ ์ก ๊ฐ๋ฅ
- ์น ์๋ฒ vs ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ(WAS)
์น ์๋ฒ : ์ ์ ์ธ ํ์ผ Serve
(ex) NGINX, APACHE)
์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ : ์น ์๋ฒ๋ฅผ ํฌํจํ๋ ๊ฐ๋ ,
ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ์คํํด์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์ํํ์ฌ ๋์ ์ผ๋ก ๋ณด์ฌ์ค ์ ์์
(ex) ํฐ์บฃ(Tomcat) Jetty, Undertow)
๊ฒฝ๊ณ๊ฐ ํ์คํ ๊ฑด ์๋, ์น ์๋ฒ๋ ํ๋ก๊ทธ๋จ ์คํ ๊ธฐ๋ฅ์ ํฌํจํ๊ธฐ๋ ํจ (ex) ํ๋ฌ๊ทธ์ธ
=> ์ค๋ฌด์์๋?
WAS ๋จ์ : ๋๋ฌด ๋ง์ ์ญํ ์ ๋ด๋น -> ์๋ฒ ๊ณผ๋ถํ ์ฐ๋ ค, ์ค๋ฅ ํ๋ฉด ๋์ธ ์ ์์
์ถ์ฒ: ๊น์ํ ๊ฐ์ฌ๋ ์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ ๊ฐ์ ์๋ฃ ์ด ๊ตฌ์กฐ์ ์ฅ์ :
- ํจ์จ์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ ๊ฐ๋ฅ -> ํ์์ ๋ฐ๋ผ ์น์๋ฒ, WAS ์ค ์ ํํด ์ฆ์ค
- ์น ์๋ฒ๋ ๋จ์ํด์ ์ฅ์ ๊ฐ ๊ฑฐ์ ๋์ง ์์ <-> WAS๋ ์ ์ฃฝ์ง๋ง ์ค๋ฅํ๋ฉด ์ ๊ณต ๋ถ๊ฐ๋ฅ
-> WAS๊ฐ ํฐ์ก์ ๋ Web Server์์ ์ค๋ฅํ๋ฉด ๋ณด์ฌ์ฃผ๋ฉด ๋จ (์ค๋ฅํ๋ฉด ํ์ ์์ผ๋ฉด ์์ด๋ OK)
โป ์๋ธ๋ฆฟ
- ์๋ธ๋ฆฟ์ด๋?
๋์ ์นํ์ด์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๋ฐ ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์น์์์ ์์ฒญ๊ณผ ํ๋ฆ์ ๋ฉ์๋ ํธ์ถ๋ง์ผ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ์ Controller์ ๋ฉ์๋๋ค์ ์๊ฐํ๋ฉด ๋๋ค.
์๋ธ๋ฆฟ์ ๋ค๋ฃจ๋ฉด์,
์๋ฒ์์๋ HTTP ๋ฉ์ธ์ง๋ฅผ ์ฝ์ด์ผ ํจ
-> ๋ฉ์ธ์ง๋ฅผ ์ฝ์ ๋ ๋ง๋ค ๋ฐ๋ณต๋๋ ์์ ์ด ๋ง์
-> ์ค๋ณต๋๋ ์์ ์ Servlet์์ ์ง์ํจ์ผ๋ก์จ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ๋ง๋ค์ด์ค
<์ฝ๋ ์ ๋ฆฌ>
HttpServlet์ extendsํ Custom Servlet์ @WebServlet(name ="{์๋ธ๋ฆฟ ์ด๋ฆ}", urlPatterns = "/{url}")์ ๋ถ์ฌ์ค
HttpServlet์ service ํจ์๋ฅผ Override -> ํ๋ผ๋ฏธํฐ๋ก ์ ๊ณต๋๋ HttpServletRequest, HttpServletResponse
WAS ๊ฐ๋ฐ์๋ HttpServletRequest์ผ๋ก ์์ฒญ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ , HttpServletResponse์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ HTTP์๋ต์ ๋ณด๋
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋
- ์๋ธ๋ฆฟ์ ์ง์ํ๋ WAS
- ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋จ -> ๊ณต์ ๋ณ์ ์ฌ์ฉ ์ฃผ์
์ต์ด ๋ก๋ฉ ์์ ์ ๋ง๋ค๊ณ ์ฌํ์ฉ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์ข ๋ฃ ์ ๊ฐ์ด ์ข ๋ฃ - ๋์ ์์ฒญ์ ์ํ ๋ฉํฐ ์ค๋ ๋ ์ฒ๋ฆฌ ์ง์
โป ๋์ ์์ฒญ - ๋ฉํฐ ์ฐ๋ ๋
- ์ค๋ ๋
์๋ธ๋ฆฟ์ ํธ์ถํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ํ๋ํ๋ ์์ฐจ์ ์ผ๋ก ์คํ
์ค๋ ๋ ํ : ์๋ธ๋ฆฟ์ ํธ์ถ ํ ๋๋ง๋ค ํ์ ์๋ ์ค๋ ๋๋ฅผ ๊บผ๋ด ์, ์ฌ์ฉ ํ ๋ฐ๋ฉ
์ต๋ ์ค๋ ๋(์๋ธ๋ฆฟ ํ ์ค๋ ๋ ๊ฐ์)๊ฐ ๋ชจ๋ ์ฌ์ฉ์ค์ด๋ฉด, ํน์ ์ซ์๋งํผ ๋๊ธฐํ๋๋ก ์ค์ ๊ฐ๋ฅ
-> ์ต๋์ค๋ ๋๊ฐ ๋๋ฌด ๋์ผ๋ฉด : ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค ์๊ณ์ ์ด๊ณผ๋ก ์๋ฒ ๋ค์ด
-> ์ต๋์ค๋ ๋๊ฐ ๋๋ฌด ๋ฎ์ผ๋ฉด : ์๋ฒ๋ ์ฌ์ ๋ก์ด๋ฐ ํด๋ผ์ด์ธํธ ํ๊น
=> ์ ์ ์ซ์ ์ฐพ๊ธฐ(ํ๋) : ์ฑ๋ฅ ํ ์คํธ
โป HTML, HTTP API, CSR, SSR
- ์ ์ ๋ฆฌ์์ค : ์ด๋ฏธ ์์ฑ๋ ๋ฆฌ์์ค ํ์ผ
- HTML ํ์ด์ง : ๋์ ์ผ๋ก ํ์ํ HTML ํ์ผ์ ์์ฑํด ์ ๋ฌ
- HTTP API : ๋ฐ์ดํฐ๋ง ์ฃผ๊ณ ๋ฐ๋๋ค.(๋ณดํต json) UIํ๋ฉด์ ํด๋ผ์ด์ธํธ ๋ณ๋ ์ฒ๋ฆฌ
- SSR : ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง (๋ฐฑ์๋), ํ๋ฉด์ด ๋ณต์กํ์ง ์์ ๊ฒฝ์ฐ
ex) ํ์๋ฆฌํ - CSR : ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง (์น ํ๋ก ํธ์๋)
โป ์๋ฐ ์น ๊ธฐ์ ์ญ์ฌ
๊ณผ๊ฑฐ : ์๋ธ๋ฆฟ -> JSP -> ์๋ธ๋ฆฟ, JSP์กฐํฉ MVC
ํ์ฌ : ์คํ๋ง MVC(์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ), ์คํ๋ง ๋ถํธ(WAS ์๋ฒ ๋ด์ฅ)
์ต์ : Web Servlet - Spring MVC,
Web Reactive - Spring WebFlux(์ด๋ ค์, ๋น ๋ฆ(๊ทผ๋ฐ MVC๋ ์ถฉ๋ถํ ๋น ๋ฆ)์๋ธ๋ฆฟ๊ธฐ์ ์ฌ์ฉ x)
HTML ํธ๋ฆฌํ๊ฒ ์์ฑ - Thymeleaf(Best)
2. ์๋ธ๋ฆฟ
โป Hello ์๋ธ๋ฆฟ
- Application class์ @ServletComponentScan ์ ๋ถ์ด๋ฉด @WebServlet์ด ๋ถ์ Servlet ํด๋์ค๋ค์ด ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋จ
- @WebServlet์ url ํจํด์ผ๋ก ์๋ธ๋ฆฟ์ด ํธ์ถ๋๋ฉด, service ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
- Http ๋ฉ์ธ์ง ๋ด์ฉ
START LINE
- HTTP ๋ฉ์๋
- URL
- ์ฟผ๋ฆฌ ์คํธ๋ง
- ์คํค๋ง, ํ๋กํ ์ฝ
ํค๋
- ํค๋ ์กฐํ
๋ฐ๋
- form ํ๋ผ๋ฏธํฐ ํ์ ์กฐํ
- message body ๋ฐ์ดํฐ ์ง์ ์กฐํ
โป HttpServletRequest - ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html
HttpServletRequest (Java EE 6 )
Validate the provided username and password in the password validation realm used by the web container login mechanism configured for the ServletContext. This method returns without throwing a ServletException when the login mechanism configured for the Se
docs.oracle.com
โป HTTP ์์ฒญ ๋ฐ์ดํฐ - GET ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
HttpServletRequest request
//1. ์ ์ฒด ํ๋ผ๋ฏธํฐ request.getParameterNames().asIterator() .forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName))); //2. ๋จ์ผ ํ๋ผ๋ฏธํฐ String username = request.getParameter("{ํ๋ผ๋ฏธํฐ ์ด๋ฆ}"); //3. ์ด๋ฆ์ด ๊ฐ์ ๋ณต์ ํ๋ผ๋ฏธํฐ String[] usernames = request.getParameterValues("{ํ๋ผ๋ฏธํฐ ์ด๋ฆ}");
โป HTTP ์์ฒญ ๋ฐ์ดํฐ - POST ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
<form action="/request-param" method="post">๋ฅผ ํตํด ํผ ๊ฐ์ ์ ์ก
(๋ฉ์์ง ๋ฐ๋์ ์ฟผ๋ฆฌ ํ๋ฆฌ๋ฏธํฐ ํ์์ผ๋ก ์ ๋ฌ (username=hello&age=20))GET๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์กฐํ ๊ฐ๋ฅํจ
โป HTTP ์์ฒญ ๋ฐ์ดํฐ - API ๋ฉ์์ง ๋ฐ๋ - ๋จ์ ํ ์คํธ
ObjectMapper ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ HttpServletRequest์์ ์ฝ์ด์จ json ๋ฐ์ดํฐ๋ฅผ class์ ๋งคํํด์ค๋ค
ServletInputStream inputStream = request.getInputStream(); String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
โป HttpServletResponse - ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html
HttpServletResponse (Java EE 6 )
void setStatus(int sc, java.lang.String sm) Deprecated. As of version 2.1, due to ambiguous meaning of the message parameter. To set a status code use setStatus(int), to send an error with a description use sendError(int, String).
docs.oracle.com
โป HTTP ์๋ต ๋ฐ์ดํฐ - ๋จ์ ํ ์คํธ, HTML
HttpServletResponse response
PrintWriter writer = response.getWriter(); writer.println("{๋ณด๋ผ ๋ด์ฉ}")
โป HTTP ์๋ต ๋ฐ์ดํฐ - API JSON
data๋ก ๋ณด๋ผ ๊ฐ์ฒด๋ฅผ ObjectMapper๋ก String์ผ๋ก ๋ณ๊ฒฝํ ํ, ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ณด๋ธ๋ค.
String result = objectMapper.writeValueAsString(helloData); PrintWriter writer = response.getWriter(); writer.write(result);
3. ์๋ธ๋ฆฟ, JSP, MVC ํจํด
โป MVC ํจํด
์๋ธ๋ฆฟ์์ html ์ฝ๋๋ฅผ writeํด์ ์ผ์ผํ ๋ณด๋ด๊ฑฐ๋,
JSP์ ์๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์
ํ ์ฝ๋์์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ทฐ ๋ ๋๋ง๋ฅผ ํ ๋ฒ์ ๋ค๋ฃจ๊ธฐ์ ๋๋ฌด ๋ง์ ์ญํ ์ ํ๊ฒ ๋๋ค.
์ ์ง๋ณด์๊ฐ ์ด๋ ต๊ณ , ๋์ ๋ผ์ดํ์ฌ์ดํด๋ ๋ค๋ฅด๋ค.
=>
MVC : Model View Controller
Model : ๋ทฐ์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ด์๋๋ค.
View : ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ํ๋ฉด์ ๊ทธ๋ฆฐ๋ค.
Controller : HTTP ์์ฒญ์ ๋ฐ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒ์ฆํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ทฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ
๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ๋ชจ๋ธ์ ๋ด๋๋ค.<์ฝ๋>
Servlet์ Controller๋ก ์ฌ์ฉํ์ฌ,
request.setAttribute("member", member); String viewPath = "/WEB-INF/views/save-result.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request,response);
member๋ฅผ ๋ชจ๋ธ ์ผ์, ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก jsp์ ๋ชจ๋ธ์ ์ ๋ฌํ๋ค.
=> ํ๊ณ:
์ ์ฝ๋(ํฌ์๋์ ViewPath)๊ฐ ๊ณ์ ์ค๋ณต๋๋ค.
HttpServletRequest request, HttpServletResponse response๋ ๋ ๋ค ์ฌ์ฉ๋์ง ์์๋ ๊ณ์ ๋ถ๋ ค๋ค๋๋ค.
4. MVC ํ๋ ์์ํฌ ๋ง๋ค๊ธฐ
โป ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด
์ถ์ฒ: ๊น์ํ ๊ฐ์ฌ๋ ์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ ๊ฐ์ ์๋ฃ FrontController ์๋ธ๋ฆฟ ํ๋๋ก ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์์,
์์ฒญ์ ๋ง๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์์ ํธ์ถํด์ค๋ค.
<์ฝ๋>
Ver1.
Map์ {"url", url์ ๋ง๋ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด} ์ธํธ๋ฅผ ๋ฃ์ด ๋๊ณ ,
request๊ฐ ๋ค์ด์ค๋ฉด url๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์ฐ๊ฒฐํด์ค๋ค.
Ver2.
์ค๋ณต ์ ๊ฑฐ
๊ฐ๊ฐ ์ปจํธ๋กค๋ฌ์ ์ค๋ณต๋๋ ์๋ ๋ถ๋ถ์
String viewPath = "๊ฒฝ๋ก"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request,response);
๊ฐ์ฒด๋ก ๋ฐ๋ก ๋นผ์
public class MyView { private String viewPath; public MyView(String viewPath){ this.viewPath = viewPath; } public void render(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); } }
return new MyView("๊ฒฝ๋ก");
์ด๋ ๊ฒ ๋ฐ๊ฟ์ค๋ค.
Ver3.
๋ชจ๋ธ์ ์ถ๊ฐํ๋ค.
@Getter @Setter public class ModelView { private String viewName; private Map<String, Object> model = new HashMap<>(); public ModelView(String viewName){ this.viewName = viewName; } }
Map์ ๋ทฐ์ ์ ๋ฌํ ๊ฐ์ฒด๋ค์ ๋ด์์ ๋ทฐ์ ์ ๋ฌํ๋ค.
ModelView mv = controller.process(paramMap); String viewName = mv.getViewName(); MyView view = viewResolver(viewName); // ๋๋จธ์ง ๊ฒฝ๋ก์ ํจ๊ป MyView ๊ฐ์ฒด ๋ฆฌํด view.render(mv.getModel(), request, response);
Ver4.
Model์ ๊ฐ์ฒด๊ฐ ์๋๋ผ ๋งต์ผ๋ก ์ฌ์ฉํ๊ธฐ
๊ฐ์ฒด๊น์ง controller์ ๋๊ฒจ์ ๊ฒฝ๋ก๋ฅผ ๋ฆฌํดํ๊ฒ ํ๋ค.
์ฝ๋๊ฐ ๊ฐ๊ฒฐํจ
Map<String, Object> model = new HashMap<>(); String viewName = controller.process(paramMap, model); MyView view = viewResolver(viewName); view.render(model, request, response);
Ver5.
V1~V4๋ฅผ ์ํฉ์ ๋ฐ๋ผ ์์ด์ธ ์ ์๋๋ก ์์ ํ๊ณ ์ถ์
-> Adapter ํจํด
์ถ์ฒ: ๊น์ํ ๊ฐ์ฌ๋ ์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ ๊ฐ์ ์๋ฃ <์ฝ๋>
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ handleAdapter๋ค๋ List์ ๋ฑ๋ก์์ผ ๋๋๋ค.
request URI๋ฅผ ๋ฐํ์ผ๋ก ๋ง๋ handler๋ฅผ ์ฐพ์
handler์ ๋ง๋ handler Adapter๋ ์ฐพ๊ณ
handlerAdapter๋ handler๋ฅผ ์ด์ฉํด์ ๊ฐ์์ ๋ฐฉ์์ผ๋ก ModelView ๋ฆฌํด, View์ ์ ๋ฌ
5. ์คํ๋ง MVC - ๊ตฌ์กฐ ์ดํด
โป ์คํ๋ง MVC ์ ์ฒด ๊ตฌ์กฐ
4์ฅ์์๋ MVC ๊ตฌ์กฐ๋ฅผ ์ง์ ๋ง๋ค์ด๋ณด์๋ค.
ํ์ง๋ง ์คํ๋ง์์๋ ์ด๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌํํด๋จ๋ค!
์ถ์ฒ: ๊น์ํ ๊ฐ์ฌ๋ ์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ ๊ฐ์ ์๋ฃ ๋์ ๊ด๊ณ๋ ์ด๋ ๊ฒ ๋๋ค.
์ง์ ๋ง๋ ํ๋ ์์ํฌ ์คํ๋ง MVC FrontController DispatcherServlet HandlerMappingMap (ํธ๋ค๋ฌ ๋ฑ๋กํด๋์ ๋ฆฌ์คํธ) HandlerMapping MyHandlerAdapter HandlerAdapter ModelView ModelAndView ViewResolver (๊ฒฝ๋ก ๋ฐ์์ ํฌ์๋ฉํ๋) ViewResolver MyView View - DispatcherServlet์ FrameworkServlet์ ์์ํ์ง๋ง, FrameworkServlet๋ ๋์ด ๊ฐ๋ค๊ฐ๋ค ๋ณด๋ฉด HttpServlet์ ํธ์ถํ๊ธฐ ๋๋ฌธ์ FrontController์ฒ๋ผ HttpServlet์ ์์ํ๋ค๊ณ ํ ์ ์๋ค. - ๋๊ฐ์ด service() override ํด์ ์ฌ์ฉ
- DispacherServlet ์ ๋ชจ๋ ๊ฒฝ๋ก( urlPatterns="/" )์ ๋งคํ๋จ. ํ์ง๋ง ๋ ์์ธํ ๊ฒฝ๋ก๊ฐ ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ๋ฑ๋กํ ์๋ธ๋ฆฟ๋ ๋์ํจ
- ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ์ธํฐํ์ด์ค๋ก ์ ๊ณตํ๋ฏ๋ก ์ํ๋ ๊ธฐ๋ฅ ์์ & ํ์ฅ์ด ๊ฐ๋ฅํ๋ค(์ฝ์ง๋ ์๋ค)
serivce()์์ DispacherServlet.doDispatch()๋ฅผ ํธ์ถํ๋ค.
์ด ์ฝ๋์์
1. ํธ๋ค๋ฌ ์กฐํ
2. ํธ๋ค๋ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์ด๋ํฐ ์กฐํ
3. ํธ๋ค๋ฌ ์ด๋ํฐ ์คํ -> 4. ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ํตํด ํธ๋ค๋ฌ ์คํ -> 5. ModelAndView ๋ฐํ
6. ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ํตํด์ ๋ทฐ ์ฐพ๊ธฐ -> 7. View ๋ฐํ
8. ๋ทฐ ๋ ๋๋ง
๊น์ง ์์์ ๋ดค๋ ๊ณผ์ ๋ค์ด ์ด๋ฃจ์ด์ง๋ค.
โป ํธ๋ค๋ฌ ๋งคํ๊ณผ ํธ๋ค๋ฌ ์ด๋ํฐ
@Controller๋ ๋ค๋ฆ ์ฃผ์
์๋๋ Controller์ ์์์ด๋ค. ์ด Controller๊ฐ ์ด๋ป๊ฒ ์คํ๋ ์ ์์๊น?
@Component("/springmvc/old-controller") //์คํ๋ง ๋น ์ด๋ฆ public class OldController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("OldController.handleRequest"); return new ModelAndView("new-form"); } }
์ํฉ : ์คํ๋ง ๋น์ ์ด๋ฆ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐพ์ ์ ์๋ ํธ๋ค๋ฌ ๋งคํ์ด ํ์ํจ
Controller ์ธํฐํ์ด์ค๋ฅผ ์คํํ ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ์์ผ ํจ
๋๋ถ๋ถ์ ํธ๋ค๋ฌ์ ํธ๋ค๋ฌ ์ด๋ํฐ๋ ์คํ๋ง์ ๊ตฌํ๋์ด์์ผ๋ฉฐ, ์ฐ์ ์์๋ ์ ํด์ ธ ์๋ค.
Dispatcher Servlet์์ ์์๋๋ก ํ์ธํ๋ฉด์ ์์ ์ํฉ์ ๋งคํ์ด ๊ฐ๋ฅํ ํธ๋ค๋ฌ ๋งคํ์ ์ฐพ๋๋ค.(ex)BeanNameUrlHandlerMapping) -> ์ด๊ฑธ๋ก ํธ๋ค๋ฌ๋ ์ฐพ๋๋ค.
์์ ๋ง๋ ํธ๋ค๋ฌ ์ด๋ํฐ๋ ์ฐพ๋๋ค.(ex)SimpleControllerHandlerAdapter)
โป ๋ทฐ ๋ฆฌ์กธ๋ฒ
๋ทฐ ๋ฆฌ์กธ๋ฒ๋ ๋๊ฐ์ด ์ฌ์ฉํ๊ณ ์๋ ๋ทฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ViewResolver๋ฅผ ์ฐพ์์ ์ ์ฉํ๋ค.
โป ์คํ๋ง MVC - ์์ํ๊ธฐ
์์์ ์ค๋ช ํ ๋ด์ฉ์ ์ ๋ถ ๊ณผ๊ฑฐ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๊ณ ,
ํ์ฌ๋ @RequestMapping๋ก ์ ์ฐํ๊ฒ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ ์ ์์
@Controller public class Controller { @RequestMapping({url}) public ModelAndView process(){ return new ModelAndView({path}); } @GetMapping({url}) public ModelAndView process(){ return new ModelAndView({path}); } @PostMapping({url}) public ModelAndView process(){ return new ModelAndView({path}); } }
'SPRING > INFLEARN' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ฐ์] ์คํ๋ง MVC 2ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ 4 (0) 2023.03.20 [๊ฐ์] ์คํ๋ง MVC 2ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ 5 (0) 2023.01.30 [๊ฐ์] ์คํ๋ง MVC 2ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ 3 (0) 2023.01.13 [๊ฐ์] ์คํ๋ง MVC 2ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ 1 (0) 2022.11.21 [๊ฐ์] ์ค์ ! Querydsl 1 (0) 2022.08.22