ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [๊ฐ•์˜] ์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  1
    SPRING/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});
        }
    }

     

Designed by Tistory.