Cookie ํ•ด๊ฒฐ

์ด๋™์–ธยท2024๋…„ 8์›” 2์ผ

new world

๋ชฉ๋ก ๋ณด๊ธฐ
22/62
post-thumbnail

8.2 (๊ธˆ)

๐Ÿ“Œ ์–ด์ œ๋ถ€ํ„ฐ ๋บ‘์ด์นœ cookie๋กœ ๋งŒ๋“  ์ž‘๊ณ ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•ด๊ฒฐํ•ด์„œ ๊ธฐ๋ถ„์ข‹์€ ๊ธฐ๋…์œผ๋กœ ํ•œ๋ฒˆ ๋” ์˜ฌ๋ฆฐ๋‹ค. ์ ์  ๊ฐœ๋ฐœ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ต์ˆ™ํ•จ์ด ์ฆ๊ฐ€ํ•˜๋Š”์ค‘.

0-1. ์ฟ ํ‚ค์ƒ์„ฑ

//ex1) ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„๋•Œ  

String uid = req.getParameter("uid"); //ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ String์— ํ• ๋‹นํ•ด์„œ

Cookie userInfoCookie = new Cookie("userInfo", uid); //์ฟ ํ‚ค ๊ฐ’ ๋ถ€๋ถ„์— ๋„ฃ์–ด์คŒ

-----------------------------------------------------------------------
//ex2) ๋ฐฐ์—ด๋กœ ๋ฐ›์„๋•Œ

 cart = new Cookie("cart", String.join("&", items));

๐Ÿ‘‰ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ์ ์€ ์ฟ ํ‚ค๋Š” ํ‚ค์™€ ๊ฐ’์˜ ํ˜•ํƒœ๋กœ ์ง‘์–ด๋„ฃ๋Š”๋ฐ, ๋‘˜๋‹ค ๋ฌธ์ž์—ด์ด์—ฌ์•ผํ•จ.
๐Ÿ‘‰ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด๋กœ ๋ฐ›์„๋•Œ ๋‚ด๋ถ€์˜ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ์ด์–ด์ง€๋„๋ก ๋ฐ›์•„์ค˜์•ผํ•จ.




0-2. ์ฟ ํ‚ค ์œ ํšจ๋ฒ”์œ„, ์œ ํšจ๊ธฐ๊ฐ„, ์ €์žฅ

userInfoCookie.setPath("/"); //์œ ํšจ๋ฒ”์œ„ ์„ค์ •

userInfoCookie.setMaxAge(60 * 60 * 24); //์œ ํšจ๊ธฐ๊ฐ„ ์„ค์ •

resp.addCookie(userInfoCookie); // ์ฟ ํ‚ค ์ €์žฅ

๐Ÿ‘‰ ์ฟ ํ‚ค ์ƒ์„ฑ ๋ฐ”๋กœ ๋ฐ‘์— ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑ๋œ ์ฟ ํ‚ค๋ฅผ ์–ด๋””์—์„œ๋“  ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ์ง€ ์„ค์ • ํ•˜๋Š” setPath, ์œ ํšจ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•œ๋‹ค
๐Ÿ‘‰ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด๋‘๋ฉด ๋ช‡์‹œ๊ฐ„๋™์•ˆ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ์ง€ setMaxAge, ์œ ํšจ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•œ๋‹ค
๐Ÿ‘‰ ์„ค์ •ํ•œ ์ฟ ํ‚ค๋ฅผ addCookie ์ €์žฅํ•œ๋‹ค.




0-3. ์ฟ ํ‚ค๋ฅผ jsp์— ์‚ฌ์šฉํ• ์ˆ˜์žˆ๋„๋ก ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊บผ๋‚ด๊ธฐ.

Cookie cks = CookieUtil.getCookie(req, "userInfo"); //CookieUtil์„ ํ†ตํ•ด
//userInfo๋ผ๋Š” ์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ์œผ๋ฉด cks๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด๊ธฐ.

String cksvalue = cks.getValue(); //cksvalue๋ผ๋Š” ๋ฌธ์ž์—ด์— cks์ฟ ํ‚ค์˜ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜

req.setAttribute("cksvalue", cksvalue); //jsp์—์„œ cksvalue๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ cksvalue๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅ

๐Ÿ‘‰ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์‹ถ์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  jsp์—์„œ ํ•ญ์ƒํ•˜๋˜ setAttribute๋ฅผ ์ด์šฉํ•˜์—ฌ ${cksvalue}๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด๋จ.




0-4. ๋งŒ์•ฝ ์ฟ ํ‚ค๊ฐ€ ๋ฐฐ์—ด์ด๋ผ์„œ & ๋กœ ๋ฌถ์—ฌ์žˆ๋‹ค๋ฉด jsp์—์„œ ์‚ฌ์šฉ๋ฒ•.

	<div>
        <c:set var="cartItems" value="${fn:split(cartValue, '&')}" />
        <c:forEach items="${cartItems}" var="cart">
             <img src="/img/${cart}">${cart}
        </c:forEach>
    </div>

๐Ÿ‘‰ cartItems๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ setAttribute ๋ฅผ ํ–ˆ์—ˆ์Œ. &๋กœ ์—ฎ์—ฌ์žˆ๋Š” ๋ฌธ์ž์—ด๋“ค์„ split์„ ํ†ตํ•ด์„œ ํ’€์–ด์คŒ
๐Ÿ‘‰ ์—ฌ๊ธฐ์„œ fn์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ fn ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ƒ์œ„์— import๋ฅผ ํ•ด์ค˜์•ผํ•จ
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>




1-1. SigninController

@WebServlet(value="/signin")
@Log4j2

public class SigninController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("signin doGet");

        req.getRequestDispatcher("/WEB-INF/signin.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("signin doPost");

        String uid = req.getParameter("uid");
        // uid๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

        Cookie userInfoCookie = new Cookie("userInfo", uid);
		//uid๋ผ๋Š” ๊ฐ’์„ userInfo๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ cookie๋ฅผ ์ƒ์„ฑ

        userInfoCookie.setPath("/");
		//์ด ์ฝ”๋“œ๋Š” /signin์—์„œ ์ƒ์„ฑ๋œ ์ฟ ํ‚ค์ด๋ฏ€๋กœ /signin ๋ฐ ๊ทธ ํ•˜์œ„ ๊ฒฝ๋กœ์—์„œ๋งŒ ์œ ํšจํ•œ๋ฐ
        // ํ˜„์žฌ์ฒ˜๋Ÿผ / ์ด๋ ‡๊ฒŒ๋งŒ ๋˜์–ด์žˆ๋‹ค๋ฉด ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ ์ด ์ฟ ํ‚ค๋ฅผ ์ ‘๊ทผ ํ•  ์ˆ˜์žˆ๋‹ค.

        userInfoCookie.setMaxAge(60 * 60 * 24);
        // 1์ผ๋™์•ˆ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑ
    
        resp.addCookie(userInfoCookie);
        //์ฟ ํ‚ค์ €์žฅ

        resp.sendRedirect("/movies");
    }
}




1-2. MoviesController

@WebServlet(value="/movies")
@Log4j2
public class MoviesController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("movies doGet");


        Cookie cks = CookieUtil.getCookie(req, "userInfo"); //userInfo๋ผ๋Š” cookie์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ

        if(cks == null){
            log.info("cookies is empty");
            resp.sendRedirect("/signin");
            return; //userInfo ์—†์œผ๋ฉด ์ข…๋ฃŒ
        }


        ArrayList<String> movies = new ArrayList<>();

        movies.add("movie1.jpg");
        movies.add("movie2.jpg");
        movies.add("movie3.jpg");
        movies.add("movie4.jpg");
        movies.add("movie5.jpg");

        req.setAttribute("movies", movies); movies๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ jsp์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ.

        req.getRequestDispatcher("/WEB-INF/movies.jsp").forward(req, resp);
    }


}




1-3. BuyController

@WebServlet("/buy")
@Log4j2
public class BuyController extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("buy doPost");

        String[] items = req.getParameterValues("item"); //jsp์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋ฐ›๊ธฐ

        if (items != null && items.length > 0) { //์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์€ item์ด ์žˆ๋‹ค๋ฉด
            Cookie cart = CookieUtil.getCookie(req, "cart"); //CookieUtil์˜ getCookie ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ cart๋ผ๋Š” ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ด.
                                                            // ๊ธฐ์กด์— Cookie๊ฐ€ ์—†์—ˆ์œผ๋‹ˆ๊นŒ cart๋Š” null๊ฐ’์ด ๋ฐ˜ํ™˜๋  ๊ฒƒ์ด๊ณ  ์•„๋ž˜์—์„œ null์ผ๋•Œ๋Š” cart์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์คŒ.


            if (cart == null) { //๋งŒ์•ฝ์— ์นดํŠธ๋ผ๋Š” ์ฟ ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด
                cart = new Cookie("cart", String.join("&", items)); //cart๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์คŒ, items ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๊ฒฐํ•ฉ์‹œ์ผœ์คŒ.
            } else {
                cart.setValue(cart.getValue() + "&" + String.join("&", items)); //์นดํŠธ์ฟ ํ‚ค๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๋ฉด, ์•„์ดํ…œ๋งŒ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
                //๊ทผ๋ฐ ์ฟ ํ‚ค๋Š” ("๋ฌธ์ž์—ด","๋ฌธ์ž์—ด")์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผํ•ด์„œ & ๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด์„ ์ด์–ด์ค€๊ฒƒ.
            }
            cart.setPath("/");
            //์–ด๋А ๊ฒฝ๋กœ์—์„œ๋“  ์‚ฌ์šฉ๊ฐ€๋Šฅ.
            resp.addCookie(cart);
			//์ฟ ํ‚ค์ €์žฅ

            resp.sendRedirect("/mypage");
        }
    }
}




1-4. MypageController


@WebServlet(value="/mypage")
@Log4j2
public class MypageController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        log.info("mypage doGet");

        Cookie cks = CookieUtil.getCookie(req,"userInfo");
		// CookieUtil์„ ์ด์šฉํ•ด์„œ userInfo๋ผ๋Š” ์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
        // ๋งŒ์•ฝ userInfo ์ฟ ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด cks๋Š” null๋กœ ๋ฐ˜ํ™˜๋ ๊ฒƒ์ž„.
        
        if(cks == null){
            log.info("userInfo is null");
            resp.sendRedirect("/signin");
            return;
            // userInfo์ฟ ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด ๋กœ๊ทธ์ธํ™”๋ฉด์œผ๋กœ ์ด๋™
        }

        Cookie cart = CookieUtil.getCookie(req,"cart");
        // ๋˜‘๊ฐ™์ด cart์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
        if(cart == null){
            log.info("cart is null");
            resp.sendRedirect("/movies");
            return;
        }else{ //๋งŒ์•ฝ cart์ฟ ํ‚ค๊ฐ€ ์žˆ๋‹ค๋ฉด
            String cartValue = cart.getValue();
			// getValue๋ฉ”์†Œ๋“œ๋Š” ์ฟ ํ‚ค์˜ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜
            req.setAttribute("cartValue", cartValue);
            // cartValue๋ฅผ cartvalue๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ
        }

        req.getRequestDispatcher("/WEB-INF/mypage.jsp").forward(req, resp);
    }
}




1-5. CookieUtil

public class CookieUtil {

    public static Cookie getCookie(final HttpServletRequest request, final String name) {

        Cookie[] cookies = request.getCookies();
        //request.getCookies๋ฅผ ํ†ตํ•ด http์— ์š”์ฒญํ•œ ์ฟ ํ‚ค๋ฅผ ์ฟ ํ‚ค ๋ฐฐ์—ด์— ๋„ฃ๊ณ 
        if (cookies == null || cookies.length == 0) {
        //์ฟ ํ‚ค๋ฐฐ์—ด์ด ์—†์œผ๋ฉด null๋กœ ๋ฐ˜ํ™˜
            return null;
        }
        for (Cookie cookie : cookies) {
        // Cookie๋ฐฐ์—ด๋‚ด์— cookie๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋ƒˆ์„๋•Œ
            if (cookie.getName().equals(name)) {
            //๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์—ˆ๋˜(์›ํ•˜๋Š” ์ฟ ํ‚ค์ด๋ฆ„)๊ณผ ๊ฐ™๋‹ค๋ฉด cookie๋ฅผ ๋ฆฌํ„ดํ•ด์คŒ.
                return cookie;
            }

        }
        return null;
    }
}




1-6. signin.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>signin Page ์ž…๋‹ˆ๋‹ค.</h1>

<form action = "/signin" method="post">
    <div>
        <label>ID</label>
        <input type="text" name="uid">
    </div>

    <div>
        <label>PW</label>
        <input type="password" name="upw">
    </div>

    <button>SIGNIN</button>

</form>

</body>
</html>




1-7. movies.jsp

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<style>
    .pic{
        width: 12rem;
        margin : 2rem;
    }
</style>


<form action="/buy" method="post">
    <ul>
    <c:forEach items="${movies}" var="movie">
        <li>
            <img class="pic" src="/img/${movie}">
            <input type="checkbox" name="item" value="${movie}">${movie}
        </li>
    </c:forEach>
    </ul>
    <button>๋‹ด๊ธฐ</button>
</form>


</body>
</html>




1-8. mypage.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>My Page ์ฟ ํ‚ค์žˆ๋„ค?</h1>

<style>
    img{
        width: 12rem;
    }
</style>


<ul>
    <div>
        <c:set var="cartItems" value="${fn:split(cartValue, '&')}" />
        <c:forEach items="${cartItems}" var="cart">
             <img src="/img/${cart}">${cart}
        </c:forEach>
    </div>
</ul>
</body>
</html>

1-9. LogoutController




@WebServlet(value="/logout")
@Log4j2
public class LogoutController  extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        log.info("logout post");
        Cookie logoutCookie = CookieUtil.getCookie(req,"signin");
        // ๋งจ์ฒ˜์Œ signin ์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ

        if(logoutCookie != null) {
            logoutCookie.setMaxAge(0);
            resp.addCookie(logoutCookie);
            log.info("yes logout");
            resp.sendRedirect("/movie/signin");
        }

    }
}




1-10. LoginCheckFilter


@WebFilter (urlPatterns = {"/movie/movies","/movie/mypage"})
@Log4j2
public class LoginCheckFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        Cookie cks = CookieUtil.getCookie(request,"signin"); //signin ์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ

        if(cks == null || cks.getValue() == null){ //๋กœ๊ทธ์ธ ์ฟ ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด ๋ชจ๋“  jspํŽ˜์ด์ง€์—์„œ url๋กœ ์ด๋™๋ถˆ๊ฐ€๋Šฅ
            response.sendRedirect("/signin");
            log.info("no fisrt cookie");
            return;
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }
}




1-11. register DAO


public enum MovieDAO {

    INSTANCE;

    public Integer register(MovieVO movie) throws Exception {
        String sql = "insert into tbl_movies (uid,upw,name) values (?,?,?)";

        @Cleanup Connection con = ConnectionUtil.INSTANCE.getDs().getConnection();
        @Cleanup PreparedStatement ps = con.prepareStatement(sql);
        ps.setString(1, movie.getUid());
        ps.setString(2, movie.getUpw());
        ps.setString(3, movie.getName());

        int count = ps.executeUpdate();

        if(count != 1){
            throw new Exception();
        }
        Integer mno = movie.getMno();

        return mno;
    }
}

๐Ÿ‘‰ register์˜ return๊ฐ’์€ ๋ช‡๋ฒˆ์ด ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜ค๊ธฐ์œ„ํ•ด Intger
๐Ÿ‘‰ register์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์„ ๊ฐ’์€ jsp๋กœ๊ทธ์ธ์ฐฝ์— ๋“ค์–ด๊ฐˆ uid,upw์ด๋ฏ€๋กœ MovieVO ๋ฐ์ดํ„ฐํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ




1-12. RegisterController


@WebServlet(value="/movie/register")
@Log4j2
public class RegisterController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("register get");

        req.getRequestDispatcher("/WEB-INF/movie/register.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("register post");

        String uid = req.getParameter("uid");
        String upw = req.getParameter("upw");
        String name = req.getParameter("name");

        MovieVO movievo = MovieVO.builder()
                .uid(uid)
                .upw(upw)
                .name(name)
                .build();

        try {
            MovieDAO.INSTANCE.register(movievo);
            log.info("yes login");
            resp.sendRedirect("/movie/signin");

        } catch (Exception e) {
            resp.sendRedirect("/movie/signin?error=input");
            throw new RuntimeException(e);
        }


    }
}

๐Ÿ‘‰ MovieVO์ฑ„๋กœ ๋„ฃ์–ด์ค˜์•ผํ•˜๋‹ˆ๊นŒ builder ์ด์šฉํ•˜๊ธฐ




1-13. register.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>register</h1>

<form action="/movie/register" method="post">
    <div>
        <label>ID</label>
        <input type="text" name="uid">
    </div>

    <div>
        <label>PW</label>
        <input type="password" name="upw">
    </div>

    <div>
        <label>NAME</label>
        <input type="text" name="name">
    </div>

    <button>Register</button>
</form>
</body>
</html>

0๊ฐœ์˜ ๋Œ“๊ธ€