[JSP] ์ฟ ํ‚ค๐Ÿช

Geehyun(์žฅ์ง€ํ˜„)ยท2024๋…„ 3์›” 10์ผ

JSP

๋ชฉ๋ก ๋ณด๊ธฐ
4/7
post-thumbnail

์ฟ ํ‚ค

์ฟ ํ‚ค(Cookie)๋ž€, ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ pc์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€, ๋‹ค์Œ ์š”์ฒญ ์‹œ ์ €์žฅ๋œ ์ฟ ํ‚ค๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

  • ์ฟ ํ‚ค๋Š” Key, Value ํ˜•ํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ฟ ํ‚ค๋Š” 3000๊ฐœ๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฟ ํ‚ค ํ•˜๋‚˜์˜ ์ตœ๋Œ€ ํฌ๋‹ˆ๋Š” 4096 ๋ฐ”์ดํŠธ ์ž…๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ๋‚˜ ๋„๋ฉ”์ธ์—์„œ ์ตœ๋Œ€ 50๊ฐœ๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟ ํ‚ค์˜ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜


1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค! (์ตœ์ดˆ ์ ‘์†)
2. ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์„œ HTTP ์‘๋‹ต ํ—ค๋”์— ์‹ค์–ด์„œ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
3. ํด๋ผ์ด์–ธํŠธ ์ฟ ํ‚ค๋ฅผ ๋ฐ›์•„ ํด๋ผ์ด์–ธํŠธ pc์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. (์•„์ง ํด๋ผ์ด์–ธํŠธ pc์—๋งŒ ์žˆ๋Š” ์ƒํƒœ)
4. ํด๋ผ์ด์–ธํŠธ์˜ ๋‹ค์Œ๋ฒˆ ์š”์ฒญ ์‹œ ์ €์žฅํ•ด๋‘” ์ฟ ํ‚ค๋ฅผ HTTP ์š”์ฒญ ํ—ค๋”์— ์‹ค์–ด ์„œ๋ฒ„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
5. ์„œ๋ฒ„๋Š” ํด๋ฆฌ์–ด์ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ์ฝ์–ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฟ ํ‚ค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ

์ฟ ํ‚ค์˜ ์†์„ฑ

  • ์ด๋ฆ„(name)
    ์ฟ ํ‚ค๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ์ด๋ฆ„ ์ž…๋‹ˆ๋‹ค. (์ด๋ฆ„ ์ค‘๋ณต ๋ถˆ๊ฐ€)
    String ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ’(value)
    ์ฟ ํ‚ค์— ์ €์žฅํ•  ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ž…๋‹ˆ๋‹ค.
    String ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    ( ) < > @ , ; : \ " / [ ] ? = { } ์˜ ํŠน์ˆ˜๋ฌธ์ž๋Š” ์‚ฌ์šฉ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋„๋ฉ”์ธ(domain)
    ์ฟ ํ‚ค๋ฅผ ์ ์šฉํ•  ๋„๋ฉ”์ธ ์ž…๋‹ˆ๋‹ค.
  • ๊ฒฝ๋กœ(path)
    ์ฟ ํ‚ค๋ฅผ ์ ์šฉํ•  ๊ฒฝ๋กœ ์ž…๋‹ˆ๋‹ค.
  • ์œ ์ง€ ๊ธฐ๊ฐ„(max age)
    ์ฟ ํ‚ค๊ฐ€ ํด๋ผ์ด์–ธํŠธ pc์—์„œ ๋งŒ๋“ค์–ด์ง„ ํ›„ ์œ ์ง€๋  ๊ธฐ๊ฐ„, ์ฆ‰ ์ฟ ํ‚ค์˜ ์ˆ˜๋ช… ์ž…๋‹ˆ๋‹ค.
    ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฟ ํ‚ค ๊ด€๋ จ ๋ฉ”์„œ๋“œ

์‚ฌ์šฉ๋ฒ•

์ฟ ํ‚ค ์ƒ์„ฑ๋ฒ•์€ ์•„๋ž˜ ์ฟ ํ‚ค ์กฐ์ž‘๋ฒ•(๊ธฐ๋ณธ) ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”

<%
// ์‚ฌ์šฉ๋ฒ•
์ฟ ํ‚ค๋‹ด์€๋ณ€์ˆ˜๋ช….๋ฉ”์„œ๋“œ();

// ์‚ฌ์šฉ์˜ˆ์‹œ
Cookie cookie = new Cookie("cookieName", "cookieValue");
cookie.setValue("changedValue");
%>
๋ฆฌํ„ด ํƒ€์ž…๋ฉ”์„œ๋“œ ๋ช…์„ค๋ช…
voidsetValue(String value)- ํ•ด๋‹น ์ฟ ํ‚ค์˜ ๊ฐ’์„ ์ž…๋ ฅํ•œ value๋กœ ์„ค์ •(์ˆ˜์ •)ํ•ฉ๋‹ˆ๋‹ค.
voidsetDomain(String domain)- ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ์ ์šฉํ•  ๋„๋ฉ”์ธ์„ ์„ค์ • ํ•ฉ๋‹ˆ๋‹ค.
voidsetPath(String path)- ์ฟ ํ‚ค๋ฅผ ์ ์šฉํ•  ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
- ์ง€์ •ํ•œ ๊ฒฝ๋กœ์™€ ๊ทธ ํ•˜์œ„ ๊ฒฝ๋กœ๊นŒ์ง€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
voidsetMaxAge(int expire_seconds)- ์ฟ ํ‚ค์˜ ์ˆ˜๋ช…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
- ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ pc์— ์ €์žฅ๋œ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์„ค์ •๋œ ์ดˆ ๋งŒํผ์˜ ์ˆ˜๋ช…์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
- ์ˆ˜๋ช…์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ 0์œผ๋กœ ์„ค์ •๋˜์–ด ํด๋ผ์ด์–ธํŠธ pc์—์„œ ๋งŒ๋“ค์–ด์ง„ ์ˆœ๊ฐ„ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
StringgetName()- ํ•ด๋‹น ์ฟ ํ‚ค์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
StringgetValue()- ํ•ด๋‹น ์ฟ ํ‚ค์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
StringgetDomain()- ํ•ด๋‹น ์ฟ ํ‚ค๊ฐ€ ์ ์šฉ๋˜์–ด์žˆ๋Š” ๋„๋ฉ”์ธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
StringgetPath()- ํ•ด๋‹น ์ฟ ํ‚ค๊ฐ€ ์ ์šฉ๋˜์–ด์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
intgetMaxAge()- ํ•ด๋‹น ์ฟ ํ‚ค์˜ ์ˆ˜๋ช…์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
- ์ˆ˜๋ช…์ด ์„ค์ •๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฟ ํ‚ค ์กฐ์ž‘๋ฒ•(๊ธฐ๋ณธ)

์ฟ ํ‚ค์ƒ์„ฑ

  1. ์ฟ ํ‚ค ์ƒ์„ฑ
    ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” Cookie ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    Cookie ๋ณ€์ˆ˜๋ช… = new Cookie(String Key, String value);
  2. ๋„๋ฉ”์ธ ์„ค์ •
    ์ฟ ํ‚ค์— ์ ์šฉํ•  ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    ๋ณ€์ˆ˜๋ช….setDomain(String domain);
  3. ๊ฒฝ๋กœ ์„ค์ •
    ์ฟ ํ‚ค๊ฐ€ ์ ์šฉ๋  ๊ฒฝ๋กœ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    ๋ณ€์ˆ˜๋ช….setPath(String path);
  4. ์ˆ˜๋ช… ์„ค์ •
    ํ•ด๋‹น ์ฟ ํ‚ค๊ฐ€ ์œ ์ง€๋  ๊ธฐ๊ฐ„์„ ์ดˆ๋‹จ์œ„๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ์ž‘์„ฑ ์‹œ 0์œผ๋กœ ์„ค์ •๋˜๋ฉด ๋งŒ๋“ค์–ด์ง€์ž๋งˆ์ž ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
    ๋ณ€์ˆ˜๋ช….setMaxAge(int age);
  5. ์—ด์‹ฌํžˆ ๋งŒ๋“  ์ฟ ํ‚ค ์ถ”๊ฐ€ํ•˜๊ธฐ
    ์œ„ ์ˆœ์„œ๋Œ€๋กœ ๋งŒ๋“  ์ฟ ํ‚ค๋ฅผ response ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ์‘๋‹ตํ—ค๋”์— ์ฟ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    response.addCookie(๋ณ€์ˆ˜๋ช…);
<!-- ์‚ฌ์šฉ์˜ˆ์‹œ -->
<%
// 1. ์ฟ ํ‚ค ์ƒ์„ฑ
Cookie cookie = new Cookie("myCookie", "์ฟ ํ‚ค๊ฐ’1");
// 2. ๋„๋ฉ”์ธ ์„ค์ • : ํ˜„์žฌ localhost์—์„œ๋งŒ ์‚ฌ์šฉํ•  ๊บผ๋ผ ์ผ๋‹จ ์ƒ๋žต
// 3. ๊ฒฝ๋กœ์„ค์ •
cookie.setPath(request.getContextPath());  
// ์ปจํ…์ŠคํŠธ ํŒจ์Šค์— ๊ฐ’์„ ์•ˆ์ฃผ๋ฉด ๋ฃจํŠธ๊ฐ€ ๋จ = "/"
// 4. ์ˆ˜๋ช…์„ค์ •
cookie.setMaxAge(3600);
// 5. ์ฟ ํ‚ค ์‘๋‹ตํ—ค๋”์— ์ถ”๊ฐ€ํ•˜๊ธฐ
response.addCookie(cookie);
%>

์ฟ ํ‚ค ์กฐํšŒ

  1. ์ฟ ํ‚ค ์ •๋ณด ๊ฐ–๊ณ ์˜ค๊ธฐ
    request ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ •๋ณด์—์„œ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    Cookie[] ๋ณ€์ˆ˜๋ช… = request.getCookies();
  2. ์ฟ ํ‚ค ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
    ์œ„ ์ƒ์„ฑํ•œ ๋ฐฐ์—ด์—์„œ getName, getValue ์œผ๋กœ ์ฟ ํ‚ค๋ช…๊ณผ ๊ฐ’์„ ๊ฐ–๊ณ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    for๋ฌธ์œผ๋กœ ๋Œ๋ฉด์„œ ํ•˜๋‚˜์”ฉ ๊ฐ’์„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<%
// 1. ์ฟ ํ‚ค ์ •๋ณด ๊ฐ–๊ณ ์˜ค๊ธฐ
Cookie[] cookies = request.getCookies();
// 2. ์ฟ ํ‚ค ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
if (cookies != null) {
	for(Cookie c : cookies) {
		String cookieName = c.getName();
		String cookieVal = c.getValue();
        // + ์›ํ•˜๋Š” ์ฟ ํ‚ค ์ •๋ณด๋งŒ ๊ฐ–๊ณ ์˜ค๊ธฐ ์œ„ํ•ด์„œ if ๋ฌธ์œผ๋กœ ์ฒดํฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        if (cookieName.equals("์›ํ•˜๋Š” ์ฟ ํ‚ค ์ด๋ฆ„") {
        	out.print(String.format("%s : %s + %s<br>", cookieNamem cookieVal)
        }
	}
}
%>

์ฟ ํ‚ค ์‚ญ์ œ

ํŠน์ • ์กฐ๊ฑด์ผ ๋•Œ ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•  ๊ฒฝ์šฐ๋Š”, ์ฟ ํ‚ค ์ƒ์„ฑ ์‹œ์™€ ๋™์ผํ•œ ๋กœ์ง์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, setValue("")๋กœ ๊ฐ’์„ ์ง€์›Œ์ฃผ๊ณ , setMaxAge(0)์œผ๋กœ ํ•ด๋‹น ์ฟ ํ‚ค๊ฐ€ ์ €์žฅ๋จ๊ณผ ๋™์‹œ์— ์—†์–ด์ง€๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<%
// 1. ์ฟ ํ‚ค ์ƒ์„ฑ (๋‹จ, ์‚ญ์ œ์ด๋ฏ€๋กœ ๊ฐ’์„ ""์œผ๋กœ ์ง€์›Œ์คŒ
Cookie cookie = new Cookie("myCookie", "");
// 2. ๋„๋ฉ”์ธ ์„ค์ • : ํ˜„์žฌ localhost์—์„œ๋งŒ ์‚ฌ์šฉํ•  ๊บผ๋ผ ์ผ๋‹จ ์ƒ๋žต
// 3. ๊ฒฝ๋กœ์„ค์ •
cookie.setPath(request.getContextPath());  
// ์ปจํ…์ŠคํŠธ ํŒจ์Šค์— ๊ฐ’์„ ์•ˆ์ฃผ๋ฉด ๋ฃจํŠธ๊ฐ€ ๋จ = "/"
// 4. ์ˆ˜๋ช…์„ค์ • (๋‹จ, ์‚ญ์ œ์ด๋ฏ€๋กœ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ €์žฅ๊ณผ ๋™์‹œ์— ์‚ฌ๋ผ์ง€๊ฒŒ ํ•จ)
cookie.setMaxAge(0);
// 5. ์ฟ ํ‚ค ์‘๋‹ตํ—ค๋”์— ์ถ”๊ฐ€ํ•˜๊ธฐ
response.addCookie(cookie);
%>

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ๋ณธ์ธ ์ฟ ํ‚ค ์‚ญ์ œํ•˜๊ธฐ

  • ๋ธŒ๋ผ์šฐ์ € ๋งˆ๋‹ค ์„ค์ • ์ฐฝ์—์„œ ์ „์ฒด ์ฟ ํ‚ค ์‚ญ์ œ
  1. ํฌ๋กฌ ์ฟ ํ‚ค ์‚ญ์ œ
  2. ์—ฃ์ง€ ์ฟ ํ‚ค ์‚ญ์ œ
  • ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(F12) ์ด์šฉํ•ด์„œ ์›ํ•˜๋Š” ์ฟ ํ‚ค ์ง์ ‘ ์‚ญ์ œ
    ๊ฐœ๋ฐœ์ž๋„๊ตฌ(F12) > Application ํƒญ > Storage > Cookies > ํ•ด๋‹นํ•˜๋Š” ๋„๋ฉ”์ธ > ์›ํ•˜๋Š” ์ฟ ํ‚ค ์šฐ ํด๋ฆญ ํ›„ ์‚ญ์ œ

์ฟ ํ‚ค ์กฐ์ž‘๋ฒ•(์‘์šฉ) : ์ฟ ํ‚ค ๋งค๋‹ˆ์ €

์ฟ ํ‚ค ๋งค๋‹ˆ์ €๋Š”, ์œ„ ์ฟ ํ‚ค ๊ธฐ๋ณธ ์กฐ์ž‘๋ฒ•์„ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•ด๋†“๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹ ์ž…๋‹ˆ๋‹ค.

  • CookieManger ํด๋ž˜์Šค ์ž‘์„ฑ
package chap04;

import jakarta.servlet.http.*;
// response, request ์‚ฌ์šฉ์„ ์œ„ํ•ด importํ•จ.

public class CookieUtil {
	
    // ์ฟ ํ‚ค ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ
	public static void setCookie(HttpServletResponse resp, String name, String value, int expire_date, String path) {
		Cookie cookie = new Cookie(name, value);
		cookie.setPath(path);
		cookie.setMaxAge(expire_date); 
		resp.addCookie(cookie);
	}
	
    // ์ฟ ํ‚ค ๊ฐ–๊ณ ์˜ค๋Š” ๋ฉ”์„œ๋“œ (์ฟ ํ‚ค ์ด๋ฆ„์œผ๋กœ ๊ฐ–๊ณ ์˜ค๊ฒŒ๋” ์ž‘์„ฑ)
	public static String getCookieValue(HttpServletRequest req, String name) {
		String value = "";
		Cookie[] cookies = req.getCookies();
		for(Cookie c : cookies) {
			String cookieName = c.getName();
			String cookieVal = c.getValue();
			if (name.equals(cookieName)) {
				value = cookieVal;
				break;
			}
		}
		return value;
	}
	
    // ์ €์žฅ๋œ ์ฟ ํ‚ค ์‚ญ์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ
	public static void setDeleteCookie(HttpServletResponse resp, String name, String path) {
		 setCookie(resp, name, "",0, path);
	 }
	// ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ static์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑํ•จ.
}
  • ์ฟ ํ‚ค ๋งค๋‹ˆ์ € ์‚ฌ์šฉ ์˜ˆ์‹œ
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ page import="chap04.CookieManger"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// ์ฟ ํ‚ค ์ƒ์„ฑ์— ์ฟ ํ‚ค ๋งค๋‹ˆ์ € ์ ์šฉ
CookieManger.setCookie(respons, "myCookie", "์ฟ ํ‚ค๊ฐ’1", 3600)
%>
</body>
</html>

์ฟ ํ‚ค ๊ด€๋ จ ์‹ค์Šต ์ฝ”๋“œ

[TIL]240307 ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์„ฑ๋‚™ํ˜„์˜ JSP ์ž๋ฐ” ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2ํŒ - ์„ฑ๋‚™ํ˜„ ์ง€์Œ
์œ„ ์ฑ…์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

profile
๋ธ”๋กœ๊ทธ ์ด์ „ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ธ”๋กœ๊ทธ ์•„์ด์ฝ˜(๐Ÿ ) ๋ˆŒ๋Ÿฌ์„œ ๋†€๋Ÿฌ์˜ค์„ธ์š”

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