Skip to content

iclxxud/ios-wanted-VoiceRecorder

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๋นŒ๋“œ ๋ฐฉ๋ฒ•

  1. ํ”„๋กœ์ ํŠธ์˜ ํด๋”์—์„œ pod install
  2. Target์—์„œ, Signing & Capabilities์—์„œ Team ์ˆ˜์ •
  3. ๋นŒ๋“œ

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

  • xcode : Version 13.4.1 (13F100)
  • deployment Target : 15.0

๋ชฉ์ฐจ

  1. Team
    1. ํŒ€์› ์†Œ๊ฐœ
    2. ๊ธฐ์—ฌํ•œ ๋ถ€๋ถ„
  2. ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ
    1. ๋ชฉํ‘œ
    2. ์‚ฌ์šฉํ•œ ๊ธฐ์ˆ 
    3. ๊ธฐ๋Šฅ ์†Œ๊ฐœ
    4. ์‚ฌ์šฉํ•œ Pattern ์†Œ๊ฐœ
    5. ๊ฐ์ฒด ์—ญํ•  ์†Œ๊ฐœ
    6. Project UML
  3. ๊ณ ๋ฏผํ•œ ๋ถ€๋ถ„
  4. ํšŒ๊ณ 

Team

ํŒ€์› ์†Œ๊ฐœ

Downey JMin Oyat
๊ฐœ๋ฐœ ๋ฐ ํŒ€ ๋ฆฌ๋”ฉ, ๊ธฐ์ˆ  ์†Œ๊ฐœ ๊ฐœ๋ฐœ ๋ฐ ์•ฑ Bug ํƒ์ƒ‰ ๊ฐœ๋ฐœ ๋ฐ ์Šคํ„ฐ๋”” ๋‚ด์šฉ ์ž๋ฃŒ ์ œ์ž‘

๊ธฐ์—ฌํ•œ ๋ถ€๋ถ„

ํŒ€์› ๊ธฐ์—ฌํ•œ ๋‚ด์šฉ
Downey - ํŒ€ ์ผ์ • ๋ฐ ์ž‘์—… ๊ณต์ˆ˜ ์กฐ์ •
- ์•ฑ์˜ ํŒจํ„ด ๋ฐ ์•„ํ‚คํ…์ณ ๊ฐ์ฒด ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ๋ฆฌ๋”ฉ
- ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ๋ฆฌ๋“œ
- AudioManager ๊ฐ์ฒด ์—ญํ•  ๋ถ„๋ฆฌ
- ์˜์กด ๊ฐ์ฒด ์ „๋‹ฌ container ๊ตฌํ˜„
- ์˜์กด๊ด€๊ณ„์— dependency injection ๊ตฌํ˜„
- pathfinder ๊ฐ์ฒด ๊ตฌํ˜„
- DefaultAudioPlayer ๊ธฐ๋Šฅ ๊ตฌํ˜„
- VoiceMemoPlayerView ๊ธฐ๋Šฅ ๊ตฌํ˜„
- VoiceMemoRecoderView UI ๊ตฌํ˜„
JMin - ๋กœ์ง ๋ฒ„๊ทธ ํ”ฝ์Šค ๋ฐ ๋ฆฌํŒฉํ† ๋ง
- FirebaseManager ๋‹ค์šด๋กœ๋“œ, ์—…๋กœ๋“œ, ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- DefaultAudioRecorder ๊ธฐ๋Šฅ ๊ตฌํ˜„
- VoiceMemoPlayerView UI๊ตฌํ˜„
- VoiceMemoRecoderView ๊ธฐ๋Šฅ ๊ตฌํ˜„
- waveFormView ๊ตฌํ˜„ (Pair Programming)
Oyat - VoiceMemoListView UI ๊ตฌํ˜„
- VoiceMemoListView์˜ tableView dataSource, delegate ๊ตฌํ˜„
- Coordinator Pattern ๊ตฌํ˜„
- DefaultAudioPlayer์˜ Volume์กฐ์ ˆ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- FirebaseStorageManager์˜ MetaData ์ฃผ์ž… ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- ๋…น์Œ ์™„๋ฃŒ ํ›„ ํ…Œ์ด๋ธ”๋ทฐ ๋ฆฌ๋กœ๋“œ notification ์ ์šฉ
- ์…€ ์Šค์™€์ดํ”„ํ•ด์„œ ์‚ญ์ œ์‹œ firebaseStorage, ๋กœ์ปฌ์—์„œ ํŒŒ์ผ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- waveFormView ๊ตฌํ˜„ (Pair Programming)
- FirebaseStorageManager์˜ Singleton Pattern ์ œ๊ฑฐ
- FirebaseStorage์˜ ๋…น์Œ ํŒŒ์ผ์— ์žฌ์ƒ ์‹œ๊ฐ„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฃผ์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๋ชฉํ‘œ

firebaseStorage์™€ ์—ฐ๋™ํ•˜๋ฉฐ, ์žฌ์ƒ ๋ฐ ๋…น์Œ ๊ธฐ๋Šฅ๊ณผ ๋‹ค์ˆ˜์˜ ๊ด€๋ จ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” App
์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : FirebaseStorage Only!

์‚ฌ์šฉํ•œ ๊ธฐ์ˆ 

Coordinator Pattern Observer Pattern Delegate Pattern Code-based UI MVC Dependency inversion

๊ธฐ๋Šฅ ์†Œ๊ฐœ

App Flow

  • all Flow

  • ListView Flow

  • RecordView Flow

  • PlayView Flow

Demo Gif

  • ์ฒซ ํ™”๋ฉด

  • RecordView, ๋ ˆ์ฝ”๋“œ ๊ธฐ๋Šฅ

  • RecordView, ์žฌ์ƒ ๊ธฐ๋Šฅ

  • PlayView, ์žฌ์ƒ๊ธฐ๋Šฅ

์‚ฌ์šฉํ•œ Pattern ์†Œ๊ฐœ

Coordinator Pattern

1. ์ฝ”๋””๋„ค์ดํ„ฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ์ด์œ 

MVC์— CoordinatorํŒจํ„ด์„ ์ ์šฉํ•จ์œผ๋กœ Massive VC๋ฅผ ๋œ์–ด๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

2. ์–ด๋–ค ์žฅ์ ์ด ์กด์žฌํ• ๊นŒ?

Coordinator๊ฐ€ ํ™”๋ฉด ์ „ํ™˜ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๊ฐ์ฒด๊ฐ€ ๋˜์–ด ์ข€ ๋” VC๋ฅผ ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด ์ „ํ™˜์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ชจ์—ฌ ์žˆ์–ด ํŒŒ์•…, ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์šฉ์ดํ•˜๊ณ  ๊ฒŒ๋‹ค๊ฐ€ ์ฑ…์ž„๊ณผ ๊ตฌ๋ถ„(์—ญํ• )์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Coordinator๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ๋” ์ˆ˜ํ›จํ•ฉ๋‹ˆ๋‹ค.

Observer Pattern

1. ์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ์ด์œ 

์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋ฉด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ฒจ๋„ ๋ฌด๋‚œํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด ์‚ฌ์ด์˜ ์ƒํ˜ธ ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.(๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ)

2. ์–ด๋–ค ์žฅ์ ์ด ์กด์žฌํ• ๊นŒ?

  • Delegate Design Pattern ์€ 1:1 ๊ด€๊ณ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, Observer & Notification Pattern ์€ 1:๋‹ค ๊ด€๊ณ„ ์„ฑ๋ฆฝ ๊ฐ€๋Šฅ ( ex. ์ €ํฌ์˜ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ๋ทฐ, ํ”Œ๋ ˆ์ด๋ทฐ 2๊ณณ์— ์˜ต์ €๋ฒ„๋ฅผ ์ƒ์„ฑํ•ด AudioPlayable ๊ฐ์ฒด์— 1๊ฐœ์˜ Notification ์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค)
  • ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ•œ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์ „ํŒŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Š์Šจํ•œ ๊ฒฐํ•ฉ(Loose Coupling)์œผ๋กœ ์‹œ์Šคํ…œ์ด ์œ ์—ฐํ•˜๊ณ  ๊ฐ์ฒด๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • Open / Close ์›์น™(๊ฐœ๋ฐฉ ํ์‡„ ์›์น™)์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ฐœ๋ฐฉ ํ์‡„ ์›์น™: ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค.)

Delegate Pattern

1. ๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ์ด์œ 

  • Delegate์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค๊ณ„ํ•˜์ง€ ์•Š๊ณ  Notification๋งŒ ๊ฐ€์ง€๊ณ  ์„ค๊ณ„๋ฅผ ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ฝ”๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•  ๋•Œ ์ด Notification์„ ๋ˆ„๊ฐ€ Subscribeํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ธฐ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— 1:1 ๊ด€๊ณ„๋ผ๋ฉด Delegate์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น Delegate์˜ ์ด๋ฆ„, ํ”„๋กœํ† ์ฝœ์˜ ๋ฉ”์„œ๋“œ ๋“ฑ์„ ํ†ตํ•ด ์–ด๋–ค ๊ณผ์ •์— ์˜ํ•ด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ๋Œ์•„๊ฐ€๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ  ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ํ•œ๊ฒฐ ์ˆ˜์›”ํ•˜๊ธฐ์— Delegate ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ์–ด๋–ค ์žฅ์ ์ด ์กด์žฌํ• ๊นŒ?

  • ๋งค์šฐ ์—„๊ฒฉํ•œ Syntax๋กœ ์ธํ•ด ํ”„๋กœํ† ์ฝœ์— ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋“ค์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ช…์‹œ๋จ.
  • ์ปดํŒŒ์ผ ์‹œ ๊ฒฝ๊ณ ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋– ์„œ ํ”„๋กœํ† ์ฝœ์˜ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์•Œ๋ ค์คŒ.
  • ๋กœ์ง์˜ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๊ธฐ ์‰ฌ์›€.
  • ํ”„๋กœํ† ์ฝœ ๋ฉ”์†Œ๋“œ๋กœ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ์ •๋ณด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.
  • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๊ณผ์ •์„ ์œ ์ง€ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ œ 3์˜ ๊ฐ์ฒด(ex: NotificationCenter ๊ฐ™์€ ์™ธ๋ถ€ ๊ฐ์ฒด)๊ฐ€ ํ•„์š”์—†์Œ.
  • ํ”„๋กœํ† ์ฝœ์ด ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฒ”์œ„ ์•ˆ์—์„œ ์ •์˜๋จ.

๊ฐ์ฒด ์—ญํ•  ์†Œ๊ฐœ

View ๊ด€๋ จ

class / struct ์—ญํ• 
SceneDelegate - ์•ฑ์˜ ์ดˆ๊ธฐ ๊ถŒํ•œ ์š”์ฒญ, Coordinator ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ.
AppCoordinator - ์•ฑ์˜ ํ™”๋ฉด ์ „ํ™˜์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด. SceneDelegate๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ๊ฐ ViewController์˜ ํ•„์š”์— ๋งž๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
VoiceMemoListView - FirebaseStorageManager๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋…น์Œ ํŒŒ์ผ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜จ๋‹ค.
- ํŒŒ์ผ๋ช…์— ๋”ฐ๋ฅธ metaData๋ฅผ ์–ป์–ด์™€ View์— ํ‘œ๊ธฐํ•œ๋‹ค.
- ์…€์„ ์Šฌ๋ผ์ด๋“œํ•˜์—ฌ, ๋กœ์ปฌ๊ณผ FirebaseStorage๋‚ด์˜ ๋…น์Œ ํŒŒ์ผ์„ ์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
VoiceMemoRecordView - ๋…น์Œ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋…น์Œ ์‹œ ํŠน์ • ์ฃผํŒŒ์ˆ˜ ์ดํ•˜๋งŒ ํ†ต๊ณผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
- ๋…น์Œ ์‹œ ๋ณผ๋ฅจ ํŒŒํ˜•์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
- ๋…น์Œ์„ ์žฌ์ƒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์žฌ์ƒ ์œ„์น˜๋ฅผ 5์ดˆ ์ „ํ›„๋กœ ์ด๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋…น์Œ ์™„๋ฃŒ ์‹œ, ๋…น์Œ ํŒŒ์ผ์„ FirebaseStorage์— ์—…๋กœ๋“œํ•œ๋‹ค.
VoiceMemoPlayView - ๋…น์Œ์„ ์žฌ์ƒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์žฌ์ƒ ์œ„์น˜๋ฅผ 5์ดˆ ์ „ํ›„๋กœ ์ด๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋…น์Œ์˜ pitch๋ฅผ ๋ฐ”๊ฟ” ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋ณ€์กฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์žฌ์ƒ ์œ„์น˜๋ฅผ View์˜ ์ƒ‰ ๋ณ€ํ™”๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋‹ค.
- ๋…น์Œ ํŒŒ์ผ์˜ ๋ณผ๋ฅจ ํŒŒํ˜•์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
- ์Šฌ๋ผ์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์„ ์กฐ์ ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.
WaveFormView - ์ „๋‹ฌ๋ฐ›์€ ๋ณผ๋ฅจ ํŒŒํ˜• Data๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ User๊ฐ€ ๋ณผ๋ฅจ ํŒŒํ˜•์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Manger ๊ด€๋ จ

class / struct ์—ญํ• 
FirebaseStorageManager - FirebaseStorage์™€ Networking ํ•˜๋Š” ๊ฐ์ฒด.
- ํŒŒ์ผ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ, ํŒŒ์ผ์˜ metaData๊ฐ€์ ธ์˜ค๊ธฐ, ํŒŒ์ผ์˜ ๋‹ค์šด, ์—…๋กœ๋“œ, ์‚ญ์ œ ๊ธฐ๋Šฅ
PathFinder - Class FileManager๋ฅผ ๊ฐ์‹ผ ๊ฐ์ฒด.
- ์•ฑ์—์„œ ํ•„์š”ํ•œ Local File System์— ์ ‘๊ทผํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต.
- ํ˜„์žฌ ์‹œ๊ฐ„์„ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต
AudioManager - Protocol AudioRecordable๊ณผ AudioPlayable ์ฑ„ํƒ์‹œ, ์ƒ์†ํ•ด์•ผ ํ•˜๋Š” Class.
-๋‘ Procotol์˜ ๊ตฌํ˜„ class์— ํ•„์š”ํ•œ ๊ณตํ†ต Property, Method๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
AudioRecodable - ๋…น์Œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Recorder์˜ ๊ธฐ๋Šฅ์„ ๋ช…์‹œํ•˜๋Š” Protocol
DefalutAudioRecoder - AudioRecodable์„ ์ฑ„ํƒํ•œ Recoder๊ธฐ๋Šฅ์„ View์— ์ œ๊ณตํ•˜๋Š” Class
AudioPlayable - ๋…น์Œ ํŒŒ์ผ์„ ์žฌ์ƒํ•˜๋Š” Player์˜ ๊ธฐ๋Šฅ์„ ๋ช…์‹œํ•˜๋Š” Protocol
DefalutAudioPlayer - AudioPlayable์„ ์ฑ„ํƒํ•œ Player๊ธฐ๋Šฅ์„ View์— ์ œ๊ณตํ•˜๋Š” Class

Project UML

๊ณ ๋ฏผํ•œ ๋ถ€๋ถ„

Downey

์ˆœ์ˆ˜ํ•จ์ˆ˜ :

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Manager ํด๋” ๋‚ด์˜ ์žˆ๋Š” class๋“ค์ด ๋กœ์ง์„ ๋‹ด๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ class๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์— ๊ฐ€๊น๊ฒŒ ๊ตฌํ˜„ํ•˜๋ ค ๋…ธ๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ, ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ class๋Š” ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์ „์˜ AudioManager์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ์—๋Š”, ์˜ค๋””์˜ค ํŒŒ์ผ์˜ local fileSystem ๊ฒฝ๋กœ์ธ filePath: URL๋ฅผ Property๋กœ ๊ฐ–๊ณ ์žˆ๋Š” ํ˜•ํƒœ์ด๋ฉฐ, filePath๋Š” init์—์„œ ํ• ๋‹นํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹น์ดˆ class๋ฅผ ์ˆœ์ˆ˜ํ•จ์ˆ˜์— ๊ฐ€๊น๊ฒŒ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋ฐฉ์‹์— ์ •๋ฉด์œผ๋กœ ๋ถ€๋”ชํžˆ๋Š” ๋ฐฉํ–ฅ์ด์—ˆ๊ณ , ๊ฐ method๋Š” filePath๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, filePath๋ฅผ ๊ผญ, property๋กœ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉด ์•ˆ๋˜๋Š”๊ฐ€์— ๋Œ€ํ•ด์„œ ๊ตฌํ˜„ ํ›„์—๋„ ๋ช‡๋ฒˆ์ด๊ณ  ๋‹ค์‹œ ๊ณ ๋ฏผํ–ˆ๋˜ ์ ์€, class ๋‚ด๋ถ€์—์„œ method๋ฅผ ์‚ฌ์šฉ ํ•  ๋•Œ์—๋„ filePath๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์ ์ด ๋ถˆํŽธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š”, ์•ž์œผ๋กœ๋„ ๊ณ„์†ํ•ด์„œ ๊ณ ๋ฏผํ•ด์•ผํ•˜๋Š” trade-off ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

AudioManager์˜ ๋ถ„๋ฆฌ :

AudioManager๋Š” ๋ณธ๋ž˜ Play, Record์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋ง๋ผํ•˜๋Š” class์˜€์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ๊ฐ–๋Š” class ์ด๋ฏ€๋กœ Play๊ธฐ๋Šฅ๊ณผ Record ๊ธฐ๋Šฅ์„ ๋‚˜๋ˆ„์—ˆ์œผ๋‚˜, ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Property์™€ method๊ฐ€ ์กด์žฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์—, ์‹ค์ œ play, record์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” class๋Š” ๊ณตํ†ต๋œ method๋ฅผ ๊ฐ–๊ณ ์žˆ๋Š” AudioManager๋ฅผ ์ƒ์†ํ•˜๊ณ , ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•˜์—ฌ, ๊ฐ class๊ฐ€ ๋‹จ์ผ ์ฑ…์ž„์„ ๊ฐ–๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Protocol ์ฑ„ํƒ :

Protocol AudioPlayable, AudioRecordable์„ ์ •์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•˜์—ฌ, ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ์„ ๋Š์Šจํ•˜๊ฒŒํ•˜๋ฉฐ, mocking test๋ฅผ ์ง„ํ–‰ํ•จ์— ์žˆ์–ด์„œ๋„ ํŽธ๋ฆฌ์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dependency Injection์˜ ๊ตฌํ˜„ :

๊ฐ ViewController์—์„œ ํ•„์š”ํ•œ ๋กœ์ง๊ฐ์ฒด๋ฅผ ์ตœ์ƒ์œ„ ๋ชจ๋“ˆ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” SceneDelegate์—์„œ ์ƒ์„ฑ ํ•œ ๋’ค, struct Dependencies๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•˜์—ฌ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•˜์—ฌ, ์•ฑ ์ „๋ฐ˜์— ์‚ฌ์šฉ๋  ๋กœ์ง๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์„ ํ†ตํ•ฉ์ ์œผ๋กœ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ interface์˜ ์ „๋‹ฌ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ, Dependencies์˜ ์ „๋‹ฌ์€ AppCoordinator์—์„œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ์ด๋Š”, VoiceMemoPlayView์—์„œ AudioRecordable์˜ ๊ตฌํ˜„์ฒด class๋ฅผ ์ฐธ์กฐ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ, Dependencies์˜ ์ „๋‹ฌ์„ ์˜๋„์ ์œผ๋กœ ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋…น์Œ ํŒŒ์ผ์˜ ์ข…๋ฃŒ ์‹ ํ˜ธ :

AVAudioPlayerNode.scheduleFile, .scheduleSegment method๋Š” trailing Closure๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, ํŒŒ์ผ์˜ ์ข…๋ฃŒ์‹œ ํ•ด๋‹น method๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์—, skip method๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ scheduleFile์˜ trailing Closure๊ฐ€ ์‹คํ–‰๋˜์–ด bug๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์—, trailing Closure๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , playerNode.installTab์—์„œ ํ˜„์žฌ ์žฌ์ƒ์ค‘์ธ Frame๊ณผ ์ „์ฒด Frame์˜ ๋น„์œจ์ธ ratio๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , ์Šคํ‚ต๊ธฐ๋Šฅ์— ์˜ํ•œ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•˜์—ฌ ๋…น์Œ ํŒŒ์ผ์˜ ์ข…๋ฃŒ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•˜์—ฌ ๋‘ ๋ถ€๋ถ„์—์„œ ํŒŒ์ผ ์žฌ์ƒ ์ •์ง€์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ , ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์ŠคํŠธ ๋ทฐ์˜ ์…€ ์‚ญ์ œ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ :

ํ˜„์žฌ App์€ FirebaseStorage์˜ ํŒŒ์ผ ๋ชฉ๋ก์„ cell๋กœ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์—, ๋„คํŠธ์›Œํฌ์˜ success ๋ฆฌ์Šคํฐ์Šค๋ฅผ ๋ฐ›์•˜์„ ๋•Œ, local์˜ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ dummy data๋ฅผ ๋‚จ๊ธธ ์œ„ํ—˜์„ ๋‚ดํฌํ•œ๋‹ค ์ƒ๊ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‚ญ์ œ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜๋ฉด, local fileSystem์— ํ•ด๋‹น ๋…น์ŒํŒŒ์ผ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ , ์กด์žฌํ•œ๋‹ค๋ฉด ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ firebaseStorage์˜ ํŒŒ์ผ remove์˜ response๋กœ success๋ฅผ ๋ฐ›์•˜์„ ๋•Œ, TableView์˜ Cell์„ ์ œ๊ฑฐํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Oyat

1. ํ™”๋ฉด ์ „ํ™˜์˜ ๊ด€๋ฆฌ(์ฝ”๋””๋„ค์ดํ„ฐ ํŒจํ„ด์˜ ์‚ฌ์šฉ)

  • ๋ฌธ์ œ์ 
    • ๋“ค์–ด๋งŒ ๋ดค๋˜ ์ฝ”๋””๋„ค์ดํ„ฐ ํŒจํ„ด ์ง์ ‘ ์‚ฌ์šฉ์„ ํ•ด๋ณด์•˜๊ณ  ์šฐ๋ฆฌ ์•ฑ์—๋Š” ์–ด๋–ค ์‹์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ
  • ๊ณ ๋ฏผํ–ˆ๋˜ ์ 
    • ๋ณดํ†ต ์ฝ”๋””๋„ค์ดํ„ฐ์˜ ๊ฒฝ์šฐ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•ด ๋ถ€๋ชจ ์ฝ”๋””๋„ค์ดํ„ฐ์™€ ์ž์‹ ์ฝ”๋””๋„ค์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด 2๊ฐœ ์ด์ƒ์˜ ์ฝ”๋””๋„ค์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅํ•˜๋Š” ๊ฒฝ์šฐ childCoordinator๋ฅผ ๋งŒ๋“œ๋‚˜ ์šฐ๋ฆฌ ์•ฑ์˜ ๊ฒฝ์šฐ๋Š” main Coordinator๋งŒ์„ ํ™œ์šฉ ์ ์šฉํ•˜๋Š” ๊ฑด ์–ด๋–จ์ง€ ๊ณ ๋ฏผํ•ด๋ด„.
  • ํ•ด๊ฒฐ๋ฒ•
    • child Coordinator๋ฅผ ์ƒ๋žตํ•˜๊ณ  main AppCooridinator๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋””๋„ค์ดํ„ฐ ํŒจํ„ด์„ ์„ค๊ณ„ํ•˜์˜€๋‹ค. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„  2๊ฐœ ์ด์ƒ์˜ Coordinator๋กœ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ child๋ฅผ ํฌํ•จํ•ด์„œ ๋งŒ๋“ค์–ด๋ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
  • ์ฐธ๊ณ ๋งํฌ

2. ํŒŒ์ผ ์—…๋กœ๋“œ ์™„๋ฃŒ๋œ ํ›„ ์–ด๋–ป๊ฒŒ ๋ฆฌ์ŠคํŠธ๋ทฐ๋ฅผ ๋ฆฌ๋กœ๋“œํ•  ๊ฒƒ์ธ๊ฐ€(์˜ต์ €๋ฒ„ ํŒจํ„ด์˜ ์‚ฌ์šฉ)

  • ๋ฌธ์ œ์ 
    • ์‚ฌ์šฉ์€ ํ•ด๋ดค์ง€๋งŒ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ์‚ฌ์šฉํ–ˆ๋˜ ์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ์–ด๋–ค์‹์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ
  • ๊ณ ๋ฏผํ–ˆ๋˜ ์ 
    • ์˜ต์ €๋ฒ„ ํŒจํ„ด์œผ๋กœ NotificationCenter์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ ˆ์ฝ”๋“œ๋ทฐ๋Š” ๋…น์Œ์„ ์Šคํƒ‘ํ•˜๋ฉด ๊ณง๋ฐ”๋กœ FirebaseStorage์— ์—…๋กœ๋“œ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์ด ์™„๋ฃŒ๋˜๊ณ  ๋ฆฌ์ŠคํŠธ๋ทฐ๊ฐ€ ๋‹ค์‹œ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ fetchํ•ด์„œ ํ…Œ์ด๋ธ”๋ทฐ๋ฅผ ๋ฆฌ๋กœ๋“œ ํ•ด์•ผํ–ˆ๋‹ค. ๋˜ ํ”Œ๋ ˆ์ด๋ทฐ์˜ ๊ฒฝ์šฐ์—๋Š” ํ”Œ๋ ˆ์ด๊ฐ€ ๋‹ค ๋˜์—ˆ์„ ๊ฒฝ์šฐ์— ๋ฒ„ํŠผ์ด ์žฌ์ƒ ์‹œ pause๋กœ ๋˜์–ด์žˆ๋˜ ๋ฒ„ํŠผ์„ play๋ฒ„ํŠผ์œผ๋กœ ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ๊ณ  ๋˜ ๋‹ค์‹œ play๋ฒ„ํŠผ์„ ๋ˆŒ๋ฅด๋ฉด ์ง„ํ–‰์ด ๋˜์–ด์•ผ ํ–ˆ๋‹ค. ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ์–ด๋–ค ํŒจํ„ด์„ ํ™œ์šฉํ• ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ–ˆ๋‹ค.
  • ํ•ด๊ฒฐ๋ฒ•
    • 1:N์˜ ๊ฒฝ์šฐ notificationCenter๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฑฐ๋ผ๋Š” ํŒ๋‹จํ•˜์— obeserver ํŒจํ„ด์„ ์ ์šฉํ•˜์˜€๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ์Šคํ† ๋ฆฌ์ง€์— ์—…๋กœ๋“œ๋ฅผ notificationํ–ˆ๋˜ ๋ถ€๋ถ„์€ 1:1๊ด€๊ณ„์ด๊ธฐ์— ์ถ”ํ›„ ๋ฆฌํŒฉํ† ๋ง์œผ๋กœ ๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์„ ์ ์šฉํ•ด ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
  • ์ฐธ๊ณ ๋งํฌ

3. ํŒŒํ˜• ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์™€ ๊ฐ ํŒŒํ˜•๋ทฐ์— ์ „๋‹ฌํ•  ๊ฒƒ์ธ๊ฐ€(๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์˜ ์‚ฌ์šฉ)

  • ๋ฌธ์ œ์ 
    • ๋”œ๋ฆฌ๊ฒŒ์ดํŠธ์— ํŒจํ„ด์— ๋Œ€ํ•œ ๊ฐœ๋… ๋ถ€์กฑ๊ณผ ํ”„๋กœํ† ์ฝœ ํ™œ์šฉ ๊ฒฝํ—˜์˜ ๋ถ€์žฌ
  • ๊ณ ๋ฏผํ–ˆ๋˜ ์ 
    • ์ปค์Šคํ…€ ๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์„ ํ™œ์šฉํ•œ ๊ฑด ์šฐ๋ฆฌ ์•ฑ์˜ ๊ฒฝ์šฐ ๋‘ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๋Š”๋ฐ ์˜ค๋””์˜ค ๋ฒ„ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ๊ฐ ํŒŒํ˜•๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์ค˜์•ผํ•˜๋Š” ๊ฒฝ์šฐ์™€ ์žฌ์ƒ์‹œ๊ฐ„์„ ํ˜„์žฌ ์žฌ์ƒ์‹œ๊ฐ„๊ณผ ์ „์ฒด ์žฌ์ƒ์‹œ๊ฐ„์„ ๋น„์œจ๋กœ ์žก์•„ ์ถ”์ ํ•˜๋Š” ๊ณณ์— ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ๊ทธ ์ค‘์— ๋‚˜๋Š” ๋ฒ„ํผ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒํ˜•๋ทฐ์— ์ „๋‹ฌํ•  ๋•Œ์— ๋Œ€ํ•ด ์–ด๋–ค์‹์œผ๋กœ ์ „๋‹ฌํ• ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์„ ํ–ˆ๋‹ค.
  • ํ•ด๊ฒฐ๋ฒ•
    • ๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์„ ํ™œ์šฉํ•ด AudioBufferLiveDataDelegate๋ฅผ ์ฑ„ํƒํ•ด AudioRecordable์ด ๋ณธ ์ฑ…์ž„์ž๋กœ ์ผ์„ ์ง€์‹œํ•˜๊ณ  ์ผ์„ ๋„˜๊ธฐ๋Š” ๋ทฐ๋กœ RecordView๋Š” ์œ„์ž„์ž๋กœ ์ผ์„ ๋Œ€์‹ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๊ธฐ์— ํ•จ์ˆ˜ communicationBufferData๋ฅผ ๊ตฌํ˜„ํ•ด ์ผ์„ ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ์•„์ง ๋จธ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด ์ข€ ๋” ์ •๋ฆฌํ•ด์„œ ๋ธ”๋กœ๊ทธ์— ํฌ์ŠคํŒ…ํ•ด ๋ณผ ์˜ˆ์ •์ด๋‹ค.
  • ์ฐธ๊ณ ๋งํฌ

JMin

1. ํ”Œ๋ ˆ์ด ๋ฐ ๋ ˆ์ฝ”๋”ฉ์— ์‚ฌ์šฉํ•  ๊ฐ์ฒด ๊ณ ๋ฏผ

  • ๋ฌธ์ œ์ 
    • AVAudioPlayer ๋ฐ AVAudioRecorder๋ฅผ ์‚ฌ์šฉํ• ๋ ค ํ–ˆ์œผ๋‚˜ pitch ๊ธฐ๋Šฅ์ด๋‚˜ cutoffFrequency๊ธฐ๋Šฅ์ด ํ•ด๋‹น ๊ฐ์ฒด์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค
  • ํ•ด๊ฒฐ๋ฒ•
    • AVAudioEngine ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ๋‹ค

2. Record์‹œ ์ฃผํŒŒ์ˆ˜ ์ฐจ๋‹จ

  • ๋ฌธ์ œ์ 
    • cutoff frequency์˜ ์ž‘๋™๋ฐฉ์‹์„ ์ž˜๋ชป์ดํ•ดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค
  • ๊ณ ๋ฏผํ–ˆ๋˜์ 
    • ๋‚˜์ดํ€ด์ŠคํŠธ ์ด๋ก ์— ๋”ฐ๋ฅด๋ฉด sampleRate๋Š” ์‹ ํ˜ธ์˜ ๋‘๋ฐฐ๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š”๊ฑธ ์•Œ๊ณ  sampleRate๋ฅผ ์กฐ์ ˆํ•˜๋ฉด ์ฃผํŒŒ์ˆ˜ ์ฐจ๋‹จ์„ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค
    • ์—์ผ๋ฆฌ์‹ฑ ํ˜„์ƒ์— ์˜ํ•ด ๋‚˜์ดํ€ด์ŠคํŠธ ์ฃผํŒŒ์ˆ˜๋ณด๋‹ค ์‹ ํ˜ธ๋Š” ๋…น์Œ์ด ์•ˆ๋˜๋Š”๊ฒŒ ์•„๋‹Œ ์™œ๊ณก์ด ๋ผ์„œ ๋…น์Œ์ด ๋œ๋‹ค
  • ํ•ด๊ฒฐ๋ฒ•
    • ์—์ผ๋ฆฌ์–ด์‹ฑ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ• ๋ ค๋ฉด Low Pass Filter๋ฅผ ์ ์šฉ์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค
    • AVAudioUnitEQ๋ฅผ audioEngine์— ์—ฐ๊ฒฐํ•ด์ค€๋‹ค์Œ Low Pass Filter๋ฅผ ์ ์šฉ์‹œ์ผœ์ค˜์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค
  • ์ฐธ๊ณ ๋งํฌ

3. ํŠน์ • ๊ธฐ๊ธฐ์—์„œ ๋…น์Œ์‹œ ์•ฑ์ด ์ฃฝ๋Š” ํ˜„์ƒ

  • ๋ฌธ์ œ์ 
    • ๊ธฐ๊ธฐ์˜ ๋งˆ์ดํฌ SampleRate๋ž‘ audioEngine์˜ SampleRate๋ž‘ ๋งž์ง€ ์•Š์•„ ์•ฑ์ด ์ฃฝ๋Š” ํ˜„์ƒ์ด ์žˆ๋‹ค
  • ๊ณ ๋ฏผํ–ˆ๋˜์ 
    • ํ•ด๋‹น ๊ธฐ๊ธฐ์˜ SampleRate๋ฅผ audioEngine์˜ SampleRate๋กœ ๋งž์ถฐ์ฃผ๋ฉด ํ•ด๊ฒฐ๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ๋‹ค
  • ํ•ด๊ฒฐ๋ฒ•
    • audioEngine์˜ outFormat์˜ format๊ฐ€ ๋…น์Œํ•˜๋Š” ๊ธฐ๊ธฐ์˜ format์ด๋ผ๋Š”๊ฒƒ์„ ์•Œ๊ณ  ํ•ด๋‹น ํฌ๋งท์˜ SampleRate๋กœ audioEngine์˜ SampleRate๋ฅผ ์„ค์ •ํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค

4. ๋…น์ŒํŒŒ์ผ ์žฌ์ƒ์‹œ ํŒŒ์ผ์˜ ์ด ์žฌ์ƒ์‹œ๊ฐ„์ด ๋๋‚˜์ง€๋„ ์•Š์•˜๋Š”๋ฐ ์žฌ์ƒ์ด ์ค‘์ง€๋˜๋Š” ๋ฌธ์ œ

  • ๋ฌธ์ œ์ 
    • ๋…น์ŒํŒŒ์ผ์˜ SampleRate๋ž‘ audioEngine์˜ SampleRate๋ž‘ ๋งž์ง€์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค
  • ๊ณ ๋ฏผํ–ˆ๋˜์ 
    • ํ˜„์žฌ ์žฌ์ƒ ๊ตฌ๊ฐ„์„ ๋…น์ŒํŒŒ์ผ์˜ ์ „์ฒด SampleRate๋ž‘ ํ˜„์žฌ ํ”Œ๋ ˆ์ด๋œ ํƒ€์ž„๊นŒ์ง€์˜ SampleRate๋ฅผ ๋น„๊ตํ•˜๋Š”๋ฐ ๊ธฐ์ค€์ด ๋˜๋Š” SampleRate๊ฐ€ ๋‹ฌ๋ผ์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์˜€๋‹ค
  • ํ•ด๊ฒฐ๋ฒ•
    • AVAudioPlayerNode์˜ SampleRate๋กœ audioEngine SampleRate๋กœ ์„ค์ •ํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค

5. ๋…น์Œํ›„ ์žฌ์ƒ์‹œ ๋…น์Œ์ด ์ด์–ด์„œ ๋˜๋Š” ๋ฌธ์ œ

  • ๋ฌธ์ œ์ 
    • ๋…น์Œ์‹œ ์—ฐ๊ฒฐํ–ˆ๋˜ ๋…ธ๋“œ๋“ค์ด ํ”Œ๋ ˆ์ด์‹œ์—๋„ ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ์–ด ํ”Œ๋ ˆ์ด์™€ ๋™์‹œ์— ๋…น์Œ์ด ์ง„ํ–‰๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค
  • ํ•ด๊ฒฐ๋ฒ•
    • ๋…น์Œ ๋ฐ ํ”Œ๋ ˆ์ด๋ฅผ ์ •์ง€ํ–ˆ์„๋•Œ audioEngine์˜ ๋…ธ๋“œ๋“ค์„ ์ˆœํ™˜ํ•˜๋ฉฐ ํƒญ์—์„œ ์—ฐ๊ฒฐ์„ ๋Š์–ด์ค˜์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค

ํšŒ๊ณ 

Downey

์ „์ฒด ํšŒ๊ณ 

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ํŒ€์›์œผ๋กœ ์ฐธ์—ฌํ•˜๊ฑฐ๋‚˜, ํ˜ผ์žํ•˜๋˜ ํ”„๋กœ์ ํŠธ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, ํŒ€์›์„ ๋ฆฌ๋“œํ•˜๋Š” ์œ„์น˜์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ๋‚ด๊ฒŒ ์ฃผ์–ด์ง„ ์ผ๋งŒ ์ž˜ ํ•˜๊ฑฐ๋‚˜, ํŠน๋ณ„ํ•œ ์ผ์ •์—†์ด ํ˜ผ์ž ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ์™€๋Š” ๋‹ฌ๋ž๋‹ค. ํŒ€์›์˜ ์ง„ํ–‰ ์‚ฌํ•ญ, ์ˆ˜ํ–‰ ๋Šฅ๋ ฅ, ํ•™์Šต ์†๋„์— ๋”ฐ๋ผ์„œ, ์—…๋ฌด๋ฅผ ๋‚˜๋ˆ„๊ณ  ํ”„๋กœ์ ํŠธ์˜ ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๋Š” ์ผ์€ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๋•Œ๋ฌธ์—, 21์‹œ๋ฅผ ๋„˜์–ด์„œ๋„, ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ ๊ณ ๋ฏผํ•˜๊ณ , ํ•  ์ผ์„ ์ ์œผ๋ฉฐ ๋Šฆ๊ฒŒ๊นŒ์ง€ ์‹œ๊ฐ„์„ ๋ณด๋‚ด ์—๋„ˆ์ง€๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์ผ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ์ด์™€๊ฐ™์€ ๊ณ„ํš๋„, ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์— ํ•ด์•ผํ•˜๋ฉฐ, ์ถฉ๋ถ„ํ•œ ํœด์‹์„ ์ทจํ•ด์•ผ ์ง€์† ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

์ดˆ๊ธฐ ํ”„๋กœ์ ํŠธ์˜ ๊ณ„ํš์—์„œ๋Š”, ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋’ค, MVVM์œผ๋กœ ์ „ํ™˜์„ ๋ชฉํ‘œ๋กœ ํ•˜์˜€๋‹ค. ์ด ๋•Œ, ๋ฆฌ์Šคํฌ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ MVC๋กœ ์™„์ „ํ•œ ๊ตฌํ˜„์„ ๋งˆ์นœ๋’ค์—, ์ถฉ๋ถ„ํ•œ ์ผ์ •์ด ํ™•๋ณด ๋œ๋‹ค๋ฉด ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ๊ณ„ํšํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„ํš์˜ ๋ณ€๊ฒฝ์ด ์œ ์—ฐํ•˜๊ฒŒ ์ง„ํ–‰ ๋  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฑฐ๋‚˜, ์–ด๋– ํ•œ ์ผ์„ ์ง„ํ–‰ ํ•  ๋•Œ, ์ด์™€ ๊ฐ™์ด ์ฐฉ์ง€์ ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊นจ๋‹ฌ์•˜๋‹ค.

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

git ๊ด€๋ จ ํšŒ๊ณ 

๋‚˜๋Š” gitDesktop์„ ์‚ฌ์šฉํ•œ๋‹ค. ์•ฝ๊ฐ„ ์‚ฌํŒŒ๊ฐ™์€ ๋Š๋‚Œ์ธ๋ฐ, ๊ทธ๋ž˜๋„ git์˜ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ๊ณ  ์“ฐ๋‹ˆ๊นŒ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, GUI๋ฅผ ์“ฐ๊ธฐ์— ๋ช…๋ น์–ด๋ฅผ ์ž˜ ๋ชจ๋ฅด๋Š” ๋‚˜๋Š”, ํ„ฐ๋ฏธ๋„๋งŒ์„ ์ด์šฉํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋Š” ํŒ€์›์—๊ฒŒ ์ƒˆ๋กœ์šด branch๋ฅผ checkout, pull ํ•œ ๋’ค, ์ˆ˜์ •์‚ฌํ•ญ์„ commit, pushํ•˜๋Š” ๊ณผ์ •์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ํ„ฐ๋ฏธ๋„์„ ๊ผญ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„, ๊ฐ€๋” ๋ช…๋ น์–ด๋ฅผ ์Šฅ ํ•œ๋ฒˆ ์ฝ๋Š” ๋ฃจํ‹ด์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๊ธฐ์ˆ  ๊ด€๋ จ ํšŒ๊ณ 

  1. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ์•ฑ์˜ ๊ธฐ๋Šฅ์ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š์•„์„œ, MVC๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ •์‹ ์—†์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์™„๋ฃŒํ•œ ๋’ค, ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด๋‹ˆ, Model์ด ์—†๋‹จ ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ทธ๋ ‡๋‹ค, View์™€ Controller๋งŒ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

Model๊ฐ์ฒด๋Š” ๋กœ์ง์„ ๋‹ด๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ณดํ†ต ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋กœ์ง์ด ์ข€ ํฌ์ง€๋งŒ, ์˜ค๋””์˜ค๋ฅผ ์žฌ์ƒ, ๋…นํ™”ํ•˜๋Š” DefaultAudioRecorder, Player๋ฅผ ๋ชจ๋ธ๋กœ ๋ณผ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ๋ผ๊ณ  ์ƒ๊ฐ๋„ ํ•ด๋ดค์ง€๋งŒ, ๋‘ class๋Š” audioEngine์˜ ์„ค์ •๊ณผ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ๋…น์Œ ํŒŒ์ผ์˜ data๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋•Œ๋ฌธ์—, Model๋กœ ๋ณผ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋ฌผ๋ก  architecture์— ๊ผญ ์ง‘์ฐฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ํ•˜์ง€๋งŒ audioFile์ด๋ผ๋Š” model์„ ํ† ๋Œ€๋กœ ์•ฑ์„ ์„ค๊ณ„ํ–ˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ? ํ•˜๋Š” ์•„์‰ฌ์›€์ด ์žˆ๋‹ค.

  1. audioFile์˜ bufferData๋ฅผ ์ฝ์–ด ํŒŒํ˜•์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์–ด๋ ค์› ๋‹ค. audioFile์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ง€์‹ ์—†์ด ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋‹ˆ, ์šฉ์–ด์™€ ์ˆ˜์‹์ด ์ „ํ˜€ ์ดํ•ด๋˜์ง€ ์•Š์•˜๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์€ ์ง€๋‚œํ•˜๊ณ , ์–ด๋ ต๊ณ , ์ •์‹ ์ ์œผ๋กœ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ์ผ์ด์—ˆ๋‹ค.
    ์ฐจํ›„ ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ์— ๋ด‰์ฐฉํ–ˆ์„ ๋•Œ์—๋Š”, ์ตœ๋Œ€ํ•œ ๊ธฐ๋ณธ์ง€์‹์— ๋Œ€ํ•œ ์Šคํ„ฐ๋””๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ณ , ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด๋ž€ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

ํ˜‘์—… ๊ด€๋ จ ํšŒ๊ณ 

  1. ํ˜‘์—…์˜ ์ง„ํ–‰ ์ „, ์—ฌ๋Ÿฌ ์ปจ๋ฒค์…˜๊ณผ ๋ช…์นญ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ •ํ•˜๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ๊ณ  ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‹ˆ๊นŒ ๊ดœ์ฐฎ๊ฒ ์ง€ ํ•˜๋Š” ์•ˆ์ผํ•œ ๋งˆ์Œ์œผ๋กœ ์Šค๋ฆฌ์Šฌ์ฉ ์‹œ์ž‘ํ–ˆ๋‹ค.
    ์ด ํ–‰๋™์€ ๋ˆˆ๋ฉ์ด๊ฐ€ ๊ตด๋Ÿฌ ์ปค์ง€๋“ฏ ๋ถˆ์–ด๋‚˜, ๋งˆ์ง€๋ง‰์— ์™€์„œ ๋‹ค์ˆ˜์˜ ๋ฆฌํŒฉํ† ๋ง ํ•ญ๋ชฉ์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. ํ•œ ๋ฒˆ ์ผํ•  ๊ฒƒ์„ ๋‘ ๋ฒˆ ์ผํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค. ์ถ”ํ›„์—๋Š” ์ด์™€ ๊ฐ™์€ ์•ˆ์ผํ•œ ํ–‰๋™์„ ์ง€์–‘ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ๋‹ค์ง์„ ํ–ˆ๋‹ค.

  2. ๋ธŒ๋žœ์น˜ ์ „๋žต์ด ์•„์‰ฌ์› ๋‹ค. main - dev - featureBranch ๋กœ ๋‚˜๋ˆ„์–ด ์ง„ํ–‰ ํ•œ ๊ฒƒ์€ ์ข‹์•˜์œผ๋‚˜, dev์— mergeํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ๋ฏธํกํ–ˆ๋‹ค. ์ด๋กœ ์ธํ•˜์—ฌ, ๊ฐ„๋‹จํžˆ ์•Œ ์ˆ˜ ์žˆ๋Š” ์˜คํƒ€, ์ž˜๋ชป๋œ ๋กœ์ง, ๋ชจํ˜ธํ•œ ๋ช…์นญ ๋“ฑ์„ ์‚ฌ์ „์— ๊ฑธ๋Ÿฌ ๋‚ผ ์ˆ˜ ์—†์—ˆ๋‹ค. ๋ฌผ๋ก  dev branch์˜ ์—ญํ•  ์ž์ฒด๋ฅผ main์— mergeํ•˜๊ธฐ ์ „ ๊ฑฐ๋ฆ„๋ง์œผ๋กœ ์„ค์ •ํ•˜์˜€์œผ๋ฏ€๋กœ, ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, PR์„ ํ†ตํ•˜์—ฌ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์•˜์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

Oyat

์ „์ฒด ํšŒ๊ณ 

์ „์ฒด์  ๊ฐœ๋… ์ˆ™์ง€๊ฐ€ ๋งŽ์ด ๋ถ€์กฑํ•œ ์ƒํƒœ์—์„œ ์ง„ํ–‰ํ•œ ํŒ€ํ”„๋กœ์ ํŠธ๋ผ ๋ชจ๋“  ๊ฒŒ ์–ด๋ ต๊ณ  ๊ตฌํ˜„ํ•ด๋‚ด๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ŠคํŠธ๋ ˆ์Šค๊ฐ€ ์‹ฌํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌผ๋ก  ์ด๋Ÿฐ ๋‚˜์˜ ๋ฉ˜ํƒˆ์ ์ธ ๊นจ์ง๋“ค์ด ๋งŽ์ด ํž˜๋“ค์—ˆ์ง€๋งŒ ์ด๋กœ ์ธํ•ด ์ข€ ๋” ์ง€๊ธˆ ๋‚ด ์ƒํ™ฉ์—์„œ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ ์ค‘์—๋„ ํŒจํ„ด๋“ค์— ๋Œ€ํ•ด ์ง‘์ค‘ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๊ณ  ์ฝ”๋””๋„ค์ดํ„ฐ์™€ ์˜ต์ €๋ฒ„, ๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์„ ์™„๋ฒฝํ•˜์ง€๋งŒ ์•Š์ง€๋งŒ ์ •๋ฆฌํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์„œ ๊ทธ๋‚˜๋งˆ ๋‹คํ–‰์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ํŒ€์›๋“ค์—๊ฒŒ ๋งŽ์ด ๋ฐฐ์šฐ๊ณ  ๋‚˜ ์Šค์Šค๋กœ ๋˜๋Œ์•„๋ณด๊ณ  ๋ฐ˜์„ฑํ•˜๋Š” 2์ฃผ๊ฐ€ ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

git ๊ด€๋ จ ํšŒ๊ณ 

GUI๋กœ ์‚ฌ์šฉํ•˜๋‹ค SSH๊ด€๋ จ์œผ๋กœ ๊ณ„์ •์„ ๊ฐœ๋ณ„ ๊ด€๋ฆฌํ•˜๋ ค๋‹ค๋ณด๋‹ˆ ํ„ฐ๋ฏธ๋„์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ๋งŽ์ด ์ต์ˆ™ํ•ด์ง€๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค๋งŒ ๋ชจ๋“  ์ƒํ™ฉ์— ๋Œ€ํ•œ ๋Œ€์ฒ˜๊ฐ€ ๋งŽ์ด ๋ฏธํกํ•œ์ง€๋ผ ์ด ๋ถ€๋ถ„๋„ ํฌ์ŠคํŒ… ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

๊ธฐ์ˆ  ๊ด€๋ จ ํšŒ๊ณ 

  • ๊ฐ์ฒด ์ฑ…์ž„ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•œ ๋ฆฌํŒฉํ† ๋ง๊ณผ ๊ธฐ์ˆ  ๊ด€๋ จ ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ๋ถ€๋ถ„์„ ํŒ€์›๋ถ„๋“ค์˜ ๊ฒƒ๋“ค์„ ๋ณด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋งŽ์€ ๊ณต๋ถ€๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์–ด๋ ดํ’‹์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผํ•˜๊ณ  ์–ด๋–ค ์‹์œผ๋กœ ์ง„ํ–‰์ด ๋˜๋Š”์ง€ ๋ชธ์†Œ ์ฒดํ—˜์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฌผ๋ก  ํ•ด๋ณด๋ผ๊ณ  ํ•˜๋ฉด ์•„์ง์€ ์–ด๋ ต๊ฒ ์ง€๋งŒ ์˜จ๋ณด๋”ฉ์ด ๋งˆ๋ฌด๋ฆฌ ๋˜๋ฉด ์š•์‹ฌ ๋ถ€๋ฆฌ์ง€ ๋ง๊ณ  ๊ธฐ์ดˆ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ฐจ๊ทผ์ฐจ๊ทผ ํ•ด๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

  • ์ฝ”๋””๋„ค์ดํ„ฐ ํŒจํ„ด๊ณผ ์˜ต์ €๋ฒ„ ํŒจํ„ด ๊ทธ๋ฆฌ๊ณ  ๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์„ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•˜๋ฉด์„œ ์ด๋ ‡๊ฒŒ ๋‹ค ํ•œ ๋ฒˆ์”ฉ ์‚ฌ์šฉํ•ด๋ณธ ๊ฑด ์ด๋ฒˆ์ด ์ฒ˜์Œ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌผ๋ก  ์‘์šฉํ•ด์„œ ์กฐ๊ธˆ๋งŒ ๋น„๊ผฌ์•„๋„ ๋จธ๋ฆฌ๊ฐ€ ์–ด์งˆ์–ด์งˆํ•˜์ง€๋งŒ ๋Œ€๋žต์ ์œผ๋กœ ๋ฆฌ๋“œ๋ฏธ ๊ด€๋ จ ์ž๋ฃŒ๋ฅผ ์ค€๋น„ํ•˜๋ฉด์„œ ์–ด๋Š ์ •๋„ ์ •๋ฆฌ๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์•„ ๊ทธ๋‚˜๋งˆ ์•ˆ์‹ฌ์ด ๋œ๋‹ค. ์‚ฌ์‹ค ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๋‚˜๋งˆ ๋‚ด๊ฐ€ ๊ฐ€์ ธ๊ฐ”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ถ€๋ถ„์ด ํŒจํ„ด์ด์—ˆ๋˜ ๊ฐ™๋‹ค. ๊ธฐ์ˆ  ๊ด€๋ จํ•ด์„œ๋Š” ํŒ€์›๋“ค์—๊ฒŒ ๋งŽ์ด ์˜์กดํ•œ ๋ถ€๋ถ„์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ๊ณ ๋ฏผ์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ๊ณ ๋Š” ํ–ˆ์ง€๋งŒ ์ƒ๊ฐ์—†๋Š” ์ฝ”๋“œ๋“ค๊ณผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ฝ”๋“œ๋“ค์„ ์ž‘์„ฑํ•˜๋‹ˆ ๋‚˜ ์Šค์Šค๋กœ๋„ ๋งค์šฐ ํž˜๋“ค์—ˆ๋‹ค. ๋งˆ์Œ์ด ๋„ˆ๋ฌด๋‚˜๋„ ๋ถˆํŽธํ–ˆ์ง€๋งŒ ์•ž์œผ๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ€๋‹ค๋“ฌ๊ณ  ๊ฐœ๋ฐœ ๊ธฐ์ˆ ์„ ํ‚ค์šธ ์ˆ˜ ์žˆ๋„๋ก ๊ทธ๋ƒฅ ๋ ˆํผ๋Ÿฐ์Šค์—์„œ ์ฝ”๋“œ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ดํ•ดํ•˜๊ณ  ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ ธ์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ˜‘์—… ๊ด€๋ จ ํšŒ๊ณ 

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

  • ๋์œผ๋กœ PR์ด ์—†์ด ์ง„ํ–‰ํ–ˆ๋˜ ๋ถ€๋ถ„์ด ๋’ค๋Šฆ๊ฒŒ ์•„์‰ฌ์šด ๋ถ€๋ถ„์ด์—ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ €๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” PR์„ ํ†ตํ•ด ๋งŽ์ด ๋ถ€์กฑํ•˜์ง€๋งŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฐ์šฐ๊ณ  ๊ธฐ์ˆ ๋„ ์•Œ๋ ค์ฃผ๋ ค๋Š” ๋ถ€๋ถ„์ด ๊ธฐ๋ก๋˜์–ด ๋ฏธ์—ฐ์— ๋ฒ„๊ทธ๋ฅผ ์žก๊ฑฐ๋‚˜ ์ง„ํ–‰์ƒํ™ฉ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์ด ์—†์–ด ์˜คํƒ€๋‚˜ ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ๋’ค๋Šฆ๊ฒŒ ์•Œ๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๋„ ๊ฐ„ํ˜น ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜๋„ ์‹ค๋ ฅ์ด ์ข‹์€ ๋™๋ฃŒ๋“ค๊ณผ ํ•จ๊ป˜ํ•ด ๋‹ค๋ฆ„ ํŒ€๋“ค์— ๋น„ํ•ด ์กฐ๊ธฐ์— ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ์ข€ ๋” ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์–ด ํŒ€์›๋“ค์—๊ฒŒ ๋งŽ์ด ๋ฐฐ์› ๊ณ  ๋‚˜ ๋•Œ๋ฌธ์— ์ข€ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ๋ฐ›์œผ์…จ์„ํ…๋ฐ ๊ณ ๋ง™๊ณ  ๊ฐ์‚ฌํ•˜๋‹ค๋Š” ๋ง์„ ์ „ํ•ด์ฃผ๊ณ  ์‹ถ๋‹คใ…Žใ…Ž

JMin

์ „์ฒด ํšŒ๊ณ 

์ฒ˜์Œ์œผ๋กœ ์ง„ํ–‰ํ•œ ํŒ€ ํ”„๋กœ์ ํŠธ์ด๋‹ˆ๋งŒํผ ๋งŽ์€๊ฒŒ ์„œํˆด๊ณ  ์–ด๋ ค์› ๋‹ค ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ์ง„ํ–‰ํ• ์ˆ˜๋ก ํŒ€๋‹จ์œ„๋กœ ์ผํ•˜๋Š”๊ฒŒ ์ต์ˆ™ํ•ด์กŒ๋‹ค ๋ณดํ†ต ๊ฐœ๋ฐœ์€ ํŒ€ ๋‹จ์œ„๋กœ ์ง„ํ–‰๋˜๊ธฐ๋•Œ๋ฌธ์— ํ˜‘์—…์„ ํ•˜์—ฌ ๊ฐœ๋ฐœํ•ด๋ณธ ๊ฒฝํ—˜์€ ์•ž์œผ๋กœ ํฐ ๋„์›€์ด ๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ•œ๋‹ค

git ๊ด€๋ จ ํšŒ๊ณ 

์ง€๊ธˆ๊นŒ์ง€๋Š” ํ˜ผ์ž์„œ ๊ฐœ๋ฐœ์„ ํ•ด์™”๊ธฐ๋•Œ๋ฌธ์— fork, pr์˜ ๊ฐœ๋…์„ ๋ชฐ๋ž๋‹ค ๋˜ํ•œ ๊นƒ์„ ๋‹จ์ˆœํžˆ github์— ์ €์žฅํ•˜๊ธฐ๋งŒ์„ ์œ„ํ—ค ์‚ฌ์šฉํ•ด์™”์–ด์„œ branch, merge๋“ฑ์˜ ๊ฐœ๋…๋„ ๋ชจํ˜ธํ–ˆ๋‹ค
์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์œ„ ๊ฐœ๋…๋“ค์„ ์ˆ™์ง€ํ•˜์˜€๊ณ  ํ„ฐ๋ฏธ๋„์„ ์‚ฌ์šฉํ•ด์„œ git์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ฝค ์ต์ˆ™ํ•ด์กŒ๋‹ค ํ•ด๋‹น ๊ฒฝํ—˜์€ ์•ž์œผ๋กœ๋„ git์„ ํ†ตํ•ด ๋ฒ„์ „๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š”๋ฐ ํฐ ๋„์›€์ด ๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ•œ๋‹ค

๊ธฐ์ˆ ๊ด€๋ จ ํšŒ๊ณ 

  • ๋ฆฌํŒฉํ† ๋ง ๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„์ง€ํ•˜๊ฒŒ ํ•ด๋ณธ์ ์ด ์—†๊ธฐ๋•Œ๋ฌธ์— ์‚ฌ์‹ค์ƒ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๋‚ด๊ฐ€ ๋ฆฌํŒฉํ† ๋ง์„ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์€ ๊ฑฐ์˜ ์—†๊ณ  ์ง„ํ–‰๊ณผ์ • ๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ๋งŒ ํ–ˆ๋‹ค ๋ฆฌํŒฉํ† ๋ง ์ „์ด๋ž‘ ํ›„๋ž‘ ๋น„๊ตํ•ด๋ดค์„๋•Œ ๋ฉ”์„œ๋“œ๋ฐ ๊ฐ์ฒด์˜ ์—ญํ• ์ด ๋ถ„๋ฆฌ๋˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์•ˆ์ง„๊ฒƒ์„ ๋ณด๊ณ  ๋ฆฌํŒฉํ† ๋ง์— ๊ด€ํ•ด์„œ๋Š” ํ•œ๋ฒˆ ์ง„์ง€ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋ด์•ผ๊ฒ ๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค
  • ์˜์กด์„ฑ ์ฃผ์ž… ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ด๋ฒˆ์— ์ฒ˜์Œ ๋“ค์–ด๋ดค๋‹ค ์˜์กด์„ฑ ์ฃผ์ž…์€ SOLID๋ฐฉ์‹์ค‘ D์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ ์ด ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ• ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€๋ณด์ˆ˜, ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€ / ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•ด์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค ์‹ค์ œ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…๋ฐฉ์‹์œผ๋กœ ๋ผ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ณผ์ •์„ ๋ดค๋Š”๋ฐ ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์žก๊ณ ์žˆ๋Š” ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋ฆฌํŒฉํ† ๋ง๋˜๋Š”๊ฒƒ์„ ๋ณด๊ณ  ๋†€๋ž๋‹ค
    ์•„์ง ์˜์กด์„ฑ ์ฃผ์ž…์— ๊ด€ํ•ด์„œ ์ •ํ™•ํ•œ ๊ฐœ๋…์„ ์•Œ์ง„ ๋ชปํ•œ๋‹ค ์ด๋Š” ํ•˜๋ฃจ์•„์นจ์— ๊ป˜๋”›๋Š”๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉฐ ์•ž์œผ๋กœ SOLID์›์น™๊ณผ ํ•จ๊ป˜ ๊พธ์ค€ํžˆ ๊ณต๋ถ€ํ•  ๊ณ„ํš์ด๋‹ค

ํ˜‘์—… ๊ด€๋ จ ํšŒ๊ณ 

์ง€๊ธˆ๊นŒ์ง€๋Š” ํ˜ผ์ž์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๊ธฐ๋•Œ๋ฌธ์— ์ปจ๋ฒค์…˜์— ๋Œ€ํ•ด์„œ ์‹ ๊ฒฝ์„ ์•ˆ์จ์™”๋‹ค ํ•˜์ง€๋งŒ ํ˜‘์—…์‹œ์—๋Š” ๋‚ด ์ฝ”๋“œ๋ฅผ ๋‚˜๋งŒ๋ณด๋Š”๊ฒŒ ์•„๋‹Œ ํŒ€ ๋ชจ๋‘๊ฐ€ ๋ณด๊ธฐ๋•Œ๋ฌธ์— ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๊ณตํ†ต๋œ ์ปจ๋ฒค์…˜์ด ํ•„์š”ํ•˜๋‹ค

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 99.6%
  • Ruby 0.4%