Skip to content
Youngin Kim edited this page Dec 14, 2023 · 10 revisions

๐ŸŒŽ traveline

์—ฌํ–‰ ์ผ์ •์„ ํƒ€์ž„๋ผ์ธ์œผ๋กœ ๊ธฐ๋กํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ์—ฌํ–‰ SNS ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
๋‚˜๋งŒ์˜ ์—ฌํ–‰์„ ๊ณต์œ ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์—ฌํ–‰๋“ค์„ ๋งŒ๋‚˜๋ณด์•„์š” :)


แ„€แ…ตแ„‚แ…ณแ†ผ แ„‰แ…ฉแ„€แ…ข แ„‘แ…ฆแ„‹แ…ตแ„Œแ…ต

๋‚˜๋ž‘ ๋น„์Šทํ•œ ์ทจํ–ฅ๊ณผ ํ™˜๊ฒฝ์„ ๊ฐ€์ง„ ๋‹ค์–‘ํ•œ ์—ฌํ–‰๋“ค์„ ๋งŒ๋‚˜๊ณ  ๋‚˜๋งŒ์˜ ์—ฌํ–‰ ๊ณ„ํš์„ ์งœ๋ณด์•„์š” !

  • ์ง€์—ญ, ๊ธฐ๊ฐ„, ํ…Œ๋งˆ ๋“ฑ ์ด 8 ๊ฐ€์ง€์˜ ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์—ฌํ–‰์„ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์š”.
  • ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์›ํ•˜๋Š” ์—ฌํ–‰์„ ๋ฐ”๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋งค ๋‚ ์งœ๋งˆ๋‹ค ์‹œ๊ฐ„ ์ˆœ์œผ๋กœ ๊ธฐ๋ก๋œ ์—ฌํ–‰๋“ค์„ ํ†ตํ•ด ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ผ์ •์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์ง€๋„๋กœ ๋ณด๊ธฐ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์–ด๋–ค ์žฅ์†Œ์— ๋จธ๋ฌผ๋ €๋Š”์ง€ ์ง€๋„๋กœ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

Traveline ํŒ€ ์†Œ๊ฐœ

S009 ๊น€์˜์ธ S013 ๊น€ํƒœํ˜„ S041 ํ™๊ธฐ์›… J048 ๋ฐ•๊ฒฝ๋ฏธ J170 ํ™ฉ์ •๋ฏผ
@0inn @kth1210 @otoolz @kmi0817 @yaongmeow
iOS iOS iOS BE BE

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

iOS แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ แ„€แ…ฎแ„Œแ…ฉแ„ƒแ…ฉ
BE image

iOS ๊ธฐ์ˆ  ์Šคํƒ

MVVM + CleanArchitecture

  • ํ˜„์žฌ ์„œ๋น„์Šค ๊ธฐํš ๊ฐ„ ๋ณต์žกํ•œ ์•„ํ‚คํ…์ฒ˜์˜ ํ•„์š”์„ฑ์„ ๋Š๋ผ์ง€ ๋ชปํ–ˆ๊ณ , ์ž‘์—… ๊ฐ„ ๋กœ์ง ๋ถ„๋ฆฌ์˜ ์šฉ์ดํ•จ์„ ์œ„ํ•ด ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์—ฌ๋Ÿฌ ๋ช…์ด ๋™์‹œ์— ๊ฐœ๋ฐœํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— CleanArchitecture๋ฅผ ํ™œ์šฉํ•ด ์—ญํ•  ๋ถ„๋ฆฌ๋ฅผ ํ™•์‹คํžˆ ํ•ด๋‘์–ด ์ฝ”๋“œ์˜ ํ†ต์ผ์„ฑ์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Repository ํŒจํ„ด์„ ํ†ตํ•ด Data Source๋ฅผ ์บก์Šํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , RepositoryMock์„ ์ด์šฉํ•ด ์„œ๋ฒ„ ๊ฐœ๋ฐœ ์ƒํ™ฉ์— ๊ด€๊ณ„์—†์ด ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Combine

  • Third-party์ธ RxSwift์— ๋น„ํ•ด ์‹œ๊ฐ„, ๊ณต๊ฐ„์  ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— First-party์ธ Combine์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์กฐ์ž‘ํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์— ์ตœ์ ํ™”๋œ Combine์„ UI Binding์— ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Swift Concurrency

  • Concurrency๋ฅผ ํ™œ์šฉํ•ด ๋‹จ๋ฐœ์„ฑ ๋น„๋™๊ธฐ ์‘๋‹ต์ธ ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ๋ณด๋‹ค ์ง๊ด€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Repository - Network์˜ ํ๋ฆ„์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

MapKit

  • ์ง€๋„ ์œ„์— ๋งˆ์ปค๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์œ„์น˜ ์ขŒํ‘œ ์ •๋ณด๋งŒ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ Third-party ์ง€๋„๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ด ์• ํ”Œ ํ”„๋ ˆ์ž„์›Œํฌ์ธ MapKit์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Keychain

  • ๋กœ๊ทธ์ธ ์ดํ›„ ํ† ํฐ ๋“ฑ ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

BE ๊ธฐ์ˆ  ์Šคํƒ

NestJS + TypeORM

  • ์›ํ™œํ•œ ํ˜‘์—…๊ณผ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด ์ž์œจ์„ฑ์ด ๋†’์€ Express๋Š” ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ฐ–์ถฐ์ง€๊ณ , TypeScript๊ฐ€ ๊ธฐ๋ฐ˜์ธ NestJS๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ์ธ์ž TypeORM๊ณผ ์š”์ฆ˜ ํ•ซํ•œ Prisma. TypeORM ์‚ฌ์šฉ์ž์—๊ฒŒ Prisma๊ฐ€ ์ธ๊ธฐ ์žˆ๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด TypeORM์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ €ํฌ๋Š” ๋จผ์ € TypeORM์„ ๊ฒฝํ—˜ํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค.

RDB

  • traveline ์•ฑ์€ ํ•˜๋‚˜์˜ ๊ฒŒ์‹œ๊ธ€์— ์—ฌ๋Ÿฌ ํƒ€์ž„๋ผ์ธ ๊ธ€์ด ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ๊ฒŒ์‹œ๊ธ€์—๋Š” ์ข‹์•„์š”์™€ ์‹ ๊ณ  ์ •๋ณด๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ด๋ธ” ๊ฐ„ join ์—ฐ์‚ฐ์ด ๋งŽ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ฏ€๋กœ NoSQL๋ณด๋‹จ RDB๊ฐ€ ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

GitHub Actions + Docker

  • ์›๋ž˜ ์ˆ˜๋™ ๋ฐฐํฌ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ, node ๋ฒ„์ „ ์ด์Šˆ์™€ systemd service ๋“ฑ๋ก ๊ณผ์ •์— ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋กœ์ปฌ ์ž‘์—… ํ™˜๊ฒฝ์„ ๊ทธ๋Œ€๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์ด์‹์„ฑ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ ์ง€์†์ ์ธ ๋ฐฐํฌ์—๋„ ์œ ์šฉํ•œ Docker๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Swagger API๋ฅผ ์„œ๋‘˜๋Ÿฌ iOS ์ธก์— ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋‚ฎ๊ณ , ์‹ ์†ํ•œ ์„ธํŒ…์ด ๊ฐ€๋Šฅํ•œ GitHub Actions๋กœ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

Letโ€™s Encrypt + Nginx

  • ์• ํ”Œ ์ •์ฑ…์ƒ ipa๋Š” https์—์„œ๋งŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์—, 90์ผ๋งˆ๋‹ค SSL ์ธ์ฆ์„œ๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ฌด๋ฃŒ๋กœ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” Letโ€™s Encrypt๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Nest ์„œ๋ฒ„์—์„œ ์ง์ ‘ SSL ์ธ์ฆ์„œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์ฝ”๋“œ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ”ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์›น ์„œ๋ฒ„๋ฅผ Reverse Proxy๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ SSL ๊ตฌ์„ฑ์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— SSL ๊ด€๋ จ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„, ๋”์šฑ ํ•ต์‹ฌ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AWS SES (Simple Email Service)

  • traveline์€ ์ƒˆ๋กœ์šด IP๋กœ ๋กœ๊ทธ์ธ ์‹œ ๋ณธ์ธ ํ™•์ธ ๋ฉ”์ผ์„ ์ „์†กํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Nest ๋‚ด์žฅ ๋ชจ๋“ˆ์ธ nodemailer๋Š” ๋ณด์•ˆ์ƒ ์ทจ์•ฝ์ ์ด ๋ฐœ๊ฒฌ๋˜์–ด ์‹ค์„œ๋น„์Šค์—์„œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. NCP์˜ Cloud Outbound Mailer๋Š” ์–ด๋ทฐ์ง• ๋ฌธ์ œ๋กœ ์ธํ•ด ํ˜„์žฌ (2023.12) ์„œ๋น„์Šค ์‹ ์ฒญ์ด ๋ง‰ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์—, AWS SES๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฅ ์šฐ๋ฆฌ์˜ ๋„์ „๋“ค

iOS

BE


๐Ÿ“š ๋ฌธ์„œ Wiki ํŒ€ ๋…ธ์…˜ ๊ทธ๋ผ์šด๋“œ ๋ฃฐ ์ปจ๋ฒค์…˜ ํšŒ์˜๋ก ๊ธฐํš/๋””์ž์ธ

๋‘ฅ๊ธ€๋‘ฅ๊ธ€ ๊ฐœ๋ฐœ์ผ์ง€

๐Ÿ“š ๋ฌธ์„œ

๐Ÿ“ƒ ๋ฐฑ๋กœ๊ทธ

๐Ÿ“ ์•„์นด์ด๋ธŒ

๐Ÿซถ๐Ÿป ํŒ€ ๊ธฐ๋ก

๐Ÿ”ฅ ์šฐ๋ฆฌ์˜ ๋„์ „

๐ŸŽ iOS์˜ ๋„์ „

๐Ÿ’ฝ BE์˜ ๋„์ „

Clone this wiki locally