๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“”๊ฐ•์˜ ์ •๋ฆฌ ๋…ธํŠธ

[์Šคํ”„๋ง MVC 1] ์„œ๋ธ”๋ฆฟ, ํ…œํ”Œ๋ฆฟ์—”์ง„, MVC ํŒจํ„ด (2)

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๋™์ž‘ ๋ฐฉ์‹

์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๋‚ด์žฅ๋œ ํ†ฐ์บฃ์„œ๋ฒ„๋ฅผ ๋„์šฐ๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์š”์ฒญ์„ request, response๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์„œ Servlet๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

์ด Servelt๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.

 

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ์„œ๋ธ”๋ฆฟ์ด HttpServletRequest๊ฐ์ฒด๋กœ ๋‹ด์•„์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

 

`HttpServletRequest` => [๋ฉ”์„œ๋“œ, URL์ •๋ณด, ์ฟผ๋ฆฌ์ŠคํŠธ๋ง // ํ—ค๋” // Body]์™€ ๊ฐ™์€ ์š”์ฒญ๋ฉ”์‹œ์ง€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉ.

๊ฐ™์€ ์š”์ฒญ์— ๊ฐ’์„ ์ž„์‹œ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์„ ์ œ๊ณตํ•˜๋ฉด ์„ธ์…˜ ๊ด€๋ฆฌ๋„ ์ œ๊ณตํ•œ๋‹ค.

HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ ๋ฐฉ์‹ 3๊ฐ€์ง€

  • GET - ์ฟผ๋ฆฌํŒŒ๋ฆฌ๋ฏธํ„ฐ      `ex) url?username=hello?age=20`
  • POST - HTML FORM
    • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ. (content-type: application/x-www-form-urlencoded)
  • HTTP Message Body
    • JSON, XML, TEXT

์š”์ฒญ์˜ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๊ฐ’์„ ๊บผ๋‚ด์–ด ์‚ฌ์šฉํ•˜๊ธฐ

์ฟผ๋ฆฌ์ŠคํŠธ๋ง์€ `request.getParameter(value)`๋กœ  ๊ฐ’์„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์žˆ๋Š” ๊ฐ’์€ ์„œ๋ธ”๋ฆฟ์—์„œ ์–ด๋–ป๊ฒŒ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์„๊นŒ?

 

๋จผ์ € content-type์ด x-www-form-urlencodedํ˜•์‹์ธ ๋ฐ์ดํ„ฐ๋Š” request.getParamter()๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋‹ค์Œ์€ application/json, text ๋ฐฉ์‹๋“ค์ด๋‹ค.

 

text๋Š” request์—์„œ inputStream()์„ ๊บผ๋‚ด์–ด Stringํ˜•์‹์˜ ๋ฐ”๋””๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

 

json์€ key, valueํ˜•ํƒœ์ด๋ฏ€๋กœ ๋จผ์ € ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ž. ์ดํ›„ ObjectMapper๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํžˆ Body๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

HttpServletResponse

๋ฐ˜ํ™˜ํ•  ๋ฐ์ดํ„ฐ์˜ content-type๊ณผ ์ฟ ํ‚ค, redirect, ์ธ์ฝ”๋”ฉ ์ •๋ณด๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

jsonํ˜•ํƒœ์˜ ๊ฐ’์„ ์‘๋‹ต์— ๋‹ด์„ ๋•Œ๋Š” `objectMapper.writeValueAsString()`๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ Stringํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ ํ›„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

ํ…œํ”Œ๋ฆฟ ์—”์ง„

์ž๋ฐ”์ฝ”๋“œ์— HTML๋„ฃ์–ด์„œ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ๋น„ํšจ์œจ์ ์ด๋‹ค.

ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ ์ž๋ฐ” ์ฝ”๋“œ๋กœ HTML์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ ๋ณด๋‹ค ์ฐจ๋ผ๋ฆฌ HTML ๋ฌธ์„œ์— ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.

 

ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋ฉด HTML๋ฌธ์„œ์—๋‹ค๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ ์šฉํ•ด์„œ ๋™์ ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. (JSP, Thymeleaf, Freemarker)

 

ํ•˜์ง€๋งŒ ์ž๋ฐ”์ฝ”๋“œ์— HTML์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€ ํ…œํ”Œ๋ฆฟ์—”์ง„์— ์ฝ”๋“œ๋ฅผ ์ ์šฉํ–ˆ์„ ๋•Œ ํ•œ๊ณ„์ ์ด ์กด์žฌํ•œ๋‹ค.

๋ฐ”๋กœ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํ•œ ํŒŒ์ผ์—์„œ ์ด๋ค„์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ์ด ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

MVC ํŒจํ„ด

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์„œ๋ธ”๋ฆฟ ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , JSP๋Š” ๋ชฉ์ ์— ๋งž๊ฒŒ HTML๋กœ ํ™”๋ฉด(View)์„ ๊ทธ๋ฆฌ๋Š” ์ผ์— ์ง‘์ค‘ํ•˜๋„๋ก ํ•˜์ž.

  • JSP์—๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ํ• ๋‹นํ•˜์ง€๋ง์ž. (๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์€.. ๊ทธ ๊ฐ์ฒด๊ฐ€ ํ•˜๋Š”์ผ์„ ์•Œ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค)
  • ๋ทฐ ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์„ ๋ถ„๋ฆฌํ•˜์ž! (๊ฐ์ž์˜ ์—ญํ• ์— ์ง‘์ค‘ํ•˜์ž)

'๋ทฐ'์™€ '๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง'์˜ ๋ณ€๊ฒฝ์ฃผ๊ธฐ๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋‘๊ฐœ๋ฅผ ํ•˜๋‚˜๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ ˆ๋Œ€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค. ๋ทฐ ์ฝ”๋“œ๋งŒ ๋ณด๊ณ  ์ˆ˜์ •ํ•ด๋„ ๋  ์ผ์„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊นŒ์ง€ ๋ด์•ผํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์ง€ ์•Š๋‹ค.

 

  • ์ปจํŠธ๋กค๋Ÿฌ: HTTP ์š”์ฒญ์„ ๋ฐ›์•„์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ทฐ์— ์ „๋‹ฌํ•  ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด์„œ ๋ชจ๋ธ์— ๋‹ด๋Š”๋‹ค.
    • ์š”์ฒญ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ์ฒดํฌ - ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๋‹ค๋ฉด ์„œ๋น„์Šค๋กœ ๋ณด๋‚ด์ง€ ์•Š์Œ.
    • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜์ง€ ์•Š๋„๋ก '๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง'์ด ์กด์žฌํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์„ ๋งŒ๋“ ๋‹ค.
  • ๋ชจ๋ธ: ๋ทฐ์— ์ถœ๋ ฅํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„๋‘”๋‹ค. ๋ทฐ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ชจ๋ธ์— ๋‹ด์•„์„œ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๋•๋ถ„์— ๋ทฐ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ๋ชฐ๋ผ๋„ ๋˜๊ณ , ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•˜๋Š” ์ผ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • ๋ทฐ: ๋ชจ๋ธ์— ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์ผ์— ์ง‘์ค‘ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” HTML์„ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์„ ๋งํ•œ๋‹ค.

MVC ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ณผ์ •

 MVC์—์„œ Controller์ฝ”๋“œ ์‚ดํŽด๋ณด๊ธฐ

@RestController
@RequiredArgsConstructor
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/ members")
public class MvcMemberListServlet extends HttpServlet {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse
            response) throws ServletException, IOException {
        
        List<Member> members = memberRepository.findAll();
        request.setAttribute("members", members);
        
        String viewPath = "/WEB-INF/views/members.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        
        dispatcher.forward(request, response);
    }
}

ํ˜„์žฌ MVC ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ๋ทฐ๋Š” ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๋ช…ํ™•ํ•œ ์—ญํ• ์„ ๊ฐ€์ง„๋‹ค. ํ•˜์ง€๋งŒ Controller์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด 

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  view์˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋งŽ์€ ์—ญํ• ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ view๋กœ ์ด๋™ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ค‘๋ณต์ฝ”๋“œ๋กœ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฅผ ๊ณตํ†ต ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜๋“ฏ์ด ์•ž๋’ค์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

-> ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ์ „์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” 'ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ' ํŒจํ„ด์„ ๋„์ž…ํ•ด๋ณด์ž..!

 

๋‹ค์Œ์—๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.