[Spring boot] ํ™˜๊ฒฝ ์„ค์ •์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ ๋‚˜๋ˆ„๊ธฐ

๋ฐ˜์‘ํ˜•

Spring boot ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚œ ํ›„, Embedded Tomcat์„ ์ด์šฉํ•ด ์‰ฝ๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•ด๋ณด๊ณ , ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊นŒ์ง€๋Š” ์ข‹์€ ๊ฒƒ์ด๊ธด ํ•œ๋ฐ, Embedded Tomcat์— ๋Œ€ํ•œ ํฌํŠธ ์ฃผ์†Œ ๋“ฑ์˜ ์„ค์ •์€ ์–ด๋–ป๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

Property

๊ธฐ์กด์˜ Spring์—์„œ๋Š” ๋ชจ๋“  ์„ค์ •์„ XML ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด,  Spring boot์—์„œ๋Š” Embedded Tomcat, Application ์„ค์ • ๊ด€๋ จ ๋ฐ ๊ธฐํƒ€ ์ •์ ์ธ ๊ฐ’์„ ํ‚ค ๊ฐ’ ํ˜•์‹์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 

Spring boot ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์ž๋™ ๋งŒ๋“ค์–ด์ง€๋Š” application.properties๋Š” ์ด๋Ÿฌํ•œ ์„ค์ •์„ ํ•ด์ฃผ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด 8080 ํฌํŠธ๋กœ ์„ค์ •๋˜์ง€๋งŒ, ์ด ํฌํŠธ ์ฃผ์†Œ๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ๋ถ€ํ„ด 1412 ํฌํŠธ ์ฃผ์†Œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด์ฃ .

 

Auto Configuration

์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ๊ฒƒ์ด ์ €๋ ‡๊ฒŒ ๋‹จ์ˆœํ•œ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ผ๊นŒ์š”? ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ๋งŒ๋“œ์‹  Spring boot ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”์ธ ์ฝ”๋“œ์— ๊ทธ ๋‹ต์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฉ”์ธ์ฝ”๋“œ์—๋Š” SpringBootApplication ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ์‚ดํŽด ๋ณด์ž๋ฉด..

์ด๋ ‡๊ฒŒ @EnableAutoConfiguration ์ž๋™ ํ™˜๊ฒฝ ์„ค์ •์ด๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ๋‹ฌ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Spring boot์—์„œ ํฌ๊ฒŒ ๊ฐœ์„ ๋œ ์ ์ด์ž ์•„์ฃผ ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค. 

์™œ๋ƒํ•˜๋ฉด, ์ด ์–ด๋…ธํ…Œ์ด์…˜ ํ•˜๋‚˜๋กœ, Web, H2, JDBC๋ฅผ ๋น„๋กฏํ•œ ์•ฝ 100์—ฌ ๊ฐœ์˜ ์ž๋™ ์„ค์ •์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . Embedded Tomcat์—์„œ ๊ธฐ๋ณธ ์„ค์ • ๊ฐ’์œผ๋กœ 8080์„ ์ฃผ์–ด์ฃผ๋Š” ๊ฒƒ๋„ ๋ฐ”๋กœ ์ด ์–ด๋…ธํ…Œ์ด์…˜์˜ ์˜ํ–ฅ ๋–„๋ฌธ์ž…๋‹ˆ๋‹ค. 

๋”์šฑ์ด, ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒˆ๋กœ์ด ์ถ”๊ฐ€๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (JAR)๋Š” Spring boot ์ž๋™ ํ™˜๊ฒฝ ์„ค์ •์— ์˜๊ฑฐ, ์„ค์ •์ด ์ž๋™ ์ ์šฉ๋˜๋Š”๋ฐ, ๋งŒ์•ฝ H2 ์˜์กด์„ฑ์ด ํด๋ž˜์Šค ๊ฒฝ๋กœ์— ์กด์žฌํ•œ๋‹ค๋ฉด, ์ž๋™์œผ๋กœ In-memory DB์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด์ฃ . ์ด ๋ง์€ ๊ตฌ์ฒด์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ application.properties์—์„œ H2 ์„ค์ • ํŒŒ์ผ์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋ณ„๋„์˜ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž‘์„ฑ ์—†์ด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด In-memory DB์— ์ ‘๊ทผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์™€์šฐ, ์—„์ฒญ ์ข‹์ฃ .. )

์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ•œ ๋ฒˆ ๋ณด๋„๋ก ํ•˜์ž๋ฉด... META-INF/spring.factories์— ์ •์˜๋œ ์ž๋™ ์„ค์ •ํ•  ํด๋ž˜์Šค๋“ค์„ ๋จผ์ € ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ, ์—ฌ๊ธฐ์— H2, Web ๋“ฑ 100 ์—ฌ๊ฐœ์˜ ์„ค์ •์ด ๋ฏธ๋ฆฌ ์ •์˜ ๋˜์–ด ์žˆ๊ณ , ๊ทธ ํด๋ž˜์Šค๋“ค์„ ๋กœ๋“œํ•˜์—ฌ ์ž๋™ ์„ค์ •์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ, ์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด, ์ค‘๋ณต๋˜๋Š” ๋นˆ์ด ์„ค์ •๋  ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธํ…๋ฐ, ์ด๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ ๋กœ์ง์ด ๋ˆˆ์— ๋„๋Š” ๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ Set์„ ์ด์šฉํ•ด์„œ ์ œ์™ธํ•  ์„ค์ •๋“ค์„ ์ €์žฅํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ œ์™ธํ•  ์„ค์ •๋“ค์€ ์ค‘๋ณต๋œ ์„ค์ • removeDuplicates ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ ์ถ”๋ ค์ง„ ๊ฒƒ์ด์ฃ . ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด ์ค‘์—์„œ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ๋˜๋Š” Bean๋งŒ Importํ•  ์ž๋™ ์„ค์ • ๋Œ€์ƒ์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์ด๋“ค ํด๋ž˜์Šค์˜ ๋“ฑ๋ก๊ณผ ์ž๋™ ์„ค์ •์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ๋“ค์€ ์–ด๋–ค ๊ฒƒ์ผ๊นŒ์š”?

  • META-INF/spring.factories
    - ์ž๋™ ์„ค์ • ๋Œ€์ƒ ํด๋ž˜์Šค ๋ชฉ๋ก์œผ๋กœ @EnableAutoConfiguration ์‚ฌ์šฉ์‹œ, ํ•ด๋‹น ํด๋ž˜์Šค๋“ค์€ ์ž๋™ ์„ค์ • ๋Œ€์ƒ์ด ๋œ๋‹ค.
  • META-INF/spring-configuration-metadata.json: ์ž๋™ ์„ค์ •์— ์‚ฌ์šฉํ•  Property ์ •์˜ ํŒŒ์ผ์ด๋‹ค.
  • org/springframework/boot/autoconfigure: ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•ด๋†“์€ ์ž๋™ ์„ค์ • ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ๋Œ€๋ถ€๋ถ„ ์ž๋ฐ” ์„ค์ • ๋ฐฉ์‹์„ ๋”ฐ๋ฅธ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๊พผ Embedded Tomcat์˜ LISTEN PORT ์„ค์ •๊ฐ’๋„ ์žˆ๊ฒ ์ฃ ? ๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ด ๊ณณ์—๋Š” Spring REST ๋ฟ ์•„๋‹ˆ๋ผ Spring Security ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ž๋™ ์„ค์ • ๊ฐ’์ด ๋‹ด๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด์„œ๋Š” ์ฐจํ›„ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ฃฐ ๊ฒƒ์ด์ง€๋งŒ, ์™œ Spring boot์—์„œ ์ด๋Ÿฐ Key-value ํ˜•ํƒœ์˜ ๊ฐ’ ๋งŒ์œผ๋กœ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ข€ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ๋Š” ์ž๋™ ์„ค์ •์— ๋Œ€ํ•œ ํŒŒํŠธ๋ฅผ ๋‹ค๋ฅธ ํฌ์ŠคํŠธ์—์„œ ํ•œ ๋ฒˆ ๋” ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

YAML

์—ฌํƒœ๊นŒ์ง€ Property๋ฅผ ์‚ฌ์šฉํ•ด์„œ Spring boot์˜ ํ™˜๊ฒฝ ์„ค์ •์„ ๋‹ค๋ค„๋ดค์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Properties์—์„œ๋Š” ํ‘œํ˜„์˜ ํ•œ๊ณ„์ ์ด ์กด์žฌํ•˜์—ฌ Spring Project ํŒ€์—์„œ๋„ YAML์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณธ๋ž˜, YAML์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด SnakeYAML ๋ชจ๋“ˆ์„ ๋ณ„๋„๋กœ ์„ค์น˜ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ด์ œ๋Š” Spring boot Starter์— ์ด ๋ชจ๋“ˆ์ด ๊ธฐ๋ณธ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•  ํ•„์š” ์—†์ด application.properties๋ฅผ application.yml๋กœ๋งŒ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ application.properties์™€ application.yml ํŒŒ์ผ์ด ๋‘ ๊ฐœ ๋‹ค ์กด์žฌํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”? 
---> ๊ทธ๋Ÿด ๋• application.yml ํŒŒ์ผ๋งŒ ์˜ค๋ฒ„๋ผ์ด๋“œ ๋˜์–ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

Environment Settings

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด, ๊ณตํ†ต์ ์ธ ๊ณ ๋ฏผ ๊ฑฐ๋ฆฌ๋Š” ๋ฐ”๋กœ ๋ฐฐํฌ ํ›„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ž˜ ๋™์ž‘ํ•˜์˜€๋‹ค๊ฐ€๋„ ํ•ญ์ƒ ๋ฐฐํฌ ํ›„ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์™„ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” CI/CD ํ™˜๊ฒฝ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์„ ์“ฐ๊ฒŒ ๋˜๋ฉด, ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์‚ฌ์šฉ์ž ๊ณ„์ • ๋“ฑ์˜ ์„ค์ •์„ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์„œ๋ฒ„์˜ ํ™˜๊ฒฝ ์„ค์ •์„ ๋งค๋ฒˆ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ™˜๊ฒฝ์„ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์„ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์„ค์ • ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๊ณ , Spring boot์—์„œ ์–ด๋–ค ๊ฒƒ์„ ์ด์šฉํ•˜๋ฉด ๋˜๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๊ฐœ๋ฐœ, ์šด์˜, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์ด๋ ‡๊ฒŒ 3๊ฐœ๋กœ ๋‚˜๋ˆˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ๊ฐ๊ฐ YAML ํŒŒ์ผ์„ ์œ„์™€ ๊ฐ™์ด ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

# application-dev.yml

spring:
  profiles: dev

server:
  port: 1412
# application-prod.yml

spring:
  profiles: prod

server:
  port: 80
# application-test.yml

spring:
  profiles: test

server:
  port: 8081

์œ„์™€ ๊ฐ™์ด ๊ฐ ํŒŒ์ผ์— dev, prod, test ๋“ฑ 3๊ฐ€์ง€ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ , ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

# application.yml

server:
  port: 8080
spring:
  profiles:
    active: dev

์›ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ ์šฉํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ์—๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ application.yml ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ, active ์ชฝ์˜ ๊ฐ’์„ ์›ํ•˜๋Š” ํ™˜๊ฒฝ์œผ๋กœ ์„ค์ •ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ, ํ•ด๋‹น ํ™˜๊ฒฝ์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ์œ„์˜ ํฌํŠธ ์ฃผ์†Œ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด ์™ธ์—๋„ IntelliJ IDEA์—์„œ ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ํ†ตํ•ด์„œ๋„ ํ™˜๊ฒฝ ์„ค์ •์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ์ฝ”ํ‹€๋ฆฐ ์‹คํ–‰ ํ™˜๊ฒฝ๋งŒ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ Spring boot์˜ ํ™˜๊ฒฝ ์„ค์ •์„ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. Templates ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ Spring boot Configuration์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ, ์ ์ ˆํ•œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ , Main class์— Spring boot Main Application ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ค€ ๋‹ค์Œ, Active Profiles์— ์›ํ•˜๋Š” ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ์„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ Spring boot Configuration์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๊ฒฝ์šฐ, application.yml ํŒŒ์ผ์— ์ •์˜๋œ actives๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments