Spring

MVC ํŒจํ„ด

์กฐ๋ฐˆ๋ฐ 2022. 4. 18. 18:06

๐Ÿ”Ž MVC ํŒจํ„ด ๋“ฑ์žฅ

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

 

๐Ÿ’ก Model View Controller

* ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณดํ†ต MVC ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค

- ํ•˜๋‚˜์˜ ์„œ๋ธ”๋ฆฟ์ด๋‚˜, JSP๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ๊ฒƒ์„ ์ปจํŠธ๋กค๋Ÿฌ(Controller)์™€ ๋ทฐ(View)๋ผ๋Š” ์˜์—ญ์œผ๋กœ ์„œ๋กœ ์—ญํ• ์„ ๋‚˜๋ˆˆ ๊ฒƒ์„ ๋งํ•œ๋‹ค

 

<MVC ํŒจํ„ด1>

๐Ÿ‘‰ ์ปจํŠธ๋กค๋Ÿฌ Controller

- HTTP ์š”์ฒญ์„ ๋ฐ›์•„์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•œ๋‹ค

- ๋ทฐ์— ์ „๋‹ฌํ•  ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด์„œ ๋ชจ๋ธ์„ ๋‹ด๋Š”๋‹ค

 

๐Ÿ‘‰ ๋ชจ๋ธ Model

- ๋ทฐ์— ์ถœ๋ ฅํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„๋‘”๋‹ค

- ๋ทฐ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ชจ๋ธ์— ๋‹ด์•„ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๋•๋ถ„์— ๋ทฐ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ๋ชฐ๋ผ๋„ ๋˜๊ณ ,

  ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•˜๋Š” ์ผ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค

 

๐Ÿ‘‰ ๋ทฐ View

- ๋ชจ๋ธ์— ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์ผ์— ์ง‘์ค‘ํ•œ๋‹ค

- HTML์„ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์„ ๋งํ•œ๋‹ค

 

๐Ÿ”Ž MVC ํŒจํ„ด2 

- ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์„œ๋น„์Šค(Service)๋ผ๋Š” ๊ณ„์ธต์„ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค 

+ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค

 

๐Ÿ’ก MVC ํŒจํ„ด ์ ์šฉํ•˜๊ธฐ

- ์„œ๋ธ”๋ฆฟ์„ ์ปจํŠธ๋กค๋Ÿฌ๋กœ, JSP๋ฅผ ๋ทฐ๋กœ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

- Model์€ HTTPServletRequest ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

  : request ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€์— ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค

  : request.setAttribute(), request.getAttribute()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ , ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค

=> ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” request.setAttribute(key, value)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ 

     ๋ทฐ์—์„œ๋Š” request.getAttribute(key)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ธ๋‹ค

 

๐Ÿ”Ž /WEB-INF

- ์ด ๊ฒฝ๋กœ ์•ˆ์— JSP๊ฐ€ ์žˆ์œผ๋ฉด ์™ธ๋ถ€์—์„œ ์ง์ ‘ JSP๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค

- ํ•ญ์ƒ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด JSP๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค

 

๐Ÿ‘‰ ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ Controller

@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 {
        System.out.println("MvcMemberListServlet.service");
        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);
    }
}

- dispatcher.forward()

: ๋‹ค๋ฅธ ์„œ๋ธ”๋ฆฟ์ด๋‚˜ JSP๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ

: ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ๋‹ค์‹œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•œ๋‹ค

 

๐Ÿ‘‰ ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ - ๋ทฐ

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/index.html">๋ฉ”์ธ</a>
<table>
    <thead>
    <th>id</th>
    <th>username</th>
    <th>age</th>
    </thead>
    <tbody>
    <c:forEach var="item" items="${members}">
        <tr>
            <td>${item.id}</td>
            <td>${item.username}</td>
            <td>${item.age}</td>
        </tr>
    </c:forEach>
    </tbody>
</table>

</body>
</html>

- ๋ฐ์ดํ„ฐ ๊บผ๋‚ด๊ธฐ

: <%= request.getAttribute("member")%>๋กœ ๋ชจ๋ธ์— ์ €์žฅํ•œ member ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณต์žก,,

: JSP์˜ ${ } ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด request์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค

 

- <c:forEach> ๊ธฐ๋Šฅ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ ์–ธ

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

 

 

 

 

๐Ÿ”Ž redirect vs forward

- redirect 

: ์ƒˆ๋กœ์šด ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ฒƒ

: ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ(์›น ๋ธŒ๋ผ์šฐ์ €)์— ์‘๋‹ต์ด ๋‚˜๊ฐ”๋‹ค๊ฐ€, ํด๋ผ์ด์–ธํŠธ๊ฐ€ redirect๊ฒฝ๋กœ๋กœ ๋‹ค์‹œ ์š”์ฒญํ•œ๋‹ค

: ๋กœ๊ทธ์ธ, ๊ธ€์“ฐ๊ธฐ ๋“ฑ

: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , URL ๊ฒฝ๋กœ๋„ ๋ณ€๊ฒฝ๋œ๋‹ค

- forward

: ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋Œ๋ฆฌ๋Š” ๊ฒƒ

: ๊ฒ€์ƒ‰, ๋‹จ์ˆœ ์กฐํšŒ

: ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์ผ์–ด๋‚˜๋Š” ํ˜ธ์ถœ์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „ํ˜€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค

 

request์™€ response์˜ ์ •๋ณด๊ฐ€ forward๋Š” ๊ทธ๋Œ€๋กœ ๊ฐ–๊ณ  ์žˆ๋Š” ์ƒํƒœ์—์„œ ํ•ด๋‹น url๋กœ ์ด๋™ํ•˜๊ณ  redirect๋Š” ์•„์˜ˆ ์ƒˆ๋กœ์šด ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฐ–๋Š”๋‹ค                

 

โ—๏ธ ๋‹จ์ 

- ํฌ์›Œ๋“œ ์ค‘๋ณต

: View๋กœ ์ด๋™ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ•ญ์ƒ ์ค‘๋ณต ํ˜ธ์ถœ๋œ๋‹ค

RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);

- viewPath ์ค‘๋ณต

String viewPath = "/WEB-INF/views/new-form.jsp";

- ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ

- ๊ณตํ†ต ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค

 

=> ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ(Front Controller) ํŒจํ„ด ์‚ฌ์šฉ (์ž…๊ตฌ๋ฅผ ํ•˜๋‚˜๋กœ!)