๊ณต๋ถ€ ์—ฐ์Šต์žฅ :-)

TIL_2019_03

|

2019.03.05

    func onMapView(_ mapView: NMapView!, didChangeMapCenter location: NGeoPoint) {
        mapView.setMapCenter(location)
        self.fetchNearMarts(from: location)
    }
  • ๋„ค์ด๋ฒ„์ง€๋„์—์„œ POIData๋งŒ๋“ค์–ด์„œ ๋งˆ์ปค๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘๊ณผ mapview๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘์„ ๋™์‹œ์— ํ• ๋•Œ ๋ฌธ์ œ๋ฐœ์ƒ
  • ์ˆ˜์ •์ „: ์œ„์น˜๋ฅผ ํŠธ๋ž™ํ‚นํ•˜๋Š”๊ณณ(locationManager)์ด๋‚˜ ์ง€๋„๋ฅผ ์„ผํ„ฐ๋กœ ์˜ฎ๊ฒจ ๊ทธ๋ฆฌ๋Š” ๊ณณ(didMapCenterMoved)์—์„œ fetchNearMarts๋ฅผ ํ˜ธ์ถœํ•จ
  • ํ˜„์ƒ: ๋จผ์ € ๋งต๋ทฐ๊ฐ€ ํ‘œ์‹œ๋๋‹ค๊ฐ€ - ์œ„์น˜ ํŠธ๋ž™ํ‚น - ๋งˆ์ปค๊ทธ๋ ค์ง€๋Š” ๋ ˆ์ด์–ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ณ  ๋งต๋ทฐ ์„ผํ„ฐ๊ฐ€ ์˜ฎ๊ฒจ์ง€๋ฉด์„œ ์ง€๋„๊ฐ€ ์ƒˆ๋กœ ์•ˆ๊ทธ๋ ค์ง
  • ๊ทผ๋ฐ ์ƒˆ๋กœ ์•ˆ๊ทธ๋ ค์ง€๋Š”๊ฒŒ ๋งจ๋‚  ๋นˆ ํ™”๋ฉด์ด ์•„๋‹ˆ๋ผ ์–ดใ„ท์ฉ”๋•Œ๋Š” ๋ฐ˜์”ฉ ๊ทธ๋ ค์ง€๊ณ  ๋Š๋ฆฌ๊ฒŒ ๊ทธ๋ ค์ง€๊ณ  ๋˜ ์–ด๋–จ๋•Œ๋Š” ๊ฑฐ์˜ ํ™”๋ฉด์˜ 1/5๋งŒ ๊ทธ๋ ค์ง
  • ์˜ˆ์ƒ๋˜๋Š” ์›์ธ: ์ง€๋„์˜ center๋ฅผ ์˜ฎ๊ธฐ๊ณ  ๋‚˜์„œ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ fetchํ•˜๊ณ  ๋งˆ์ปค๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘์„ ํ•˜๋ฉด์„œ ์ง€๋„ ํ‘œ์‹œํ•˜๋ ค๋Š” ์ž‘์—…์ด๋ž‘ ๋งˆ์ปค ํ‘œ์‹œํ•˜๋ ค๋Š” ์ž‘์—…์ด ์ถฉ๋Œ(์–ด์ฉŒ๋ฉด ๋ฐ๋“œ๋ฝ - ๋‘˜๋‹ค ๋งต๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘์ด๊ณ  ์„ฑ๊ฒฉ์ด ๊ฐ™์€ ๋™์ž‘์ด๋ผ๋ฉด ๊ฐ™์€ ์Šค๋ ˆ๋“œ์—์„œ ์ง„ํ–‰๋  ์ˆ˜๋„ ์žˆ๊ธฐ๋•Œ๋ฌธ์—โ€ฆ?)๋‚˜์„œ ๊ทธ๋Ÿด์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•จ
  • ํ•ด๊ฒฐ: ์ง€๋„์˜ ์„ผํ„ฐ๊ฐ€ ์˜ฎ๊ฒจ์กŒ์„๋•Œ ๋งต๋ทฐ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘๊ณผ ๋งˆ์ปค ๊ทธ๋ฆฌ๋Š” ๋™์ž‘์„ ๋ถ„๋ฆฌํ•˜๋‹ˆ๊นŒ ์ž˜ ํ‘œ์‹œ๋จ

  • Swift์˜ enum์˜ rawValue๋ฅผ tuple๋กœ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?: ๊ทธ๋ƒฅ์€ ๋ชปํ•จ
    enum ErrorCode: (Int, String) {
      case Generic_Error = (0, "Unknown")
      case DB_Error = (909, "Database")
    }
    
  • ์ด๋Ÿด๋ฐ”์—” ์ฐจ๋ผ๋ฆฌ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์ž
    struct Trouble {
      static let Generic_Error = (0, "Unknown")
      static let DB_Error = (909, "Database")
    }
    
  • ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ enum์˜ rawValue๊ฐ’์œผ๋กœ ์“ฐ๊ณ ์‹ถ์€ ํŠœํ”Œํƒ€์ž…์„ RawRepresentableํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.
    enum ErrorCode: RawRepresentable {
      case Generic_Error
      case DB_Error
    
      var rawValue: (Int, String) {
          switch self {
          case .Generic_Error: return (0, "Unknown")
          case .DB_Error: return (909, "Database")
          }
      }
    
      init?(rawValue: (Int, String)) {
          switch rawValue {
          case (0, "Unknown"): self = .Generic_Error
          case (909, "Database"): self = .DB_Error
          default: return nil
          }
      }
    }
    
  • ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ๋‚˜๋Š” UIAlertViewController์— ๋„์šธ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ staticํ•œ ๋ณ€์ˆ˜์— ๋‹ด์•„๋†“๊ณ  ์‹ถ์–ด์„œ enum์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ programdescription์„ ์ ๋Š” enum์ด ๋„ˆ๋ฌด ์ปค์ ธ์„œ ๋ถ„๋ฆฌํ•˜๋ ค๋Š” ์šฉ๋„์˜€์œผ๋ฏ€๋กœ ๊ทธ๋ƒฅ struct๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค.

    • โ€˜ErrorAlertDescriptionโ€™ declares raw type โ€˜(title: String, message: String)โ€™, but does not conform to RawRepresentable and conformance could not be synthesized
    • enum์˜ rawValue๋Š” RawRepresentableํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ํƒ€์ž…๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ํ”„๋กœํ† ์ฝœ์€ ์ปค์Šคํ…€ํƒ€์ž…์„ ๋˜๋Œ๋ ค๋„(back and forth) ์—ฐ๊ด€๋œ rawValue๊ฐ’์œผ๋กœ ์›๋ž˜์˜ ๊ฐ’์„ ์œ ์ง€ํ•˜์—ฌ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ด์ค€๋‹ค.
    • RawRepresentable์€ ํฌ๊ฒŒ enumerations with raw value types์™€ option sets ๋‘๊ฐ€์ง€ ์นดํ…Œ๊ณ ๋ฆฌ ํƒ€์ž…์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ.
    • string, integer, or floating-point raw type๊ณผ ๊ฐ™์€ ํƒ€์ž…์„ ์—ด๊ฑฐํ˜•์œผ๋กœ ๋งŒ๋“ค๋ฉด, ์Šค์œ„ํ”„ํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ RawRepresentableํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด์ค€๋‹ค. (ํŠœํ”Œ์€ ์—ฌ๊ธฐ ์—†๋Š” ํƒ€์ž…์ด๋‹ˆ๊นŒ ์•ˆ๋œ๋‹ค๋Š” ์–˜๊ธฐ)

2019.03.09

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

2019.03.13

  • ์ „์ฒด ํ™”๋ฉด ์Šคํฌ๋กค๋ทฐ safeArea ํŠ•๊น€ ์ฆ์ƒ
  • UIScrollView์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์กฐ์ •ํ•˜๋ฉด ๋จ!
  • contentInsetAdjustmentBehavior
  • https://medium.com/rosberryapps/ios-safe-area-ca10e919526f
  • full screen scrollview์—์„œ ์Šคํฌ๋กค ๋™์ž‘์ด, ์ œ์ผ top์ด๋‚˜ bottom์œผ๋กœ ์Šคํฌ๋กค์„ ์›€์ง์˜€์„๋•Œ content inset์ด ์ž๋™์œผ๋กœ ์กฐ์ •๋˜์–ด ์ปจํ…์ธ ๊ฐ€ ๊ฑธ๋ฆฌ๋“ฏ์ด ๋‚ด๋ ค๊ฐ€๊ฑฐ๋‚˜ ์˜ฌ๋ผ๊ฐ€๊ฒŒ๋œ๋‹ค.
  • contentInsetAdjustmentBehavior์˜ ๊ธฐ๋ณธ ๊ฐ’์€ automatic์ด๊ณ , ์•Œ์•„์„œ safeArea๋ฅผ ์žก์•„์ค€๋‹ค.

2019.03.14

  • Swift Algorithm club Binary Search tree

2019.03.21

  • GCD block ๊ณผ animation block์—์„œ ์™œ retain cycle์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๊ฐ€์— ๋Œ€ํ•œ ํ† ๋ก  https://www.reddit.com/r/swift/comments/8fyxlr/why_gcd_and_animate_block_is_not_strong_reference/

2019.03.28

SKStoreProductViewController๋Š” ์•ฑ์Šคํ† ์–ด์—๋ฅผ ๋ชจ๋‹ฌ ๋ทฐ๋กœ ๋„์›Œ์ฃผ๋Š” ๋ทฐ์ปจ์ž„. ๊ทผ๋ฐ ์ด๊ฑธ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ๋ ๊ฑฐ๊ฐ™์€๋ฐโ€ฆ? ์—…๋ฐ์ดํŠธ๋Š” ์•ฑ์ด ๊บผ์ง„ ์ƒํƒœ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ๋ชจ๋‹ฌ๋ทฐ๋กœ ์•ฑ์Šคํ† ์–ด๊ฐ€ ๋„์›Œ์ง€๊ณ โ€ฆ ์ผ๋‹จ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์—…๋Žƒ์ด ์‹คํ–‰๋˜๋ฉด์„œ ์•ฑ์ด ์ข…๋ฃŒ๋ ํ…๋ฐ ์ด๋ฏธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ž…๋ ฅํ–ˆ์œผ๋‹ˆ๊นŒ ์„ค์น˜ํ•˜๋ผ๋Š” ๋ช…๋ น์€ ์ž…๋ ฅ๋œ๊ฑฐ๊ณ  ๊ทธ ๋’ค๋ผ์„œ ์ƒ๊ด€์ด์—†๋Š”๊ฑด๊ฐ€..? ์ฐพ์•„๋ณด๋‹ˆ๊นŒ ๋‚˜์˜ ๋‘๋ฒˆ์งธ ์ถ”์ธก์ฒ˜๋Ÿผ ์—…๋ฐ์ดํŠธ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์•ฑ์ด kill๋˜๊ณ  ์•Œ์•„์„œ ์—…๋ฐ์ดํŠธ๋˜๋Š”๊ฑฐ ๊ฐ™์Œ(์ฐธ๊ณ ) !! ์•„๋‹˜. ๊ทธ๋ƒฅ openurl๋กœ ์•ฑ ์™ธ๋ถ€์—์„œ ์•ฑ์Šคํ† ์–ด๋ฅผ ํ‚ด. ์ด๋ ‡๊ฒŒ ๋ฐ”๊พผ ์ด์œ ๋Š” ๋Ÿฐ์น˜์Šคํฌ๋ฆฐ์—์„œ ๋ฉˆ์ถค์ƒํƒœ๋กœ (๋งํ•˜์ž๋ฉด rootViewController์„ ๋Ÿฐ์น˜์Šคํฌ๋ฆฐ์œผ๋กœ ๋Œ€์ฒดํ•œ ์ƒํƒœ๋กœ) ์•ฑ์Šคํ† ์–ด ๋ทฐ์ปจ์„ ์—ฌ๋Š”๊ฑด๋ฐ modal๋กœ ์—ฌ๋‹ˆ๊นŒ ์ƒ๊ด€์—†์„ ๊ฒƒ ๊ฐ™๊ธดํ•˜์ง€๋งŒ, ๊ทธ๋ž˜๋„ ๋Ÿฐ์น˜์Šคํฌ๋ฆฐ์—์„œ ๋ฉˆ์ถฐ์žˆ๋Š”๋ฐ Storekit์„ ๋‚ด๋ถ€์—์„œ ์—ฌ๋Š”๊ฒŒ ์ข€ ์–ด์ƒ‰ํ•˜๊ฒŒ ๋Š๊ปด์กŒ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์•ฑ์ด kill๋˜๋Š”๊ฒŒ ๋ถ„๋ช…ํ•œ๋ฐ ๊ผญ ์•ฑ ๋‚ด๋ถ€์—์„œ ์•ฑ์Šคํ† ์–ด ๋ทฐ์ปจ์„ ๋„์šฐ๋Š”๊ฒŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋งž๋Š” ๋ฐฉ์‹์ธ๊ฐ€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ๋‹ค.

ํ…Œ์ŠคํŠธํ•ด๋ณด๋‹ˆ๊นŒ itms-apps:// ์Šคํ‚ด์ด ๋™์ž‘ํ•ด์„œ ์•ฑ์Šคํ† ์–ด๊ฐ€ ์™ธ๋ถ€์—์„œ ์—ด๋ ธ๊ณ , ๋‚ด ์•ฑ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ์ƒํƒœ. ์—ฌ๊ธฐ์„œ ์•ฑ์„ ๋‹ค์‹œ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๋Žƒํ•˜๋Š” ๋™์ž‘์„ ํ•˜๋‹ˆ ์‹œ์Šคํ…œ์ด ์•ฑ์„ terminated์‹œํ‚ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

์ฐพ์•„๋ณด๋‹ˆ๊นŒ ์•ฑ์—์„œ Storekit์„ ์‚ฌ์šฉํ•˜๋ฉด, ์•ฑ์ถ”์ฒœ๊ณผ ๋ฆฌ๋ทฐ / ์ธ์•ฑ ๊ตฌ๋งค / ์• ํ”Œ๋ฎค์ง ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ค๋ช…๋˜์–ด์žˆ๋‹ค.

TIL_2019_02

|

2019.02.05


            let branchResponse = response.result.value

            if response.result.isSuccess {
                print(response.result.value)
                print(response.result.value?[0].branchName)
                print(response.result.value?[0].latitude)
            }

2019.02.07

  • Message from debugger: Terminated due to signal 9
    • ์—ก ์‹คํ–‰์ค‘์— ์‹œ์Šคํ…œ์„ค์ •์— ๋“ค์–ด๊ฐ€์„œ ์•ฑ์— ๋Œ€ํ•œ ์„ค์ •์„ ๋ฐ”๊พธ๋ฉด(ex. ์นด๋ฉ”๋ผ ์„ค์ •, ์•Œ๋ฆผ ์„ค์ • ๋“ฑ๋“ฑ..) ์•ฑ์ด terminated๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.
    • ์•ฑ ์„ค์ •์„ ๋ฐ”๊พธ๋ฉด ์„ค์ •์— ๋”ฐ๋ผ ์•ฑ์ด ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ด์•ผํ•˜๋‹ˆ ์‹œ์Šคํ…œ์—์„œ ์•ฑ ๊ตฌ๋™์„ ์ค‘๋‹จ์‹œ์ผœ๋ฒ„๋ฆฌ๋‚˜๋ณด๋‹ค. ์ด๊ฑด xcode์— ํฐ์„ ์ง์ ‘ ์—ฐ๊ฒฐํ•ด์„œ ํ™•์ธํ•ด๋ณผ์ˆ˜๋ฐ–์— ์—†์œผ๋‹ˆ ์‹ค์ œ ์•ฑ์Šคํ† ์–ด์—์„œ ๊ตฌ๋งค/์„ค์น˜๋œ ์•ฑ๋„ ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€๋Š” ๋” ์•Œ์•„๋ด์•ผํ•จ.

2019.02.20

  • @IBOutlet weak var
    • xib์—์„œ ๋ฉ”์ธ ๋ทฐ ํŒŒ์ผ?์ด ์•„๋‹Œ ๋”ฐ๋กœ ๋–จ์–ด์ ธ์žˆ๋Š” ๋ทฐ ์ค‘์— ์žˆ๋Š” ๋ทฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ weak์„ ์“ฐ๋ฉด ์‹œ์ ์— ๋”ฐ๋ผ nil์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ณ  ์•„๋‹Œ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ.
    • ์˜๋ฌธ๋„ ๋ชจ๋ฅด๊ณ  nil๋˜์–ด๋ฒ„๋ฆผ;
    • ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ
    • ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ๋ทฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๊ฒƒ๊ณผ ์•„๋‹Œ ๊ฒฝ์šฐ์˜ ์ฐจ์ดโ€ฆ?

2019.02.27

  • ์Šคํฌ๋กค๋ทฐ offset๊ณผ inset
  • xib์—์„œ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์ค€ ๋ทฐ์— ์ฝ”๋“œ๋กœ frame์„ ์ค„๋•Œ ์šฐ์„ ์„ฑ

TIL_2019_01

|

2019.01.02

  • git remote origin ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ• ์ผ์ด ์ƒ๊ฒผ๋‹ค.
  • ํ„ฐ๋ฏธ๋„์—์„œ ํ•ด๋‹น ๊ฒฝ๋กœ์˜ .gitํŒŒ์ผ๋กœ ์ ‘๊ทผํ•˜๊ณ , vi๋กœ git configํŒŒ์ผ์„ ์—ด์–ด์„œ remote origin๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.
  • ์ €์žฅํ›„ ๋‹ค์‹œ ์ƒ์œ„๊ฒฝ๋กœ (.gitํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ)๋กœ ์ด๋™ํ•ด์„œ git remote -v๋ช…๋ น์–ด๋กœ ๋ณด๋ฉด ์ฃผ์†Œ๊ฐ€ ๋ฐ”๊ปด์žˆ๋‹ค.
  • ์ปค๋ฐ‹ํ›„ ๋ณ€๊ฒฝ๋œ origin์ฃผ์†Œ๋กœ ์ตœ์ดˆ ํ‘ธ์‹œ ํ• ๋•Œ remote์ €์žฅ์†Œ์˜ username๊ณผ password์ž…๋ ฅ์„ ์š”์ฒญํ•˜๋Š”๋ฐ, ์ด๋•Œ ํ•ด๋‹นํ•˜๋Š” ์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ‘ธ์‹œ ์„ฑ๊ณต
  • cf) gitconfigํŒŒ์ผ์—์„œ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  git remote set-url ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋„๋œ๋‹ค.
    • ์˜ˆ์‹œ) git remote set-url origin https://github.com/user/repo2
    • ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง„๋‹ค.
    • ๊ธฐ์กด ์›๊ฒฉ ์ €์žฅ์†Œ ์ด๋ฆ„: origin
    • ์ƒˆ๋กœ์šด ์›๊ฒฉ ์ €์žฅ์†Œ URL : https://github.com/user/repo2.git
  • ์ฐธ๊ณ ๋งํฌ - ๋ฏผ์†Œ๋„ค ๋ธ”๋กœ๊ทธ

2019.01.03

  • ์ปค๋ฎค๋‹ˆํ‹ฐํƒญ(ํƒ€์ž„๋ผ์ธ๋ทฐ์ปจ ๋ฆฌํŒฉํ† ๋ง)
  • CommunityMainViewController
  • ์ปจํ…Œ์ด๋„ˆ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ - ๊ฒฐํ˜ผ์ค€๋น„/์˜ˆ์‹ /์ƒˆ๋Œ๋ฐฉ/์Šค๋“œ๋ฉ”๊ฒฌ์ 
  • UITabBarController

2019.01.04

  • ๋งˆํŠธ์•ฑ์—์„œ ๋งˆํŠธ ์ฃผ์†Œ ๋ณต์‚ฌํ–ˆ์„๋•Œ ํด๋ฆฝ๋ณด๋“œ ๋„์šฐ๊ธฐ๋ฅผ ์œ„ํ•ดโ€ฆ ์‡ผํ•‘๋ชฐ ์•ฑ์—์„œ ์•„์ฃผ ์ž˜ ์‚ฌ์šฉํ–ˆ๋˜ ์ „์ˆ˜์—ด๋‹˜์˜ Toaster ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค. ๋šœ๋‘ฅ ํ•˜์ง€๋งŒ unittest๋ฅผ ์œ„ํ•ด์„œ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ ํƒ€๊ฒŸ์˜ swift๋ฒ„์ „์ด 4๋ผ์„œ ๋ญ”๊ฐ€ ์•ˆ๋๋‹ค.
  • ์–ด์ฐจํ”ผ ์ผ๋‹จ ํ…Œ์ŠคํŠธ์—๋Š” pod์ด ํ•„์š”ํ•˜์ง€์•Š๊ธฐ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธํƒ€๊ฒŸ์—” pod์ด ์„ค์น˜๋˜์ง€ ์•Š๋„๋ก ํ•จ.
  • ์ด๋žฌ๋”๋‹ˆ ๋˜โ€ฆ๋ช‡๋ช‡ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์Šค์œ„ํ”„ํŠธ ๋ฒ„์ „์ด ๋งž์ง€ ์•Š์•„์„œ ๋นŒ๋“œ๊ฐ€ ์•ˆ๋จ!
  • ๊ทธ๊ฑฐ ๊ณ ์น˜๋‹ค๊ฐ€ UIWindow.level์ด๋ž€๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค!
  • window๊ฐ„์˜ ์ƒ๋Œ€์ ์ธ level์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ๋‚œ zposition๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” windowLevel์„ CGFloat๊ฐ’์˜ ์ตœ๋Œ€๊ฐ’์„ ์ค€๊ฑฐ๊ฐ™์€๋ฐ, (CGFloat.greatestFiniteMagnitude)์ด๊ฒŒ UIWindow.Level๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ ๊ฐ™์Œ.(https://zeddios.tistory.com/567)
  • pod update [PODNAME]์„ ์ด์šฉํ•ด์„œ ์›ํ•˜๋Š” pod๋งŒ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

2019.01.07

  • UIScrollView์˜ contentOffset.y
    • https://www.youtube.com/watch?v=fgwVqCGgHZA
    • ์Šคํฌ๋กค๋ฐ”๊ฐ€ ๋‚ด๋ ค๊ฐˆ๋•Œ(content ๋ทฐ๊ฐ€ ์˜ฌ๋ผ๊ฐˆ๋•Œ) contentOffset.y๊ฐ€ ์ปค์ง
    • ์Šคํฌ๋กค๋ฐ”๊ฐ€ ์˜ฌ๋ผ๊ฐˆ๋•Œ(content ๋ทฐ๊ฐ€ ๋‚ด๋ ค๊ฐˆ๋•Œ) contentOffset.y๊ฐ€ ์ž‘์•„์ง
  • ํ•œ ํ…Œ์ด๋ธ”๋ทฐ ์•ˆ์—์„œ ๋‹ค๋ฅธ ๋””์ž์ธ์˜ ์…€์„ ๊ตฌํ˜„ํ•˜๊ธฐโ€ฆ(์ด๋ ‡๊ฒŒ ํ• ์ˆ˜๋ฐ–์—์—†๊ตฌ๋งŒใ… ใ… )
    • https://medium.com/@stasost/ios-how-to-build-a-table-view-with-multiple-cell-types-2df91a206429

2019.01.09

  • Detached head..๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ๊ธฐํ•˜๊ณ ์‹ถ์–ด์„œ ํ˜„์žฌ ์ปค๋ฐ‹์ƒํƒœ์ธ ์ƒํƒœ์—์„œ ์ผ๋ถ€๋Ÿฌ git checkout ํ˜„์žฌ์ปค๋ฐ‹ ์ด๋ ‡๊ฒŒ ํ–ˆ๋”๋‹ˆ ์ด๋ ‡๊ฒŒ๋˜์–ด๋ฒ„๋ ธ๋‹ค.. ``` mijinjeon@iMac-2 ๎‚ฐ ~/Documents/practice/iOS/Cloning/Cloning-wdb ๎‚ฐ ๎‚  master โ— ๎‚ฐ git checkout cbb9592d4f350e25ad4d06aa4afb67299d89642b M CloneWDB/CloneWDB.xcodeproj/project.xcworkspace/xcuserdata/mijinjeon.xcuserdatad/UserInterfaceState.xcuserstate Note: checking out โ€˜cbb9592d4f350e25ad4d06aa4afb67299d89642bโ€™.

You are in โ€˜detached HEADโ€™ state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example:

git checkout -b

HEAD is now at cbb9592 Add assets ```

  • HEAD๊ฐ€ detached์ƒํƒœ๋ฉด ์ปค๋ฐ‹์„ ์žƒ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. git refs ๋‚ด์˜ ๋Œ์•„๊ฐ€๊ณ ์‹ถ์€ ์ปค๋ฐ‹์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๊ณ , (์‹ฌ์ง€์–ด ๋‚˜๋Š” abc123์ปค๋ฐ‹์ƒํƒœ์—์„œ abc123์œผ๋กœ ์ฒดํฌ์•„์›ƒ์„ํ•ด๋ฒ„๋ฆผ..) ์ด๋•Œ ์ž„์‹œ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž„์‹œ ๋ธŒ๋žœ์น˜๋กœ ์ฒดํฌ์•„์›ƒํ–ˆ๋‹ค๊ฐ€ ์›๋ž˜ ๋ฌธ์ œ๊ฐ€ ๋œ detached HEAD์ƒํƒœ์˜ ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„์˜ค๋ฉด, ๋ธŒ๋žœ์น˜๊ฐ€ ๋Œ์•„์™”์„๋•Œ ์ž๋™์œผ๋กœ ์ตœ์‹  ์ปค๋ฐ‹์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๊ธฐ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!
  • ์ฐธ๊ณ ๋งํฌ

2019.01.10

  • ๋งˆ์Œ์„ ๋‹ค์žก์•„์•ผํ•œ๋‹ค! ์˜ค๋Š˜ ๋งˆ์Œ ๋‹ค์žก๊ณ  ์•ฑ ํด๋กœ๋‹ ์‹œ์ž‘ํ–ˆ๋‹ค. ์•ž์œผ๋กœ ๊ณผ์—ฐ ํ• ์‹œ๊ฐ„์ด์žˆ์„๋Ÿฐ์ง€๋‚˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ..ใ…Ž_ใ…Ž;
  • XLPagerTabStrip ์งท์ข‹๋‹ค. ๋งŽ์€ ๋ถ€๋ถ„์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„๋“ฏ
  • UIScrollView์•ˆ์— UIStackView ๋„ฃ์–ด์„œ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์กฐ์ •ํ•ด์„œ ์Šคํฌ๋กค ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š”๊ฑด ๋ช‡๋ฒˆ์„ ํ•ด๋„โ€ฆํ•œ๋ฒˆ์— ๋œ ์ ์ด ์—†๋„คใ… ใ…  ํ•ญ์ƒ ๋ฐ๋ชจ๋กœ ํ• ๋•Œ๋Š” ์ž˜๋˜๋Š”๊ฑฐ๊ฐ™์€๋ฐ.. ์•„์ง ์ž˜ ๋ชจ๋ฅด๋Š”๊ฑฐ ์ดํ•ดํ•˜๊ณ ์‹ถ๋‹ค.

2019.01.28

  • ํ•ด์ปค๋žญํฌ ๋ฌธ์ œ๋ฌธ์ œ
    • https://www.hackerrank.com/challenges/day-of-the-programmer/problem
    • ๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๋‹คโ€ฆ ๋‹ค ๊ผผ๊ผผํžˆ ์ฝ์„ ํ•„์š” ์—†๋Š”๋ฐ ๋‹ค ์ฝ๋Š๋ผ ์‹œ๊ฐ„๋ณด๋ƒ„
    • ๊ฒฐ๊ตญ ๋‚ด๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ์œ ํ˜•์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋Š”๊ฒƒโ€ฆ๊ณต๋ถ€์ข€ ํ•˜์ž ใ… ใ… 

2019.01.29

  • ํ•ด์ปค๋žญํฌ ๋ฌธ์ œ๋ฌธ์ œ ๋˜ ํ’ˆ
    • https://www.hackerrank.com/challenges/strong-password/problem
    • UI๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ์ง„์งœ ์“ฐ๋˜ ํด๋ž˜์Šค์˜ ์“ฐ๋˜ ๋ฉ”์†Œ๋“œ๋งŒ ์“ฐ๊ฒŒ๋˜๋Š”๋ฐ ์—„์ฒญ ์‰ฌ์šด๋ฌธ์ œ๋ผ๋„ ํ’€์–ด๋ณด๋‹ˆ๊นŒ ๊ธฐ๋ณธ์ ์ธ ์Šค์œ„ํ”„ํŠธ ๋ฌธ๋ฒ•์„ ๋‹ค์‹œ ์ตํžˆ๋Š” ๊ธฐ๋ถ„์ด๋ผ ๋ณด๋žŒ์ฐจ๋‹ค. dictionary๋Š” ํ‰์†Œ์— ์ž˜ ์‚ฌ์šฉ์„ ์•ˆํ•ด์„œ ๋ชฐ๋ž๋Š”๋ฐ, ๋ฐ”๋กœ value์— ์ ‘๊ทผํ•ด์„œ ๊ฐ’ ํ•„ํ„ฐ๋ง์„ ํ• ์ˆ˜์žˆ์—ˆ๋‹คโ€ฆ๋œ๋œ ๋‚ด๊ฐ€ ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ์•ˆ๊ฑด๊ฐ€

2018๋…„ ํšŒ๊ณ 

|

ํšŒ๊ณ 

๋Œ์ด์ผœ๋ณด๋ฉด 29์‚ด์˜ ๋‚˜๋Š” ์ง€๋‚œ ๊ทธ ์–ด๋–ค ํ•ด ๋ณด๋‹ค ์—ด์‹ฌํžˆ(?) ์‚ด์•˜๊ณ  ๋งŽ์€ ๊ฒƒ์„ ํ–ˆ๋‹ค.

๋”ฑํžˆ 20๋Œ€์˜๋งˆ์ง€๋ง‰, ๋งˆ๋ฌด๋ฆฌ๋ผ๋Š” ์˜๋ฏธ๋กœ ์—ด์‹ฌํžˆ ํ•œ๊ฑด ์•„๋‹ˆ๊ณ  ์–ด์ฉŒ๋‹ค๋ณด๋‹ˆ ํƒ€์ด๋ฐ์ด ์ด๋ ‡๊ฒŒ ๋์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋งˆ์Œ ํ•œ์ผ ์—” 20๋Œ€์ผ๋•Œ ํ•˜๊ณ ์‹ถ์—ˆ๋˜ ์ผ์„ ๋งˆ๋ฌด๋ฆฌํ•˜์ž๋Š” ์˜๋ฏธ์—์„œ ์ข€๋” ์—ด์‹ฌํžˆ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ •๋ง ์ด์ œ 20๋Œ€๋กœ(๋งŒ ๋‚˜์ด๋ง๊ณ โ€ฆ) ์‚ด์•„๊ฐˆ ๋‚ ์ด ํ•˜๋ฃจ ๋ฐ–์— ๋‚จ์ง€ ์•Š์•˜๊ธฐ๋•Œ๋ฌธ์—, ๋ญ”๊ฐ€ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ์ž˜ ํ•˜๊ณ ์‹ถ์€ ์˜๋ฏธ์—์„œ 2018๋…„ ํšŒ๊ณ ๋ฅผ ์“ด๋‹ค!

2018๋…„์— ์ผ์–ด๋‚œ ํฐ์ผ๋“ค

  • 2018๋…„์˜ ๋‚˜๋Š” ์ฝ”๋“œ์Šค์ฟผ๋“œ๋ฅผ ์กธ์—…ํ–ˆ๊ณ , ๊ฐœ์ธ์•ฑ์„ ์ถœ์‹œํ–ˆ์œผ๋ฉฐ, iOS๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…ํ–ˆ๋‹ค.

๊ฐœ์ธ์•ฑ์„ ์ถœ์‹œํ–ˆ๋‹ค.

์ด์ „์— ๋งˆํŠธ์‰ฌ๋Š”๋‚  ํšŒ๊ณ  ๊ธ€์—์„œ๋„ ๋ฐํ˜”์ง€๋งŒ, ์ฒ˜์Œ iOS ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ• ๋•Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€๊ฐ€ ์–ด๋Š์ •๋„ ๋˜๋ฉด ๋‚˜์—๊ฒŒ ํ•„์š”ํ•œ ์•ฑ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด์ž๋Š” ๋ชฉํ‘œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹จ์ˆœํ•œ ๋‹ค์ง์—์„œ ์‹œ์ž‘ํ•ด์„œ ๊ฒฐ๊ตญ์—” ์ง„์งœ๋กœ ์•ฑ์„ ์ถœ์‹œํ•ด๋ฒ„๋ ธ๋‹ค. (์•ฑ์Šคํ† ์–ด์— ๊ฐœ๋ฐœ์ž ์ •๋ณด์— MIJIN JEON์žˆ๋Š”๊ฒŒ ์•„์ง๋„ ์‹ ๊ธฐํ•˜๋‹ค.)

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

๊ณ„์† ๋†“์ง€์•Š๊ณ  ์œ ์ง€ / ์—…๋ฐ์ดํŠธ ํ•  ์ƒ๊ฐ์ด๋‹ค. ์ด ์•ฑ์„ ๋งŒ๋“ค๋ฉด์„œ์˜ ๊ฒฝํ—˜์„ ํ†ตํ•ด์„œ ๋‹ค๋ฅธ ์•ฑ์„ ๋” ์ž˜ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ •๋ง ๋ฟŒ๋“ฏํ•œ ์ผ์ด๋‹ค.

iOS๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์—ˆ๋‹ค.

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

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

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

ํ™ˆํƒ€์šด ์ฝ”๋“œ์Šค์ฟผ๋“œ

NHN๋„ฅ์ŠคํŠธ๋ฅผ ์กธ์—…ํ•œ ๋‚ด ์ ˆ์นœ ์†กํฌ์—๊ฒŒ ๋‚˜ ๊ฐœ๋ฐœ์ž ํ•ด๋ณผ๊นŒ..? ๋ผ๊ณ  ํ•œ ์งˆ๋ฌธ์— ์†กํฌ๋Š”,

์ผ๋‹จ ํฅ๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์•Œ๊ธฐ์œ„ํ•ด ์ƒํ™œ์ฝ”๋”ฉ์„ ์ฒœ์ฒœํžˆ ๋ด. ๊ทธ๋Ÿฌ๊ณ ๋„ ํ•˜๊ณ ์‹ถ์€ ๋งˆ์Œ์ด ๋“ค๋ฉด ๋„ฅ์ŠคํŠธ ๊ต์ˆ˜ ์ถœ์‹ ์ธ ๋ถ„๋“ค์ด ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ต์œก๊ธฐ๊ด€์ด ์žˆ์–ด. ๊ฑฐ๊ธธ ์ถ”์ฒœํ•ด.

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

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

Welcome 2019!

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

์ด์— ๋Œ€ํ•œ ๋ณด์ƒ์œผ๋กœ 30๋Œ€๋•Œ๋Š” ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉด์„œ ์ข€ ๋” ์•ˆ์ •์ ์œผ๋กœ ์‚ด๊ณ ์‹ถ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ๊ฒฉ์ ์œผ๋กœ๋„ ์ง๋ฌด์ ์œผ๋กœ๋„ ์ข€ ๋” ์„ฑ์ˆ™ํ•œ ์‚ฌ๋žŒ์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค! ์•ž์œผ๋กœ๋Š”

  • ์ฃผ๋ณ€ ์ƒํ™ฉ์ด๋‚˜ ํ™˜๊ฒฝ์„ ํ•‘๊ณ„๋Œ€์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์ด ๋˜์–ด์•ผ์ง€
  • ๊ฑฑ์ • ์‚ฌ์„œ ํ•˜๋Š” ์„ฑ๊ฒฉ์ข€ ๊ณ ์น˜๊ณ  ๊ฑฑ์ •ํ•  ์‹œ๊ฐ„์— ๋‹น์žฅ ๋‚ด๊ฒŒ ๋„์›€๋  ๊ฒƒ์„ ๋จผ์ € ํ•ด์•ผ์ง€
  • ๊ฑฐ์ฐฝํ•œ ๋ชฉํ‘œ์—๋งŒ ์ง‘์ค‘ํ•˜์ง€ ๋ง์•„์•ผ์ง€
  • ๋ง‰๋ง‰ํ•˜๋ฉด ์ง€๊ธˆ ๋‹น์žฅ ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ๊ฒƒ ๋ถ€ํ„ฐ ํ•˜์ž
  • ์ ˆ๋Œ€ ์•Œ๋˜๋Œ€๋กœ, ํ•ด์˜ค๋˜๋Œ€๋กœ ์ฝ”๋”ฉํ•˜์ง€ ๋ง์•„์•ผ์ง€
  • ๋ฐ”์ด๋ฐ”์ด 2018! ์ž˜ ๊ฐ€๋ฒ„๋ ค๋ผ ~_~ ํ› ์ด

TIL_20181220 ~ 20181231

|

2018.12.20

  • TIL๋‹ค์‹œ ์‹œ์ž‘!: ์ž…์‚ฌํ•˜๊ณ  ๊ทธ๋™์•ˆ ์ ์‘ํ•˜๊ธฐ ๋ฐ”์˜๊ณ  ์ถœํ‡ด๊ทผ์ด ํž˜๋“ค๋‹ค๋Š” ํ•‘๊ณ„๋กœ ๊ณต๋ถ€๋ฅผ ์†Œํ™€ํžˆโ€ฆ.์•„๋‹ˆ ๊ทธ๋ƒฅ ์™„์ „ ์•ˆํ–ˆ๋‹ค.(ใ…Žใ…Žใ…Ž;) ์ผ๋งŒํ•˜๊ณ  ํšŒ์‚ฌ ์ฝ”๋“œ๋งŒ ๋ณด๋‹ค๋ณด๋ฉด ์‹ค๋ ฅ์ด ๋Š˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ •์‹ ์ฐจ๋ฆฌ๊ณ  ํ•œ์‹œ๊ฐ„์ด๋ผ๋„ ๊ฐœ๋ฐœํ•˜๋Š” ์Šต๊ด€์„ ๊ธธ๋Ÿฌ์•ผ๊ฒ ๋‹ค!

2018.12.23

  • ์–‘ํฌ์žฌ ์šด์˜์ฒด์ œ
  • ๊น€์ • ์ฝ”์ฝ”์•„์ธํ„ฐ๋„์ฆˆ
  • RxSwift

2018.12.27

  • Rx์‹œ์ž‘!
  • ๊ณฐํŠ€๊น€๋‹˜์˜ RxSwift๊ฐ•์˜ ๋“ฃ๊ธฐ: Functional Reactive Programming ํŒจ๋Ÿฌ๋‹ค์ž„
  • ๋ณ‘๋ ฌํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ write๋ฅผ ํ• ๋•Œ read์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€
  • Immutable์ด ๋‚˜์˜ค๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ
  • asyncํ•œ ์ƒํ™ฉ์—์„œ asyncํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋ƒ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด: Reactive!!!!
  • data๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœํ˜๋ ค๋ณด๋‚ธ๋‹ค!

ํ•จ์ˆ˜ํ˜•ํ”„๋กœ๊ทธ๋ž˜๋ฐ?

  • ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ side-effect์—†์ด ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๊ฒƒ!
  • OOP์—์„œ ์ตœ์„œ ๋ชจ๋“ˆ๋‹จ์œ„: ๋ฉค๋ฒ„๋ณ€์ˆ˜ / ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด(Object)๋‹จ์œ„ ํ•˜๋‚˜! ์˜ค๋ธŒ์ ํŠธ ํ•˜๋‚˜๊ฐ€ ์Šค์Šค๋กœ state๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ํ•จ์ˆ˜ํ˜•ํ”„๋กœ๊ทธ๋ž˜๋ฐ: input์— ๋Œ€ํ•œ output์ด(์ˆœ์ˆ˜ํ•จ์ˆ˜) ์—ฐ๊ฒฐ์ด ๋˜์–ด ํ•˜๋‚˜์˜ ์ปค๋‹ค๋ž€ ์•„์›ƒํ’‹์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ์ƒํƒœ์— ๋”ฐ๋ผ์„œ output์ด ๋‹ฌ๋ผ์ง€๋Š” ์ผ์ด ์—†๋‹ค. ๋ชจ๋“ˆ์˜ ์ตœ์†Œ๋‹จ์œ„๋Š” ํ•จ์ˆ˜ ํ•˜๋‚˜!
  • ๋‘˜์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” state๊ฐ€ ์žˆ๋ƒ ์—†๋ƒ์— ๋”ฐ๋ฆ„
  • ๋ช…๋ นํ˜• vs ์„ ์–ธํ˜• / how vs what
  • ๋‚ด๊ฐ€ ํ•˜๋Š”(ํ•˜๋ ค๋Š”) ๋™์ž‘์„ how๋กœ ํ‘œ์‹œํ•˜๊ณ ์žˆ๋Š๋ƒ, what์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ ์žˆ๋Š๋ƒ์— ๋”ฐ๋ฅธ ์ฐจ์ด๊ฐ€ ์žˆ์Œ
    • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฝ์Œ์œผ๋กœ์„œ ์–ด๋–ค๊ฑธ ํ• ์ง€(what)์•Œ ์ˆ˜ ์žˆ๋‹ค.

2018.12.28

  • wdb ํƒ€์ž„๋ผ์ธ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ;;;๋ฆฌํŒฉ;;;ํ† ๋ง;;;;;
    • ์ปจํ…Œ์ด๋„ˆ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
    • ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์€ ๋ทฐ ํŽ˜์ด์ €๋ฅผ ์ด์šฉํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ์— ์—ฌ๋Ÿฌ ๋ทฐ๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ํ•จ
    • https://coding-factory.tistory.com/206
  • ๋งˆํŠธ์‰ฌ๋Š”๋‚  ํ–„๋ฒ„๊ฑฐ๋ฉ”๋‰ด ์—†์• ๊ณ  ํƒญ๋ฐ”์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ณ€๊ฒฝ!?!!!์—†์• ์—†์• (?)

2018.12.29

  • tabbarcontroller

2018.12.27

  • ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋กœ ํ…Œ์ด๋ธ”๋ทฐ๋ฅผ ๊ทธ๋ ค๋ณด์ž
    • https://www.youtube.com/watch?v=ADyiVY5wiVk