Upgrade to Pro — share decks privately, control downloads, hide ads and more …

성장하는 iOS 개발자 되기

Suyeol Jeon
February 16, 2021

성장하는 iOS 개발자 되기

미리 톺아보는 훌륭한 개발자의 역량

Suyeol Jeon

February 16, 2021
Tweet

More Decks by Suyeol Jeon

Other Decks in Programming

Transcript

  1. ޖ঺ਸ పझ౟ೡ Ѫੋо Unit Integration End-to-End ࢚ಿ оѺ ࠭ ࢚ಿ

    ࢚ࣁ ചݶ ੹୓ ҳݒ җ੿ ৈӝࢲࠗఠ ੘ѱ द੘
  2. оѺ ನݘఠ զ૞ ನݘఠ Codable ߸ജ String ੊झబ࣌ ... పझ౟

    ೞӝ ए਍ Ѫࠗఠ ੑ۱੉ эਵݶ ୹۱੉ э׮ ࢎ੉٘ ੉ಖ౟о হ׮
  3. ੉۠ Ѫب Ҷ੉ పझ౟ܳ ੘ࢿ೧ঠ ೡө? ֎ (ࣼ۲ೡ दр੉ ੓׮ݶ)

    ੊ࣼ೧૑ח Ѫ੉ ઺ਃ ૑ध੄ ৔৉੉ ইפۄ ࣼ׳੄ ৔৉
  4. పझ౟ܳ ੘ࢿೞ׮ ࠁݶ ਃҳࢎ೦੉ ݺഛ೧૓׮ func testPriceView() { let view

    = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual( ) }
  5. పझ౟ܳ ੘ࢿೞ׮ ࠁݶ ਃҳࢎ೦੉ ݺഛ೧૓׮ func testPriceView() { let view

    = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, ) }
  6. పझ౟ܳ ੘ࢿೞ׮ ࠁݶ ਃҳࢎ೦੉ ݺഛ೧૓׮ func testPriceView() { let view

    = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  7. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  8. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } 
 
 func testPriceView() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  9. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } 
 
 func testPriceView() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  10. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } 
 
 func testPriceView() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  11. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } 
 
 func testPriceView() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  12. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } 
 
 func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  13. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } 
 
 func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  14. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } 
 
 func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 3000, price: 3000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  15. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } 
 
 func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 3000, price: 3000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") }
  16. ݅ড ਗоо ੿о৬ э׮ݶ? func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() { let view =

    PriceView(costPrice: 10000, price: 6000) XCTAssertEqual(view.priceLabel.text, "[40%] 6,000ਗ") } 
 
 func testPriceView_whenNotDiscounted_displaysPriceOnly() { let view = PriceView(costPrice: 3000, price: 3000) XCTAssertEqual(view.priceLabel.text, "3,000ਗ") }
  17. ݅ড ೡੋਯী ࣗं੼੉ ࢤӟ׮ݶ? func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() { let view =

    PriceView(costPrice: 11000, price: 7000) XCTAssertEqual(view.priceLabel.text, "[36%] 7,000ਗ") // 36.363636... }
  18. ݅ড ೡੋਯী ࣗं੼੉ ࢤӟ׮ݶ? func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() { let view =

    PriceView(costPrice: 11000, price: 7000) XCTAssertEqual(view.priceLabel.text, "[36%] 7,000ਗ") // 36.363636... }
  19. ݅ড ೡੋਯী ࣗं੼੉ ࢤӟ׮ݶ? func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() { let view =

    PriceView(costPrice: 11000, price: 7000) XCTAssertEqual(view.priceLabel.text, "[36%] 7,000ਗ") // 36.363636... }
  20. ݅ড ೡੋਯী ࣗं੼੉ ࢤӟ׮ݶ? func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() { let view =

    PriceView(costPrice: 11000, price: 7000) XCTAssertEqual(view.priceLabel.text, "[36%] 7,000ਗ") // 36.363636... }
  21. Ӓ۞׮ ࠁݶ పझ౟ झಖ੉ ҍ ӝמ ݺࣁо ػ׮ func testPriceView_whenNotDiscounted_displaysPriceOnly()

    func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() func testPriceView_whenPriceIsZero_displaysFree()
  22. झಖਸ ؊ ݺഛೞѱ ੘ࢿೞҊ र׮ݶ ೠӖ۽ ॳӝ func testPriceView_whenNotDiscounted_displaysPriceOnly() func

    testPriceView_whenDiscounted_displaysDiscountRateAndPrice() func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() func testPriceView_whenPriceIsZero_displaysFree()
  23. झಖਸ ؊ ݺഛೞѱ ੘ࢿೞҊ र׮ݶ ೠӖ۽ ॳӝ func testPriceView__ೡੋغ૑_ঋ਷_҃਋__оѺ݅_಴द೤פ׮() func

    testPriceView__ೡੋػ_҃਋__ೡੋਯҗ_оѺਸ_಴द೤פ׮() func testPriceView__ೡੋػ_҃਋__߈ৢܿػ_ೡੋਯҗ_оѺਸ_಴द೤פ׮() func testPriceView__оѺ੉_0ੋ_҃਋__ޖܐ۽_಴द೤פ׮() func testPriceView_whenNotDiscounted_displaysPriceOnly() func testPriceView_whenDiscounted_displaysDiscountRateAndPrice() func testPriceView_whenDiscounted_displaysRoundedDiscountRateAndPrice() func testPriceView_whenPriceIsZero_displaysFree()
  24. оѺ ನݘఠ զ૞ ನݘఠ Codable ߸ജ String ੊झబ࣌ ... పझ౟

    ೞӝ ए਍ Ѫࠗఠ ੑ۱੉ эਵݶ ୹۱੉ э׮ ࢎ੉٘ ੉ಖ౟о হ׮
  25. оѺ ನݘఠ զ૞ ನݘఠ Codable ߸ജ String ੊झబ࣌ ... పझ౟

    ೞӝ ए਍ Ѫࠗఠ ੑ۱੉ эਵݶ ୹۱੉ э׮ ࢎ੉٘ ੉ಖ౟о হ׮ ✅
  26. పझ౟ ೞӝ ए਍ Ѫࠗఠ 👉 ੼੼ ؊ ࠂ੟೧૓׮ݶ? ੑ۱੉ эਵݶ

    ୹۱੉ э׮ ࢎ੉٘ ੉ಖ౟о হ׮ оѺ ನݘఠ զ૞ ನݘఠ Codable ߸ജ String ੊झబ࣌ ... ✅
  27. ֎౟ਕ௼ ਃ୒ दझమ ೐ۨ੐ਕ௼ ࢲ٘౵౭ ۄ੉࠳۞ܻ ... పझ౟ ೞӝ ए਍

    Ѫࠗఠ 👉 ੼੼ ؊ ࠂ੟೧૓׮ݶ? ੑ۱੉ эਵݶ ୹۱੉ э׮ ࢎ੉٘ ੉ಖ౟о হ׮ ✅
  28. ֎౟ਕ௼ ਃ୒ दझమ ೐ۨ੐ਕ௼ ࢲ٘౵౭ ۄ੉࠳۞ܻ ... పझ౟ ೞӝ ए਍

    Ѫࠗఠ 👉 ੼੼ ؊ ࠂ੟೧૓׮ݶ? ੑ۱੉ эইب ୹۱੉ ׮ܰ׮ ࢎ੉٘ ੉ಖ౟о ࢤӟ׮ ✅
  29. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock ౵ۄ޷ఠܳ

    ଻਋ӝ ਤ೧ ೙ਃೠ ѐ୓ ੘زೞӟ ೞ૑݅ పझ౟݅ਸ ਤ೧ࢲ ٜ݅য૓ ҳഅ୓
  30. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock ౵ۄ޷ఠܳ

    ଻਋ӝ ਤ೧ ೙ਃೠ ѐ୓ ੘زೞӟ ೞ૑݅ పझ౟݅ਸ ਤ೧ࢲ ٜ݅য૓ ҳഅ୓ ޷ܻ ૑੿ೠ Ѿҗܳ ߈ജೡ ࣻ ੓ח ҳഅ୓
  31. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock ౵ۄ޷ఠܳ

    ଻਋ӝ ਤ೧ ೙ਃೠ ѐ୓ ੘زೞӟ ೞ૑݅ పझ౟݅ਸ ਤ೧ࢲ ٜ݅য૓ ҳഅ୓ ޷ܻ ૑੿ೠ Ѿҗܳ ߈ജೡ ࣻ ੓ח ҳഅ୓ Stubী ؊೧ࢲ ೣࣻ ഐ୹ਸ ӝ۾ೡ ࣻ ੓ח ҳഅ୓
  32. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock ౵ۄ޷ఠܳ

    ଻਋ӝ ਤ೧ ೙ਃೠ ѐ୓ ੘زೞӟ ೞ૑݅ పझ౟݅ਸ ਤ೧ࢲ ٜ݅য૓ ҳഅ୓ ޷ܻ ૑੿ೠ Ѿҗܳ ߈ജೡ ࣻ ੓ח ҳഅ୓ Stubী ؊೧ࢲ ೣࣻ ഐ୹ਸ ӝ۾ೡ ࣻ ੓ח ҳഅ୓ ਗೞח ݫࢲ٘о ੄بೠ ؀۽ ੜ ഐ୹غ঻ח૑ܳ Ѩૐೡ ࣻ ੓ח ҳഅ୓
  33. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock e.g.

    ೐۽೙ ࠭ܳ పझ౟ೡ ٸ ֈӝח User ѐ୓ ੘زೞӟ ೞ૑݅ పझ౟݅ਸ ਤ೧ࢲ ٜ݅য૓ ҳഅ୓ ޷ܻ ૑੿ೠ Ѿҗܳ ߈ജೡ ࣻ ੓ח ҳഅ୓ Stubী ؊೧ࢲ ೣࣻ ഐ୹ਸ ӝ۾ೡ ࣻ ੓ח ҳഅ୓ ਗೞח ݫࢲ٘о ੄بೠ ؀۽ ੜ ഐ୹غ঻ח૑ܳ Ѩૐೡ ࣻ ੓ח ҳഅ୓
  34. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock e.g.

    ೐۽೙ ࠭ܳ పझ౟ೡ ٸ ֈӝח User ѐ୓ e.g. पઁ ః୓ੋী ੷੢ೞ૑ ঋҊ ݫݽܻীࢲ݅ ҙܻೞח ః୓ੋ ޷ܻ ૑੿ೠ Ѿҗܳ ߈ജೡ ࣻ ੓ח ҳഅ୓ Stubী ؊೧ࢲ ೣࣻ ഐ୹ਸ ӝ۾ೡ ࣻ ੓ח ҳഅ୓ ਗೞח ݫࢲ٘о ੄بೠ ؀۽ ੜ ഐ୹غ঻ח૑ܳ Ѩૐೡ ࣻ ੓ח ҳഅ୓
  35. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock e.g.

    ೐۽೙ ࠭ܳ పझ౟ೡ ٸ ֈӝח User ѐ୓ e.g. पઁ ః୓ੋী ੷੢ೞ૑ ঋҊ ݫݽܻীࢲ݅ ҙܻೞח ః୓ੋ e.g. ޷ܻ ૑੿ೠ ੉޷૑ ࢶఖ Ѿҗܳ ߈ജೞח UIImagePickerStub Stubী ؊೧ࢲ ೣࣻ ഐ୹ਸ ӝ۾ೡ ࣻ ੓ח ҳഅ୓ ਗೞח ݫࢲ٘о ੄بೠ ؀۽ ੜ ഐ୹غ঻ח૑ܳ Ѩૐೡ ࣻ ੓ח ҳഅ୓
  36. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock e.g.

    ೐۽೙ ࠭ܳ పझ౟ೡ ٸ ֈӝח User ѐ୓ e.g. पઁ ః୓ੋী ੷੢ೞ૑ ঋҊ ݫݽܻীࢲ݅ ҙܻೞח ః୓ੋ e.g. ޷ܻ ૑੿ೠ ੉޷૑ ࢶఖ Ѿҗܳ ߈ജೞח UIImagePickerStub e.g. ഐ୹ػ ݫࢲ٘ܳ ӝ۾ೞח MFMailComposeViewControllerSpy ਗೞח ݫࢲ٘о ੄بೠ ؀۽ ੜ ഐ୹غ঻ח૑ܳ Ѩૐೡ ࣻ ੓ח ҳഅ୓
  37. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock e.g.

    ೐۽೙ ࠭ܳ పझ౟ೡ ٸ ֈӝח User ѐ୓ e.g. पઁ ః୓ੋী ੷੢ೞ૑ ঋҊ ݫݽܻীࢲ݅ ҙܻೞח ః୓ੋ e.g. ޷ܻ ૑੿ೠ ੉޷૑ ࢶఖ Ѿҗܳ ߈ജೞח UIImagePickerStub e.g. ഐ୹ػ ݫࢲ٘ܳ ӝ۾ೞח MFMailComposeViewControllerSpy e.g. ੄بೠ ݫࢲ٘о ഐ୹غ૑ ঋਵݶ पಁदఃח ޖ঱о
  38. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
  39. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
  40. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
  41. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
  42. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxCafe ☕ ☕
  43. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxBar 🍺 ☕
  44. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } @KxBar 🍺 🚫 🚫 ☕ 🍺 !=
  45. ֎౟ਕ௼ ਃ୒ दझమ ೐ۨ੐ਕ௼ ࢲ٘౵౭ ۄ੉࠳۞ܻ ... పझ౟ ೞӝ ए਍

    Ѫࠗఠ 👉 ੼੼ ؊ ࠂ੟೧૓׮ݶ? ੑ۱੉ эইب ୹۱੉ ׮ܰ׮ ࢎ੉٘ ੉ಖ౟о ࢤӟ׮ ✅
  46. ֎౟ਕ௼ ਃ୒ दझమ ೐ۨ੐ਕ௼ ࢲ٘౵౭ ۄ੉࠳۞ܻ ... పझ౟ ೞӝ ए਍

    Ѫࠗఠ 👉 ੼੼ ؊ ࠂ੟೧૓׮ݶ? ੑ۱੉ эইب ୹۱੉ ׮ܰ׮ ࢎ੉٘ ੉ಖ౟о ࢤӟ׮ ✅
  47. ֎౟ਕ௼ ਃ୒ दझమ ೐ۨ੐ਕ௼ ࢲ٘౵౭ ۄ੉࠳۞ܻ ... పझ౟ ೞӝ ए਍

    Ѫࠗఠ 👉 ੼੼ ؊ ࠂ੟೧૓׮ݶ? ੑ۱੉ эইب ୹۱੉ ׮ܰ׮ ࢎ੉٘ ੉ಖ౟о ࢤӟ׮ ✅
  48. ֎౟ਕ௼ ਃ୒ दझమ ೐ۨ੐ਕ௼ ࢲ٘౵౭ ۄ੉࠳۞ܻ ... పझ౟ ೞӝ ए਍

    Ѫࠗఠ 👉 ੼੼ ؊ ࠂ੟೧૓׮ݶ? ੑ۱੉ эইب ୹۱੉ ׮ܰ׮ ࢎ੉٘ ੉ಖ౟о ࢤӟ׮ ✅
  49. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    viewController = GPSViewController() // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
  50. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    viewController = GPSViewController( ) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
  51. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    locationManager = CLLocationManagerStub() let viewController = GPSViewController( ) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
  52. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController( ) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
  53. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
  54. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5093999") XCTAssertEqual(viewController.longitudeLabel.text, "126.8855371") } ☕
  55. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5740381") XCTAssertEqual(viewController.longitudeLabel.text, "126.9745863") }
  56. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5740381") XCTAssertEqual(viewController.longitudeLabel.text, "126.9745863") } ✅
  57. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5740381") XCTAssertEqual(viewController.longitudeLabel.text, "126.9745863") }
  58. ੄ઓࢿ ઱ੑ (Dependency Injection) func testGPSViewController_whenLoaded_displaysMyLatitudeAndLongitude() { // given let

    locationManager = CLLocationManagerStub() locationManager.stubbedLatitude = 37.5740381 locationManager.stubbedLongitude = 126.9745863 let viewController = GPSViewController(locationManager: locationManager) // when viewController.loadViewIfNeeded() // then XCTAssertEqual(viewController.latitudeLabel.text, "37.5740381") XCTAssertEqual(viewController.longitudeLabel.text, "126.9745863") }
  59. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock ౵ۄ޷ఠܳ

    ଻਋ӝ ਤ೧ ೙ਃೠ ѐ୓ ੘زೞӟ ೞ૑݅ పझ౟݅ਸ ਤ೧ࢲ ٜ݅য૓ ҳഅ୓ ޷ܻ ૑੿ೠ Ѿҗܳ ߈ജೡ ࣻ ੓ח ҳഅ୓ Stubী ؊೧ࢲ ೣࣻ ഐ୹ਸ ӝ۾ೡ ࣻ ੓ח ҳഅ୓ ਗೞח ݫࢲ٘о ੄بೠ ؀۽ ੜ ഐ୹غ঻ח૑ܳ Ѩૐೡ ࣻ ੓ח ҳഅ୓
  60. పझ౟ ؀৉ (Test double) Dummy Fake Stub Spy Mock ౵ۄ޷ఠܳ

    ଻਋ӝ ਤ೧ ೙ਃೠ ѐ୓ ੘زೞӟ ೞ૑݅ పझ౟݅ਸ ਤ೧ࢲ ٜ݅য૓ ҳഅ୓ ޷ܻ ૑੿ೠ Ѿҗܳ ߈ജೡ ࣻ ੓ח ҳഅ୓ Stubী ؊೧ࢲ ೣࣻ ഐ୹ਸ ӝ۾ೡ ࣻ ੓ח ҳഅ୓ ਗೞח ݫࢲ٘о ੄بೠ ؀۽ ੜ ഐ୹غ঻ח૑ܳ Ѩૐೡ ࣻ ੓ח ҳഅ୓
  61. REFACTOR GREEN RED TDD (Test Driven Development) पಁೞח పझ౟ࠗఠ ੘ࢿ

    పझ౟ܳ ాҗೞח ୭ࣗೠ੄ ҳഅ ੘ࢿ ૑੷࠙ೠ ҳഅ ѐࢶ
  62. 🧑💻 ѐߊ 📤 ಹद 🕵 ܽ౟ 🧑🔬 పझ౟ 🏗 ࠽٘

    ૑ࣘ੸ ా೤ (Continuous Integration) CI/CD
  63. 🧑💻 ѐߊ 📤 ಹद 🕵 ܽ౟ 🧑🔬 పझ౟ 🏗 ࠽٘

    ૑ࣘ੸ ా೤ (Continuous Integration) CI/CD ✅ 🚫
  64. 🧑💻 ѐߊ 📤 ಹद ૑ࣘ੸ ߓನ (Continuous Delivery) CI/CD 🏗

    ࠽٘ 📦 ߓನ 🛶 झప੉૚ 🚢 ೐۽؋࣌
  65. 🧑💻 ѐߊ 📤 ಹद ૑ࣘ੸ ߓನ (Continuous Delivery) CI/CD 🏗

    ࠽٘ 📦 ߓನ 🧑💻 ѐߊ 📤 ಹद 🏗 ࠽٘ 📦 ߓನ 🛶 झప੉૚ 🚢 ೐۽؋࣌
  66. ೖ٘ߔ ܖ೐ ઱ӝ੸ਵ۽ ਬബೠ ೖ٘ߔਸ زܐٜҗ աׂ ࣻ ੓ח ജ҃

    🕺 ೯ز 💡 ೖ٘ߔ 🙌 ѐࢶ 🚀 ࢿ੢ ૟ ೐۽Ӓې߁ ௏٘ ܻ࠭ ഥҊ
  67. ೖ٘ߔ ܖ೐ ઱ӝ੸ਵ۽ ਬബೠ ೖ٘ߔਸ زܐٜҗ աׂ ࣻ ੓ח ജ҃

    🕺 ೯ز 💡 ೖ٘ߔ 🙌 ѐࢶ 🚀 ࢿ੢ ૟ ೐۽Ӓې߁ (पदр) ௏٘ ܻ࠭ (੘স ױਤ) ഥҊ (੉ఠۨ੉࣌ ױਤ)
  68. ௏٘ ܻ࠭ (੘স ױਤ ೖ٘ߔ) Navigator ޙઁо হח૑ Ѩૐೞח Ѫ਷

    ӝࠄ ߓ҃੉ա ੄ࢎѾ੿ ١ ݓۅ ੹׳ PR ࠄޙب ܻ࠭੄ ؀࢚
  69. ௏٘ ܻ࠭ (੘স ױਤ ೖ٘ߔ) Navigator ޙઁо হח૑ Ѩૐೞח Ѫ਷

    ӝࠄ ߓ҃੉ա ੄ࢎѾ੿ ١ ݓۅ ੹׳ PR ࠄޙب ܻ࠭੄ ؀࢚ જ਷ PR਷ ܻ࠭যо ܻ࠭ೞӝ જ਷ PR
  70. ௏٘ ܻ࠭ (੘স ױਤ ೖ٘ߔ) Navigator ޙઁо হח૑ Ѩૐೞח Ѫ਷

    ӝࠄ ߓ҃੉ա ੄ࢎѾ੿ ١ ݓۅ ੹׳ PR ࠄޙب ܻ࠭੄ ؀࢚ જ਷ PR਷ ܻ࠭যо ܻ࠭ೞӝ જ਷ PR ௏٬ झఋੌ਷ ਟ݅ೞݶ ӝ҅о ೞب۾
  71. Navigator ഥҊ (੉ఠۨ੉࣌ ױਤ ೖ٘ߔ) ఒೞח җ੿੉ ইפۄ ؊ աই૑ӝ

    ਤೠ җ੿ х੿ী ؊ ࣛ૒೧૑Ҋ х੿ ࢚కܳ ؊ ݆੉ ҕਬೞӝ
  72. Navigator ഥҊ (੉ఠۨ੉࣌ ױਤ ೖ٘ߔ) ఒೞח җ੿੉ ইפۄ ؊ աই૑ӝ

    ਤೠ җ੿ х੿ী ؊ ࣛ૒೧૑Ҋ х੿ ࢚కܳ ؊ ݆੉ ҕਬೞӝ ৵ Ӓ۠ х੿ਸ וԕח૑ী ؀೧ࢲ ૘઺੸ਵ۽ ഥҊ೧ࠁӝ
  73. ѐੋ ഥҊ Fact ޖ঺ਸ ೮Ҋ Feeling ޖ঺ਸ וԕҊ Finding যڃ

    Үള੉ ੓঻׮ + Future Action ੉۠ Ѫٜਸ दب೧ ࠊঠѷ׮