COKOTHON 2022 ์ฐธ๊ฐ€ ํ›„๊ธฐ (๐Ÿ† 2์œ„)

susuยท2023๋…„ 1์›” 2์ผ
0

๋‚˜์˜ ๋‘๋ฒˆ์งธ ํ•ด์ปคํ†ค์ด ๋๋‚ฌ๋‹ค.
์ด๋ฒˆ ๋Œ€ํšŒ์—์„œ๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋ชฉํ‘œํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ๋‚ด ํž˜์œผ๋กœ ์ด๋ค„๋‚ธ ๊ฒƒ ๊ฐ™์•„์„œ ์ข‹์•˜๊ณ ,
๋ฌด์—‡๋ณด๋‹ค ์ˆ˜์ƒ์ด๋ผ๋Š” ๊ฐ€์‹œ์ ์ธ ์„ฑ๊ณผ๊ฐ€ ์žˆ์–ด ๊ธฐ๋ปค๋‹ค ๐Ÿค‘
์ค€๋น„ ๊ณผ์ •๊ณผ ์‹œํ–‰์ฐฉ์˜ค๋“ค์„ ๋ณต๊ธฐํ•˜๋ฉฐ ๋Œ€ํšŒ ํ›„๊ธฐ๋ฅผ ๊ธฐ๋กํ•ด๋ณธ๋‹ค.

๋Œ€ํšŒ ์†Œ๊ฐœ

๐Ÿ”— Notion ๋Œ€ํšŒ ๊ณต๊ณ 

๊ตญ๋ฏผ๋Œ€ํ•™๊ต ์†Œํ”„ํŠธ์›จ์–ด์œตํ•ฉ๋Œ€ํ•™ ํ•™ํšŒ Koss์™€ ์ˆ™๋ช…์—ฌ์ž๋Œ€ํ•™๊ต IT๊ณตํ•™์ „๊ณต ํ•™ํšŒ Code-it์—์„œ ๊ฐœ์ตœํ•œ ํ•ด์ปคํ†ค์ด๋‹ค.
2022๋…„ 12์›” 28์ผ๋ถ€ํ„ฐ ๊ตญ๋ฏผ๋Œ€ํ•™๊ต ๋ฏธ๋ž˜๊ด€ ์ž์œจ์ฃผํ–‰์ŠคํŠœ๋””์˜ค์—์„œ ๋ฌด๋ฐ• 2์ผ๊ฐ„ ์ง„ํ–‰๋œ๋‹ค.
์‹ ์ฒญ ๋Œ€์ƒ์€ ์•„๋ž˜ ํ•™๊ณผ ์†Œ์† ์žฌํ•™์ƒ์œผ๋กœ ์ œํ•œ๋œ๋‹ค.

  • ๊ตญ๋ฏผ๋Œ€ํ•™๊ต ์†Œํ”„ํŠธ์›จ์–ด์œตํ•ฉํ•™๋ถ€
  • ์ˆ™๋ช…์—ฌ์ž๋Œ€ํ•™๊ต IT๊ณตํ•™์ „๊ณต & ์†Œํ”„ํŠธ์›จ์–ดํ•™๋ถ€

๋Š˜ ๊ทธ๋ ‡๋“ฏ ๋‚˜๋Š” ๋ฐฑ์—”๋“œ๋กœ ์ฐธ์—ฌํ–ˆ๋‹ค.

์ฐธ๊ฐ€ํ•œ ์ด์œ 

  1. ์ง€๋‚œ Uni-DTHON์—์„œ ๋Š๊ผˆ๋˜ ์•„์‰ฌ์›€๋“ค์„ ๋ณด์™„ํ•˜๊ณ  ์‹ถ์–ด์„œ.
  2. ํ•ด์ปคํ†ค์—์„œ๋งŒ ๋Š๋‚„ ์ˆ˜ ์žˆ๋Š” ๋น ๋ฅด๊ณ  ๊ฐ„๊ฒฐํ•œ ๊ฐœ๋ฐœ ํ…œํฌ๊ฐ€ ์ข‹์•„์„œ.

๋ฌด๋ฐ•์œผ๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํž˜๋“ค๊ธด ํ•ด๋„ ์ œํ•œ๋œ ์‹œ๊ฐ„๋™์•ˆ ์–ด๋งˆ์–ด๋งˆํ•œ ์ง‘์ค‘๋ ฅ์„ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ์–ด ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฌ๋ž‘ ํŒ€์ด ๋  ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒƒ๋„ ์žฌ๋ฐŒ๋‹ค.

(๋ฌผ๋ก  ์šด์ „๊ฒฝ๋ ฅ 20๋…„์งœ๋ฆฌ ๊ธฐ์‚ฌ๊ฐ€ ๋ชจ๋Š” ๋ฒ„์Šค์— ํƒ€๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ,
์ง์ ‘ ์šด์ „๋Œ€๋ฅผ ์žก๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค ๐Ÿ˜‡...)

๐Ÿ ์‚ฌ์ „ ์ค€๋น„

์ฆ‰์„์—์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ํ•ด์ปคํ†ค์˜ ์ •์ˆ˜์ด๊ธด ํ•˜์ง€๋งŒ,
๊ทธ๋ž˜๋„ ๋„ˆ๋ฌด ์•„๋ฌด๋Ÿฐ ์ค€๋น„ ์—†์ด ๊ฐ”๋‹ค๊ฐ€๋Š” ํ”„๋กœ์ ํŠธ ์„ธํŒ… ๋„์ค‘์— ํ•ด๊ฐ€ ์ง€๋Š” ๊ฑธ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋  ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.
ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ์ด๋‚˜ DB ์„ธํŒ…์€ ๋ฏธ๋ฆฌ ํ•ด๊ฐ€๊ณ , ํ”„๋ก ํŠธ์™€์˜ ์—ฐ๋™์„ ์œ„ํ•œ ์ค€๋น„๋„ ํ•ด๊ฐ€๋Š” ๊ฒŒ ์ข‹๋‹ค.
์—ฌ์œ ๊ฐ€ ๋œ๋‹ค๋ฉด ๊ฐ„๋‹จํ•œ CRUD๋ฅผ ๋‹ด์€ ERD์™€ ์—”ํ‹ฐํ‹ฐ ์ฝ”๋“œ๋„ ์„ค๊ณ„ํ•ด๊ฐ€๋Š” ๊ฑธ ์ถ”์ฒœํ•œ๋‹ค.

ํ•„์ž๋Š” ์ง€๋‚œ ๋Œ€ํšŒ์—์„œ์˜ ๊ฒฝํ—˜์„ ํ† ๋Œ€๋กœ ์ „๋‚ ์— ๋ชจ๋‘ ์ค€๋น„ํ•ด๋‘๊ณ  ๊ฐ”๋‹ค.
๋•๋ถ„์— ๋‹ค๋ฅธ ํŒ€์—์„œ ERD ์„ค๊ณ„๋กœ ๊ณ ๋ฏผํ•  ๋•Œ ๋ฐ”๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์‹œ๊ฐ„์„ ๋งŽ์ด ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Project

  • Build Tool - Gradle
  • Spring Data JPA
  • Lombok
  • Spring Security
  • H2 Database
  • MySQL connector (Driver)

RDBMS์ธ MySQL๊ณผ ์Šคํ”„๋ง์˜ JPA๋ฅผ ๋งคํ•‘ํ•˜๋ ค๋ฉด MySQL Connector์ด๋ผ๋Š” ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
๋ฏธ๋ฆฌ ์„ค์น˜ํ•˜๊ณ  ์„ค์ •ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•ด๋‘๋ฉด ์ข‹๋‹ค.

Server

  • local : 4041 ํฌํŠธ
  • production : AWS EC2 + RDS

API ์„œ๋ฒ„๋ฅผ EC2์— ๋ฐฐํฌํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๋™ํ•  ๊ณ„ํš์ด์—ˆ๋‹ค.
๋”ฐ๋ผ์„œ EC2 ์ธ์Šคํ„ด์Šค์™€ RDS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ์—ด์–ด๋†“๊ณ  ๊ฐ”๋‹ค.

์œ„์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ๋“ฏ ๋งŽ์ด ์“ฐ๋Š” ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ERD๋„ ๊ทธ๋ ค์„œ ๊ฐ”๋‹ค.
ERD ์ž‘์„ฑ์€ ๐Ÿ”—ERD Cloud ๋ผ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ–ˆ๊ณ ,
์‚ฌ์ดํŠธ ๋ฉ”์ธ์— ์žˆ๋Š” OKKY๋ผ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ERD๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.
์ด ๊ณผ์ •์—์„œ PK ๋งคํ•‘๊ณผ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„ ๋‹ค๋Œ€์ผ๋กœ ํ’€๊ธฐ ๋“ฑ JPA์— ๋Œ€ํ•œ ๊ณต๋ถ€๋„ ๋งŽ์ด ํ–ˆ๋‹ค.

๐Ÿ ์ง„ํ–‰ ๊ณผ์ •

ํŒ€ ๋นŒ๋”ฉ

ํŒ€๋นŒ๋”ฉ์€ ๋žœ๋ค์ธ ๊ฒƒ ๊ฐ™์•˜๊ณ , 5์ธ 1ํŒ€์ด์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์„ธ ๋ช…์ด ์›น ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์—†์—ˆ๊ณ ,
๊ทธ์ค‘ ํ•œ๋ช…์€ ๋ชธ์ด ์•ˆ ์ข‹์•„์„œ ์ค‘๋„ํฌ๊ธฐ ํ•˜๊ณ  ์ง‘์— ๊ฐ€์…จ๋‹ค (...)
๋‹คํ–‰ํžˆ ๋‚˜๋จธ์ง€ ํ•œ ๋ถ„์˜ ํฌ์ง€์…˜์ด ํ”„๋ก ํŠธ์˜€๊ณ  ๋‚˜๋„ ํ˜ผ์ž์„œ ์ปค๋ฒ„๊ฐ€ ๊ฐ€๋Šฅํ•ด์„œ ๋‘˜์ด์„œ ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

์ฃผ์ œ ์„ ์ •

์ฃผ์ œ๋Š” ์ฒญ์ถ˜ ์ด์—ˆ๋‹ค.
ํ•œ ์ฃผ๊ฐ„์˜ ๋ฌธํ™”์ƒํ™œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์ถ”์ฒœํ•ด์ฃผ๋Š” ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์˜๊ฒฌ์ด ๋‚˜์™”๋‹ค.
์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ๋ฐ”๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ–ˆ๋‹ค.

๊ณต์—ฐ ์ •๋ณด๋‚˜ ์ธ๋„ค์ผ์€ ์ธํ„ฐํŒŒํฌ ๊ฐ™์€ ์˜ˆ๋งค ์‚ฌ์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌ๋กค๋งํ•ด์™€์„œ ๋ณด์—ฌ์ฃผ๊ธฐ๋กœ ํ–ˆ๊ณ ,
์˜๊ฒฌ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๊ฐœ๋ฐœ ํ™˜๊ฒฝ

๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์ด๊ธด ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์ €๊ฒƒ ๋ญ๊ฐ€ ๋งŽ์ด ๋“ค์–ด๊ฐ”๋‹ค.
๋‚˜๋Š” API ์„œ๋ฒ„ ๋ฐฐํฌ๊ฐ€ ์ฒ˜์Œ์ด์—ˆ๊ณ , ํ”„๋ก ํŠธ ์นœ๊ตฌ๋Š” ํ…Œ์ผ์œˆ๋“œ๋ฅผ ์ฒ˜์Œ ์จ๋ณธ๋‹ค๊ณ  ํ–ˆ๋‹ค.

๋ณธ๊ฒฉ์ ์ธ ๊ฐœ๋ฐœ ๊ณผ์ •

1. API ๊ฐœ๋ฐœ

Postman์œผ๋กœ ํ…Œ์ŠคํŠธ์™€ ๋ฌธ์„œํ™”๋ฅผ ๋™์‹œ์— ํ–ˆ๋‹ค.
ํ…Œ์ŠคํŠธ ์„ ํƒ์ง€์— ํฌ์ŠคํŠธ๋งจ ๋ง๊ณ ๋„ Swagger๊ฐ€ ์žˆ๊ธด ํ–ˆ๋Š”๋ฐ ์จ๋ณธ ๊ฒŒ ํฌ์ŠคํŠธ๋งจ ๋ฟ์ด๋ผ ์ต์ˆ™ํ•œ ๊ฑธ๋กœ ํ–ˆ๋‹ค.

๊ธฐ๋ณธ์ ์ธ API ์‘๋‹ต์€ ApiResponse ํด๋ž˜์Šค์— ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ๋‹ฌ์•„์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ํ–ˆ๋‹ค.
์š”์ฒญ๊ณผ ์‘๋‹ต ๋ชจ๋‘ dto๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ๋“ค์—ˆ๋Š”๋ฐ,
API๋งˆ๋‹ค ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์‹œ๊ฐ„์ด ์—†์–ด์„œ ์ผ๋ถ€๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ณด๋ƒˆ๋‹ค.
๋‚˜์ค‘์— ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉด์„œ ์ˆ˜์ •ํ•ด๋ด์•ผ์ง€.

๐Ÿšจ ๊ฐœ๋ฐœ ์ค‘ ๊ฒช์€ ์—๋Ÿฌ (1)
nullable=true๋กœ ์„ค์ •ํ•œ ์ปฌ๋Ÿผ์—์„œ null๊ฐ’์ด ๋ฆฌํ„ด๋˜๋Š” ๊ฒฝ์šฐ (e.g. ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ์™€ ์กฐ์ธํ•œ ์ปฌ๋Ÿผ) ์‘๋‹ต์ด ์ „์†ก๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
์กฐ์ธํ•œ ์ปฌ๋Ÿผ์— @JsonIgnore ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

2. ์„œ๋ฒ„ ๋ฐฐํฌ

Travis CI๋‚˜ S3 + CodeDeploy๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ์ž๋™ํ™” ๋กœ์ง์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ๊ทธ๊ฑด ๋„ˆ๋ฌด ์“ธ๋ฐ์—†๋Š”(..) ์š•์‹ฌ์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๊ณ ,
ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ API ์„œ๋ฒ„๋ฅผ ๊นƒํ—ˆ๋ธŒ์— ํ‘ธ์‹œํ•˜๊ณ  EC2์— ํด๋ก ํ•ด์™€์„œ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ์‹์˜ ์ˆ˜๋™ ๋ฐฐํฌ๋ฅผ ํ–ˆ๋‹ค.

๐Ÿšจ ๊ฐœ๋ฐœ ์ค‘ ๊ฒช์€ ์—๋Ÿฌ (2)
๋ถ„๋ช…ํžˆ ์„œ๋ฒ„๋Š” ๋ฐฐํฌ๊ฐ€ ๋๋Š”๋ฐ, ์—ฐ๊ฒฐํ•ด๋‘” ๋‚ด DB ์ƒ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋œจ์ง€ ์•Š์•˜๋‹ค.
์›์ธ๋„ ๋ชจ๋ฅด๊ณ  ์ž๊พธ ์™œ ์ด๋Ÿฌ๋‚˜ ํ—ˆ๋‘ฅ์ง€๋‘ฅ ๋‘์‹œ๊ฐ„๋™์•ˆ ํ—ค๋งธ๋Š”๋ฐ,
์›์ธ์€ .ignore ์ฒ˜๋ฆฌํ•œ ์„ค์ •ํŒŒ์ผ(application.yml)์ด ๊นƒํ—ˆ๋ธŒ์— ํ‘ธ์‹œ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.
๊ธ‰ํ•˜๊ฒŒ gitignore ํ•ด์ œ ํ›„ application.yml ํŒŒ์ผ์„ ํ‘ธ์‹œํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋Š”๋ฐ,
๊ทธ ๊ณผ์ •์—์„œ ๋‚˜์˜ ์†Œ์ค‘ํ•œ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ํ•จ๊ป˜ ํ‘ธ์‹œ๋˜๋Š” ์‚ฌํƒœ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๐Ÿšจ ๊ฐœ๋ฐœ ์ค‘ ๊ฒช์€ ์—๋Ÿฌ (3)
์ง‘์ด ์•„๋‹Œ ๊ณณ์—์„œ ๋ฐฐํฌํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ AWS์˜ ํƒ„๋ ฅ์  ip ํ• ๋‹น์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ,
๋ฌธ์ œ๋Š” ํ”„๋ฆฌํ‹ฐ์–ด์˜ ๊ฒฝ์šฐ ํƒ„๋ ฅ์  ip ํ• ๋‹น์ด ๋”ฑ ํ•œ์‹œ๊ฐ„๊นŒ์ง€ ๋ฌด๋ฃŒ์—ฌ์„œ 0.2๋‹ฌ๋Ÿฌ ์ •๋„๊ฐ€ ๊ณผ๊ธˆ๋๋‹ค.
ํƒ„๋ ฅ์  ip ํ• ๋‹น์„ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ๊ผญ๊ผญ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋ง ๊ฒƒ...
(EC2 ์ฝ˜์†” ์ƒ์—์„œ ํƒ„๋ ฅ์  ip ์—ฐ๊ฒฐ ํ•ด์ œ ํ›„ ๋ฆด๋ฆฌ์Šคํ•˜๋ฉด ๋œ๋‹ค.)

3. ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๋™

๋Š˜ ๊ทธ๋ ‡๋“ฏ CORS๋ฅผ ๋งŒ๋‚ฌ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ CORS ๋ฌธ์ œ๋Š” ์„œ๋ฒ„ ๋‹จ์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ๊ณ ,
์ด๋ฏธ ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ๋ฒˆ ํ•ด๊ฒฐํ•ด๋ดค๊ธฐ์— Configuration ์ถ”๊ฐ€๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("์ ‘์†์„ ํ—ˆ์šฉํ•  url");
    }
}

๊ฒฐ๊ณผ๋ฌผ

๐Ÿ”— ๊ฒฐ๊ณผ๋ฌผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์—ฌ๋‹ด

์ด๋ฒˆ์—๋Š” ํ›„ํšŒ ์—†์ด ์—ด์‹ฌํžˆ ๋ถˆํƒœ์šฐ๊ณ  ์™”๋‹ค~!
์ด์ œ ์†”์ฑŒ ์—ด์‹ฌํžˆ ์ค€๋น„ํ• ๊ฒŒ์š” ๐Ÿ˜Ž

profile
๋ธ”๋กœ๊ทธ ์ด์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค โœˆ https://jennairlines.tistory.com

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