<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ZeddiOS</title>
    <link>https://zeddios.tistory.com/</link>
    <description>iOS Developer. Swift lover. Xcoder.

Be truth seekers</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 15:58:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Zedd0202</managingEditor>
    <image>
      <title>ZeddiOS</title>
      <url>https://tistory1.daumcdn.net/tistory/2581856/attach/68dc98ecfa7c464ca31019bf9248c1f0</url>
      <link>https://zeddios.tistory.com</link>
    </image>
    <item>
      <title>[Swift] Typed throws</title>
      <link>https://zeddios.tistory.com/1414</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-16-release-notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&amp;nbsp;Xcode 16 릴리스 노트&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;를 보다가...새롭게 알게 된 내용이 있어서 간단히 정리!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# Typed throws&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 한마디로&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721545666399&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum MyError: Error {
    case invalid
}

func foo() ➡️throws(MyError)⬅️ -&amp;gt; String { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 throws할 때 에러 타입을 지정할 수 있게 되는 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 foo메소드는 String을 리턴하거나, &lt;b&gt;오직 MyError타입의 에러만 throw할 수 있다&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721545804364&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum OtherError: Error {
    case 저쩌구
}
    
    
func foo() throws(MyError) -&amp;gt; String {
    do {
        try ~~~~~~
    } catch {
        throw OtherError.저쩌구 //   Thrown expression type 'ViewController.OtherError' cannot be converted to error type 'ViewController.MyError'
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;만약&amp;nbsp;&lt;/span&gt;MyError가 아닌 타입을 throw하려고 하면 컴파일 에러가 발생하게 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(위 예제에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;My&lt;/b&gt;&lt;/span&gt;Error가 아닌 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Other&lt;/span&gt;&lt;/b&gt;Error를 throw하려고함)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기존에 사용하던것 처럼 타입을 지정하지 않으면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721545993976&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func bar() throws -&amp;gt; String { }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;throws(any Error)와 동일하다. (모든 에러타입을 넘기기 가능)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고..Typed throws추가되면서 do throws문도 추가된 것 같다..?!&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# do throws(에러타입)&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1721550032856&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum MyError: Error {
    case invalid
}

do throws(MyError) {
    if true {
        throw .invalid
    }
} catch {
    // error는 MyError로 추론됨
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;do throws(Error타입) ⬅️ 이런식으로 쓸 수 있는 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;catch블록 내의 error는 당연히 해당 에러타입이 된다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 에러타입 추론&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 do 블록 내의 모든 throw문에서 발생하는 에러타입이 &lt;b&gt;동일할경우&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721550586219&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do /*infers throws(MyError)*/ {
    try foo()  // throws MyError
    if true {
        throw MyError.invalid  // throws MyError
    }
} catch {
    // implicit 'error' value has type MyError
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;catch블록에서 error는 해당 에러타입으로 추론된다고 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(do throws(동일하게 발생하는 에러타입)으로 추론하는듯)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⚠️ 근데 내 Xcode 16베타 &amp;amp;&amp;amp; catch블록에서 error가 any Error로 나온다.. swift 6모드 켜도!! 흠 이건 수정될듯&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;만약 do 블록 내에서 발생하는 에러타입이 &lt;b&gt;다를경우&lt;/b&gt; catch블록내에서 error의 타입은 any Error로 추론된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721550783867&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do /*infers throws(any Error)*/ {
  try callCat() // throws CatError
  try callKids() // throw KidError
} catch {
  // implicit 'error' variable has type 'any Error'
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;아래에는 이 Typed throws의 필요성?에 대해 &lt;b&gt;&lt;a href=&quot;https://github.com/swiftlang/swift-evolution/blob/main/proposals/0413-typed-throws.md?source=post_page-----3c796a95ac60--------------------------------#typed-throws&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;Proposal&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;에 나와있는 내용인데, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;아주 간단히 왜 Typed throws가 필요하고 어떤 경우에 유용한지 정리해봤다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Proposal에 더 정확히 나와있으니 참고하길!!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아래와 같은 에러타입이 있다고 가정할때&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721547777438&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum CatError: Error {
    case sleeps
    case sitsAtATree
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기존의 throws는 Result와 Task에 비해서 더 적은 에러 정보를 전달하게 되는데,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721547796726&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func callCat() -&amp;gt; Result&amp;lt;Cat, CatError&amp;gt;
func callFutureCat() -&amp;gt; Task&amp;lt;Cat, CatError&amp;gt;
func callCatOrThrow() throws -&amp;gt; Cat&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;throws 메소드를 호출하는 코드에서 에러를 Result나 Task로 변환할 때 타입 정보가 손실되고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 손실된 정보는 명시적인 캐스팅을 통해서만 복원할 수 있기 때문이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이게 무슨소리냐!!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721547978593&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum CatError: Error {
    case sleeps
    case sitsAtATree
}

func callCatOrThrow() throws -&amp;gt; Cat {
    if Bool.random()  {
        return Cat()
    } else {
        throw CatError.sitsAtATree
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;뭐 이런 코드가 있다고 했을때&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721548007274&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func callAndFeedCat1() -&amp;gt; Result&amp;lt;Cat, CatError&amp;gt; {
    do {
        return Result.success(try callCatOrThrow())
    } catch {
        return Result.failure(error) //   won't compile, because error type guarantee is missing in the first place

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;do 에서 callCatOrThrow()를 호출해도 callCatOrThrow는 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721551214434&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func callCatOrThrow() throws -&amp;gt; Cat { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;에러타입이 정해져있지 않고 모든 에러를 throw할 수 있기 때문에 (any Error)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721548092074&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return Result.success(try callCatOrThrow())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 시점에서 에러 타입의 정보가 손실되게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721548111975&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func callAndFeedCat1() -&amp;gt; Result&amp;lt;Cat, CatError&amp;gt; {&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;callAndFeedCat1는 Error타입이 CatError로 지정되어있기 때문에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721548179067&quot; class=&quot;reasonml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;func callAndFeedCat1() -&amp;gt; Result&amp;lt;Cat, CatError&amp;gt; {
    do {
        return Result.success(try callCatOrThrow())
    } catch {
        return Result.failure(error) //   won't compile, because error type guarantee is missing in the first place

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;CatError에 대한 정보가 손실된 상태(any Error) 캐스팅 없이 error를 던지면 컴파일에러가 나게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아 ㅇㅋ....;;; 하고 CatError로 캐스팅을 아래와 같이 했다고 해보자&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721548273510&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func callAndFeedCat2() -&amp;gt; Result&amp;lt;Cat, CatError&amp;gt; {
    do {
        return Result.success(try callCatOrThrow())
    } catch let error as CatError {
        // compiles
        return Result.failure(error)
    } catch {
        return Result.failure(error)
        //   won't compile, because exhaustiveness can't be checked by the compiler
        //  so what should we return here?
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 되도 마지막 catch문에서 컴파일에러가 나게 된다(any Error타입이기 때문)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;마지막 catch문에서 CatError중 하나를 아무거나 리턴하게 해도 되고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721548626911&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum CatError: Error {
    case sleeps
    case sitsAtATree
    case unknownError(Error)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 case를 하나 추가해서.....처리해도 되지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼 any Error를 throw하는 메소드의 에러타입이 손실된다는 점이 포인트!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만 Typed throws를 사용하면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721548759948&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum CatError: Error {
    case sleeps
    case sitsAtATree
}

func callCatOrThrow() throws(CatError) -&amp;gt; Cat {  // ⭐️ throws(CatError)로 명시함
    if Bool.random()  {
        return Cat()
    } else {
        throw CatError.sitsAtATree
    }
}

func callAndFeedCat2() -&amp;gt; Result&amp;lt;Cat, CatError&amp;gt; {
    do {
        return Result.success(try callCatOrThrow())
    } catch {
        return Result.failure(error) // ✅ 
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;에러타입의 정보가 손실되지 않게 되며 &amp;nbsp;Result로 변환하는 과정에서 별도의 캐스팅 없이 컴파일이 잘 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼 이렇게 구체적인 에러타입을 지정할 수 있게 되면서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 에러 처리의 명확성을 높히고, 특정 에러 타입에 대해 철저히 처리할 수 있는 이점이 생김&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 기존의 any Error는 런타임에 타입 정보를 확인해야하기 떄문에 메모리/성능측면에서 오버헤드가 발생할 수 있는데, Typed throws는 컴파일타임에 에러타입이 결정되므로 이러한 오버헤드가 개선될 수 있다고 한다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Typed throws가 도입되더라도 대부분의 Swift코드에서는 기존의 throws가(any Error) 여전히 더 나은 기본 에러 처리 메커니즘으로 여겨지므로&lt;b&gt; Typed throws는 특정상황에서 사용될 때 가장 적합하다고 한다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;e.g. 상대적으로 에러 조건이 고정되어있는경우. 같은 모듈이나 패키지에서 발생하는 에러 / 독립적인 라이브러리에서 발생하는 에러를 다루는 경우에 유용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# 참고&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #f5f5f7; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-16-release-notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Xcode 16 Beta 3 Release Notes&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #e6edf3; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/swiftlang/swift-evolution/blob/main/proposals/0413-typed-throws.md?source=post_page-----3c796a95ac60--------------------------------#typed-throws&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Typed throws&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift</category>
      <category>Swift</category>
      <category>typed throws</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1414</guid>
      <comments>https://zeddios.tistory.com/1414#entry1414comment</comments>
      <pubDate>Sun, 21 Jul 2024 17:59:07 +0900</pubDate>
    </item>
    <item>
      <title>[WWDC24] Breakpoint 새롭게 안 사실들 정리</title>
      <link>https://zeddios.tistory.com/1413</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오.... &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2024/10198&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Run, Break, Inspect: Explore effective debugging in LLDB&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 을 보면서 처음알았던 사실이 있어서 메모해둔다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;다 breakpoint관한 내용임&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Breakpoint&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.32.52.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C6Idx/btsIiRlpIJp/TZxPeuTHKeJVyBW6jcxqRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C6Idx/btsIiRlpIJp/TZxPeuTHKeJVyBW6jcxqRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C6Idx/btsIiRlpIJp/TZxPeuTHKeJVyBW6jcxqRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC6Idx%2FbtsIiRlpIJp%2FTZxPeuTHKeJVyBW6jcxqRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1528&quot; height=&quot;660&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.32.52.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;대충 이런코드가 있다고 생각해보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Button의 생성자 쪽에 breakpoint를 걸어놨으므로 Button이 생성될 때 프로그램이 멈추면서 걸릴것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.34.02.png&quot; data-origin-width=&quot;2746&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVo3nU/btsIi9F7y8a/av4SCG4M7E2bL2MadR2H3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVo3nU/btsIi9F7y8a/av4SCG4M7E2bL2MadR2H3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVo3nU/btsIi9F7y8a/av4SCG4M7E2bL2MadR2H3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVo3nU%2FbtsIi9F7y8a%2Fav4SCG4M7E2bL2MadR2H3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2746&quot; height=&quot;300&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.34.02.png&quot; data-origin-width=&quot;2746&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위 코드는 Hello, world!라는 Button을 누르면 someMethod가 실행되는데, 버튼을 한번 눌러보겠다!!!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2024-06-306.35.37-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciEiuF/btsIicjhvGt/QRXu8WRU0epw93Tip4YirK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciEiuF/btsIicjhvGt/QRXu8WRU0epw93Tip4YirK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciEiuF/btsIicjhvGt/QRXu8WRU0epw93Tip4YirK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ciEiuF/btsIicjhvGt/QRXu8WRU0epw93Tip4YirK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-filename=&quot;2024-06-306.35.37-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그럼 이렇게 breakpoint가 걸린다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;여기서 궁금증이 들 수 있는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;20번째 라인에 breakpoint를 걸어놨는데 왜 21번째 라인에서도 걸린것인가? 이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;Run, Break, Inspect: Explore effective debugging in LLDB 에서 요 이유를 명쾌하게 설명해줘서 알게되었다!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;breakpoint를 걸면 breakpoint navigator에 &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.40.16.png&quot; data-origin-width=&quot;2630&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u46ym/btsIg7pK6W8/h4HOKb0CASwVMGlF03psck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u46ym/btsIg7pK6W8/h4HOKb0CASwVMGlF03psck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u46ym/btsIg7pK6W8/h4HOKb0CASwVMGlF03psck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu46ym%2FbtsIg7pK6W8%2Fh4HOKb0CASwVMGlF03psck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2630&quot; height=&quot;912&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.40.16.png&quot; data-origin-width=&quot;2630&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;이렇게 2개의 breakpoint가 있는 것을 볼 수 있다.&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;여기서 나오는 것들은 &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;b&gt;서로 다른 코드 경로를 통해 이 breakpoint에 멈출 수 있음&lt;/b&gt;을 나타&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;낸다고 한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;이 경우 Xcode는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;1. Button이 생성될 때 (20번째 라인)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;2. Button &lt;span style=&quot;text-align: start;&quot;&gt;생성자 자체에 의해 호출된 trailing closure가 실행될 때&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;를 잡은것이라고 볼 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그리고 breakpoint마다 ID가 생성되는데&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.51.55.png&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBlmQ/btsIhfVonew/eEzT6Qxp8RNBkSkFyiPAwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBlmQ/btsIhfVonew/eEzT6Qxp8RNBkSkFyiPAwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBlmQ/btsIhfVonew/eEzT6Qxp8RNBkSkFyiPAwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBlmQ%2FbtsIhfVonew%2FeEzT6Qxp8RNBkSkFyiPAwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1236&quot; height=&quot;246&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.51.55.png&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 경우에는 1로 할당이 된거고, 각 breakpoint는 1.1, 1.2이런식으로 할당이 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.51.09.png&quot; data-origin-width=&quot;2958&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpgG8F/btsIidWLXoK/nMpYzl5OiSP07JjUIxnkqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpgG8F/btsIidWLXoK/nMpYzl5OiSP07JjUIxnkqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpgG8F/btsIidWLXoK/nMpYzl5OiSP07JjUIxnkqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpgG8F%2FbtsIidWLXoK%2FnMpYzl5OiSP07JjUIxnkqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2958&quot; height=&quot;232&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.51.09.png&quot; data-origin-width=&quot;2958&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.51.26.png&quot; data-origin-width=&quot;2978&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF1YuX/btsIgMGdj7B/r3L7ZV8PRq2tR63f1CnCH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF1YuX/btsIgMGdj7B/r3L7ZV8PRq2tR63f1CnCH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF1YuX/btsIgMGdj7B/r3L7ZV8PRq2tR63f1CnCH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF1YuX%2FbtsIgMGdj7B%2Fr3L7ZV8PRq2tR63f1CnCH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2978&quot; height=&quot;244&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.51.26.png&quot; data-origin-width=&quot;2978&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그래서 breakpoint &lt;b&gt;1.1&lt;/b&gt;, breakpoint &lt;b&gt;1.2&lt;/b&gt; 이런식으로 나온것을 볼 수 있다!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;&quot;&gt;원래 navigator에서도 아래와같이 ID를 바로 볼 수 있는 것 같은데 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.37.01.png&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JZIEJ/btsIg40SJ1P/hWuk4kOL3AserzInMyq4kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JZIEJ/btsIg40SJ1P/hWuk4kOL3AserzInMyq4kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JZIEJ/btsIg40SJ1P/hWuk4kOL3AserzInMyq4kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJZIEJ%2FbtsIg40SJ1P%2FhWuk4kOL3AserzInMyq4kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;412&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.37.01.png&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt; 이게 언제 나오고 언제 안나오는지 모르겠다.. 길어서 그런가...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1.n은 ID가 안나옴 ㄱ-&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;action이 있는 Button을 만들어보자&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719741356867&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@State private var isAddedToWatchLater = false

Button(action: { self.isAddedToWatchLater.toggle()}) {
    Text(isAddedToWatchLater ? &quot;Added to Watch Later&quot; : &quot;Add to Watch Later&quot;)
        ...생략
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이때 Button에 breakpoint를 걸게되면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.56.33.png&quot; data-origin-width=&quot;3002&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJVdJK/btsIg29Njf8/9uwHZ6u7m89SVLriRbqfj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJVdJK/btsIg29Njf8/9uwHZ6u7m89SVLriRbqfj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJVdJK/btsIg29Njf8/9uwHZ6u7m89SVLriRbqfj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJVdJK%2FbtsIg29Njf8%2F9uwHZ6u7m89SVLriRbqfj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3002&quot; height=&quot;604&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.56.33.png&quot; data-origin-width=&quot;3002&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Xcode는 3개의 breakpoint를 생성한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. Button의 생성자 (1.1)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.58.48.png&quot; data-origin-width=&quot;2960&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u39BU/btsIioqd9Or/6hrxFXamYEKWkFozfcpFh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u39BU/btsIioqd9Or/6hrxFXamYEKWkFozfcpFh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u39BU/btsIioqd9Or/6hrxFXamYEKWkFozfcpFh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu39BU%2FbtsIioqd9Or%2F6hrxFXamYEKWkFozfcpFh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2960&quot; height=&quot;566&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.58.48.png&quot; data-origin-width=&quot;2960&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. Button의 action &lt;span style=&quot;text-align: start;&quot;&gt;closure (1.2)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.59.39.png&quot; data-origin-width=&quot;2988&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnkftv/btsIhgfEDXU/iEKTXonKZPaWDannYTp72k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnkftv/btsIhgfEDXU/iEKTXonKZPaWDannYTp72k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnkftv/btsIhgfEDXU/iEKTXonKZPaWDannYTp72k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnkftv%2FbtsIhgfEDXU%2FiEKTXonKZPaWDannYTp72k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2988&quot; height=&quot;402&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.59.39.png&quot; data-origin-width=&quot;2988&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;3. Button의 &lt;span style=&quot;text-align: start;&quot;&gt;trailing closure (1.3)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.59.17.png&quot; data-origin-width=&quot;2994&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WWdMM/btsIiAqAr3e/mMxp19WXfhaPaiKBrKXioK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WWdMM/btsIiAqAr3e/mMxp19WXfhaPaiKBrKXioK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WWdMM/btsIiAqAr3e/mMxp19WXfhaPaiKBrKXioK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWWdMM%2FbtsIiAqAr3e%2FmMxp19WXfhaPaiKBrKXioK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2994&quot; height=&quot;458&quot; data-filename=&quot;스크린샷 2024-06-30 오후 6.59.17.png&quot; data-origin-width=&quot;2994&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(불리는 순서는 1 -&amp;gt; 3 -&amp;gt; 2임)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.04.55.png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHFyot/btsIiwIurLn/0VrOFDYULV3og9GUlCerXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHFyot/btsIiwIurLn/0VrOFDYULV3og9GUlCerXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHFyot/btsIiwIurLn/0VrOFDYULV3og9GUlCerXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHFyot%2FbtsIiwIurLn%2F0VrOFDYULV3og9GUlCerXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1906&quot; height=&quot;914&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.04.55.png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# LLDB에서 breakpoint list확인하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;lldb에서도 확인이 가능하다. (navigator에서 나오는것보다 더 자세한 정보를 알 수 있음)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.01.54.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btcaQB/btsIiocG0GJ/Hu6Y4cAMDZ1tuiYT8rkjnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btcaQB/btsIiocG0GJ/Hu6Y4cAMDZ1tuiYT8rkjnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btcaQB/btsIiocG0GJ/Hu6Y4cAMDZ1tuiYT8rkjnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtcaQB%2FbtsIiocG0GJ%2FHu6Y4cAMDZ1tuiYT8rkjnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;76&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.01.54.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;breakpoint list를 입력하면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.02.17.png&quot; data-origin-width=&quot;2252&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN94Ui/btsIidbq3mx/CKaoQ4iflKe07Jd3Fxfce0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN94Ui/btsIidbq3mx/CKaoQ4iflKe07Jd3Fxfce0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN94Ui/btsIidbq3mx/CKaoQ4iflKe07Jd3Fxfce0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN94Ui%2FbtsIidbq3mx%2FCKaoQ4iflKe07Jd3Fxfce0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2252&quot; height=&quot;510&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.02.17.png&quot; data-origin-width=&quot;2252&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;가독성은 좀 글킨한데;; 아무튼 이렇게 볼 수도 있음 ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Disable하기 &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;물론 disable도 가능하다!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.06.41.png&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAQIvz/btsIje8rZhJ/KfPQySeDK2aEbVPpdJhqa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAQIvz/btsIje8rZhJ/KfPQySeDK2aEbVPpdJhqa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAQIvz/btsIje8rZhJ/KfPQySeDK2aEbVPpdJhqa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAQIvz%2FbtsIje8rZhJ%2FKfPQySeDK2aEbVPpdJhqa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2992&quot; height=&quot;334&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.06.41.png&quot; data-origin-width=&quot;2992&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;navigator에서 저 빨간 박스 부분을 클릭하면 탁한 파란색이 되면서 disable처리가 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(우클릭 눌러서 Disable Breakpoint Location눌러도됨)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그동안 딱 내가 지정한 라인 말고 다른 라인이 걸릴때 무지성으로 continue버튼 누르고 그랬는데 이런 이유가~~~!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Swift Error breakpoint&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.43.01.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cigEWE/btsIhjXL7JY/WjcfKvOYQFFpYINe3TeQa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cigEWE/btsIhjXL7JY/WjcfKvOYQFFpYINe3TeQa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cigEWE/btsIhjXL7JY/WjcfKvOYQFFpYINe3TeQa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcigEWE%2FbtsIhjXL7JY%2FWjcfKvOYQFFpYINe3TeQa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1960&quot; height=&quot;1040&quot; data-filename=&quot;스크린샷 2024-06-30 오후 7.43.01.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;예를 들어서 이런 Json String이 있고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719744259374&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let jsonData = self.jsonString.data(using: .utf8)!

do {
    let videos = try decoder.decode([Video].self, from: jsonData)

    for video in videos {
        print(video.title, video.description)
    }
} catch {
    // do nothing
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;해당 Json을 파싱하는 코드가 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;문제인 상황을 만들어보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.15.04.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yxpA4/btsIgLm0h2u/JF0OgSKnOzdcL31iFNu1W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yxpA4/btsIgLm0h2u/JF0OgSKnOzdcL31iFNu1W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yxpA4/btsIgLm0h2u/JF0OgSKnOzdcL31iFNu1W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyxpA4%2FbtsIgLm0h2u%2FJF0OgSKnOzdcL31iFNu1W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1178&quot; height=&quot;456&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.15.04.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;id 10번의 imageName Key에 오타를 냈다. image -&amp;gt; imag&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자.. 그럼 여기에 오타가 있는지 몰랐다고 가정하고 원인을 파악한다고 해보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 프로그램을 실행했더니&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 파싱에 실패했고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 공교롭게도 error를 찍고 있지 않아서 원인을 찾다가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. decode로직에 breakpoint를 찍었다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2024-06-307.45.06-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kyMTc/btsIhz0lPwS/JcjBXS8OkgNU1JKyCIiifk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kyMTc/btsIhz0lPwS/JcjBXS8OkgNU1JKyCIiifk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kyMTc/btsIhz0lPwS/JcjBXS8OkgNU1JKyCIiifk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/kyMTc/btsIhz0lPwS/JcjBXS8OkgNU1JKyCIiifk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-filename=&quot;2024-06-307.45.06-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 Json의 객체 개수만큼 breakpoint가 걸릴텐데....다들 이런 경험 한번씩 해봤을 것 같은데 (머쓱)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt; 이럴 때 Swift Error Breakpoint를 사용하면 유용하다!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;Swift Error Breakpoint는 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Swift Error가 발생하면 프로그램을 중단하도록 lldb에 지시한다&lt;/span&gt;고 한다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 기존에 추가했던 breakpoint를 지우고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 왼쪽에서 breakpoint navigator로 이동해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 왼쪽 하단의 +버튼 &amp;gt; Swift Error Breakpoint 를 추가한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.14.08.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q2mzJ/btsIg5FuB8s/bF0ZReSpf5qNvZzM9UWlL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q2mzJ/btsIg5FuB8s/bF0ZReSpf5qNvZzM9UWlL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q2mzJ/btsIg5FuB8s/bF0ZReSpf5qNvZzM9UWlL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2mzJ%2FbtsIg5FuB8s%2FbF0ZReSpf5qNvZzM9UWlL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.14.08.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. 실행!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 이렇게 문제가 되는 (Swift Error가 처음 발생한) 라인에서 멈추게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.19.22.png&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wyh7i/btsIhvRonuE/fWjlnwHEB80I8SpAQ64sA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wyh7i/btsIhvRonuE/fWjlnwHEB80I8SpAQ64sA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wyh7i/btsIhvRonuE/fWjlnwHEB80I8SpAQ64sA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwyh7i%2FbtsIhvRonuE%2FfWjlnwHEB80I8SpAQ64sA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2282&quot; height=&quot;818&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.19.22.png&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;lldb를 사용해서 이때의 id를 알아내고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.20.11.png&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n8KA6/btsIirHfE3B/g4KUJ1jlZIfNSnkHR65ZpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n8KA6/btsIirHfE3B/g4KUJ1jlZIfNSnkHR65ZpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n8KA6/btsIirHfE3B/g4KUJ1jlZIfNSnkHR65ZpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn8KA6%2FbtsIirHfE3B%2Fg4KUJ1jlZIfNSnkHR65ZpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2088&quot; height=&quot;378&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.20.11.png&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아 그럼 id 10번에 무슨 문제가 있나보다~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하고 때에 맞는 적절한 수정을 해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 경우에는 바로 Json String의 id 10번을 찾아서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.21.17.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2Z94T/btsIhUJU6M7/RhDDJozhI5zcxjBKKQAhk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2Z94T/btsIhUJU6M7/RhDDJozhI5zcxjBKKQAhk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2Z94T/btsIhUJU6M7/RhDDJozhI5zcxjBKKQAhk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2Z94T%2FbtsIhUJU6M7%2FRhDDJozhI5zcxjBKKQAhk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1488&quot; height=&quot;494&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.21.17.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;imageName쪽을 살펴봐주고 -&amp;gt; 오타가 있었군? -&amp;gt; 수정&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;해주면 끝나는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나도 이렇게 decode쪽 로직에 breakpoint를 걸었던 적이 있었고.. 당연하게도 매번 breakpoint가 실행되니 그냥 print로 원인을 찾았던 적이 있는데 이럴 때 Swift Error Breakpoint가 유용했을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;물론 이건 Error가 나야하는 거라서!!! 상황에 따라 적절하게 사용하면 될 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# High-firing Breakpoint&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;High-firing Breakpoint는 자주 발생하는 breakpoint라는 뜻이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;for-loop에 걸어놓은 breakpoint가 대표적이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;우리가 방금 본 decode로직쪽에 걸어둔 breakpoint도 High-firing Breakpoint라고 볼 수 있다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;for-loop안에 breakpoint를 걸면 모든 반복에서 멈추는 것 보다.. 특정한 이벤트가 발생했을때만 중단하면 좋은 경우가 대부분이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;High-firing Breakpoint를 처리하는 3가지 기술을 WWDC에서 소개했는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;condition같은건 대부분 알 것 같긴하지만&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;처음 들어보는 것도 있어서 간단히 정리해본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Breakpoint conditions&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 for-loop안에 breakpoint를 걸어두었는데&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.33.48.png&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4Iic/btsIhBjz7AE/KqiOHmc8VmvmCkQhvoTPw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4Iic/btsIhBjz7AE/KqiOHmc8VmvmCkQhvoTPw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4Iic/btsIhBjz7AE/KqiOHmc8VmvmCkQhvoTPw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4Iic%2FbtsIhBjz7AE%2FKqiOHmc8VmvmCkQhvoTPw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2268&quot; height=&quot;220&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.33.48.png&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;특정 조건을 만족하는 경우에만 중단하고 싶다면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L6s3p/btsIiRlsFUw/5l5yAQOR823mrRHFU90V21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L6s3p/btsIiRlsFUw/5l5yAQOR823mrRHFU90V21/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;582&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.32.58.png&quot; data-widthpercent=&quot;42.5&quot; style=&quot;width: 42.006564%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L6s3p/btsIiRlsFUw/5l5yAQOR823mrRHFU90V21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL6s3p%2FbtsIiRlsFUw%2F5l5yAQOR823mrRHFU90V21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1002&quot; height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMhNyg/btsIg74mdIk/8G8STVHhftqGVyEzA4SzQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMhNyg/btsIg74mdIk/8G8STVHhftqGVyEzA4SzQk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;486&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.33.13.png&quot; data-widthpercent=&quot;57.5&quot; style=&quot;width: 56.830645%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMhNyg/btsIg74mdIk/8G8STVHhftqGVyEzA4SzQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMhNyg%2FbtsIg74mdIk%2F8G8STVHhftqGVyEzA4SzQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;condition을 원하는대로 추가해주면된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 description의 count가 30이 넘는 경우만 멈추고싶다! 로 한것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Breakpoint action&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1719751491195&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for video in videos {
    if video.hasRemoteMedia {
        video.loadRemoteMedia()
    }
    processSomething()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;예를 들어 이런 코드가 있다고 생각해보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;processSomething()은 매 반복마다 호출될텐데, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;loadRemoteMedia가 실행된 경우에만 중단&lt;/span&gt;되길 원할수도 있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1번에서 본 것 처럼 condition을 사용해도 되지만 Breakpoint action을 사용해볼 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런경우 &lt;b&gt;tbreak&lt;/b&gt;(temparary(임시) breakpoint.) 를 만들수 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 loadRemoteMedia가 실행된 경우에만 processSomething()에 중단하고 싶은거니까&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.55.42.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xXNSB/btsIgZS2naM/654t79HvGsFfAEzPBOwKOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xXNSB/btsIgZS2naM/654t79HvGsFfAEzPBOwKOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xXNSB/btsIgZS2naM/654t79HvGsFfAEzPBOwKOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxXNSB%2FbtsIgZS2naM%2F654t79HvGsFfAEzPBOwKOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1544&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.55.42.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;loadRemoteMedia쪽에 breakpoint를 걸고 ➡️ Edit breakpoint &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;➡️&lt;/span&gt; Add action &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;➡️&lt;/span&gt;&amp;nbsp;Debugger Command&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.56.44.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkwZ9x/btsIhNYz73d/cWHKGm8LdEHgQKCmQK5KK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkwZ9x/btsIhNYz73d/cWHKGm8LdEHgQKCmQK5KK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkwZ9x/btsIhNYz73d/cWHKGm8LdEHgQKCmQK5KK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkwZ9x%2FbtsIhNYz73d%2FcWHKGm8LdEHgQKCmQK5KK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;538&quot; data-filename=&quot;스크린샷 2024-06-30 오후 9.56.44.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;tbreak {&lt;span style=&quot;text-align: start;&quot;&gt;filename:linenumber&lt;/span&gt;}&lt;/b&gt; 또는&amp;nbsp;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;tbreak {functioname} &lt;/span&gt;&lt;/b&gt;를 적어주면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;tbreak는 해당 위치에서 한번만 프로그램을 중단시킨다고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(우리는 for-loop의 loadRemoteMedia의 action에 걸어놨으므로 loadRemoteMedia가 불릴 때 마다 임시 breakpoint가 생성되어 processSomething에서도 한번 중단하게 된다.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;실행해보면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 10.00.47.png&quot; data-origin-width=&quot;2264&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg1B0y/btsIg5eqp3u/hPKji9dizpYBmlCxKIomGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg1B0y/btsIg5eqp3u/hPKji9dizpYBmlCxKIomGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg1B0y/btsIg5eqp3u/hPKji9dizpYBmlCxKIomGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg1B0y%2FbtsIg5eqp3u%2FhPKji9dizpYBmlCxKIomGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2264&quot; height=&quot;396&quot; data-filename=&quot;스크린샷 2024-06-30 오후 10.00.47.png&quot; data-origin-width=&quot;2264&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 one-shot breakpoint라고 나옴.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;tbreak는 일회성 breakpoint라는 것이 핵심인데, 예를 들어 for-loop가 아니라&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;viewDidLoad에서 processSomething에 tbreak를 걸었다고 하자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;(tbreak {&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;filename:linenumber&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;}도 가능한데 이번에는 &lt;span style=&quot;text-align: start;&quot;&gt;tbreak {functioname}로 해줘봤음)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 10.20.04.png&quot; data-origin-width=&quot;1742&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSGguC/btsIhOpFxJS/wWxZ9XsEpj2KuGhZddWGt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSGguC/btsIhOpFxJS/wWxZ9XsEpj2KuGhZddWGt1/img.png&quot; data-alt=&quot;processSomething()이 아니라 processSomething으로 적어줘야함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSGguC/btsIhOpFxJS/wWxZ9XsEpj2KuGhZddWGt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSGguC%2FbtsIhOpFxJS%2FwWxZ9XsEpj2KuGhZddWGt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1742&quot; height=&quot;600&quot; data-filename=&quot;스크린샷 2024-06-30 오후 10.20.04.png&quot; data-origin-width=&quot;1742&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;processSomething()이 아니라 processSomething으로 적어줘야함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;1. processSomething에는 임시 breakpoint가 걸리고 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;2. 최초로 &lt;span style=&quot;text-align: start;&quot;&gt;processSomething이 호출되면&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;3. 중단 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;4. 그 이후에는 breakpoint가 삭제되어서 중단 X&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;인 것~~!! &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사진처럼 Edit breakpoint에 들어가서 하는 방법도 편하긴한데.. 나는 그냥 lldb에서 하는게 더 편했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 10.23.40.png&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckX9Ht/btsIhBjAYWu/joaCZMDHlhQ4orKj88VMuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckX9Ht/btsIhBjAYWu/joaCZMDHlhQ4orKj88VMuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckX9Ht/btsIhBjAYWu/joaCZMDHlhQ4orKj88VMuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckX9Ht%2FbtsIhBjAYWu%2FjoaCZMDHlhQ4orKj88VMuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2258&quot; height=&quot;762&quot; data-filename=&quot;스크린샷 2024-06-30 오후 10.23.40.png&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;중단됐을 때 그냥 lldb에서 tbreak생성 해버리기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Breakpoint ignore count&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;고정된 횟수동안 breakpoint를 무시하고 이후에 발생하는 것만 중단시키는 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-30 오후 10.08.31.png&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5DrHj/btsIiVOSRRJ/JhJKewHvIEgcJjHbucmVXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5DrHj/btsIiVOSRRJ/JhJKewHvIEgcJjHbucmVXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5DrHj/btsIiVOSRRJ/JhJKewHvIEgcJjHbucmVXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5DrHj%2FbtsIiVOSRRJ%2FJhJKewHvIEgcJjHbucmVXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2072&quot; height=&quot;704&quot; data-filename=&quot;스크린샷 2024-06-30 오후 10.08.31.png&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;무시하고 싶은 고정된 횟수의 count를 ignore부분에 넣어주면 된다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;-------&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;tbreak는 처음봤는데, 진짜 일회성으로 뭔가 확인하고 싶을 때 유용하게 쓸 수 있을 것 같다 ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;끝!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;참고 : &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2024/10198&quot;&gt;Run, Break, Inspect: Explore effective debugging in LLDB&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Xcode</category>
      <category>breakpoint</category>
      <category>lldb</category>
      <category>WWDC</category>
      <category>WWDC2024</category>
      <category>WWDC24</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1413</guid>
      <comments>https://zeddios.tistory.com/1413#entry1413comment</comments>
      <pubDate>Sun, 30 Jun 2024 22:37:49 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] kill -9/-15 PID</title>
      <link>https://zeddios.tistory.com/1412</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;인텔리제이에서 Run했더니&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-26-1024x330.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2QqP3/btsGOuT4otB/yn4kyQhHk3zV2IPgEmEDJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2QqP3/btsGOuT4otB/yn4kyQhHk3zV2IPgEmEDJK/img.png&quot; data-alt=&quot;https://springhow.com/web-server-failed-to-start-port-8080-was-already-in-use/ 에서 가져옴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2QqP3/btsGOuT4otB/yn4kyQhHk3zV2IPgEmEDJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2QqP3%2FbtsGOuT4otB%2Fyn4kyQhHk3zV2IPgEmEDJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;330&quot; data-filename=&quot;image-26-1024x330.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://springhow.com/web-server-failed-to-start-port-8080-was-already-in-use/ 에서 가져옴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;web server failed to start. port 8080 was already in use ~&lt;/span&gt; 에러가 나왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나는 초보도 아니고 궁서체 보초 수준이라서 살짝 당황했지만 침착하게 구글링을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하라는대로 터미널에 &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;lsof -i :8080를 치니 여러 프로세스가 8080포트를 사용하고 있었다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000; background-color: #ffffff;&quot;&gt;암튼 이 프로세스를 죽이면 된다고 &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;kill -9 PID 를 입력하라고 해서 했더니 아주 깔끔하게 지워졌다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;해결은 했는데...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;내가 이런 커맨드에 익숙하지 않아서 이 생태계(?)를 잘 모르는 상태라 그런지는 몰라도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;-e 이런식으로 영어가 적힌건 많이봤어도 -9 처럼 숫자가 있는게 너무 신기해서(..) 이 9가 무슨뜻인지 갑자기 너무 궁금해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;우선&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;kill -&amp;lt;signal&amp;gt; &amp;lt;pid&amp;gt; &amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;이런식으로 사용하고 가운데 9자리에 오는 것은 signal에 해당한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;signal을 줘도 되고 안줘도 되어서 kill pid로만 쓸 수 있는데, 이는 사실 kill -15 pid와 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;15는 SIGTERM의 번호이며, &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;SIGTERM은 &lt;/span&gt;프로세스에게 정상적인 종료를 요청하는 신호다. (15대신에 SIGTERM를 사용해도됨)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;kill pid == kill -15 pid == kill -SIGTERM pid&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;다만 프로세스가 응답이 없을경우 이 요청을 무시하게 되는데, 이때 사용할 수 있는것이 9다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;9는 &lt;b&gt;SIGKILL&lt;/b&gt;의 번호이며, &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;SIGTERM은&lt;/span&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;프로세스를 강제종료하는 신호다. (이것도 9대신에 &lt;b&gt;SIGKILL&lt;/b&gt;사용해도됨)&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;kill -9 pid == kill -SIGKILL&amp;nbsp;pid&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;프로세스가 이 신호를 받으면 즉시 종료된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;즉시 종료되기 때문에 마무리 작업을 할 수 가 없으니, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;프로세스가 자원을 정리하지 않는다거나, 저장하지 않은 데이터가 날아간다거나 하는 부작용이 있을 수 있다고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;되도록 15를 사용하여 kill을 하라는데 나는 &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;kill -9 pid를 한 후에 그 사실을 알게되었다. ㅎ;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;별건 아니지만 개인적으로 흥미롭게 알게된 사실이라 정리해본다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1412</guid>
      <comments>https://zeddios.tistory.com/1412#entry1412comment</comments>
      <pubDate>Mon, 22 Apr 2024 23:03:28 +0900</pubDate>
    </item>
    <item>
      <title>[기록] 테스트 앱을 삭제했는데도 권한이 남아있을 때</title>
      <link>https://zeddios.tistory.com/1410</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Core Motion관련해서 테스트해보고 싶은게 있어서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. 프로젝트를 새로 만들고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. 동작 및 피트니스 권한 요청을 하고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;3. 걸음수 가져오기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;4. 시뮬레이터 아니고 실 디바이스에서 빌드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;대충 이런식으로 했는데, 권한 부분을 다시 테스트해보고싶어서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. 앱을 삭제했다가 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. 다시 빌드해서 설치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;3. 동작 및 피트니스 권한이 계속 동의된 상태로 설치되는것이다...??&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;뭐지..하고 다른 앱도 설치해봤는데 동일한것이다. &lt;b&gt;(폰을 재부팅해도 권한이 유지됐음)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;e.g.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;RPReplay_Final1711181045-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ETxhd/btsF04B0tP5/XKJkoW2a0Z2XqipwnVwdh0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ETxhd/btsF04B0tP5/XKJkoW2a0Z2XqipwnVwdh0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ETxhd/btsF04B0tP5/XKJkoW2a0Z2XqipwnVwdh0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ETxhd/btsF04B0tP5/XKJkoW2a0Z2XqipwnVwdh0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;1297&quot; data-filename=&quot;RPReplay_Final1711181045-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;왜 이런 현상이 발생하는지 잘 모르겠다. (캐싱이 되나;?)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;다른 앱은 모르겠고..일단 내 테스트앱이라도 초기화할 수 있는 방법이 없나?; 하고 찾아봤는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나한테 효과가 있는 방법을 찾았따&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Xcode &amp;gt; Window &amp;gt; Device and Simulators에 들어가면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi643U/btsF2yondjT/kgCuIXt830SUSWKxzDTdiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi643U/btsF2yondjT/kgCuIXt830SUSWKxzDTdiK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;874&quot; data-filename=&quot;스크린샷 2024-03-23 오후 5.13.22.png&quot; data-widthpercent=&quot;25.07&quot; style=&quot;width: 24.77397%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi643U/btsF2yondjT/kgCuIXt830SUSWKxzDTdiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi643U%2FbtsF2yondjT%2FkgCuIXt830SUSWKxzDTdiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/elUILG/btsF13Cbof0/uReR7bRwpb2rDWrjDR6hlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/elUILG/btsF13Cbof0/uReR7bRwpb2rDWrjDR6hlK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;694&quot; data-filename=&quot;스크린샷 2024-03-23 오후 5.11.16.png&quot; data-widthpercent=&quot;74.93&quot; style=&quot;width: 74.063239%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/elUILG/btsF13Cbof0/uReR7bRwpb2rDWrjDR6hlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FelUILG%2FbtsF13Cbof0%2FuReR7bRwpb2rDWrjDR6hlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오른쪽에 Installed Apps 섹션이 보일것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;여기에 내가 설치한 모든 앱들이 나오는건 아니고, 개발용으로 설치한것들만 나오는 것 같은데.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;여기서 -버튼을 눌러 삭제 ➡️ 다시 빌드해서 설치하면 ➡️ 권한을 다시 물어봤다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;근데 이렇게 한번 하고 나니까, 일반적인 방법으로 삭제해도 권한을 다시 물어본다;;; (원래 삭제해도 권한 다시 안물어봤었음 ㅠ)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;만약 동일한 현상이 발생한다면 &lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;Installed Apps 섹션에서 한번 삭제해보는 것을 추천한다!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;근데 앱스토어에서 받은 페도미터 &amp;lt; 요 앱은 무슨짓을 해도... 삭제했다 다시설치해도 여전히 권한상태가 유지되어있다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ㅎ&lt;br /&gt;ㅡ&lt;br /&gt;ㅁ...&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;내일 다시 해봐야지;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>일상</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1410</guid>
      <comments>https://zeddios.tistory.com/1410#entry1410comment</comments>
      <pubDate>Sat, 23 Mar 2024 17:31:48 +0900</pubDate>
    </item>
    <item>
      <title>assert / precondition (feat. preconditionFailure vs fatalError)</title>
      <link>https://zeddios.tistory.com/1405</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;precondition을 얼마전에 처음 봤는데, 그 때 쓰기 시작한 글을 마무리를 못했네여&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;설날 기념으로 마무리해서 발행쓰&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# assert&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;Debug configuration에서 오류가 생기면 치명적일 것인 곳에 심어 놓는 에러 검출용 코드이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;즉 Release c&lt;span style=&quot;text-align: left;&quot;&gt;onfiguration&lt;/span&gt;에서는 아무 영향을 주지 않는다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704256578118&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func assert(
    _ condition: @autoclosure () -&amp;gt; Bool,
    _ message: @autoclosure () -&amp;gt; String = String(),
    file: StaticString = #file,
    line: UInt = #line
)

------
[사용법]

assert(false)
assert(1 + 1 != 2, &quot;assert message&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 condition이 evalute되는 빌드가 따로 있는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-03 오후 1.46.56.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/26bXo/btsCZhQ3MhS/bPRoUyV7ptNlamJ42BL930/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/26bXo/btsCZhQ3MhS/bPRoUyV7ptNlamJ42BL930/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/26bXo/btsCZhQ3MhS/bPRoUyV7ptNlamJ42BL930/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F26bXo%2FbtsCZhQ3MhS%2FbPRoUyV7ptNlamJ42BL930%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1014&quot; height=&quot;112&quot; data-filename=&quot;스크린샷 2024-01-03 오후 1.46.56.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 플레이그라운드 or&lt;span style=&quot;background-color: #dddddd;&quot;&gt; -Onone&lt;/span&gt;(Debug &lt;span style=&quot;text-align: left;&quot;&gt;Configuration의 기본값) &amp;amp; condition이 false이면 ➡️ &lt;b&gt;프로그램 중지  &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;- &lt;span style=&quot;background-color: #dddddd;&quot;&gt;-O&lt;/span&gt;빌드(Release Configuration의 기본값)에서는 condition이 evaluate 되지 않음 (== 효과가 없음)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Release configuration에서는 condition이 evalute 조차 되지 않으니까 assert가 무시?되는것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# assertionFailure&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1704257408711&quot; class=&quot;less&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;func assertionFailure(
    _ message: @autoclosure () -&amp;gt; String = String(),
    file: StaticString = #file,
    line: UInt = #line
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;assertionFailure은 assert와 동작하는 환경자체는 같은데, condition이 없는 것을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;condition없이 무조건 잘못된 상황일 때 assertionFailure를 사용하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;역시나 Debug configaration에서만 동작한다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# precondition&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Debug configaration말고 &lt;b&gt;Release configation에서도&lt;/b&gt; 에러를 검출하고 프로그램을 중지시키고 싶다면 precondition을 쓰면된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;덜덜;;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;precondition은 이름에서도 그 역할이 보이듯이, 코드가 수행되기 위해 필요한 조건을 앞서 확인하는 친구다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704257661819&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func precondition(
    _ condition: @autoclosure () -&amp;gt; Bool,
    _ message: @autoclosure () -&amp;gt; String = String(),
    file: StaticString = #file,
    line: UInt = #line
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;수행되는 환경은 assert와 살짝 다르다. (precondition은 Releas configuration에서도 프로그램을 중지시키니까)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 플레이그라운드 or &lt;span style=&quot;background-color: #dddddd;&quot;&gt;-Onone&lt;/span&gt;(Debug&amp;nbsp;&lt;span style=&quot;text-align: left;&quot;&gt;Configuration의 기본값) &amp;amp; condition이 false이면 ➡️ 프로그램 중지  &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;- &lt;span style=&quot;background-color: #dddddd;&quot;&gt;-O&lt;/span&gt;빌드(Release Configuration의 기본값) &amp;amp;&amp;amp; condition이 false이면 &lt;span style=&quot;text-align: left;&quot;&gt;➡️&lt;/span&gt;&amp;nbsp;프로그램 중지  &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;프로그램 중지될때 전달한 message도 같이 나오게 되는데(전달안하면 empty string) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이건 Onone(Debug configuration의 기본값)에서만 나온다. (당연하게도?!)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# preconditionFailure&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1704362733107&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func preconditionFailure(
    _ message: @autoclosure () -&amp;gt; String = String(),
    file: StaticString = #file,
    line: UInt = #line
) -&amp;gt; Never&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;precondition은 condition이 있었다면 요건 그냥 아묻따 프로그램 종료&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 플레이그라운드 or&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;-Onone&lt;/span&gt;(Debug&amp;nbsp;&lt;span style=&quot;text-align: left;&quot;&gt;Configuration의 기본값) ➡️&amp;nbsp;프로그램 중지  &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;-&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;-O&lt;/span&gt;빌드(Release Configuration의 기본값) &amp;nbsp;&lt;span style=&quot;text-align: left;&quot;&gt;➡️&lt;/span&gt;&amp;nbsp;프로그램 중지&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;precondition과 마찬가지로 프로그램 중지될때 전달한 message는 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Onone(Debug configuration의 기본값)에서만 나온다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위에 같이 적진 않았지만..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;assert류, precondition류들은 -Ounchecked 빌드에서는 condition이 evalute되지는 않지만 optimizer가 condition이 항상 true로 간주할 수도 있다고 한다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;사실 &lt;span style=&quot;text-align: start;&quot;&gt;-Ounchecked는 특수한? 빌드이기도 하고&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-12 오후 1.35.46.png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QiZrF/btsEHo8xkEM/DozdQQi4BvLAgKYSgntBfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QiZrF/btsEHo8xkEM/DozdQQi4BvLAgKYSgntBfk/img.png&quot; data-alt=&quot;선택하는 곳에서도 기본적으로 나오지도 않음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QiZrF/btsEHo8xkEM/DozdQQi4BvLAgKYSgntBfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQiZrF%2FbtsEHo8xkEM%2FDozdQQi4BvLAgKYSgntBfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1186&quot; height=&quot;276&quot; data-filename=&quot;스크린샷 2024-02-12 오후 1.35.46.png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;선택하는 곳에서도 기본적으로 나오지도 않음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;딱히 큰 신경을 안써도 될 것 같긴하다 ㅎ;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 나는 assert도 잘 안쓰기도 하고해서 precondition이라는게 있는지도 몰랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;precondtion은 릴리스 빌드에서도 발생한다니까 무섭긴 한데   ,,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;진짜 일반 사용자에게 절대 노출되면 안되는?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(간헐적으로 일어나는) 모종의 이유로 꼬여서 특정 값 없이 그대로 실행하는게 더 위험한 곳(== 차라리 앱을 종료시켜버리는게 나은 상황..)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;에서는 적절히 쓰면 좋을 것 같다! (말 그대로 precondition이니까 특정 condition이 만족하지 못하는 상황)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;잘 정리된 이미지가 있어서 첨부!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1*iapHMoKw0tmk0VTJG8Gozw.webp&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxWTP/btsEFelpEMB/4G5clepMZCXYY0O8b6bA70/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxWTP/btsEFelpEMB/4G5clepMZCXYY0O8b6bA70/img.webp&quot; data-alt=&quot;https://medium.com/swift-india/fortify-code-with-runtime-checks-66619b43766f&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxWTP/btsEFelpEMB/4G5clepMZCXYY0O8b6bA70/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxWTP%2FbtsEFelpEMB%2F4G5clepMZCXYY0O8b6bA70%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;247&quot; data-filename=&quot;1*iapHMoKw0tmk0VTJG8Gozw.webp&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://medium.com/swift-india/fortify-code-with-runtime-checks-66619b43766f&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;# 번외 (안읽어도됨) &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;위 이미지를 보고 일반적인 상황에서 precondition&lt;b&gt;Failure&lt;/b&gt;랑 fataError랑 무슨차이인거지...? 가 궁금했는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;어딜 찾아봐도 차이점은 이거다!!!! 라고 딱 명쾌하게 나온곳이 없었다 ㅠ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;차이점 찾는거 포기할때쯤 &lt;a href=&quot;https://github.com/apple/swift/blob/main/stdlib/public/core/Assert.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;swift github의 Assert.swift&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;를 보게 됐는데, 흥미로웠다 ㅎㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[assert]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-12 오후 1.50.52.png&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6lggw/btsEF7lSqmP/WYQ2BwKbqrnbhUsonCK7a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6lggw/btsEF7lSqmP/WYQ2BwKbqrnbhUsonCK7a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6lggw/btsEF7lSqmP/WYQ2BwKbqrnbhUsonCK7a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6lggw%2FbtsEF7lSqmP%2FWYQ2BwKbqrnbhUsonCK7a0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1224&quot; height=&quot;616&quot; data-filename=&quot;스크린샷 2024-02-12 오후 1.50.52.png&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;정의 그대로 DebugConfiguration일때만 보고 있었다!! (당연하겠지만..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[assertionFailure]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-12 오후 1.58.57.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JqXS6/btsEKFBWdzl/I4HdMlmv4GYVwm6ijf1O40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JqXS6/btsEKFBWdzl/I4HdMlmv4GYVwm6ijf1O40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JqXS6/btsEKFBWdzl/I4HdMlmv4GYVwm6ijf1O40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJqXS6%2FbtsEKFBWdzl%2FI4HdMlmv4GYVwm6ijf1O40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1220&quot; height=&quot;620&quot; data-filename=&quot;스크린샷 2024-02-12 오후 1.58.57.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;assertionFailure의 경우 Debug Configuration만 볼 줄 알았는데 Fast Configuration이란것도 보고있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Fast Configuration은 뭔지 잘 모르겠다. 이것저것 건들여봐도 -Onone에서만 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[precondition]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.02.42.png&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxIPqq/btsEFPeI2Gx/NvRo02c0DeKj6Y4qRvGeB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxIPqq/btsEFPeI2Gx/NvRo02c0DeKj6Y4qRvGeB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxIPqq/btsEFPeI2Gx/NvRo02c0DeKj6Y4qRvGeB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxIPqq%2FbtsEFPeI2Gx%2FNvRo02c0DeKj6Y4qRvGeB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1326&quot; height=&quot;772&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.02.42.png&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;precondition은 정의와 똑같이 Debug, Release 둘 다 보고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;역시 위에서 본 것 처럼 message는 Debug일때만 전달되고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Release일때는 단순히 &quot;precondition failure&quot;로 전달되는 것을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[preconditionFailure]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.07.20.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwsc3c/btsEJb8O4TR/4hKjRnusogw304QDtLeoN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwsc3c/btsEJb8O4TR/4hKjRnusogw304QDtLeoN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwsc3c/btsEJb8O4TR/4hKjRnusogw304QDtLeoN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwsc3c%2FbtsEJb8O4TR%2F4hKjRnusogw304QDtLeoN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1104&quot; height=&quot;660&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.07.20.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;precondition과 거의 똑같은데, condition조건을 검사하는 로직이 사라졌다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[fatalError vs precondition]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.12.23.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvqnsH/btsENSOruEO/SAMRtTUmuvuJJOZpU7SXF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvqnsH/btsENSOruEO/SAMRtTUmuvuJJOZpU7SXF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvqnsH/btsENSOruEO/SAMRtTUmuvuJJOZpU7SXF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvqnsH%2FbtsENSOruEO%2FSAMRtTUmuvuJJOZpU7SXF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1104&quot; height=&quot;378&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.12.23.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;애플 쪽 코드를 보니까..그냥 preconditionFailure와 fatalError는 차이가 있긴 하지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 차이를 분석해야할만큼;;; 유의미하게 다른것 같진 않다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvqnsH/btsENSOruEO/SAMRtTUmuvuJJOZpU7SXF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvqnsH/btsENSOruEO/SAMRtTUmuvuJJOZpU7SXF0/img.png&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.12.23.png&quot; data-origin-height=&quot;378&quot; data-origin-width=&quot;1104&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;63.58&quot; style=&quot;width: 62.844468%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvqnsH/btsENSOruEO/SAMRtTUmuvuJJOZpU7SXF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvqnsH%2FbtsENSOruEO%2FSAMRtTUmuvuJJOZpU7SXF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1104&quot; height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwsc3c/btsEJb8O4TR/4hKjRnusogw304QDtLeoN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwsc3c/btsEJb8O4TR/4hKjRnusogw304QDtLeoN1/img.png&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.07.20.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;660&quot; data-origin-width=&quot;1104&quot; data-widthpercent=&quot;36.42&quot; style=&quot;width: 35.992741%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwsc3c/btsEJb8O4TR/4hKjRnusogw304QDtLeoN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwsc3c%2FbtsEJb8O4TR%2F4hKjRnusogw304QDtLeoN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1104&quot; height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;굳이굳이 차이점을 꼽자면;; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;fatalError는 항상 message를 전달하고, preconditionFailure는 Debug Configuration일때만 전달한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그리고 fatalError는 항상 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;&lt;i&gt;&lt;b&gt;_assertionFailure&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;를 호출하는 반면, (_assertionFailure은 결국&lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt; Builtin.int_trap()&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;을 호출한다)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;preconditionFailure는 Release Configuration일때는 &lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;Builtin.condfail_message()&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;를 호출한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.20.12.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D3IMI/btsENS8Knmr/ikdTqTUpRnmWWhQhlZv0X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D3IMI/btsENS8Knmr/ikdTqTUpRnmWWhQhlZv0X0/img.png&quot; data-alt=&quot;fatalError - Debug/Relese상관없이 이렇게 나옴 / preconditionFailure - Debug 일때 이렇게 나옴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D3IMI/btsENS8Knmr/ikdTqTUpRnmWWhQhlZv0X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD3IMI%2FbtsENS8Knmr%2FikdTqTUpRnmWWhQhlZv0X0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1502&quot; height=&quot;104&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.20.12.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fatalError - Debug/Relese상관없이 이렇게 나옴 / preconditionFailure - Debug 일때 이렇게 나옴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.20.39.png&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhBYMe/btsEHFCl1XD/ERaWapIGx8ZXA96LFsn0h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhBYMe/btsEHFCl1XD/ERaWapIGx8ZXA96LFsn0h0/img.png&quot; data-alt=&quot;preconditionFailure - Relese일때 이렇게 나옴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhBYMe/btsEHFCl1XD/ERaWapIGx8ZXA96LFsn0h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhBYMe%2FbtsEHFCl1XD%2FERaWapIGx8ZXA96LFsn0h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1480&quot; height=&quot;240&quot; data-filename=&quot;스크린샷 2024-02-12 오후 2.20.39.png&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;preconditionFailure - Relese일때 이렇게 나옴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;fatalError : &lt;i&gt;&lt;b&gt;&lt;span style=&quot;text-align: start; background-color: #dddddd; color: #ef5369;&quot;&gt;Builtin.int_trap()&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;preconditionFailure : Debug -&amp;gt; &lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;Builtin.int_trap()&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; / Relase -&amp;gt;&lt;i&gt; &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;&lt;b&gt;Builtin.condfail_message()&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;Builtin.int_trap() 와 Builtin.condfail_message() 의 안쪽이 정확히 어떻게 되어있는지는 못찾았는데,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;크래시날 때 스택트레이스가 좀 다른것을 보니 내부 동작은 다른건 확실한데...굳이 더 안파봐도 될 것 같다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;ㅎㅓ허&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic'; background-color: #ffffff;&quot;&gt;[참고]&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #3cb09c; background-color: #ffffff;&quot; href=&quot;https://developer.apple.com/documentation/swift/debugging-and-reflection#testing&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/swift/debugging-and-reflection#testing&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #3cb09c; background-color: #ffffff;&quot; href=&quot;https://github.com/apple/swift/blob/main/stdlib/public/core/Assert.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/apple/swift/blob/main/stdlib/public/core/Assert.swift&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #3cb09c; background-color: #ffffff;&quot; href=&quot;https://github.com/apple/swift/blob/main/stdlib/public/core/AssertCommon.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/apple/swift/blob/main/stdlib/public/core/AssertCommon.swift&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>assert</category>
      <category>fatalerror</category>
      <category>Precondition</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1405</guid>
      <comments>https://zeddios.tistory.com/1405#entry1405comment</comments>
      <pubDate>Mon, 12 Feb 2024 14:36:54 +0900</pubDate>
    </item>
    <item>
      <title>isAccessibilityElement / accessibilityElements</title>
      <link>https://zeddios.tistory.com/1406</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# isAccessibilityElement&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;element가 접근성 요소인지 여부를 나타내는 Bool값&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;UIKit control이 아닌경우 기본값은 &lt;b&gt;false&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- UIControl을 상속받고 있는 UIButton같은것들 ➡️ 기본값 true&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- UIView나 UIImageView같은것들 &lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;➡️&lt;/span&gt;&amp;nbsp;기본값 false&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2024-02-11-15-57-03.jpeg&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWna9s/btsEEzwWD2S/FhWdlSALkriorDokYoQO40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWna9s/btsEEzwWD2S/FhWdlSALkriorDokYoQO40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWna9s/btsEEzwWD2S/FhWdlSALkriorDokYoQO40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWna9s%2FbtsEEzwWD2S%2FFhWdlSALkriorDokYoQO40%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;999&quot; height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2024-02-11-15-57-03.jpeg&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런경우 기본적으로 UIButton에만 접근성 요소로 잡힐것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이때, 바깥의 주황색 View에도 접근성 요소에 포함하려면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707634737211&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.myView.isAccessibilityElement = true
self.myView.accessibilityLabel = &quot;적절한 accessibilityLabel&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;isAccessibilityElement 프로퍼티를 true로 만들어주면 된다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;UIView에 초점이 갔을 때 뭔가를 읽어줘야하므로 적절한 accessibilityLabel도 같이 넣어주자&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2024-02-11-16-01-15.jpeg&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6B0tS/btsEEzwWIaz/WEM1MoKweWal2UUUktug3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6B0tS/btsEEzwWIaz/WEM1MoKweWal2UUUktug3K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6B0tS/btsEEzwWIaz/WEM1MoKweWal2UUUktug3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6B0tS%2FbtsEEzwWIaz%2FWEM1MoKweWal2UUUktug3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1002&quot; height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2024-02-11-16-01-15.jpeg&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이때 문제가 하나 발생하는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;지금처럼 Parent-Child뷰 관계에서 Parent의 isAccessibilityElement를 true로 해버리면 &lt;b&gt;Child뷰는 접근성 계층 구조에 표시되지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;즉, 이 상태에서 Child의 버튼에 초점이 가지 않는다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이거 정확한 이유를 알고싶어서 애플 문서를 뒤적거려봤는데, 찾지는 못했음..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;참고한 포스팅 :&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt; &lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://medium.com/@jchen_77520/accessibility-and-ui-testing-in-ios-3eb0822a17fb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://medium.com/@jchen_77520/accessibility-and-ui-testing-in-ios-3eb0822a17fb&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아마 이 블로그 글대로 하나의 Parent에 여러 Child가 있을 때 여러번 초점이 가는것을 방지하려고 그런 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/uikit/accessibility_for_uikit/supporting_voiceover_in_your_app&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;애플 보이스오버 문서&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;에서도 요런 내용도 있으니 참고!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bce02f2c-ccd3-4cae-a8fd-22601abc4cb0.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnqlJN/btsEGkee9k1/HjA4FWPyJdFKM0skX3HDCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnqlJN/btsEGkee9k1/HjA4FWPyJdFKM0skX3HDCk/img.png&quot; data-alt=&quot;출처 :&amp;amp;nbsp;https://developer.apple.com/documentation/uikit/accessibility_for_uikit/supporting_voiceover_in_your_app&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnqlJN/btsEGkee9k1/HjA4FWPyJdFKM0skX3HDCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnqlJN%2FbtsEGkee9k1%2FHjA4FWPyJdFKM0skX3HDCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1066&quot; height=&quot;269&quot; data-filename=&quot;bce02f2c-ccd3-4cae-a8fd-22601abc4cb0.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://developer.apple.com/documentation/uikit/accessibility_for_uikit/supporting_voiceover_in_your_app&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이때 2가지 해결책이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. Parent의 traits을 button으로 지정하고, Parent를 눌렀을 때 버튼을 눌렀을 때와 동일한 액션을 수행하기 (버튼에 굳이 초점이 안가도 되도록)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. 버튼에 초점이 그냥 가게 하기&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;상황에 따라 다르겠지만 우선 2번만 살펴보자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707636801565&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.view.accessibilityElements = [self.myView, self.myButton]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;accessibilityElements는 접근성 요소들을 담는 배열이라고 보면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;지금 상태는 myButton이 접근성 요소임에도 불구하고 (UIButton이므로 isAccessibilityElement가 기본적으로 true임)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Parent의 isAccessibilityElement를 true로 만들었기 때문에 초점이 가지 않는 상태인데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이를 접근성 요소 배열에 추가해주는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그러면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Video_2024-02-11-16-51-05-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cym0p9/btsEFTOJVCb/FuPKwPgt2KAdFt4GZuVkh0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cym0p9/btsEFTOJVCb/FuPKwPgt2KAdFt4GZuVkh0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cym0p9/btsEFTOJVCb/FuPKwPgt2KAdFt4GZuVkh0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cym0p9/btsEFTOJVCb/FuPKwPgt2KAdFt4GZuVkh0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;332&quot; height=&quot;720&quot; data-filename=&quot;KakaoTalk_Video_2024-02-11-16-51-05-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 Parent, Child 둘 다 초점이 잡히게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;accessibilityElements를 사용할 때 주의할 점은,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707638041848&quot; class=&quot;crystal&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.view.accessibilityElements = [self.myView, self.myButton]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;넣은 순서대로 초점이 잡힌다는것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;지금 초점 순서는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;주황색 Parent View가 잡히고 -&amp;gt; 스와이프 오른쪽 -&amp;gt; Child 버튼 -&amp;gt; 스와이프 왼쪽 -&amp;gt; 주황색 Parent View&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;만약 버튼을 먼저 넣었다면&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707638108093&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.view.accessibilityElements = [self.myButton, self.myView]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Child 버튼이 먼저 잡히고 -&amp;gt; 스와이프 오른쪽 -&amp;gt; 주황색 ParentView -&amp;gt; 스와이프 왼쪽 -&amp;gt; Child 버튼&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 순서대로 초점이 잡히게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# 심화&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그렇다면 뷰가 여러개 중첩되어있을 때의 상황으로 테스트 해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2024-02-11-16-59-57.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;919&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsBYqv/btsELo7K3pH/x8iR47BdrzzDxWsk7QpKX1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsBYqv/btsELo7K3pH/x8iR47BdrzzDxWsk7QpKX1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsBYqv/btsELo7K3pH/x8iR47BdrzzDxWsk7QpKX1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsBYqv%2FbtsELo7K3pH%2Fx8iR47BdrzzDxWsk7QpKX1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;919&quot; data-filename=&quot;KakaoTalk_Image_2024-02-11-16-59-57.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;919&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;민트색 뷰 -&amp;gt; 파랑색 뷰 -&amp;gt; 흰색 뷰 -&amp;gt; 버튼&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;총 4개의 뷰가 있고, 순서대로 first, second, third, fourth다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;일단 알 수 있는 사실은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;first, second, third -&amp;gt; isAccessibilityElement == false&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;fourth(ㅋ버튼) -&amp;gt; isAccessibilityElement == true&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;접근성 로직에 아~~~무것도 안한상태에서 보이스오버를 켜보면 가장 안쪽의 버튼에만 초점이 간다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# 1. 모든 뷰에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;초점이 안가게&lt;/span&gt; 하고싶음&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;지금 접근성 요소가 버튼 하나밖에 없기 때문에..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707638671951&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.fourthButton.isAccessibilityElement = false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;를 하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;근데 만약에 버튼이 막 10개 있어;;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;전부 하나씩&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707638692157&quot; class=&quot;ini&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.fourthButton.isAccessibilityElement = false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 짓을 해줄 순 없는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이때는 적절한 Parent에&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707638761835&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.firstView.accessibilityElementsHidden = true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;accessibilityElementsHidden&lt;/b&gt;를 true로 주면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;해당 View &lt;b&gt;포함&lt;/b&gt; 모든 Subview들이 접근성 요소가 아니게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707641982032&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.firstView.isAccessibilityElement = true
self.firstView.accessibilityElementsHidden = true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이렇게 해도 firstView도 접근성 요소가 아님&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;물론 지금은 first, second, third 어디에서 accessibilityElementsHidden를 하든 상관없다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;자신의 상황에 맞게 적절한 Parent에 accessibilityElementsHidden 값을 주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# 2. [first, fourth에만 초점이 가게 하고싶음]&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;가장 최상위 민트색뷰, 가장 안쪽의 버튼에만 초점이 가도록 해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이건 사실 가장 처음에 봤던 예제랑 똑같은거라서.. 쉽게 할 수 있을것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707639239398&quot; class=&quot;crystal&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.firstView.isAccessibilityElement = true
self.view.accessibilityElements = [self.firstView, self.fourthButton]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그런데, 아까부터&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707639806276&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.firstView.isAccessibilityElement = true
self.view.accessibilityElements = [self.firstView, self.fourthButton]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;여기에 의문을 가진 사람도 있을것이다!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;isAccessibilityElement는 firstView에 걸어주는데, accessibilityElements는 왜 view에 걸어주지!?&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(사실 self.accessibilityElements = [~~] 도 동일한데 그냥 view로 해줬다..)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707639881754&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.firstView.isAccessibilityElement = true
self.firstView.accessibilityElements = [self.firstView, self.fourthButton]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 &lt;b&gt;둘 다 firstView에 세팅해주면 안되는건가?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;isAccessibilityElement는 당연히 해당하는 뷰에 걸어주는게 맞는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;accessibilityElements는 &lt;b&gt;그 상위뷰에 걸어줘야 적용이 된다!!&lt;/b&gt; (지금은 firstView의 상위뷰인 UIViewController의 view에 걸어준것)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# 3. [second, fourth에만 초점이 가게 하고싶음]&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2번 문제와 원리는 똑같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;secondView의 isAccessibilityElement를 true로 만들어주고 accessibilityElements를 세팅해주면되는데..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707640285452&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.secondView.isAccessibilityElement = true

self.view.accessibilityElements = [self.secondView, self.fourthButton] // 가능 
self.firstView.accessibilityElements = [self.secondView, self.fourthButton] // 가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이때 당연히 secondView.accessibilityElements 를 세팅해주는게 아니라!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;상위뷰인 firstView나 최상위뷰이인 view에 넣어줘야 원하는대로 초점이 잡히게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(바로 위 상위뷰만 된다는 글도 있는 것 같은데, 나는 최상위뷰에 해도 잘 되는 것 같다;;)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;다만 최상위뷰의 accessibilityElements를 세팅해줄때는 주의해야 할 점이 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707640635641&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.view.accessibilityElements = [self.firstView, self.fourthButton]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위 코드는&lt;b&gt; 2번문제 - [first, fourth에만 초점이 가게 하고싶음]&lt;/b&gt; 에서 사용한 코드인데..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 상위뷰에 넣어줬으니 firstView와 fourthButton에는 초점이 잘 가겠으나&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2024-02-11-17-11-31.jpeg&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxkCXO/btsEE3qNfJO/dwqLOEeda5fEpJvKNXrOL1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxkCXO/btsEE3qNfJO/dwqLOEeda5fEpJvKNXrOL1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxkCXO/btsEE3qNfJO/dwqLOEeda5fEpJvKNXrOL1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxkCXO%2FbtsEE3qNfJO%2FdwqLOEeda5fEpJvKNXrOL1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1012&quot; height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2024-02-11-17-11-31.jpeg&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;밑에 다른 접근성 요소가 있다면, 거기에는 초점이 안가게 된다. (위 그림에서 3번에 초점이 안감)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707640717489&quot; class=&quot;crystal&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.view.accessibilityElements = [self.firstView, self.fourthButton]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;왜냐면 최상위 뷰에 2개만 넣어줬기 때문.....&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707640729575&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.view.accessibilityElements = [self.firstView, self.fourthButton, self.myButton]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그래서 이렇게 myButton도 같이 넣어주거나 해야한다. (myButton == 3번 버튼)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;3번 문제에서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707641165999&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.view.accessibilityElements = [self.secondView, self.fourthButton] // 가능 
self.firstView.accessibilityElements = [self.secondView, self.fourthButton] // 가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;둘 다 가능하다고는 했지만, view에 넣어준것은 바로 위 문제가 발생하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt; firstView에 넣어준것은 아래 주황색뷰 안에있는 버튼에도 초점이 잘 가게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나는 그냥 테스트 프로젝트라서 최상위뷰의 accessibilityElements에 넣어줬지만, 이런 일은 최대한 지양해야할 것 같고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;따로 View를 하나 더 만들던가 해서 최상위뷰가 아닌 &lt;b&gt;바로 위 상위뷰에 넣어주는게 가장 좋을 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아니면 요걸 다른 방식으로 풀 수 있는것인지는 잘 모르겠다!!! 아시는 분은 댓글로 알려주세여&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>Accessibility</category>
      <category>접근성</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1406</guid>
      <comments>https://zeddios.tistory.com/1406#entry1406comment</comments>
      <pubDate>Sun, 11 Feb 2024 18:04:18 +0900</pubDate>
    </item>
    <item>
      <title>2023년 회고와 2024년 다짐</title>
      <link>https://zeddios.tistory.com/1404</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/652&quot;&gt;2018년 회고와 2019년 다짐&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/928&quot;&gt;2019년 회고와 2020년 다짐&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1192&quot;&gt;2020년 회고와 2021년 다짐&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1330&quot;&gt;2021년 회고와 2022년 다짐&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/1378&quot;&gt;2022년 회고와 2023년 다짐&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;올해에는 진짜 한게 없는 것 같았는데, 또 되돌아보니 이것저것 했고, 도전하고, 절망도하고.. &lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여러가지 경험들을 한 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이렇게 한 해를 돌아보는 시간이 있기에 내년이 더 반갑게 느껴지고 시작의 설레임이 배가 되는 듯한 느낌!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 운동&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;작년에 10kg를 감량했으니 조금 더 욕심내가지고 총 20kg..아니 15kg 감량까지도 해보고싶었는데, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;약 12kg에서 그쳤다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[2022년 7월 1일 건강검진]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-5.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRqkwR/btsCTwAvs8P/kqKhm9NNsdkjlE55bSfmtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRqkwR/btsCTwAvs8P/kqKhm9NNsdkjlE55bSfmtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRqkwR/btsCTwAvs8P/kqKhm9NNsdkjlE55bSfmtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRqkwR%2FbtsCTwAvs8P%2FkqKhm9NNsdkjlE55bSfmtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1144&quot; height=&quot;186&quot; data-filename=&quot;R1280x0-5.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[2022년 12월 14일 헬스장]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-6.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkPYfD/btsCWKdHICm/pP7wimXvompSHEuvn3jshk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkPYfD/btsCWKdHICm/pP7wimXvompSHEuvn3jshk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkPYfD/btsCWKdHICm/pP7wimXvompSHEuvn3jshk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkPYfD%2FbtsCWKdHICm%2FpP7wimXvompSHEuvn3jshk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;150&quot; data-filename=&quot;R1280x0-6.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[2023년 8월 8일 건강검진]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2023-12-30-23-32-10.jpeg&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nq7N5/btsCSaxH0u3/u02ce1z4lKlnq5Ry4hsV70/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nq7N5/btsCSaxH0u3/u02ce1z4lKlnq5Ry4hsV70/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nq7N5/btsCSaxH0u3/u02ce1z4lKlnq5Ry4hsV70/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnq7N5%2FbtsCSaxH0u3%2Fu02ce1z4lKlnq5Ry4hsV70%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1116&quot; height=&quot;180&quot; data-filename=&quot;KakaoTalk_Image_2023-12-30-23-32-10.jpeg&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;최근에는 인바디를 안재서.. 지표가 없긴 한데, 대충 비슷할거라고 생각합니다..? ㅈㅅ&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나 : 작년에 분명 골격근량 30kg를 기대했는데요. 분발하시길&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나 : 네&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나름 유지를 잘 하고 있는것 같다고 생각하는데, 정말 '유지'만 하고있어서 아쉽기도 하지만 뿌듯하기도 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나는 내 나름대로의 관리 루틴이 있고 나름 빡빡하게 관리한다고 하는데, 체중은 그렇게 안빠지는 것을 보면..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 관리 안하면 바로 다시 돌아가겠구나 싶다 ㅎㅎ..ㅠ&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;사실 올해는 유지만 하다보니 작년처럼 와 10kg를 빼다니..??!! 이런 감량에 대한 성취가 없어서 딱히 할말이 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;요 정체기를 탈출할 수 있는 꿀팁이 있다면 댓글좀.. 운동을 지금보다 더 많이 하면 되겠지만요........&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;PT도 올해 난생 처음 받아봤었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://brunch.co.kr/@zedd/386&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://brunch.co.kr/@zedd/386&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1703999311024&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;생애 첫 PT 경험&quot; data-og-description=&quot;힘들었지만 보람찼다고 말할 수 밖에 | 1월 17일 PT를 시작했고, 바로 3월 20일 10회차로 PT가 끝났다. 나는 골격도 있고 힘도 세다고(;;) 스스로 생각했는데, 그걸 완전히 부셔주는..나는 정말 약하구&quot; data-og-host=&quot;brunch.co.kr&quot; data-og-source-url=&quot;https://brunch.co.kr/@zedd/386&quot; data-og-url=&quot;https://brunch.co.kr/@zedd/386&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cnPg9P/hyUXZRxSeb/zaUxQpZFg7hBRJMiVNIDo0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/dSKc7x/hyUXMSc1HV/FvDEW0fcaThnRne5tHyRkk/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500&quot;&gt;&lt;a href=&quot;https://brunch.co.kr/@zedd/386&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brunch.co.kr/@zedd/386&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cnPg9P/hyUXZRxSeb/zaUxQpZFg7hBRJMiVNIDo0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/dSKc7x/hyUXMSc1HV/FvDEW0fcaThnRne5tHyRkk/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;생애 첫 PT 경험&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;힘들었지만 보람찼다고 말할 수 밖에 | 1월 17일 PT를 시작했고, 바로 3월 20일 10회차로 PT가 끝났다. 나는 골격도 있고 힘도 세다고(;;) 스스로 생각했는데, 그걸 완전히 부셔주는..나는 정말 약하구&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brunch.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;PT할 때 만큼은 선생님이 한 부위를 한계까지 밀어붙이곤 했는데, 혼자할땐 그러기 쉽지 않은 것 같다.&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;헬스 하나만 하다가 재미도없고 의욕도 안생기는것 같아서 새로운 운동을 찾아보던 중..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;집에서 살짝 거리가 있지만 좋은 요가학원이 있어서 요가를 배우기 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 요가&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7월 말부터 요가를 배우기 시작했는데,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;올해 가장 잘한 선택이 아닐까 싶다~~!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;달마다 시간표가 새로 만들어지는데,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;월요일부터 토요일까지 몇시에 어떤 선생님의 어떤 수업이 있고, 내가 그걸 예약하는 시스템이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;종류가 진~~짜 많아서 이것저것 시도해보는 재미도 쏠쏠했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;처음에는 그냥 내가 되는 시간대 (보통 평일 저녁)에 가는식으로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 &amp;lsquo;&lt;b&gt;시간&lt;/b&gt;&amp;rsquo;에 맞췄지, 그때의 &amp;lsquo;&lt;b&gt;선생님&lt;/b&gt;&amp;rsquo;이 누구냐는 신경쓰지 않았고 별로 중요하지 않다고 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요가 선생님 == 내가 동작 따라해야하는 요가 짱 잘하는 사람&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 이렇게 인지하고 있었음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어느 날, 평일 오전대 시간대의 처음보는 선생님 수업을 듣게 됐는데&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그 선생님이 진짜 사람 자체 + 마인드가 정말 멋있으시고, 목소리도 정~~~말 좋으시고..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;당연히 요가도 잘하시고ㅠㅠ 요가에 진심인게 느껴져서 그 선생님의 팬이 되었다..!!! ❤️&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;너무 잘 가르쳐주셔서 신뢰도 뿜뿜 ➡️ 자연스럽게 요가 더 가려고 함&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;물론 다른 선생님들도 다 너무 잘하시고 좋으신데, 각자 성향이 맞는 선생님이 있는 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런 경험들을 하면서 &amp;lsquo;선생님이 주는 영향이 크구나!&amp;rsquo;를 느꼈다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;머리서기는 요가 고수들만 하는건줄 알았는데, 이 선생님이 딱 한마디 해줬는데 바로 성공했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그 날 얼마나 뿌듯하던지!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 나는 요가 고수는 아니고 그냥 머리 서기 할 수 있는 사람됨&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 고대하던 플라잉요가도 해봤었는데, 해먹에서 허우적거리는 나를 볼때마다 현타가와서&amp;hellip;살짝 힘들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;처음으로 했을 때 ➡️ 와 진짜 다신 하나봐라 나랑 안맞음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;한 달 후 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;➡️&lt;/span&gt;&amp;nbsp;그래도 처음하고 그렇게 평가 내리는건 아닌듯. 나랑 안맞다고 외면하지 말아보자!! 해보자&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;두번째로 하고 나서 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;➡️&lt;/span&gt;&amp;nbsp;역시!! 나랑 안맞는군..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 상태&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 완전히 별로다!! 이건 아닌데, 살 좀만 빼고 하면 훨씬 더 수월할 것 같다&amp;hellip;ㅋㅋ..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요가를 정말정말 추천하는데,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어딜가나 듣는 뻔한말일 수도 있지만.. 마음의 번뇌를 다스리는데 큰 도움이 되는게 맞는 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 도움도 많이 받고 얻은것도 많은 것 같아서 꾸준히 하고싶다~~!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 중국어&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여전히 중국어를 공부중이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 여전히 듀오링고로만 공부하고있는데, 올해 유독 &amp;lsquo;&lt;b&gt;이걸 공부한다고 할 수 있는건가!&lt;/b&gt;&amp;rsquo;하는 생각이 많이 들었던 것 같다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아니 당연히 공부는 되지만!!! 듀오링고 강도로 언어를 배우는건 부족한 느낌이 든다..? 정도..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그렇게 느끼긴 했지만 아직까진 듀오링고 하나로 하는 중 ㅎㅎㅋ!!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;올해 듀오링고 후기는 아래와같이 정리할 수 있을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 원래 리그탭에 있는 time challenge를 정말 많이 했었는데, match madness로 바뀌고 나서 손이 아예 안가게 됨 ➡️ 그러다보니 주말에만 열리는 ramp up challenge도 잘 안하게됨&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 자연스럽게 그냥 코스(?)를 계속 깨게 됨 &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;➡️&lt;/span&gt; 작년보다 코스 진행 속도가 훨씬 빨라짐 + 단어도 더 많이 알게됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 다만 match madness / ram up 둘 다 잘 안하다보니 얻는 XP는 줄어듬 &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;➡️&lt;/span&gt;&amp;nbsp;다이아 리그 유지가 쉽지는 않았음..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. 앱 업데이트를 잘 안하는 편인데, 어쩌다 업데이트 했다가 성조/한자 쓰기를 공부할 수 있는 탭이 생긴걸 보고 너무 감동하고 업데이트를 열심히 해야겠다고 생각함ㅋㅋ..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;5. 각 문제에 대해 유저들끼리 토론이나 질문할 수 있는 곳이 있었는데 어느 날 그게 없어짐. 들어가면 나랑 똑같은!!! 궁금증을 가진 사람들이 많았고 관련해서 여러 의견들을 볼 수 있어서 좋았는데&amp;hellip;없어져서 굉장히 아쉬움. 돌려줘 ㅠ&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qe24B/btsCSaqSXmJ/eAZdChiEPlXYSSPaYSuewK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qe24B/btsCSaqSXmJ/eAZdChiEPlXYSSPaYSuewK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;1372&quot; data-filename=&quot;KakaoTalk_Image_2023-12-31-14-09-39.jpeg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.418605%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qe24B/btsCSaqSXmJ/eAZdChiEPlXYSSPaYSuewK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqe24B%2FbtsCSaqSXmJ%2FeAZdChiEPlXYSSPaYSuewK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;1372&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3j2rt/btsCTAQiZlf/gxAZEsDGLozSmgahlz5iQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3j2rt/btsCTAQiZlf/gxAZEsDGLozSmgahlz5iQk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2023-12-31-13-57-32_002.jpeg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.418605%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3j2rt/btsCTAQiZlf/gxAZEsDGLozSmgahlz5iQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3j2rt%2FbtsCTAQiZlf%2FgxAZEsDGLozSmgahlz5iQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;작년 / 올해 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;작년과 올해를 비교해보면 배운 단어수가 확연히 차이나는 것을 볼 수 있다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아 이거 듀오링고 하는 사람만 공감할 수 있는걸지도 모르겠지만..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;나는 작년에는 코스를 그렇게 많이 하는 편은 아니었는데,&amp;nbsp;왜냐면 딱 이상태일때 XP 부스트를 지금 당장 받고싶지 않아서..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2023-12-31-14-20-03.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBChij/btsCOBCE5dB/1KhkhtzirX2IpAjCsIQ8wK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBChij/btsCOBCE5dB/1KhkhtzirX2IpAjCsIQ8wK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBChij/btsCOBCE5dB/1KhkhtzirX2IpAjCsIQ8wK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBChij%2FbtsCOBCE5dB%2F1KhkhtzirX2IpAjCsIQ8wK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;431&quot; data-filename=&quot;KakaoTalk_Image_2023-12-31-14-20-03.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그래서 코스를 계속 미루다보니 time challenge만 했던건데, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;match madness로 바뀌고 나서는 하기가 싫어서 그냥 XP부스트 신경 안쓰고 코스를 계속 깨는 사람이 되었다..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그냥 올해에는 이상한 이유;;로 코스를 안깨던 나를 벗어난 것 같아서 기분이 좋았다 XD..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나름 작년보다 단어도 더 많이 알고, 내가 말하고 싶은 것들을 더 많이 말할 수 있게 되어서!!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;얼마전에 아주 살짝 자신감이 있는 상태로&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;대만여행을 다녀왔다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래 대만은 번체니까 읽는건 잘 못한다고 쳐 (나는 간체로 공부중)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 듣기도, 말하기도 내가 생각한대로 잘 안되니까 너무 답답했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 씨에씨에봇이 됨&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;웃긴 일화가 있는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 우육면을 먹었는데 굉장히 짰음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 그 날 저녁에 택시를 탔는데 기사님이 엄청 말거심&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 어느나라 사람이냐 여행왔냐 이것저것 물어봄&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. 일행이 중국어 조금 할줄 알아서 그냥 둘이 이야기함.. 나는 거의 못알아듣겠어서 옆에서 계속 뭐라셔..? 밖에 안함&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;5. 말하는 중에 우육면 먹어봤냐 하길래(이건 알아들음) 일행이 먹어봤다고 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;6. 내가 가만히 있다가 진짜 용기내서&amp;nbsp;&lt;b&gt;太咸了(t&amp;agrave;i xi&amp;aacute;nle 너무 짰다)&lt;/b&gt;&amp;nbsp;라고 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;7. 못알아들음ㅋㅋㅠㅠㅠㅠ 시엔..? 이러심&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;8. 일행도 같이 말해줬는데 그래도 못알아들으심(일행도 咸의 성조를 몰랐다고함)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;9. 사전으로 보여주니까 아~~시엔~&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 성조가 기억이 안났던터라 그냥 신경안쓰고 대충 말하긴 했는데 (그냥 당연히 문맥상 알아들을거라고 생각함..)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 사건이 나름 나에게 &lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;스피킹 공부를 좀 더 열심히해야겠다고 다짐하는 계기가 됨..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;(참고로 대만은 간체를 쓰는 중국 대륙과 다르게 번체를 쓰고 중국과 다른 단어도 몇개 있지만 말할때는 거의 문제없이 소통할 수 있는 것 같더라구요..?)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그리고 이번 여행으로 일행(a.k.a 짝꿍)을 다시 보게됐는데&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;내가 중국어 질문하면 맨날 &lt;i&gt;음 모르겠네...&lt;/i&gt;만하고 &lt;i&gt;이제 너가 중국어 더 잘하는 것 같아!!!  &lt;/i&gt; 이러던 사람이&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;의사소통이 문제없이 되길래 그동안의 모습은 뭐지..라는 생각이 들면서도 의지가 되어서 든든했다. (영어가 안통하는 상황에서 특히..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;s&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근데 왜 내가 궁금한것들 모르는거지..?;;&lt;/span&gt;&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;원래 대만가서 중국어 해야하는 상황에는 내가 다 말하고 대답하고 그러는게 목표였는데, 아예 알아듣지를 못하겠어서..ㅌㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;일행이 거의 다 해서 너무 아쉽고.. 근데 막상 중국어 해야할 땐 머리가 새하얘져서 단어도 생각이 잘 안났다. 데헷&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 클라이언트 플랫폼 팀&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;올해 일 관련해서 나에게 가장 큰 변화는 팀을 옮긴게 아닐까 싶다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;올해 7월, 클라이언트 플랫폼 (이하 클플)으로 팀을 옮겼다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(개인적으로 내가 느끼기엔.. 우리 회사는 팀을 옮기는게 엄청 큰 일이고 어렵다!! 이렇진않고, &lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 해보고싶고 &amp;amp; 기회가 되면 쉽게 팀을 옮길 수 있는 분위기다.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클플에 소속되어있는 사람들은 개발자를 위한 개발자..라고 이야기되는데, 딱 맞는 말이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다른 iOS개발자들이 iOS개발에 집중할 수 있도록 하는 사람들!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;나는 CI/CD + 자동화관련을 주로 보고있어서 그쪽만 말하면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱이 작지 않은 만큼 CI/CD가 내가 왔을때부터 너무 잘되어있었고, 자동화의 끝판왕이라고 느껴졌었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 사실 CI/CD를 신경쓰지 않아도 되는 회사에 있었어서 이런쪽은 완전히 무지했었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;배포가 안돼요 &amp;rarr; 클플 분들 멘션 &amp;rarr; 뚝딱 해결 &amp;rarr; 감사합니다! 역시 갓..그저 빛&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 이쪽을 아예 모르기에 당연히 멘션할 수 밖에 없지만 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러면서도 내가 아무것도 할 수 없다는 무력감이 항상 존재했었고, 클플 분들께도 죄송했었다 ㅠ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러면서 동시에 뚝딱뚝딱 해결하시는 모습이 너무 멋있으셨고, 내가 모르는 부분들을 배워보고 싶은 마음이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;동시에 내가 맡고 있는 서비스가 실험만 하다가 완전히 전체배포를 할 수 있게 되어서 팀이 해체 되는 타이밍에 클플로 팀을 옮기게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;젠킨스, 파이썬, 그루비, 코틀린 모든게 엮여있는데,&amp;nbsp;나는&amp;nbsp;&lt;/span&gt;파이썬을 가장 많이 쓰는 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;그렇다고 Swift를 안쓰는건 아니고 그냥 반반 하는 느낌!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;얼마전에는 코틀린으로 API추가하고, DB 테이블 추가하는것도 해봤었는데 재미있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;DB를 써야하는데, 이미 DB가 있어..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;근데 거기에 테이블을 어떻게 추가하고 그러는지 하나도 모르겠어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Tool을 뭘 써야할지도 모르겠어... &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;내가 뭘 모르는지 모르겠어!!!! &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런 상태였는데, 같은 팀원분이 정말 세세하게 알려주셔서 큰 도움을 받았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실 나는 아직도 너무 서툴고 뭐가 문제인지 하나도 모를때가 많은데, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;많이들 도와주셔서 겨우겨우 적응하고 맨날 새로운 경험을 해보고 있는 중이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt; 진짜 한 1년 있었던 것 같은데;; 5개월 밖에 안됐다는게 믿기지가 않네&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해보고싶어서 도전한거긴한데, 모르는게 너무 많아서ㅋㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;너무 바보같고 1인분 못하는것 같고 그렇지만 노력하는 중.. 아자아자&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# 올해의 xx&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;심심해서 요것도 넣어봄&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[올해의 영화]&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;엘리멘탈..ㅜㅜㅜ..   어흑.. 표현력, 상상력이 정말 뛰어나고 감동적인 영화였다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;얼마전에 본 크레센도도 좋았음!!  &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[올해의 잘산템]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;밧드야&lt;/b&gt; : 음식물 쓰레기통인데, 진짜 냄새가 1도 안난다..바이럴일까봐 반신반의했지만 후기가 좋은건 이유가 있는법&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704007652406&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;밧드야 18-8스테인리스 2L 음식물쓰레기통 : 네이버 쇼핑&quot; data-og-description=&quot; &quot; data-og-host=&quot;search.shopping.naver.com&quot; data-og-source-url=&quot;https://search.shopping.naver.com/catalog/32091709511?cat_id=50002478&amp;amp;frm=NVSCITB&amp;amp;section=review&amp;amp;query=밧드야&amp;amp;NaPm=ct%3Dlqt64hm0%7Cci%3D6523fcddf4de27ebd9ba2ebe3e2e86a38207548a%7Ctr%3Dslst%7Csn%3D95694%7Chk%3D56386d95372280f98886e6076745d39802d99024&quot; data-og-url=&quot;https://search.shopping.naver.com/catalog/32091709511?NaPm=ct%3Dlqt64hm0%7Cci%3D6523fcddf4de27ebd9ba2ebe3e2e86a38207548a%7Ctr%3Dslst%7Csn%3D95694%7Chk%3D56386d95372280f98886e6076745d39802d99024&amp;amp;cat_id=50002478&amp;amp;frm=NVSCITB&amp;amp;query=%EB%B0%A7%EB%93%9C%EC%95%BC&amp;amp;section=review&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bFKQX3/hyUXUQfwBV/mOhwKodEO15JKYKI1RqDe0/img.jpg?width=160&amp;amp;height=160&amp;amp;face=0_0_160_160,https://scrap.kakaocdn.net/dn/cqp6sf/hyUXSx8A6n/cdZuzdU1CE83tFnf9KREQK/img.jpg?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640&quot;&gt;&lt;a href=&quot;https://search.shopping.naver.com/catalog/32091709511?cat_id=50002478&amp;amp;frm=NVSCITB&amp;amp;section=review&amp;amp;query=밧드야&amp;amp;NaPm=ct%3Dlqt64hm0%7Cci%3D6523fcddf4de27ebd9ba2ebe3e2e86a38207548a%7Ctr%3Dslst%7Csn%3D95694%7Chk%3D56386d95372280f98886e6076745d39802d99024&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://search.shopping.naver.com/catalog/32091709511?cat_id=50002478&amp;amp;frm=NVSCITB&amp;amp;section=review&amp;amp;query=밧드야&amp;amp;NaPm=ct%3Dlqt64hm0%7Cci%3D6523fcddf4de27ebd9ba2ebe3e2e86a38207548a%7Ctr%3Dslst%7Csn%3D95694%7Chk%3D56386d95372280f98886e6076745d39802d99024&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bFKQX3/hyUXUQfwBV/mOhwKodEO15JKYKI1RqDe0/img.jpg?width=160&amp;amp;height=160&amp;amp;face=0_0_160_160,https://scrap.kakaocdn.net/dn/cqp6sf/hyUXSx8A6n/cdZuzdU1CE83tFnf9KREQK/img.jpg?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;밧드야 18-8스테인리스 2L 음식물쓰레기통 : 네이버 쇼핑&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;search.shopping.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2L사서 살짝 후회. 3L사세요...&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;호카 본디 8&lt;/b&gt; : 크록스만 주구장창 신다가 조금만 걸어도 너무 발이 아파서.. 신발을 사야겠다고 계속 생각했었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;뉴발, 아식스, 호카 등등 다양한 브랜드들을 추천하길래 고민하다가 우연히 호카 매장에서 본디8을 신어봤는데, 나를 감싸주는 느낌이 너무 좋아서..호카로 결정.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이상한 신발(&lt;s&gt;크록스&lt;/s&gt;)로 오래걸으면 발이 아프고 피로도가 세배로 쌓이는 느낌이 들면서 온몸이 피곤한데,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;호카 신었을 때는 오래걸어도 온몸이 아픈 느낌은 없었다. 너무너무 잘한 소비같아서 추천..&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704007934310&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;호카 여성 본디 8 WWH : 호카코리아&quot; data-og-description=&quot;[호카코리아] FLY HUMAN FLY HOKA&quot; data-og-host=&quot;brand.naver.com&quot; data-og-source-url=&quot;https://brand.naver.com/hoka/products/6904948098&quot; data-og-url=&quot;https://brand.naver.com/hoka/products/6904948098&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJL5yU/hyUXJ8101o/njlB24Dd2ekKbrZEauEz81/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000,https://scrap.kakaocdn.net/dn/bvZ7rK/hyUXZxgbee/BurqfK3KP70Jp4NtiEkgdk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000,https://scrap.kakaocdn.net/dn/4MB4J/hyUXOWOyvo/m493XjkR58omwl6deGlezk/img.jpg?width=510&amp;amp;height=510&amp;amp;face=0_0_510_510&quot;&gt;&lt;a href=&quot;https://brand.naver.com/hoka/products/6904948098&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brand.naver.com/hoka/products/6904948098&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJL5yU/hyUXJ8101o/njlB24Dd2ekKbrZEauEz81/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000,https://scrap.kakaocdn.net/dn/bvZ7rK/hyUXZxgbee/BurqfK3KP70Jp4NtiEkgdk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000,https://scrap.kakaocdn.net/dn/4MB4J/hyUXOWOyvo/m493XjkR58omwl6deGlezk/img.jpg?width=510&amp;amp;height=510&amp;amp;face=0_0_510_510');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;호카 여성 본디 8 WWH : 호카코리아&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[호카코리아] FLY HUMAN FLY HOKA&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brand.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[올해의 책]&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아 올해 재밌게 읽은책들이 진짜 많은데, 하나만 꼽자면..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;당신도 느리게 나이들 수 있습니다&lt;/b&gt; : 저속노화에 관심이 많기도 하고..꼭 노화 관련이 아니더라도 그냥 현대사회를 살아가는 일원으로서, 건강하게 삶을 살아가기 위해서 어떤것들을 할 수 있는지, 하면 좋을지가 잘 정리되어있는 것 같다. 정희원 작가님의 식견에 놀라고 또 놀란책.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704008385986&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;book&quot; data-og-title=&quot;당신도 느리게 나이 들 수 있습니다 - 예스24&quot; data-og-description=&quot;행복한 노화를 위해 지금 당장 준비해야 할 네 가지 기둥과 습관들&amp;ldquo;당신의 삶이 노화의 속도를 결정한다&amp;rdquo;피할 수는 없지만 늦출 수는 있다! 서울아산병원 노년내과 정희원 교수가 한국사회에&quot; data-og-host=&quot;m.yes24.com&quot; data-og-source-url=&quot;https://m.yes24.com/Goods/Detail/116413548&quot; data-og-url=&quot;https://m.yes24.com/Goods/Detail/116413548&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cLdxTL/hyUTFNXmXt/czOOZm4QST49sP9Pso5ze0/img.jpg?width=828&amp;amp;height=1200&amp;amp;face=106_986_209_1098,https://scrap.kakaocdn.net/dn/7JC3B/hyUTzAel7r/bQmTXHoAt7aqP3FKVc22kK/img.jpg?width=828&amp;amp;height=1200&amp;amp;face=106_986_209_1098&quot;&gt;&lt;a href=&quot;https://m.yes24.com/Goods/Detail/116413548&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.yes24.com/Goods/Detail/116413548&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cLdxTL/hyUTFNXmXt/czOOZm4QST49sP9Pso5ze0/img.jpg?width=828&amp;amp;height=1200&amp;amp;face=106_986_209_1098,https://scrap.kakaocdn.net/dn/7JC3B/hyUTzAel7r/bQmTXHoAt7aqP3FKVc22kK/img.jpg?width=828&amp;amp;height=1200&amp;amp;face=106_986_209_1098');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;당신도 느리게 나이 들 수 있습니다 - 예스24&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;행복한 노화를 위해 지금 당장 준비해야 할 네 가지 기둥과 습관들&amp;ldquo;당신의 삶이 노화의 속도를 결정한다&amp;rdquo;피할 수는 없지만 늦출 수는 있다! 서울아산병원 노년내과 정희원 교수가 한국사회에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;m.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[올해의 웹툰]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;올해 진짜 유독 웹툰을 많이봤는데... &lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나에게 올해의 앱은 아마 네이버 웹툰이랑 카카오페이지일듯;;; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;솔직히 웹툰 추천 하고싶은거 너무 많지만..(이 맘 다들 알거라 믿음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하나만 꼽자면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;후궁 스캔들&lt;/b&gt; : 그냥 스토리, 개그요소 모든게 내 취향...왜 밑에 있는지 이해 안가는 웹툰 1위.. 얼마전에 완결났으니 꼭 보시길&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704008558321&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;후궁 스캔들&quot; data-og-description=&quot;동생 때문에 억지로 황태자비 간택전에 나가게 된 화영.이렇게 된 김에 화려하게 쫓겨날 계획을 세운다!하지만 계속 이상하게 엮이는 황태자 신영 때문에 계획은 쉽지 않고,오히려 황비와 황태&quot; data-og-host=&quot;comic.naver.com&quot; data-og-source-url=&quot;https://comic.naver.com/webtoon/list?titleId=784140&quot; data-og-url=&quot;https://comic.naver.com/webtoon/list?titleId=784140&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b0e4DQ/hyUXRlHlx3/8tKFD32H42xwDIaHYZaSM0/img.jpg?width=480&amp;amp;height=623&amp;amp;face=0_0_480_623&quot;&gt;&lt;a href=&quot;https://comic.naver.com/webtoon/list?titleId=784140&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://comic.naver.com/webtoon/list?titleId=784140&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b0e4DQ/hyUXRlHlx3/8tKFD32H42xwDIaHYZaSM0/img.jpg?width=480&amp;amp;height=623&amp;amp;face=0_0_480_623');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;후궁 스캔들&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;동생 때문에 억지로 황태자비 간택전에 나가게 된 화영.이렇게 된 김에 화려하게 쫓겨날 계획을 세운다!하지만 계속 이상하게 엮이는 황태자 신영 때문에 계획은 쉽지 않고,오히려 황비와 황태&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;comic.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;작가님들 항상 건강하시고..아프시면 푹 쉬시고..재밌는 웹툰 많이 만들어주셔서 감사하다는...말씀을 드립니다... &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2023-12-31-16-46-26.jpeg&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3KOnv/btsCN30CNwJ/pcEudH0GLt0yXeXeUaKiv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3KOnv/btsCN30CNwJ/pcEudH0GLt0yXeXeUaKiv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3KOnv/btsCN30CNwJ/pcEudH0GLt0yXeXeUaKiv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3KOnv%2FbtsCN30CNwJ%2FpcEudH0GLt0yXeXeUaKiv0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;908&quot; height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2023-12-31-16-46-26.jpeg&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;전 쿠키를 준비해둘게요!!!!!!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;데헷&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# 작년 다짐&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;목표와 다짐은 다르니..나는 목표를 세우기 보다는 다짐을 하고싶다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아직도 헬스장을 가려고 하면 으 5분만...하는 생각이 드는데, 그냥 이럴때 바로 가버리기!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그냥 생각하지 말고 바로 실천하는 내가 되었으면 한다. (대신 말은 생각하고 하기~~!)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;헬스장가기 &amp;lt; 이런걸 뭔가 해치워야하는 미션같이 생각하지말고 그냥 습관처럼 할 수 있도록 시스템화하기 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;(== 양치하는거랑 똑같이 그냥 당연히 해야할 때 해야하는 것으로 인식하게 만들기)&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;작년에 했던 이 다짐이 여전히 헬스장만 다니고 있었다면 지켜지지 못했겠지만..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;요가 덕분에 (그리고 내가 좋아하는 선생님 덕분에!) 아무 생각없이 갈 수 있는 날들이 많았던 것 같아서 살짝 뿌듯할지도..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;헬스든 요가든 잡생각이 들려고 할때의 꿀팁은 그냥 일단 일어나서 운동복을 입으면 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;운동복을 입으면 일단 가야되기때문에^^,,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# 2024년 다짐&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;24년에는 내 예상이 맞다면..정말 많은 일이 일어날 해라서 정신없을 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;사실.. 관련해서 올해에도 정말 많은 일이 있었는데, 회고에 쓰지는 않았지만 올해도 정말 정신없었다. ㅋㅋ;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 거창한 다짐은 없고&amp;nbsp;24년에는 그냥 계획했던 일들 잘 해내고, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내년 회고에 올해 회고에서 못했던 이런저런 이야기를 할 수 있기를 바래본다~~!&lt;/span&gt;&lt;/p&gt;</description>
      <category>일상</category>
      <category>2023</category>
      <category>회고</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1404</guid>
      <comments>https://zeddios.tistory.com/1404#entry1404comment</comments>
      <pubDate>Sun, 31 Dec 2023 19:26:59 +0900</pubDate>
    </item>
    <item>
      <title>[iOS] PHPicker 권한 정리</title>
      <link>https://zeddios.tistory.com/1403</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;옛날에 PHPicker관련해서 쓴 것들 왜이렇게 헷갈리지..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# 권한 필요없음&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;기본적으로 사진을 단순 Read하기 위해서는 사진 접근 권한이 필요없음 (= PHPicker를 띄우기 위해서는 권한이 따로 필요없음)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AnlAT/btsBOgrZjJ9/K7c2nrQ1VszZ1pMF48KyU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AnlAT/btsBOgrZjJ9/K7c2nrQ1VszZ1pMF48KyU0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1043&quot; data-filename=&quot;KakaoTalk_Image_2023-12-11-21-31-58.jpeg&quot; data-widthpercent=&quot;49.83&quot; style=&quot;width: 49.252212%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AnlAT/btsBOgrZjJ9/K7c2nrQ1VszZ1pMF48KyU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAnlAT%2FbtsBOgrZjJ9%2FK7c2nrQ1VszZ1pMF48KyU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1043&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diAHjq/btsBOg6BieU/lKXc7btKzPq4eOz47rt3Bk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diAHjq/btsBOg6BieU/lKXc7btKzPq4eOz47rt3Bk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1036&quot; data-filename=&quot;KakaoTalk_Image_2023-12-11-21-32-46.jpeg&quot; data-widthpercent=&quot;50.17&quot; style=&quot;width: 49.584997%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diAHjq/btsBOg6BieU/lKXc7btKzPq4eOz47rt3Bk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiAHjq%2FbtsBOg6BieU%2FlKXc7btKzPq4eOz47rt3Bk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1036&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;PHPicker를 띄우면 왼쪽 그림처럼 안내 텍스트가 보일거고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;설정에 가면 오른족 그림처럼 비공개로 접근으로 뜰 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 앱은 사용자의 사진 보관함을 표시할 수 있지만,&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오직 사용자가 선택한 항목에만 접근할 수 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;그러니까.. PHPicker를 띄웠으면 모든 사진/비디오 같은것들이 나올텐데, 이런것들에 앱(코드로)이 접근 못하고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2023-12-11-21-39-38.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MkUwV/btsBGFNdpP9/GOqDn3bu9cOAW7pwyvXiCK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MkUwV/btsBGFNdpP9/GOqDn3bu9cOAW7pwyvXiCK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MkUwV/btsBGFNdpP9/GOqDn3bu9cOAW7pwyvXiCK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMkUwV%2FbtsBGFNdpP9%2FGOqDn3bu9cOAW7pwyvXiCK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;744&quot; data-filename=&quot;KakaoTalk_Image_2023-12-11-21-39-38.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;내가 선택하고 추가한 것들에만 접근 할 수 있다는 뜻&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;암튼 이 PHPicker를 띄우고, PHPicker가 모든 Asset들을 보여주는것에 대해서는 따로 권한이 필요없다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;PHPicker에서 선택한 Asset에 대해서 접근할때도 권한 필요없음. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⚠️ 주의 : 여기서 말하는 Asset은 PHAsset이 아님!! &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;PHPicker에서 선택한 결과. 즉 PHPickerResult를 PHAsset으로 변환시키고 싶으면 권한이 필요함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;loadObject나 loadDataRepresentation같은것들로 접근하는 것만 가능하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# 언제 권한이 필요하냐?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;코드 내에서 사진첩에 있는 사진을 읽어오고 싶을 때 (PHPicker 안통하고), &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;사진을 추가/편집하고 싶을 때 권한이 필요하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. NSPhotoLibraryUsageDescription 권한 요청 메시지 추가&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. 아래 코드를 이용하여 권한을 요청&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/05011d2b0d3e4d86158911880deccec7.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;참고) 이렇게 명시적으로 권한 요청 안해도..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702299580598&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let albums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: nil)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;뭐 이런 코드만 있어도 알아서 권한을 요청하는것을 확인했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하지만 권한체크는 앞에서 꼭 해주자&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. 아래와 같이 권한 요청 프롬프트가 뜬다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-11 오후 9.53.05.png&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWTGc/btsBKiwShts/iNODkHjyhMIoPrT1zNtRr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWTGc/btsBKiwShts/iNODkHjyhMIoPrT1zNtRr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWTGc/btsBKiwShts/iNODkHjyhMIoPrT1zNtRr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWTGc%2FbtsBKiwShts%2FiNODkHjyhMIoPrT1zNtRr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;912&quot; data-filename=&quot;스크린샷 2023-12-11 오후 9.53.05.png&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오 원래 이렇게 자세하게 안나왔던 것 같은데;; 아무튼 17.1.2 인데 이렇게 나오네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# 접근 제한을 눌렀을 때&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2023-12-12-09-45-04.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;903&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LXIHR/btsBGwo9MAP/CCBKKMaGTCnuJmYsoQxKq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LXIHR/btsBGwo9MAP/CCBKKMaGTCnuJmYsoQxKq0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LXIHR/btsBGwo9MAP/CCBKKMaGTCnuJmYsoQxKq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLXIHR%2FbtsBGwo9MAP%2FCCBKKMaGTCnuJmYsoQxKq0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;903&quot; data-filename=&quot;KakaoTalk_Image_2023-12-12-09-45-04.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;903&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;메시지가 살짝 바뀌는데,&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;~앱은 사용자가 선택한 항목에만 접근할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;해당 앱이 사용자의 보관함에 추가하는 것은 가능합니다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. ~앱은 사용자가 선택한 항목에만 접근할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;설정에 가보면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2023-12-12-09-46-10.jpeg&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kWvtE/btsBHqospmu/mDhkz3oW20w9PfMprTKkq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kWvtE/btsBHqospmu/mDhkz3oW20w9PfMprTKkq1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kWvtE/btsBHqospmu/mDhkz3oW20w9PfMprTKkq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkWvtE%2FbtsBHqospmu%2FmDhkz3oW20w9PfMprTKkq1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;876&quot; height=&quot;1440&quot; data-filename=&quot;KakaoTalk_Image_2023-12-12-09-46-10.jpeg&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 되어있는 것을 볼 수 있는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;현재는 선택된 사진이 하나도 없는 상태이고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;선택된 사진 편집을 눌러서 사진들을 선택하고 해당 사진들에게만 접근 권한을 추가할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEkURs/btsBQvichoH/htvdYhZYGvDFJ32P0k0J6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEkURs/btsBQvichoH/htvdYhZYGvDFJ32P0k0J6K/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;762&quot; data-filename=&quot;KakaoTalk_Image_2023-12-12-09-50-03.jpeg&quot; data-widthpercent=&quot;63.24&quot; style=&quot;width: 62.50631%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEkURs/btsBQvichoH/htvdYhZYGvDFJ32P0k0J6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEkURs%2FbtsBQvichoH%2FhtvdYhZYGvDFJ32P0k0J6K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFZ1Wk/btsBQhKXMV6/tLNkXiRlLZ7ItONG5KVjmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFZ1Wk/btsBQhKXMV6/tLNkXiRlLZ7ItONG5KVjmk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1311&quot; data-filename=&quot;KakaoTalk_Image_2023-12-12-09-50-36.jpeg&quot; data-widthpercent=&quot;36.76&quot; style=&quot;width: 36.330899%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFZ1Wk/btsBQhKXMV6/tLNkXiRlLZ7ItONG5KVjmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFZ1Wk%2FbtsBQhKXMV6%2FtLNkXiRlLZ7ItONG5KVjmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1311&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;사진을 선택해서 완료를 누르면 저렇게 N개의 항목이 선택되었다고 나오게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 상태에서 앱으로 돌아가 PHPicker를 열면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-12 오전 10.04.55.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;1256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuG9jh/btsBGHj1zzN/xKTdpwv9WWjcxUI9lSdUGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuG9jh/btsBGHj1zzN/xKTdpwv9WWjcxUI9lSdUGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuG9jh/btsBGHj1zzN/xKTdpwv9WWjcxUI9lSdUGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuG9jh%2FbtsBGHj1zzN%2FxKTdpwv9WWjcxUI9lSdUGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;1256&quot; data-filename=&quot;스크린샷 2023-12-12 오전 10.04.55.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런식으로 모든 사진이 나오게 되는데..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;여기서 내가 선택한 항목만 나오는거 아니었어?!&lt;/b&gt; 하고 헷갈릴 수 있는데, 여기서 나오는거는 다 나오되&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702343186203&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let options = PHFetchOptions()
let albums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: nil)

albums.enumerateObjects { (collection, _, _) in
    let assets = self.fetchAssets(in: collection)
    ~~~
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런식으로 코드에서 사진첩에 접근할 때 해당 선택된 항목에만 접근할 수 있다는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;현재 나는 이미지 1개를 접근할 수 있도록 해두었으니&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFZ1Wk/btsBQhKXMV6/tLNkXiRlLZ7ItONG5KVjmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFZ1Wk/btsBQhKXMV6/tLNkXiRlLZ7ItONG5KVjmk/img.jpg&quot; data-widthpercent=&quot;46.72&quot; data-filename=&quot;KakaoTalk_Image_2023-12-12-09-50-36.jpeg&quot; data-origin-height=&quot;1311&quot; data-origin-width=&quot;1170&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.172025%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFZ1Wk/btsBQhKXMV6/tLNkXiRlLZ7ItONG5KVjmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFZ1Wk%2FbtsBQhKXMV6%2FtLNkXiRlLZ7ItONG5KVjmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1311&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIBPvN/btsBMWtAiqm/qQgfoahyKKi8RurqPfZyQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIBPvN/btsBMWtAiqm/qQgfoahyKKi8RurqPfZyQk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;1114&quot; data-filename=&quot;스크린샷 2023-12-12 오전 10.09.33.png&quot; data-widthpercent=&quot;53.28&quot; style=&quot;width: 52.665185%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIBPvN/btsBMWtAiqm/qQgfoahyKKi8RurqPfZyQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIBPvN%2FbtsBMWtAiqm%2FqQgfoahyKKi8RurqPfZyQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1134&quot; height=&quot;1114&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Asset들을 쫙 훑었을 때 1개만 나오는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그리고 저 1개의 Asset을 화면에 표시하면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEkURs/btsBQvichoH/htvdYhZYGvDFJ32P0k0J6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEkURs/btsBQvichoH/htvdYhZYGvDFJ32P0k0J6K/img.jpg&quot; style=&quot;width: 61.217852%; margin-right: 10px;&quot; data-widthpercent=&quot;61.94&quot; data-filename=&quot;KakaoTalk_Image_2023-12-12-09-50-03.jpeg&quot; data-origin-height=&quot;762&quot; data-origin-width=&quot;1170&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEkURs/btsBQvichoH/htvdYhZYGvDFJ32P0k0J6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEkURs%2FbtsBQvichoH%2FhtvdYhZYGvDFJ32P0k0J6K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS2Pm7/btsBQW7Goy3/rGrbQZD6eUXRzFGFbGMkak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS2Pm7/btsBQW7Goy3/rGrbQZD6eUXRzFGFbGMkak/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1240&quot; data-filename=&quot;KakaoTalk_Image_2023-12-12-10-09-19.jpeg&quot; data-widthpercent=&quot;38.06&quot; style=&quot;width: 37.619357%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS2Pm7/btsBQW7Goy3/rGrbQZD6eUXRzFGFbGMkak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS2Pm7%2FbtsBQW7Goy3%2FrGrbQZD6eUXRzFGFbGMkak%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1240&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아까 내가 선택한 고양이가 잘 나오는 것을 볼 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. 해당 앱이 사용자의 보관함에 추가하는 것은 가능합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;제한된 접근을 눌렀어도 이미지를 추가하는 것은 가능하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;UIImageWriteToSavedPhotosAlbum 으로 간단히 테스트해봤는데, 문제없이 추가되는 것을 확인했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;여기서 헷갈리면 안되는게&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. 코드내에서 선택된 Asset에 접근이 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. PHPicker를 열었음 ➡️ 모든 Asset들이 다 나올거임 &lt;span style=&quot;text-align: start;&quot;&gt;➡️ &lt;/span&gt;내가 특정 Asset을 선택함(그게 앞에서 선택한 Asset이 아닐 수 있음) &lt;span style=&quot;text-align: start;&quot;&gt;➡️&lt;/span&gt; 추가 &lt;span style=&quot;text-align: start;&quot;&gt;➡️&lt;/span&gt; 방금 추가한 Asset들에도 접근이 가능&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;그냥 &lt;u&gt;PHPicker를 열어서&lt;/u&gt; 이미지를 선택하면, 권한과 상관없이 해당 Asset에 접근할 수 있다고 이해하면 가장 쉬울 것 같다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# 전체 접근 허용&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;말 그대로 모든 Asset에 대해 접근을 허용하겠다는 뜻이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWTGc/btsBKiwShts/iNODkHjyhMIoPrT1zNtRr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWTGc/btsBKiwShts/iNODkHjyhMIoPrT1zNtRr0/img.png&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-12-11 오후 9.53.05.png&quot; data-origin-height=&quot;912&quot; data-origin-width=&quot;574&quot; data-widthpercent=&quot;42.04&quot; style=&quot;width: 41.550402%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWTGc/btsBKiwShts/iNODkHjyhMIoPrT1zNtRr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWTGc%2FbtsBKiwShts%2FiNODkHjyhMIoPrT1zNtRr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEPR7c/btsBHRsSzSE/uFNKXc3qcJ6H0G4mzuRZh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEPR7c/btsBHRsSzSE/uFNKXc3qcJ6H0G4mzuRZh1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;1104&quot; data-filename=&quot;스크린샷 2023-12-12 오전 10.18.36.png&quot; data-widthpercent=&quot;57.96&quot; style=&quot;width: 57.286807%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEPR7c/btsBHRsSzSE/uFNKXc3qcJ6H0G4mzuRZh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEPR7c%2FbtsBHRsSzSE%2FuFNKXc3qcJ6H0G4mzuRZh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;1104&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;전체 접근을 허용하면, &lt;b&gt;코드에서&lt;/b&gt; 사진 보관함에 접근하여 모든 Asset들을 가져올 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;물론 추가도 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# 허용 안함&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;요것도 말그대로 허용을 아예 안하겠다는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Q : 접근 제한에서 사진 아무것도 선택 안한거랑 허용안함이 뭐가다름?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;접근 제한에서 아무것도 선택 안했을 때는 앨범에는 접근이 가능하다. 다만 Asset이 없다고 나올뿐..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-12 오전 10.25.32.png&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;1112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQjTKu/btsBQpvueHE/rSrtyfAjTEMOOoWDTS7BQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQjTKu/btsBQpvueHE/rSrtyfAjTEMOOoWDTS7BQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQjTKu/btsBQpvueHE/rSrtyfAjTEMOOoWDTS7BQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQjTKu%2FbtsBQpvueHE%2FrSrtyfAjTEMOOoWDTS7BQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1166&quot; height=&quot;1112&quot; data-filename=&quot;스크린샷 2023-12-12 오전 10.25.32.png&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;1112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;허용 안함 상태에서는 앨범에도 접근이 불가하다. (아예 앨범 갯수가 0으로 나옴)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;허용 안함 상태에서도 헷갈리면 안되는게&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;PHPicker를 직접 열어서 선택한 것들에는 접근이 가능하다. 코드내에서 접근이 안될뿐..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Q : 허용안함 상태에서 이미지 추가 가능?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;A : 당연히 불가!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오랜만에 보니까 이게 권한이 필요했었나.. 싶어서 헷갈려가지고 ㅠ 정리&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>PHPicker</category>
      <category>PHPicker Permission</category>
      <category>PHPicker 권한</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1403</guid>
      <comments>https://zeddios.tistory.com/1403#entry1403comment</comments>
      <pubDate>Tue, 12 Dec 2023 12:12:42 +0900</pubDate>
    </item>
    <item>
      <title>[Github] Support for password authentication was removed on August 13, 2021 / Fine-grained vs classic</title>
      <link>https://zeddios.tistory.com/1402</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;개인 맥북에서 (정말 오랜만에) clone 하려니까&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.42.39.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfjnqi/btsATPoWgBS/njl0eIEJayySUq8KTw0Wak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfjnqi/btsATPoWgBS/njl0eIEJayySUq8KTw0Wak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfjnqi/btsATPoWgBS/njl0eIEJayySUq8KTw0Wak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfjnqi%2FbtsATPoWgBS%2Fnjl0eIEJayySUq8KTw0Wak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;64&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.42.39.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이게 나오길래 그냥 생각없이 github 비밀번호 쳤더니..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701053015938&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;remote: Support for password authentication was removed on August 13, 2021.

remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요게 나왔다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;차근차근 수정해보자!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Github 프로필로 이동 &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/settings/profile&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/settings/profile&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1701052319654&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub: Let&amp;rsquo;s build from here&quot; data-og-description=&quot;GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/settings/profile&quot; data-og-url=&quot;https://github.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crX0HB/hyUE1hHzQJ/PKs6b74qwVqwmLw1pT9kB1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://github.com/settings/profile&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/settings/profile&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crX0HB/hyUE1hHzQJ/PKs6b74qwVqwmLw1pT9kB1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub: Let&amp;rsquo;s build from here&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 왼쪽 제일 하단 Developer settings 클릭&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.32.05.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b68qcA/btsAVqIWViy/OjGyKKPw36hkWtwqIpjLFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b68qcA/btsAVqIWViy/OjGyKKPw36hkWtwqIpjLFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b68qcA/btsAVqIWViy/OjGyKKPw36hkWtwqIpjLFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb68qcA%2FbtsAVqIWViy%2FOjGyKKPw36hkWtwqIpjLFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;332&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.32.05.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Personal access tokens &amp;gt; Tokens &amp;gt; Generate new token 클릭&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.33.45.png&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AHMo6/btsAWf1DEFU/q3vKqvGXhRKNJ1gsPHDi7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AHMo6/btsAWf1DEFU/q3vKqvGXhRKNJ1gsPHDi7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AHMo6/btsAWf1DEFU/q3vKqvGXhRKNJ1gsPHDi7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAHMo6%2FbtsAWf1DEFU%2Fq3vKqvGXhRKNJ1gsPHDi7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2258&quot; height=&quot;640&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.33.45.png&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 뜰텐데, 나는 &lt;b&gt;classic&lt;/b&gt;으로 선택..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.38.50.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VZtXo/btsASsH0OSG/MQdkBIm4YQUBNTrbRd7UC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VZtXo/btsASsH0OSG/MQdkBIm4YQUBNTrbRd7UC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VZtXo/btsASsH0OSG/MQdkBIm4YQUBNTrbRd7UC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVZtXo%2FbtsASsH0OSG%2FMQdkBIm4YQUBNTrbRd7UC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;360&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.38.50.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Fine-grained 는 하단에서 설명하겠다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. Expiration 및 Scope 설정&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;보통 No expiration으로 많이하고, 나는 권한이 없어서 다시 토큰을 regenrate하는 일을 방지하기위해 다 체크를 해줬다,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.40.52.png&quot; data-origin-width=&quot;2330&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxI1Uk/btsASuTlHGs/Dlg5hLKLYMIqfKTtkbCcx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxI1Uk/btsASuTlHGs/Dlg5hLKLYMIqfKTtkbCcx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxI1Uk/btsASuTlHGs/Dlg5hLKLYMIqfKTtkbCcx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxI1Uk%2FbtsASuTlHGs%2FDlg5hLKLYMIqfKTtkbCcx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2330&quot; height=&quot;1324&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.40.52.png&quot; data-origin-width=&quot;2330&quot; data-origin-height=&quot;1324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;5. 화면에 토큰이 보일텐데, 꼭 복사를 해두자. &lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나가면 다시 못봄&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;6. 다시 clone이나 push 시도&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러면 Username이랑 Password 받을거임&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701053715081&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Username for 'https://github.com': 유저네임
Password for 'https://Zedd0202@github.com': 토큰 복붙&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하고나면 clone이나 push가 제대로 되는 것을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Q&amp;amp;A&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : Username을 어떻게 확인?&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A : 본인 Github 프로필 URL(https://github.com/본인의_Username)에 붙어있는거로 알고있긴한데..맞겠져&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ex. 나의 경우 &amp;nbsp;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/Zedd0202&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/&lt;b&gt;Zedd0202&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; &amp;lt; 라서 Username은 Zedd0202&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : 생각해보니까 Username잘못입력함;;; 다시 입력하고싶은데..&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701054016174&quot; class=&quot;nginx&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;Username for 'https://github.com': 유저네임
Password for 'https://Zedd0202@github.com': 토큰 복붙&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이거 다시 나오게 하는 방법 없는지?ㅎ;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A : 키체인 접근 &amp;gt; github 검색&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-27 오후 12.02.39.png&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwjOfF/btsASS7wFBX/PqGTg77VlomunA1MasvYMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwjOfF/btsASS7wFBX/PqGTg77VlomunA1MasvYMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwjOfF/btsASS7wFBX/PqGTg77VlomunA1MasvYMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwjOfF%2FbtsASS7wFBX%2FPqGTg77VlomunA1MasvYMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1454&quot; height=&quot;124&quot; data-filename=&quot;스크린샷 2023-11-27 오후 12.02.39.png&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;키체인 &amp;gt; 로그인인거 삭제하면 되는듯하다. 나는 수정일로 보긴 했는데;; 우클릭하면 삭제 나옴&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다시 clone이나 push하면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701054235546&quot; class=&quot;nginx&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Username for 'https://github.com': 유저네임
Password for 'https://Zedd0202@github.com': 토큰 복붙&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이거 다시 물어보는 것을 볼 수 있다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : Fine-grained, repo-scoped 이거 머임; 이거로 하면 안되는지..&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.38.50.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VZtXo/btsASsH0OSG/MQdkBIm4YQUBNTrbRd7UC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VZtXo/btsASsH0OSG/MQdkBIm4YQUBNTrbRd7UC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VZtXo/btsASsH0OSG/MQdkBIm4YQUBNTrbRd7UC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVZtXo%2FbtsASsH0OSG%2FMQdkBIm4YQUBNTrbRd7UC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;360&quot; data-filename=&quot;스크린샷 2023-11-27 오전 11.38.50.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A : &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Github 공식 문서에서는 classic 대신 Find-grained를 사용할 것을 권장한다고 나와있다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;GitHub recommends that you use fine-grained personal access tokens instead of personal access tokens (classic) whenever possible.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;Fine-grained는 classic에 비해 다음과 같이 보안적으로 좀 더 안전하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 각 토큰은 단일 사용자 또는 조직이 소유한 리소스에만 액세스할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 각 토큰은 특정 저장소에만 액세스할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 각 토큰에는 개인 액세스 토큰(클래식)에 부여된 범위보다 더 많은 제어를 제공하는 특정 권한이 부여됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 각 토큰에는 만료 날짜가 있어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 조직 소유자는 조직의 리소스에 액세스할 수 있는 세분화된 개인 액세스 토큰에 대한 승인을 요구할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자세한건 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 참고!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;음 organization이 있고, 권한을 세밀하게 관리해야하는 거면 Fine-grained를 쓰면 좋을 것 같긴한데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 혼자 쓰는거니까 그냥 classic이 마음 편한것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Fine-grained를 써볼까도 싶지만 위에서 언급됐듯이 만료날짜가 반드시 있어야 하기 때문에.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Expiration에 No Expriation설정이 없다..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b02uKb/btsASceobgb/3AKKB3KHesxkWSFV71V8NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b02uKb/btsASceobgb/3AKKB3KHesxkWSFV71V8NK/img.png&quot; data-filename=&quot;스크린샷 2023-11-27 오후 12.07.39.png&quot; data-origin-height=&quot;338&quot; data-origin-width=&quot;864&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;47.7&quot; style=&quot;width: 47.146163%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b02uKb/btsASceobgb/3AKKB3KHesxkWSFV71V8NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb02uKb%2FbtsASceobgb%2F3AKKB3KHesxkWSFV71V8NK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;864&quot; height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3AXpE/btsAVpQP2mn/xHkhbOWDKlEbleOS0zWZP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3AXpE/btsAVpQP2mn/xHkhbOWDKlEbleOS0zWZP0/img.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;304&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-11-27 오후 12.07.13.png&quot; data-widthpercent=&quot;52.3&quot; style=&quot;width: 51.691046%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3AXpE/btsAVpQP2mn/xHkhbOWDKlEbleOS0zWZP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3AXpE%2FbtsAVpQP2mn%2FxHkhbOWDKlEbleOS0zWZP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;852&quot; height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;classic / Fine-grained&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;(대충 Fine-grained를 안쓰는 가장 큰 이유라는 뜻)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;끝!&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>github</category>
      <category>remote: Support for password authentication was removed on August 13</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1402</guid>
      <comments>https://zeddios.tistory.com/1402#entry1402comment</comments>
      <pubDate>Mon, 27 Nov 2023 13:27:55 +0900</pubDate>
    </item>
    <item>
      <title>[CoreLocation] When InUse / Always 비교 + info.plist Location관련한 key들 정리</title>
      <link>https://zeddios.tistory.com/1351</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위치 관련해서 잠깐 봐야할 게 있어서 봤는데..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-03 오후 9.40.57.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xTz9Y/btrBaxhWxUC/K3jI7nBFXY4Oxc0q5ldcY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xTz9Y/btrBaxhWxUC/K3jI7nBFXY4Oxc0q5ldcY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xTz9Y/btrBaxhWxUC/K3jI7nBFXY4Oxc0q5ldcY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxTz9Y%2FbtrBaxhWxUC%2FK3jI7nBFXY4Oxc0q5ldcY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;198&quot; data-filename=&quot;스크린샷 2022-05-03 오후 9.40.57.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;왜이렇게 많은거지..&lt;/span&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;한번 정리해두면 좋을 것 같아서!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;#&amp;nbsp;NSLocationUsageDescription&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &amp;nbsp;iOS 8에서 &lt;b&gt;Deprecate&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-7.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bggRNU/btrA9jEutmk/DhDqUB3rMJtFHZXhyH4v01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bggRNU/btrA9jEutmk/DhDqUB3rMJtFHZXhyH4v01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bggRNU/btrA9jEutmk/DhDqUB3rMJtFHZXhyH4v01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbggRNU%2FbtrA9jEutmk%2FDhDqUB3rMJtFHZXhyH4v01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;198&quot; data-filename=&quot;R1280x0-7.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;응 안봐&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;#&amp;nbsp;NSLocationAlwaysUsageDescription&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- iOS 11에서&amp;nbsp;&lt;b&gt;Deprecate&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 앱의 Deploy Target이 iOS 11+ 이라면 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/bundleresources/information_property_list/nslocationalwaysandwheninuseusagedescription&quot;&gt;NSLocationAlwaysAndWhenInUseUsageDescription&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;을 사용해야합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;~ 11 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;이전&lt;/span&gt; 버전을 지원한다면 ~&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 11 이전 OS에서는 무조건 NSLocationAlwaysUsageDescription을 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 11 이후 OS에서는 무조건 NSLocationAlwaysAndWhenInUseUsageDescription을 사용&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러니까 11 &lt;b&gt;이전 버전&lt;/b&gt;을 지원한다면! &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;개발자는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;NSLocationAlwaysAndWhenInUseUsageDescription&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;NSLocationAlwaysUsageDescription&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 두가지를 동일한 메세지로 추가해놔야합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;~ 11 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;이후 버전만&lt;/span&gt; 지원한다면 ~&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-7.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bICOWD/btrBcJIb8Ks/ITy8wdLUEvNU6Cyq1ZtcCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bICOWD/btrBcJIb8Ks/ITy8wdLUEvNU6Cyq1ZtcCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bICOWD/btrBcJIb8Ks/ITy8wdLUEvNU6Cyq1ZtcCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbICOWD%2FbtrBcJIb8Ks%2FITy8wdLUEvNU6Cyq1ZtcCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;198&quot; data-filename=&quot;R1280x0-7.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;저는 11 이후만 지원하니까 저한테는 이렇게 되네요 야호&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Location Always Usage Description -&amp;gt; iOS 11에서 deprecate&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Location Usage Description -&amp;gt; iOS 8에서 deprecate &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 가장 많이 사용하게 될&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-4.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU9LKd/btsAjj50QTP/eVA3Dl4MykbU4MRENMvD0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU9LKd/btsAjj50QTP/eVA3Dl4MykbU4MRENMvD0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU9LKd/btsAjj50QTP/eVA3Dl4MykbU4MRENMvD0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU9LKd%2FbtsAjj50QTP%2FeVA3Dl4MykbU4MRENMvD0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;198&quot; data-filename=&quot;R1280x0-4.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- NSLocationAlwaysAndWhenInUseUsageDescription&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- NSLocationWhenInUseUsageDescription&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;를 봅시다. 이 친구들은 iOS 11부터 사용 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# NSLocation&lt;span style=&quot;background-color: #f6e199;&quot;&gt;WhenInUse&lt;/span&gt;UsageDescription&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;- &lt;b&gt;앱이 사용중일 때 위치 서비스를 사용하고 이벤트를 수신할 수 있음.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;1. Foregorund에 있을 때&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;2. (아래 그림처럼) 위치 사용 표시기가 활성화 된 상태에서 백그라운드에서 실행중일때&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 2.34.58.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qKfHn/btsArijDVCl/mbl70PxHkesU5wnzMplgWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qKfHn/btsArijDVCl/mbl70PxHkesU5wnzMplgWK/img.png&quot; data-alt=&quot;https://hypertrack.com/blog/2020/06/24/impact-of-ios13-ios14-location-permissions-on-background-location-access/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qKfHn/btsArijDVCl/mbl70PxHkesU5wnzMplgWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqKfHn%2FbtsArijDVCl%2Fmbl70PxHkesU5wnzMplgWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1412&quot; height=&quot;268&quot; data-filename=&quot;스크린샷 2023-11-15 오후 2.34.58.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://hypertrack.com/blog/2020/06/24/impact-of-ios13-ios14-location-permissions-on-background-location-access/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;사용중이라고 판단 &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# NSLocation&lt;span style=&quot;background-color: #f6e199;&quot;&gt;AlwaysAndWhenInUse&lt;/span&gt;UsageDescription&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;사용자가 앱이 실행중이라는 사실을 알지 못하는 경우에도 앱은 모든 위치 서비스를 사용하고 이벤트를 수신할 수 있음&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;(앱이 실행되고 있지 않으면 시스템이 앱을 실행하고 이벤트를 전달함)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# Always? WhenInUse?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic'; background-color: #f6e199;&quot;&gt;&lt;b&gt;Apple: 가능하면 When&amp;nbsp;In&amp;nbsp;Use만 요청하셈ㅋ&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;이게 결론인데... 차근차근 봅시다!&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일단 위치 권한 요청 메소드는AlwaysWhenInUse / WhenInUse 이렇게&amp;nbsp;2가지가 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651581992534&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let manager = CLLocationManager()
...
self.manager.requestAlwaysAuthorization()
self.manager.requestWhenInUseAuthorization()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[주의할 점 - Always권한을 요청한경우]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;반드시 Info.plist에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- NSLocationAlwaysAndWhenInUseUsageDescription&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- NSLocationWhenInUseUsageDescription&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2개 다 들어가있어야합니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하나만 들어가있으면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;This app has attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain both &amp;ldquo;NSLocationAlwaysAndWhenInUseUsageDescription&amp;rdquo; and &amp;ldquo;NSLocationWhenInUseUsageDescription&amp;rdquo; keys with string values explaining to the user how the app uses this data&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;이런 에러가 뜨니 주의!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[주의할 점 - When In Use권한만 요청한경우]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 무조건 &lt;b&gt;NSLocationWhenInUseUsageDescription&lt;/b&gt;가 반드시 있어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;This app has attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an &amp;ldquo;NSLocationWhenInUseUsageDescription&amp;rdquo; key with a string value explaining to the user how the app uses this data&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;Always때처럼 &lt;b&gt;NSLocationAlwaysAndWhenInUseUsageDescription&lt;/b&gt;가 필요하진 않습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# requestWhenInUseAuthorization&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;When In Use 부터 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 2.51.00.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVnR8k/btsAqIJG4jw/QQ1pizsE1TaYrXykcCsyhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVnR8k/btsAqIJG4jw/QQ1pizsE1TaYrXykcCsyhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVnR8k/btsAqIJG4jw/QQ1pizsE1TaYrXykcCsyhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVnR8k%2FbtsAqIJG4jw%2FQQ1pizsE1TaYrXykcCsyhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;148&quot; data-filename=&quot;스크린샷 2023-11-15 오후 2.51.00.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;When In Use니까 요거 하나만 넣어주면 되고..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700027501445&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.manager.requestWhenInUseAuthorization()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;를 호출해봅시다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 2.52.02.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pTXY6/btsAjwdcwS0/agoFJLrMndTRBfAPFkbUFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pTXY6/btsAjwdcwS0/agoFJLrMndTRBfAPFkbUFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pTXY6/btsAjwdcwS0/agoFJLrMndTRBfAPFkbUFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpTXY6%2FbtsAjwdcwS0%2FagoFJLrMndTRBfAPFkbUFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;1040&quot; data-filename=&quot;스크린샷 2023-11-15 오후 2.52.02.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;별 문제없이 다 잘 나오는것을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;각 케이스 별로 정리해보자!!!!&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[한 번 허용]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;우선 한번은 허용하겠다~라서 권한은&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.04.23.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;1048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b24KEa/btsAp1QjkDm/alHOMQcUPpVtqzNBpYNYV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b24KEa/btsAp1QjkDm/alHOMQcUPpVtqzNBpYNYV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b24KEa/btsAp1QjkDm/alHOMQcUPpVtqzNBpYNYV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb24KEa%2FbtsAp1QjkDm%2FalHOMQcUPpVtqzNBpYNYV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1382&quot; height=&quot;1048&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.04.23.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;1048&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;authorizedWhenInUse&lt;/span&gt;&lt;/b&gt;로 설정됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하지만 앱이 더이상 사용되지 않는 즉시 notDetermined 상태로 돌아갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;실제로 앱을 종료하고 다시 켜면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pTXY6/btsAjwdcwS0/agoFJLrMndTRBfAPFkbUFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pTXY6/btsAjwdcwS0/agoFJLrMndTRBfAPFkbUFK/img.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;1040&quot; data-filename=&quot;스크린샷 2023-11-15 오후 2.52.02.png&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;42.36&quot; style=&quot;width: 41.863879%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pTXY6/btsAjwdcwS0/agoFJLrMndTRBfAPFkbUFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpTXY6%2FbtsAjwdcwS0%2FagoFJLrMndTRBfAPFkbUFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eYiJQF/btsAqyUGwtT/GP4lQ72RxYTFrKgGYuEoA0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eYiJQF/btsAqyUGwtT/GP4lQ72RxYTFrKgGYuEoA0/img.jpg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1311&quot; data-filename=&quot;IMG_631286C46016-1.jpeg&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;57.64&quot; style=&quot;width: 56.97333%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eYiJQF/btsAqyUGwtT/GP4lQ72RxYTFrKgGYuEoA0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeYiJQF%2FbtsAqyUGwtT%2FGP4lQ72RxYTFrKgGYuEoA0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1311&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위 프롬프트를 또! 만나게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;한번 허용을 눌렀을 때는 설정에서도&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;다음번에 묻기 에 체크되어있는 것을 볼 수 있습니다. (내가 공유할때는 뭐지...?)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[앱을 사용하는 동안 허용]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;앱을 사용하는 동안 허용을 눌렀을때의 권한은&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b24KEa/btsAp1QjkDm/alHOMQcUPpVtqzNBpYNYV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b24KEa/btsAp1QjkDm/alHOMQcUPpVtqzNBpYNYV0/img.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;1048&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.04.23.png&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;59.79&quot; style=&quot;width: 59.089909%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b24KEa/btsAp1QjkDm/alHOMQcUPpVtqzNBpYNYV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb24KEa%2FbtsAp1QjkDm%2FalHOMQcUPpVtqzNBpYNYV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1382&quot; height=&quot;1048&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7eUof/btsAopDUUIc/V848EDKkzfVtTk6edZhpNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7eUof/btsAopDUUIc/V848EDKkzfVtTk6edZhpNk/img.jpg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1319&quot; data-filename=&quot;IMG_15B46F2F298D-1.jpeg&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;40.21&quot; style=&quot;width: 39.7473%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7eUof/btsAopDUUIc/V848EDKkzfVtTk6edZhpNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7eUof%2FbtsAopDUUIc%2FV848EDKkzfVtTk6edZhpNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1319&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;역시나 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;authorizedWhenInUse&lt;/span&gt;&lt;/b&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;설정에서도 앱을 사용하는 동안이라고 체크되어있는 것을 볼 수 있죠&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[허용 안함]&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;당연히&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n8Bq3/btsAqIQtz2b/g8bu7WwJkNxPdAOG6Hceo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n8Bq3/btsAqIQtz2b/g8bu7WwJkNxPdAOG6Hceo1/img.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;976&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.15.41.png&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;53.57&quot; style=&quot;width: 52.942832%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n8Bq3/btsAqIQtz2b/g8bu7WwJkNxPdAOG6Hceo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn8Bq3%2FbtsAqIQtz2b%2Fg8bu7WwJkNxPdAOG6Hceo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1336&quot; height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ6Z5q/btsAopYfnPE/B3y9MKAqp23nn5GseFkNkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ6Z5q/btsAopYfnPE/B3y9MKAqp23nn5GseFkNkK/img.jpg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;986&quot; data-filename=&quot;IMG_B1591CCE76CB-1.jpeg&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;46.43&quot; style=&quot;width: 45.894377%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ6Z5q/btsAopYfnPE/B3y9MKAqp23nn5GseFkNkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ6Z5q%2FbtsAopYfnPE%2FB3y9MKAqp23nn5GseFkNkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;986&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef6f53;&quot;&gt;denied&lt;/span&gt;&lt;/b&gt;로 설정됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;설정에서도 안함으로 체크되어있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이번엔 Always 권한을 요청해보겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# request&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Always&lt;/span&gt;Authorization&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 5.30.56.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buCgIo/btsAjkc12K2/42wTDv2yoMFoMtlGTeG2X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buCgIo/btsAjkc12K2/42wTDv2yoMFoMtlGTeG2X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buCgIo/btsAjkc12K2/42wTDv2yoMFoMtlGTeG2X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuCgIo%2FbtsAjkc12K2%2F42wTDv2yoMFoMtlGTeG2X0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2023-11-15 오후 5.30.56.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Always니까 Info.plist에 둘 다 넣어주고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651582582258&quot; class=&quot;css&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.manager.requestAlwaysAuthorization()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;를 호출해봅시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 뜨는 것을 볼 수 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.19.29.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gmr0u/btsAjl3WnEI/V82MK31TfjZtuDDs5R4wgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gmr0u/btsAjl3WnEI/V82MK31TfjZtuDDs5R4wgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gmr0u/btsAjl3WnEI/V82MK31TfjZtuDDs5R4wgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGmr0u%2FbtsAjl3WnEI%2FV82MK31TfjZtuDDs5R4wgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;1034&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.19.29.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;뭔가 이상하죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Always를 호출했음에도 불구하고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. &lt;b&gt;항상 허용&lt;/b&gt;이 나오질 않음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. &lt;b&gt;Description은 When In Use의 Description이 나옴&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이 이상한 부분은 뒤에서 다루기로 하고.. 하나씩 봅시다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;[한 번 허용]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이건 위 When In Use때랑 똑같습니다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b24KEa/btsAp1QjkDm/alHOMQcUPpVtqzNBpYNYV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b24KEa/btsAp1QjkDm/alHOMQcUPpVtqzNBpYNYV0/img.png&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;1048&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.04.23.png&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;62.12&quot; style=&quot;width: 61.397804%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b24KEa/btsAp1QjkDm/alHOMQcUPpVtqzNBpYNYV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb24KEa%2FbtsAp1QjkDm%2FalHOMQcUPpVtqzNBpYNYV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1382&quot; height=&quot;1048&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ru583/btsAreVV6Kr/HpjHVtqyohpzSZmCo6sIe0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ru583/btsAreVV6Kr/HpjHVtqyohpzSZmCo6sIe0/img.jpg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1455&quot; data-filename=&quot;IMG_77460B219658-1.jpeg&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;37.88&quot; style=&quot;width: 37.439406%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ru583/btsAreVV6Kr/HpjHVtqyohpzSZmCo6sIe0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRu583%2FbtsAreVV6Kr%2FHpjHVtqyohpzSZmCo6sIe0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1455&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;권한도 authorizedWhenInUse가 나오고, 앱이 사용되지 않으면 notDetermined로 돌아가게 되죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;설정에서도 다음번에 묻기로 체크되어있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;When In Use때랑 달라진것은.. &lt;b&gt;항상&lt;/b&gt; 옵션이 추가되었고, 앱 설명 부분도 Always것을 쓰네요. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;⭐️ &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;[앱을 사용하는 동안 허용] ⭐️&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이 부분을 잘 보셔야 합니다!!!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;앱을 사용하는 동안 허용 눌렀으니까..권한은 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;authorizedWhenInUse&lt;/span&gt;&lt;/b&gt; 겠지;; 라고 생각할 수 있지만..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.39.18.png&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;964&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLeunn/btsAjVjEe52/kRuDJPu4kb2XNN8tPLIl5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLeunn/btsAjVjEe52/kRuDJPu4kb2XNN8tPLIl5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLeunn/btsAjVjEe52/kRuDJPu4kb2XNN8tPLIl5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLeunn%2FbtsAjVjEe52%2FkRuDJPu4kb2XNN8tPLIl5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;964&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.39.18.png&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;964&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;authorizedAlways&lt;/span&gt;&lt;/b&gt;가 나오게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그럼 설정에는 어떻게 되어있을까요&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_CBF2458DF414-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr5KXL/btsAkjkuitD/0VFdrLSwqUW7qFblqMPf3k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr5KXL/btsAkjkuitD/0VFdrLSwqUW7qFblqMPf3k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr5KXL/btsAkjkuitD/0VFdrLSwqUW7qFblqMPf3k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr5KXL%2FbtsAkjkuitD%2F0VFdrLSwqUW7qFblqMPf3k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1437&quot; data-filename=&quot;IMG_CBF2458DF414-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;앱을 사용하는 동안&lt;/b&gt;으로 체크가 되어있네요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그럼 이상한 점이 총 4가지 입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Always를 호출했음에도 불구하고&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. OS 권한 요청 팝업에 &lt;b&gt;항상 허용&lt;/b&gt;이 나오질 않음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2.&amp;nbsp;&lt;b&gt;Description은 When In Use의 Description이 나옴&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. 설정에는 앱을 사용하는 동안으로 체크되어있음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;4. 근데 권한은 &lt;span style=&quot;text-align: start;&quot;&gt;authorizedAlways임&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : ⁉️&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;iOS 13이후부터는 애플의 개인정보보호 강화 어쩌구의 일환으로.. 항상허용이 바로 나오지 않습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Always를 요청하고, 사용자가 &lt;b&gt;앱을 사용하는 동안 허용&lt;/b&gt;을 누르게 되면 ➡️ &lt;b&gt;iOS는 provisional always(임시 항상 허용)권한을 부여합니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-03 오후 10.19.56.png&quot; data-origin-width=&quot;3640&quot; data-origin-height=&quot;1176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kIuil/btrA9iTalht/ST75kJQn2XIQLf7b5eOrM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kIuil/btrA9iTalht/ST75kJQn2XIQLf7b5eOrM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kIuil/btrA9iTalht/ST75kJQn2XIQLf7b5eOrM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkIuil%2FbtrA9iTalht%2FST75kJQn2XIQLf7b5eOrM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3640&quot; height=&quot;1176&quot; data-filename=&quot;스크린샷 2022-05-03 오후 10.19.56.png&quot; data-origin-width=&quot;3640&quot; data-origin-height=&quot;1176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 타임라인 초록색 가장 끝부분을 보시면,&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Start using Always powers&lt;/span&gt;라고 나와있죠?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱을 사용하는 동안 허용을 누른 시점부터 실제로 Always 권한이&amp;nbsp;부여된&amp;nbsp;것처럼&amp;nbsp;작동할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : 아니 헷갈려..zz 나는 &lt;b&gt;앱을 사용하는 동안 허용&lt;/b&gt; 눌렀는데 왜 Always 권한이&amp;nbsp;부여된&amp;nbsp;것처럼&amp;nbsp;작동할&amp;nbsp;수&amp;nbsp;있는거지..?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그냥 Apple은 지금 저에게 provisional always(임시 항상 허용)권한을 준겁니다. &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&quot;임시&quot;!!!!!!!!!!!!!!!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;  : 임시..? 그 임시는 언제 끝나;; 항상 허용 내놓으라고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;iOS가 적절한 로직 + 시간에 프롬프트를 띄워서 물어봅니다. (이건 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2019/705&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WWDC 19&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 참고..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqW0qH/btsArBQ3Isz/MdJMOauBngvDclfbtHcErK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqW0qH/btsArBQ3Isz/MdJMOauBngvDclfbtHcErK/img.png&quot; data-origin-width=&quot;2388&quot; data-origin-height=&quot;818&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-11-15 오후 4.57.21.png&quot; data-widthpercent=&quot;71.04&quot; style=&quot;width: 70.212541%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqW0qH/btsArBQ3Isz/MdJMOauBngvDclfbtHcErK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqW0qH%2FbtsArBQ3Isz%2FMdJMOauBngvDclfbtHcErK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2388&quot; height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmSMuh/btsAot7oKOF/PMYcHcBoircRLJAK4039P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmSMuh/btsAot7oKOF/PMYcHcBoircRLJAK4039P0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;610&quot; data-filename=&quot;스크린샷 2023-11-15 오후 5.26.00.png&quot; data-widthpercent=&quot;28.96&quot; style=&quot;width: 28.624668%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmSMuh/btsAot7oKOF/PMYcHcBoircRLJAK4039P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmSMuh%2FbtsAot7oKOF%2FPMYcHcBoircRLJAK4039P0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;726&quot; height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위 오른쪽 사진의 프롬프트에서&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 5.30.56.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beFGfd/btsAqI4eq2n/XCiaXnLDaKTqXvqs6Nqhm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beFGfd/btsAqI4eq2n/XCiaXnLDaKTqXvqs6Nqhm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beFGfd/btsAqI4eq2n/XCiaXnLDaKTqXvqs6Nqhm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeFGfd%2FbtsAqI4eq2n%2FXCiaXnLDaKTqXvqs6Nqhm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2023-11-15 오후 5.30.56.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Always and When In Use Description이 쓰이게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[사용하는 동안만 유지]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;임시로 받은 &lt;b&gt;&lt;span style=&quot;text-align: start; background-color: #dddddd; color: #ef5369;&quot;&gt;authorizedAlways&lt;/span&gt;&lt;/b&gt;권한은 날아가고 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;authorizedWhenInUse&lt;/span&gt;&lt;/b&gt;가 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[항상 허용으로 변경]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;authorizedAlways&lt;/span&gt;&lt;/b&gt;로 바뀌고, 설정도 항상으로 바뀝니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_5A38F66ABD34-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6pzyN/btsAkjZgaOt/fNCkDQkgcIkAL05pDRvJRk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6pzyN/btsAkjZgaOt/fNCkDQkgcIkAL05pDRvJRk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6pzyN/btsAkjZgaOt/fNCkDQkgcIkAL05pDRvJRk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6pzyN%2FbtsAkjZgaOt%2FfNCkDQkgcIkAL05pDRvJRk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1425&quot; data-filename=&quot;IMG_5A38F66ABD34-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : 그럼 항상 허용 프롬프트를 내가 띄울 수 없다는거네...?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;원래 그랬는데.. 애플도 뭔가를 느꼈는지 iOS 13.4 부터 이 항상 허용 프롬프트를 개발자가 띄울 수 있도록 변경했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 조건이 있음ㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. When In Use 권한을 먼저 요청해야함&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700038481007&quot; class=&quot;css&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.manager.requestWhenInUseAuthorization()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 거기서 앱을 사용하는 동안을 눌러 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;authorizedWhenInUse&lt;/span&gt;&lt;/span&gt; 권한을 얻음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 그 상태에서 Always 권한을 요청하면&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700038547560&quot; class=&quot;css&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.manager.requestAlwaysAuthorization()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아래 프롬프트를 띄울 수 있게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_35347A273A07-1.jpeg&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi9ZEc/btsAm3Bprzm/OKSWNlTfUbWMXGRcEh7z9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi9ZEc/btsAm3Bprzm/OKSWNlTfUbWMXGRcEh7z9K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi9ZEc/btsAm3Bprzm/OKSWNlTfUbWMXGRcEh7z9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi9ZEc%2FbtsAm3Bprzm%2FOKSWNlTfUbWMXGRcEh7z9K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1104&quot; height=&quot;809&quot; data-filename=&quot;IMG_35347A273A07-1.jpeg&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;딱 한번만 띄울 수 있음 주의&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-4.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfSbOO/btsAmt8lWDu/fr7k3Yo5EYq48nOYekU2UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfSbOO/btsAmt8lWDu/fr7k3Yo5EYq48nOYekU2UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfSbOO/btsAmt8lWDu/fr7k3Yo5EYq48nOYekU2UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfSbOO%2FbtsAmt8lWDu%2Ffr7k3Yo5EYq48nOYekU2UK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;198&quot; data-filename=&quot;R1280x0-4.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Location Default Accuracy Reduced (NSLocationDefaultAccuracyReduced)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Location Temporary Usage Description Dictionary (NSLocationTemporaryUsageDescriptionDictionary)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot; data-v-53c3ef2a=&quot;&quot; data-v-3c25fba5=&quot;&quot;&gt;이렇게 2개 남았는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot; data-v-53c3ef2a=&quot;&quot; data-v-3c25fba5=&quot;&quot;&gt;# NSLocationDefaultAccuracyReduced&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot; data-v-53c3ef2a=&quot;&quot; data-v-3c25fba5=&quot;&quot;&gt;Location Default Accuracy Reduced 를 직역하면 위치 기본 정확도 감소..인데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Boolean값을 넘겨주면 되는데, 기본적으로 false입니다. (감소하지 않겠다)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이것을 true로 설정해주면 권한 프롬프트가 살짝 달라집니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qea4l/btsAqZ5QMGH/KrPI1b5IfVWsubDYUlqKrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qea4l/btsAqZ5QMGH/KrPI1b5IfVWsubDYUlqKrk/img.png&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;1066&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-11-15 오후 6.47.16.png&quot; data-widthpercent=&quot;50.2&quot; style=&quot;width: 49.611774%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qea4l/btsAqZ5QMGH/KrPI1b5IfVWsubDYUlqKrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqea4l%2FbtsAqZ5QMGH%2FKrPI1b5IfVWsubDYUlqKrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;1066&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gmr0u/btsAjl3WnEI/V82MK31TfjZtuDDs5R4wgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gmr0u/btsAjl3WnEI/V82MK31TfjZtuDDs5R4wgk/img.png&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-11-15 오후 3.19.29.png&quot; data-origin-height=&quot;1034&quot; data-origin-width=&quot;666&quot; data-widthpercent=&quot;49.8&quot; style=&quot;width: 49.225435%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gmr0u/btsAjl3WnEI/V82MK31TfjZtuDDs5R4wgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGmr0u%2FbtsAjl3WnEI%2FV82MK31TfjZtuDDs5R4wgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;true / false&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;첫번째 그림처럼 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 대략적인 위치를 사용하도록 허용하겠습니까~ 타이틀이 변경&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 정확한 위치 켜는게 안나옴&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이게 true로 설정되면 모든 Core Location 서비스가 정확도가 낮은 수준으로 정보를 받게 된다고 하네요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;설정에서도&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6E3A6F74AEFC-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rRYRa/btsAm4NUiME/Sxy8kV7YqPEISVXXRpyae1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rRYRa/btsAm4NUiME/Sxy8kV7YqPEISVXXRpyae1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rRYRa/btsAm4NUiME/Sxy8kV7YqPEISVXXRpyae1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrRYRa%2FbtsAm4NUiME%2FSxy8kV7YqPEISVXXRpyae1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1450&quot; data-filename=&quot;IMG_6E3A6F74AEFC-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정확한 위치가 꺼져있는 것을 볼 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# NSLocationTemporaryUsageDescriptionDictionary&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱이 사용자 위치에 대한 임시 접근을 요청하는 이유를 설명하는 메시지 모음...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위에서 정확한 위치를 껐을 수도 있는데, 정확한 위치가 진짜 필요할 수도 있잖아요?? &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 그때마다 이유가 다를 수 있어&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 7.18.17.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXRsLz/btsAnE9fTdr/DZQ8AvRQIq0QoEbK4Fhrgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXRsLz/btsAnE9fTdr/DZQ8AvRQIq0QoEbK4Fhrgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXRsLz/btsAnE9fTdr/DZQ8AvRQIq0QoEbK4Fhrgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXRsLz%2FbtsAnE9fTdr%2FDZQ8AvRQIq0QoEbK4Fhrgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1352&quot; height=&quot;114&quot; data-filename=&quot;스크린샷 2023-11-15 오후 7.18.17.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대충 이런식으로 넣어두고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700043082152&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Request location access to find coffee shops.
manager.requestTemporaryFullAccuracyAuthorization(withPurposeKey: &quot;zedd&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;해당 key로 접근하면 그 description이 나오면서 정확한 위치 요청 권한 프롬프트가 뜬다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 7.18.29.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMr0Nr/btsAktm8rPg/dbA8njNbqvKbDUrqamzZ41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMr0Nr/btsAktm8rPg/dbA8njNbqvKbDUrqamzZ41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMr0Nr/btsAktm8rPg/dbA8njNbqvKbDUrqamzZ41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMr0Nr%2FbtsAktm8rPg%2FdbA8njNbqvKbDUrqamzZ41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;892&quot; data-filename=&quot;스크린샷 2023-11-15 오후 7.18.29.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식~~~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;당연히 정확한 위치가 켜져있으면 아무 소용이 없겠죠?&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-03 오후 9.40.57.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xTz9Y/btrBaxhWxUC/K3jI7nBFXY4Oxc0q5ldcY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xTz9Y/btrBaxhWxUC/K3jI7nBFXY4Oxc0q5ldcY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xTz9Y/btrBaxhWxUC/K3jI7nBFXY4Oxc0q5ldcY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxTz9Y%2FbtrBaxhWxUC%2FK3jI7nBFXY4Oxc0q5ldcY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;198&quot; data-filename=&quot;스크린샷 2022-05-03 오후 9.40.57.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 친구들 다 봤네요 야호&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 글은 2022년 5월 2일에 쓰기 시작되어..... &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그때 쓰다가 아 나만 헷갈리나;;? 하면서 글감이 아니라고 생각하고 한창 쓰다가 처박아둔 글인데&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;딱 오늘 또!!! 헷갈려서 찾아서 우다다다 써보았습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그때 첨부한 이미지들 새걸로 바꾸느라 넘 귀찮았지만 그래도 다 써서 개운허다,,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;너므 길어서 누가 읽을까 싶지만.. 나중에 또 헷갈릴 나에게 도움이 되길!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;틀린 부분이 있다면 댓글 남겨주세효&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;참고&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2019/705/?time=213&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/videos/play/wwdc2019/705&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2020/10660/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/videos/play/wwdc2020/10660/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://medium.com/swlh/location-permission-in-ios-13-f9e10917c05e&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://medium.com/swlh/location-permission-in-ios-13-f9e10917c05e&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>NSLocationAlwaysUsageDescription</category>
      <category>NSLocationDefaultAccuracyReduced</category>
      <category>NSLocationTemporaryUsageDescriptionDictionary</category>
      <category>NSLocationUsageDescription</category>
      <category>NSLocationWhenInUseUsageDescription</category>
      <category>requestWhenInUseAuthorization</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1351</guid>
      <comments>https://zeddios.tistory.com/1351#entry1351comment</comments>
      <pubDate>Wed, 15 Nov 2023 19:34:13 +0900</pubDate>
    </item>
    <item>
      <title>[iOS] 총 / 남은 기기 용량 알아내는 법</title>
      <link>https://zeddios.tistory.com/1400</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;남은 기기 용량을 알아야 할 일이 생겨서 찾아봤더니..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698669741528&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func deviceRemainingFreeSpaceInBytes() -&amp;gt; Int64? {
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!
    guard
        let systemAttributes = try? FileManager.default.attributesOfFileSystem(forPath: documentDirectory),
        let freeSize = systemAttributes[FileAttributeKey.systemFreeSize] as? NSNumber
    else {
        // something failed
        return nil
    }
    return freeSize.int64Value
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런 코드를 심심치않게 볼 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여기서 중요한 부분은&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698669763450&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let freeSize = systemAttributes[FileAttributeKey.systemFreeSize]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;FileAttributeKey를 사용했다는 점! (물론 &lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;FileAttributeKey는 생략이 가능하다)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;GPT도 위 FileAttributeKey.systemFreeSize 를 사용하여 알려줬다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_137648773335-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AYmta/btszpzH4yjC/11HAXOKYbhWIXOWGpjRFKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AYmta/btszpzH4yjC/11HAXOKYbhWIXOWGpjRFKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AYmta/btszpzH4yjC/11HAXOKYbhWIXOWGpjRFKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAYmta%2FbtszpzH4yjC%2F11HAXOKYbhWIXOWGpjRFKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;778&quot; data-filename=&quot;IMG_137648773335-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나 같은 경우에는 166.8 GB 라고 나와야하는데 위 코드로 &lt;span style=&quot;text-align: start;&quot;&gt;실행해봤더니&amp;nbsp;&lt;/span&gt;33.97 GB로 나오는것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698670126963&quot; class=&quot;nix&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;let freeSize = systemAttributes[FileAttributeKey.systemFreeSize]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/26198164&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;찾아보니&lt;/span&gt;&lt;/b&gt;&lt;/a&gt; &lt;span style=&quot;text-align: start;&quot;&gt;FileAttributeKey&lt;/span&gt;를 사용하는 것은 더이상 정확하지 않다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 남은 용량 계산하기&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699425803007&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func getFreeDiskSpaceByte() -&amp;gt; Int64? {
    let fileURL = URL(fileURLWithPath:&quot;/&quot;)
    let values = try? fileURL.resourceValues(forKeys: [URLResourceKey.volumeAvailableCapacityForImportantUsageKey])
    return values?.volumeAvailableCapacityForImportantUsage
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;코드 출처 : &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/foundation/urlresourcekey/checking_volume_storage_capacity&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/foundation/urlresourcekey/checking_volume_storage_capacity&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 해서 남은 용량을 &lt;b&gt;바이트단위&lt;/b&gt;로 얻어올 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 GB, MB등으로 바꾸고 싶다면 &lt;b&gt;ByteCountFormatter&lt;/b&gt;를 이용하여 포맷팅이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699426366418&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func getFreeDiskSpace(_ byteCount: Int64) -&amp;gt; String {
    let formatter = ByteCountFormatter()
    formatter.allowedUnits = .useGB 
    formatter.countStyle = .file 
    formatter.includesUnit = true
    return formatter.string(fromByteCount: byteCount) // ex. &quot;100 GB&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;allowedUnits&lt;/b&gt; ➡️ 허용할 단위. 나는 GB만 허용했는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699426678737&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;formatter.allowedUnits = [.useGB, .useKB]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 배열을 넘길수도 있어서, 자신이 허용할 단위들을 포함해주면된다. 전부 사용하는 useAll도 있으니 참고!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;countStyle&lt;/b&gt; ➡️ &lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기본값은 file이다. (그래서 위 코드는 딱히 필요하진 않지만 설명을 위해..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4가지 case를 가지고 있는데, file 또는 memory를 사용할것은 권장하고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;file과 memory의 차이점을 간단하게 보자면 allowedUnits을 useKB로 지정해두고 100000000을 넣으면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- file : 100,000 KB&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- memory : 97,656 KB&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;남은 용량은 file로 지정했을 때 더 정확하게 나왔다. (설정에 있는 남은 용량과 거의 똑같이 나옴)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;includesUnit&lt;/b&gt; ➡️ &quot;100 GB&quot;말고 &quot;100&quot;처럼 뒤에 단위(unit)은 제거하고 숫자만 가져오고싶을수도 있는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이때 includesUnit을 false로 주면 된다. (기본값 true)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 이걸 모르고 정규식을 썼었는데.. 알고있으면 좋을 것 같아서 넣어봤다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 총 용량 계산하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;URLResourceKey에 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c; text-align: start;&quot; href=&quot;https://developer.apple.com/documentation/foundation/urlresourcekey/1415933-volumetotalcapacitykey&quot; data-v-3ef7a79a=&quot;&quot;&gt;volumeTotalCapacityKey&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;가 있어서 요걸 사용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699433601892&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func getTotalDiskSpaceByte() -&amp;gt; Int? {
    let fileURL = URL(fileURLWithPath:&quot;/&quot;)
    let values = try? fileURL.resourceValues(forKeys: [.volumeTotalCapacityKey])
    return values?.volumeTotalCapacity
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;시뮬레이터로 했을 때는 완전히 동일하게 나왔으나&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-08 오후 5.59.46.png&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsJ0ul/btszYkXZE2F/NLghoYhKxivDuLAD9IBfcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsJ0ul/btszYkXZE2F/NLghoYhKxivDuLAD9IBfcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsJ0ul/btszYkXZE2F/NLghoYhKxivDuLAD9IBfcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsJ0ul%2FbtszYkXZE2F%2FNLghoYhKxivDuLAD9IBfcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;420&quot; data-filename=&quot;스크린샷 2023-11-08 오후 5.59.46.png&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;256GB 인 실기기로 테스트해봤을 때, 255.87GB 가 나왔다. 흠.. 내 생각보다 오차가 커서 놀랐다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# URLResourceKey&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;URLResourceKey에는 volumeAvailableCapacityForImportantUsageKey&amp;nbsp;/ volumeTotalCapacityKe&lt;a style=&quot;color: #000000; text-align: start;&quot; href=&quot;https://developer.apple.com/documentation/foundation/urlresourcekey/1415933-volumetotalcapacitykey&quot; data-v-3ef7a79a=&quot;&quot;&gt;y&lt;/a&gt; 를 포함하여 총 4가지가 존재한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1.&amp;nbsp;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c; text-align: start;&quot; href=&quot;https://developer.apple.com/documentation/foundation/urlresourcekey/2887126-volumeavailablecapacityforimport&quot; data-v-3ef7a79a=&quot;&quot;&gt;volumeAvailableCapacityForImportantUsageKey&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;중요한 리소스를 저장하기 위해&lt;/b&gt; 볼륨에서 사용 가능한 용량(바이트)에 대한 key&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사용자 요청 or 앱이 제대로 작동하는데 필요한 리소스 (ex. 사용자가 시청하려는 비디오 / 게임의 다음 레벨에 필요한 리소스)를 기반으로 데이터를 저장하려는 경우에는 이거 쓰면됨&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2.&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&amp;nbsp;&lt;a style=&quot;color: #3cb09c; text-align: left;&quot; href=&quot;https://developer.apple.com/documentation/foundation/urlresourcekey/2887125-volumeavailablecapacityforopport&quot; data-v-3ef7a79a=&quot;&quot;&gt;volumeAvailableCapacityForOpportunisticUsageKey&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;중요하지 않은 리소스를 저장하기 위해&lt;/b&gt; 볼륨에서 사용 가능한 용량(바이트)에 대한 key&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;보다 예측적인(predictive) 방식으로 데이터를 다운로드 하는 경우(ex. 사용자가 최근에 시청한 TV시리즈의 새로운 에피소드를 다운로드 하려는 경우) 에는 이거 쓰면됨&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c; text-align: start;&quot; href=&quot;https://developer.apple.com/documentation/foundation/urlresourcekey/1412898-volumeavailablecapacitykey&quot; data-v-3ef7a79a=&quot;&quot;&gt;volumeAvailableCapacityKey&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;볼륨의 사용 가능한 용량(바이트)에 대한 key&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : 위에 &lt;b&gt;#남은 용량 계산하기&lt;/b&gt;에서 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;volumeAvailableCapacityFor&lt;b&gt;ImportantUsageKey&lt;/b&gt;&lt;/span&gt; 썼는데.. &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;volumeAvailable&lt;b&gt;CapacityKe&lt;a style=&quot;color: #ef5369; text-align: start; background-color: #dddddd;&quot; href=&quot;https://developer.apple.com/documentation/foundation/urlresourcekey/1412898-volumeavailablecapacitykey&quot; data-v-3ef7a79a=&quot;&quot;&gt;y&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;이걸 써야하는거 아님..?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A : 나도 그런 줄 알았으나..시뮬레이터에서는 제대로 나오지만 실기기에서는 이상한 값이 나오는 현상이 있었다;;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;테스트해보니 제일 위의 FileAttributeKey.systemFreeSize 를 썼을때와 동일한 값이 나왔다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 제대로 나오는 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c; text-align: start;&quot; href=&quot;https://developer.apple.com/documentation/foundation/urlresourcekey/2887126-volumeavailablecapacityforimport&quot; data-v-3ef7a79a=&quot;&quot;&gt;volumeAvailableCapacityForImportantUsageKey&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 를 믿고 씀. (실제로 시뮬/실기기 둘 다 제대로 나옴)&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c; text-align: start;&quot; href=&quot;https://developer.apple.com/documentation/foundation/urlresourcekey/1415933-volumetotalcapacitykey&quot; data-v-3ef7a79a=&quot;&quot;&gt;volumeTotalCapacityKey&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;볼륨의 총 용량(바이트)에 대한 key&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>free disk space</category>
      <category>free disk space swift</category>
      <category>URLResourceKey</category>
      <category>volumeAvailableCapacityForImportantUsageKey</category>
      <category>volumeAvailableCapacityForOpportunisticUsageKey</category>
      <category>volumeAvailableCapacityKey</category>
      <category>volumeTotalCapacityKey</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1400</guid>
      <comments>https://zeddios.tistory.com/1400#entry1400comment</comments>
      <pubDate>Mon, 13 Nov 2023 11:14:53 +0900</pubDate>
    </item>
    <item>
      <title>Push Notification Console 써보기</title>
      <link>https://zeddios.tistory.com/1399</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이번에 Push Notification Console 나와서 써보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;과연 어떨지..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# 푸시 보내기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 프로젝트 생성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 3.36.27.png&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAanpG/btsy8pkba8E/tigGAB5vUJKfHtyfkYNzE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAanpG/btsy8pkba8E/tigGAB5vUJKfHtyfkYNzE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAanpG/btsy8pkba8E/tigGAB5vUJKfHtyfkYNzE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAanpG%2Fbtsy8pkba8E%2FtigGAB5vUJKfHtyfkYNzE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1428&quot; height=&quot;1026&quot; data-filename=&quot;스크린샷 2023-10-24 오후 3.36.27.png&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;2. Capabilities &amp;gt; Push Notification 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-3.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zmKhy/btsy3h833rv/LgsyjyIKOjvPYMcgemCtJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zmKhy/btsy3h833rv/LgsyjyIKOjvPYMcgemCtJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zmKhy/btsy3h833rv/LgsyjyIKOjvPYMcgemCtJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzmKhy%2Fbtsy3h833rv%2FLgsyjyIKOjvPYMcgemCtJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;550&quot; data-filename=&quot;R1280x0-3.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;3. AppDelegate.swift 수정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698131070322&quot; class=&quot;swift&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.reduce(&quot;&quot;) {
        $0 + String(format: &quot;%02X&quot;, $1)
    }
    print(token)
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print(error.localizedDescription)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;4. 알림 권한 요청&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698131082500&quot; class=&quot;swift&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {
    didAllow,Error in

    DispatchQueue.main.async {
        UIApplication.shared.registerForRemoteNotifications()
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;5. 빌드 후 디바이스 토큰 얻어오기&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위 코드대로 따라했다면 콘솔에 디바이스 토큰 나왔을것임&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. &lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://icloud.developer.apple.com/dashboard&quot;&gt;&lt;b&gt;Push Notification Console&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;b&gt;로&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;이동&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;후&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;프로젝트&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;번들&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;아이디&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;찾기&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.31.03.png&quot; data-origin-width=&quot;2094&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/It8e2/btszb6GFoCl/Zdv48smnM41MVMGp55ldD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/It8e2/btszb6GFoCl/Zdv48smnM41MVMGp55ldD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/It8e2/btszb6GFoCl/Zdv48smnM41MVMGp55ldD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIt8e2%2Fbtszb6GFoCl%2FZdv48smnM41MVMGp55ldD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2094&quot; height=&quot;666&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.31.03.png&quot; data-origin-width=&quot;2094&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 3.57.46.png&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brEWHj/btsy6gBvvZ8/hKQXHYxpkwh2ePXM9NDFy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brEWHj/btsy6gBvvZ8/hKQXHYxpkwh2ePXM9NDFy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brEWHj/btsy6gBvvZ8/hKQXHYxpkwh2ePXM9NDFy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrEWHj%2Fbtsy6gBvvZ8%2FhKQXHYxpkwh2ePXM9NDFy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;428&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2023-10-24 오후 3.57.46.png&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;찾으면 아래와같이 되어있을것임&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.06.53.png&quot; data-origin-width=&quot;2128&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I8nSX/btsy35HnmoX/mkdTzHuRIoPaFHA0NhJkMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I8nSX/btsy35HnmoX/mkdTzHuRIoPaFHA0NhJkMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I8nSX/btsy35HnmoX/mkdTzHuRIoPaFHA0NhJkMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI8nSX%2Fbtsy35HnmoX%2FmkdTzHuRIoPaFHA0NhJkMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2128&quot; height=&quot;834&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.06.53.png&quot; data-origin-width=&quot;2128&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;7. Create New Notification 누르기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.07.04.png&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vgGdQ/btsy2rdcYcD/7xqUaY3fttPKlqaPRhIFy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vgGdQ/btsy2rdcYcD/7xqUaY3fttPKlqaPRhIFy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vgGdQ/btsy2rdcYcD/7xqUaY3fttPKlqaPRhIFy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvgGdQ%2Fbtsy2rdcYcD%2F7xqUaY3fttPKlqaPRhIFy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1495&quot; height=&quot;852&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.07.04.png&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;852&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;8. General 부분 채워주기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.08.42.png&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjSBJt/btsy8kXIicP/zlAHsbJjaYesk2XvBAczG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjSBJt/btsy8kXIicP/zlAHsbJjaYesk2XvBAczG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjSBJt/btsy8kXIicP/zlAHsbJjaYesk2XvBAczG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjSBJt%2Fbtsy8kXIicP%2FzlAHsbJjaYesk2XvBAczG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1081&quot; height=&quot;250&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.08.42.png&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Name ➡️ 나중에 보낸 Notification 리스트가 왼쪽에 뜨는데 그걸 구별하는 이름으로 보면됨. 그냥 테스트니까 알아서 아무거나 ㄱ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Enviroment &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;➡️ Development과 Production이 있는데, 테스트니까 우선 Development로&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Device Token &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;➡️ 아까 Xcode 콘솔에 나온거 그대로 복사해서 넣기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;9. Request Headers 부분 채워주기&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.10.24.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SSTgM/btsy4lpPx6A/t1A1nLH77Gxoeg2yjLmvKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SSTgM/btsy4lpPx6A/t1A1nLH77Gxoeg2yjLmvKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SSTgM/btsy4lpPx6A/t1A1nLH77Gxoeg2yjLmvKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSSTgM%2Fbtsy4lpPx6A%2Ft1A1nLH77Gxoeg2yjLmvKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;355&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.10.24.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;apns-topic ➡️ topic은 앱의 번들아이디라고 보면되어서 (&lt;/span&gt;&lt;a href=&quot;https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;출처&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;span style=&quot;text-align: left;&quot;&gt;In general, the topic is your app&amp;rsquo;s bundle ID/app ID) 그냥 자동으로 넣어준듯.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;apns-push-type ➡️ 그냥 push type. (종류에는 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns#4294485&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이런것&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;들이 있음) 우리가 보내는 평범한(?) 푸시는 alert이므로 우선 alert로 해준다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;apns-expiration &lt;span style=&quot;text-align: left;&quot;&gt;➡️ 푸시가 유효한 날짜라고 보면됨. Attempt delivery once로 지정해주자&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;apns-priority &lt;span style=&quot;text-align: left;&quot;&gt;➡️ 테스트니까 우선 high (10) 으로 해준다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;10 -&amp;gt; 즉시 보냄&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;5 -&amp;gt; 디바이스의 파워 상태에 따라 보냄&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;1 -&amp;gt; 다른 모든 요소보다 디바이스 파워 상태을 우선시하고 디바이스가 깨어나는 것을 방지&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;10. Payload 부분 채워주기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.18.05.png&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mWZqI/btsy7fh644u/aYIC3MaeVhlYQkLPHKRgqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mWZqI/btsy7fh644u/aYIC3MaeVhlYQkLPHKRgqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mWZqI/btsy7fh644u/aYIC3MaeVhlYQkLPHKRgqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmWZqI%2Fbtsy7fh644u%2FaYIC3MaeVhlYQkLPHKRgqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1081&quot; height=&quot;392&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.18.05.png&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.18.13.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l4aWG/btsy34IoXNi/Szbkaw4UKkSRozmIHeq8A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l4aWG/btsy34IoXNi/Szbkaw4UKkSRozmIHeq8A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l4aWG/btsy34IoXNi/Szbkaw4UKkSRozmIHeq8A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl4aWG%2Fbtsy34IoXNi%2FSzbkaw4UKkSRozmIHeq8A0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;219&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.18.13.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;우상단 JSON View를 하면 JSON 형식으로도 볼 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;다만 JSON View로 하면 key이름을 다 알아야하는데..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.27.01.png&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEugUY/btsy5cstwo2/08U9LRfodbDa5iZiKDlpj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEugUY/btsy5cstwo2/08U9LRfodbDa5iZiKDlpj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEugUY/btsy5cstwo2/08U9LRfodbDa5iZiKDlpj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEugUY%2Fbtsy5cstwo2%2F08U9LRfodbDa5iZiKDlpj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;528&quot; data-filename=&quot;스크린샷 2023-10-24 오후 4.27.01.png&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;요렇게 보면 뭘 추가할 수 있는지 다 나와서 편한 것 같다!?&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;아무튼 요건 알아서 채워주면 됨. 난 귀찮으니까 걍 그대로 보낼거..ㅎ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;11. 우상단 Send 누르기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-video-to-gif-2.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/babMZW/btsy9g1FLm4/gjJYz0MMiQkopKkiCqSGo0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/babMZW/btsy9g1FLm4/gjJYz0MMiQkopKkiCqSGo0/img.gif&quot; data-alt=&quot;뭐지 이 화질은..?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/babMZW/btsy9g1FLm4/gjJYz0MMiQkopKkiCqSGo0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/babMZW/btsy9g1FLm4/gjJYz0MMiQkopKkiCqSGo0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;107&quot; data-filename=&quot;ezgif.com-video-to-gif-2.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;뭐지 이 화질은..?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아무튼 이렇게 바로 옵니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;야호 짱 편하다~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# 여러 기능들&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;1. 푸시가 보내졌는지 안보내졌는지 상세한 로그 확인 가능&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ov9Jo/btszb3pC07a/QwMiz57BkzFBBe9FqBUQtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ov9Jo/btszb3pC07a/QwMiz57BkzFBBe9FqBUQtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ov9Jo/btszb3pC07a/QwMiz57BkzFBBe9FqBUQtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOv9Jo%2Fbtszb3pC07a%2FQwMiz57BkzFBBe9FqBUQtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1314&quot; height=&quot;442&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약에 성공적으로 보내졌다면&lt;/span&gt; &lt;b&gt;&lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;successfully delivered to the target device&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라고 나오고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위에서 말했듯이 Priority를 medium이나 low로 주면 디바이스 파워 상태에 따라 즉시 전달이 안될 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;예를들어, 저전력 모드이고 충전중이지 않을 때 low로 보내게 되면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zm55m/btszbUsOn3Y/Q5BUd1oEtOqpkxAEvUtbgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zm55m/btszbUsOn3Y/Q5BUd1oEtOqpkxAEvUtbgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zm55m/btszbUsOn3Y/Q5BUd1oEtOqpkxAEvUtbgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzm55m%2FbtszbUsOn3Y%2FQ5BUd1oEtOqpkxAEvUtbgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1394&quot; height=&quot;408&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bprHNR/btszbKjxl2G/sMWLkn0L84fxeVS7FDOAY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bprHNR/btszbKjxl2G/sMWLkn0L84fxeVS7FDOAY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bprHNR/btszbKjxl2G/sMWLkn0L84fxeVS7FDOAY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbprHNR%2FbtszbKjxl2G%2FsMWLkn0L84fxeVS7FDOAY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1672&quot; height=&quot;198&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;stored for device power considerations&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 로 나오게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이때는 배터리 절약을 위헤 바로 보내지 않고, 저장해놨다가 사용자가 핸드폰을 잠금해제하거나 저전력 모드를 해제했을 때 오는 식입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(저는 잠금 해제하면 올때도 있고, 저전력 모드를 해제하면 올때도 있고 랜덤이더라구요;;)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그때 이제 상단의 Refresh를 누르면 successfully delivered to the target device 요걸로 바뀌어있겠죠!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;물론 이러한 로그는 상단의 Delivery Logs에서도 확인이 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sb8UR/btszfHeCZoJ/6SV2p3btfYiE7lrN7E0w9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sb8UR/btszfHeCZoJ/6SV2p3btfYiE7lrN7E0w9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sb8UR/btszfHeCZoJ/6SV2p3btfYiE7lrN7E0w9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsb8UR%2FbtszfHeCZoJ%2F6SV2p3btfYiE7lrN7E0w9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1334&quot; height=&quot;196&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;각 푸시는 apns-unique-id를 가지는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq0dtI/btszf4tSPoT/Vb2nn7GjeEmI6oOpoy6yNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq0dtI/btszf4tSPoT/Vb2nn7GjeEmI6oOpoy6yNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq0dtI/btszf4tSPoT/Vb2nn7GjeEmI6oOpoy6yNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq0dtI%2Fbtszf4tSPoT%2FVb2nn7GjeEmI6oOpoy6yNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1042&quot; height=&quot;764&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요것을 복사해서 Delivery Log에 검색하면&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bezn5H/btszhr27bcO/fBsqhWCwN5VShfJkMpJzOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bezn5H/btszhr27bcO/fBsqhWCwN5VShfJkMpJzOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bezn5H/btszhr27bcO/fBsqhWCwN5VShfJkMpJzOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbezn5H%2Fbtszhr27bcO%2FfBsqhWCwN5VShfJkMpJzOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2548&quot; height=&quot;860&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;똑같은 정보를 볼 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;물론 콘솔에서 보냈다면 Send탭에서 똑같은 정보를 확인할 수 있으니 굳이 Delivery Log탭으로 안가도 되겠지만..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;서버를 통해 쐈다거나 했을 때 응답의 apns-unique-id를 활용하여 로그를 확인해볼 수 있겠죠!?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;2. Debug with Tools&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;상단의 Tool에 들어가면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;- JWT Validator&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;- JWT Generator&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;- Device Token Validator&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런것들이 있는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N5pVm/btszcPkd7a5/CsFPVj3Ij50AxaEjEnntJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N5pVm/btszcPkd7a5/CsFPVj3Ij50AxaEjEnntJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N5pVm/btszcPkd7a5/CsFPVj3Ij50AxaEjEnntJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN5pVm%2FbtszcPkd7a5%2FCsFPVj3Ij50AxaEjEnntJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1292&quot; height=&quot;430&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;JWT Generator로 토큰을 생성할수도 있고, 이미 토큰이 있다면 Validator로 유효한지 검사할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1808&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c27ojH/btszdfC68di/2WA5kbul2bPTdbw8ipgFq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c27ojH/btszdfC68di/2WA5kbul2bPTdbw8ipgFq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c27ojH/btszdfC68di/2WA5kbul2bPTdbw8ipgFq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc27ojH%2FbtszdfC68di%2F2WA5kbul2bPTdbw8ipgFq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1808&quot; height=&quot;508&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1808&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;Device Token Validator는 아주 유용하게 쓰일 수 있는데요.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sty2h/btszdqxHWd5/5VY4A6X4NjwlcREIaJLPb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sty2h/btszdqxHWd5/5VY4A6X4NjwlcREIaJLPb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sty2h/btszdqxHWd5/5VY4A6X4NjwlcREIaJLPb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsty2h%2FbtszdqxHWd5%2F5VY4A6X4NjwlcREIaJLPb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1578&quot; height=&quot;494&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런식으로 Push Type과 환경이 같이나와서 엄청 편하더라구요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;내 푸시토큰이 Live Activity 푸시토큰이다!면 저기에 Live Activity Push Type이라고 나옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;3. Metric&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Metric 탭에서는 보낸 Push Type, 각 Push Type에 해당하는 푸시들의 상태를 한눈에 살펴볼 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciHWtR/btszbSV3eXp/9hZFNKO6chqCIOoHiDy4JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciHWtR/btszbSV3eXp/9hZFNKO6chqCIOoHiDy4JK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;702&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.33.35.png&quot; data-widthpercent=&quot;49.35&quot; style=&quot;width: 48.776805%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciHWtR/btszbSV3eXp/9hZFNKO6chqCIOoHiDy4JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciHWtR%2FbtszbSV3eXp%2F9hZFNKO6chqCIOoHiDy4JK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1520&quot; height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEWu5h/btszfxJ2vw6/ki7KUCjZrECJ9vKijs5sA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEWu5h/btszfxJ2vw6/ki7KUCjZrECJ9vKijs5sA0/img.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;882&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.31.36.png&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.65&quot; style=&quot;width: 50.060405%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEWu5h/btszfxJ2vw6/ki7KUCjZrECJ9vKijs5sA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEWu5h%2FbtszfxJ2vw6%2Fki7KUCjZrECJ9vKijs5sA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1960&quot; height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(Production만 나오는듯..? 저는 Development로밖에 안보내서 0으로 나오는 것 같아요)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼 각 Status에 따라 평균 몇개인지, Total은 몇개인지 등등을 볼 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;각 그림의 왼쪽의 체크버튼을 통해서 상단 그래프에 보여질건지 말지도 조절할 수 있더라구요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 동향?같은거 살펴볼때 좋은 것 같아요~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;제가 푸시 관련 기능 나오면 써보고, 어떻게 하면 파베 안쓰고 그냥 보낼 수 있을까.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이런 저런 고민도 하고 그러면서 글도 몇개 썼었는데요!&lt;/span&gt;!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/1385&quot;&gt;[Xcode 14+] 시뮬레이터에 Remote notifications 보내기&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/1384&quot;&gt;Sending push notifications using command-line tools (feat. Token / .p8)&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/954&quot;&gt;Xcode 11.4 ) Remote Push Notifications in Simulator (feat. APNs file)&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그중에서 제일 편하네요.. 고마워 사과야  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #dca10d;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/usernotifications/testing_notifications_using_the_push_notification_console&quot;&gt;https://developer.apple.com/documentation/usernotifications/testing_notifications_using_the_push_notification_console&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>Notification</category>
      <category>Push</category>
      <category>Push Notification Console</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1399</guid>
      <comments>https://zeddios.tistory.com/1399#entry1399comment</comments>
      <pubDate>Thu, 26 Oct 2023 22:40:31 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] AVIF. itemProvider.canLoadObject(ofClass: UIImage.self)가 false로 나오는 건에 대하여</title>
      <link>https://zeddios.tistory.com/1398</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사진첩에서 특정 사진이 불러와지지 않는다는 이슈가 있어 파악해보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;해당 사진의 확장자는 AVIF였는데, 처음보는 확장자였다;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# AVIF&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;AV1 Image File Format, AV1 이미지 파일 형식이라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;고화질 이미지를 유지하면서 파일 크기를 효과적으로 줄였다고 보면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #3cb09c; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://jakearchibald.com/2020/avif-has-landed/&quot;&gt;https://jakearchibald.com/2020/avif-has-landed/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1696988956997&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;AVIF has landed&quot; data-og-description=&quot;AVIF is the first browser image format we've had in 10 years. Let's see how it performs&amp;hellip;&quot; data-og-host=&quot;jakearchibald.com&quot; data-og-source-url=&quot;https://jakearchibald.com/2020/avif-has-landed/&quot; data-og-url=&quot;https://jakearchibald.com/2020/avif-has-landed/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/piokv/hyT9FHuML1/TvljS0kuWXYAHWPKBTT0gK/img.jpg?width=1448&amp;amp;height=753&amp;amp;face=0_0_1448_753,https://scrap.kakaocdn.net/dn/fwOUf/hyT9Kvi85P/yVmV7ZEAHew3QZa2NgQRV0/img.jpg?width=1448&amp;amp;height=753&amp;amp;face=0_0_1448_753,https://scrap.kakaocdn.net/dn/RNQ1P/hyT9BSGzSt/GhRPFxGRaH9fn1zpM5vyck/img.jpg?width=800&amp;amp;height=858&amp;amp;face=162_139_560_537&quot;&gt;&lt;a href=&quot;https://jakearchibald.com/2020/avif-has-landed/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jakearchibald.com/2020/avif-has-landed/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/piokv/hyT9FHuML1/TvljS0kuWXYAHWPKBTT0gK/img.jpg?width=1448&amp;amp;height=753&amp;amp;face=0_0_1448_753,https://scrap.kakaocdn.net/dn/fwOUf/hyT9Kvi85P/yVmV7ZEAHew3QZa2NgQRV0/img.jpg?width=1448&amp;amp;height=753&amp;amp;face=0_0_1448_753,https://scrap.kakaocdn.net/dn/RNQ1P/hyT9BSGzSt/GhRPFxGRaH9fn1zpM5vyck/img.jpg?width=800&amp;amp;height=858&amp;amp;face=162_139_560_537');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AVIF has landed&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AVIF is the first browser image format we've had in 10 years. Let's see how it performs&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jakearchibald.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;위는 JPG, WebP, AVIF 화질을 비교한 링크인데 AVIF가 가장 낮은 파일 크기이면서 여전히 고화질 이미지를 보여준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;또한, 넷플릭스는 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://netflixtechblog.com/avif-for-next-generation-image-coding-b1d75675fe4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AVIF for Next-Generation Image Coding&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 글에서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;널리 지원되고, 더 나은 압축 효율성을 가지며, 더 넓은 기능셋을 갖춘 JPEG의 대안으로 AVIF이 잠재력을 갖고 있다고 믿는다&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;고 썻다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 이슈 파악&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼.. 돌아와서 AVIF를 불러오지 못하는 이유를 파악해봤다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1052&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PHPicker 글&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에서도 볼 수 있듯이 (WWDC에서 사용된 예제)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/c24ff34ee6eb313f6ea81d83e25a4631.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;보통&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696990031200&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; itemProvider.canLoadObject(ofClass: UIImage.self) // ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 canLoadObject로 검사하는게 국룰인 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;근데 여기서 AVIF의 경우 false가 나오고 있었다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696990170924&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in 
   ....
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 바로 load를 해보면 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;Could not coerce an item to class UIImage&lt;/span&gt;에러가 나온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내가 선택한 아이템을 UIImage로 강제할 수 없다? 이런 뜻인듯&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 해결&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1696990542281&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if itemProvider.hasItemConformingToTypeIdentifier(UTType.image.identifier) {
    itemProvider.loadDataRepresentation(forTypeIdentifier: UTType.image.identifier, completionHandler: { data, error in
        // 
    })
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 UTType.image.identifier 를 사용하여 불러오도록 변경했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;UTType.image는 그냥 이미지 파일 형식! 을 나타내는 것 같아서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696990785884&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;if let itemProvider = itemProvider,
       itemProvider.canLoadObject(ofClass: UIImage.self) { // 3
        itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in // 4

        }
    } else {
    
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 코드를 썼을 때 처럼 AVIF같이 UIImage로 변경? 캐스팅?;; 이 안되는 친구들도 다 포함할 수 있을 듯 하다??&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(근데 뭔가 불안해서 canLoadObject에 실패했을 때만 loadDataRepresentation을 하도록 했다 ㅋㅎ..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왜 AVIF는 UIImage.self로 로드가 안될까..하고 GPT에게 물어봤더니..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;AVIF는 UIImage클래스와 직접적으로 연결되어 있지 않으며, AVIF는 별도의 형식으로 AVIF를 로드하려면 AVAsset 또는 관련 AVFoundation클래스를 사용해야 한다고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;흠.. 글쿤 (반만 믿음)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>AVIF</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1398</guid>
      <comments>https://zeddios.tistory.com/1398#entry1398comment</comments>
      <pubDate>Wed, 11 Oct 2023 13:42:33 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] UIImagePickerController.isSourceTypeAvailable</title>
      <link>https://zeddios.tistory.com/1397</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;UIImagePickerController를 쓸 일도 없고.. 안쓴지 너무 오래되어서 기억도 잘 안나긴 하는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Simulator는 카메라가 없으니까 Simulator에서 isSourceTypeAvailable(.camera)는 false야!&lt;/b&gt; &amp;lt; 그냥 내 머리가 이렇게 알고있었음;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어쩌다가 회사 프로젝트에서 관련해서 볼 일이 생겼는데, 이것저것 실험해보다가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696575821405&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UIImagePickerController.isSourceTypeAvailable(.camera)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 코드를 Simulator에서 실행했더니 true가 나오는 것이다!! (당연히 false가 나올거라고 생각했음)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;우선 isSourceTypeAvailable 공식문서를 살펴보기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;isSourceTypeAvailable&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정의 : 디바이스가 지정된 source type을 사용하여 미디어 선택(picking media)을 지원하는지 여부를 쿼리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;return : 디바이스가 지정된 source type을 지원하면 true, 지정된 source type을 사용할 수 없으면 false&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;discussion : 사용자 라이브러리에서 이미지를 선택하려고 하는데, 라이브러리가 비어있는 경우 false / 카메라가 이미 사용중이면 false&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;discussion에 있는 내용은 처음 알았네! 근데.. 아무리 읽어봐도 Simulator에서 false를 리턴해야하는게 아닌지..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;구글에 찾아보니 역시나 나랑 똑같은 생각을 한 사람이 있었음..&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1696576000350&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;why does UIImagePickerController.isSourceTypeAvailable(.camera) return true when using the simulator&quot; data-og-description=&quot;why does UIImagePickerController.isSourceTypeAvailable(.camera) return true when using the simulator? This causes the simulator to crash when trying to access the camera.&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/76374971/why-does-uiimagepickercontroller-issourcetypeavailable-camera-return-true-when&quot; data-og-url=&quot;https://stackoverflow.com/questions/76374971/why-does-uiimagepickercontroller-issourcetypeavailable-camera-return-true-when&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EJkbb/hyT51RBRQP/OPzKHDxX85cCrNjyoUTMsk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/QlaSV/hyT9Co65Gf/i98crFIqmtjRLZlPluIFY0/img.png?width=433&amp;amp;height=811&amp;amp;face=0_0_433_811&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/76374971/why-does-uiimagepickercontroller-issourcetypeavailable-camera-return-true-when&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/76374971/why-does-uiimagepickercontroller-issourcetypeavailable-camera-return-true-when&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EJkbb/hyT51RBRQP/OPzKHDxX85cCrNjyoUTMsk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/QlaSV/hyT9Co65Gf/i98crFIqmtjRLZlPluIFY0/img.png?width=433&amp;amp;height=811&amp;amp;face=0_0_433_811');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;why does UIImagePickerController.isSourceTypeAvailable(.camera) return true when using the simulator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;why does UIImagePickerController.isSourceTypeAvailable(.camera) return true when using the simulator? This causes the simulator to crash when trying to access the camera.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://stackoverflow.com/questions/76374971/why-does-uiimagepickercontroller-issourcetypeavailable-camera-return-true-when%EF%BB%BF#comment134695058_76385661&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;코멘트&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 에서는 intel 맥에서는 false로 나오고 애플 실리콘 맥에서는 true로 나온다고 한다..?!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 한번도 시뮬레이터에서 카메라를 안띄워봤던 것 같은데...(기억이 안남)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696577267571&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let picker = UIImagePickerController()
picker.sourceType = .camera
self.present(picker, animated: true)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위와 &lt;span style=&quot;text-align: start;&quot;&gt;같이 하면 Simulator에서도 &amp;nbsp;&lt;/span&gt;카메라가 뜬다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/di3mRf/btsw8VUQDpj/1ClkWB0XlASx7bUnWA7ksk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/di3mRf/btsw8VUQDpj/1ClkWB0XlASx7bUnWA7ksk/img.gif&quot; data-is-animation=&quot;true&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;640&quot; data-filename=&quot;Simulator Screen Recording - iPhone 15 Pro Max - 2023-10-06 at 16.33.01.gif&quot; data-widthpercent=&quot;50.06&quot; style=&quot;width: 49.478868%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/di3mRf/btsw8VUQDpj/1ClkWB0XlASx7bUnWA7ksk/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdi3mRf%2Fbtsw8VUQDpj%2F1ClkWB0XlASx7bUnWA7ksk%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;296&quot; height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D7gJ1/btsxh8r5pDZ/X36qUgS3JSMsWYOlK8AB90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D7gJ1/btsxh8r5pDZ/X36qUgS3JSMsWYOlK8AB90/img.png&quot; data-is-animation=&quot;false&quot; data-filename=&quot;Simulator Screenshot - iPhone 15 Pro Max - 2023-10-06 at 16.33.18.png&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;2796&quot; data-widthpercent=&quot;49.94&quot; style=&quot;width: 49.358342%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D7gJ1/btsxh8r5pDZ/X36qUgS3JSMsWYOlK8AB90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD7gJ1%2Fbtsxh8r5pDZ%2FX36qUgS3JSMsWYOlK8AB90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;2796&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요런식으로 뜨기만 하고 카메라 버튼같은건 안눌린다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;return : 디바이스가 지정된 source type을 지원하면 true,&amp;nbsp;지정된 source type을 사용할 수 없으면 false&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그렇다면 대충 지원한다고 볼 수 있으니 &lt;/span&gt;&lt;/span&gt;true인 것인가.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;너무 소소하지만 나같이 생각한 사람이 한명이라도 있겠지..하고 써봅니다 데헷&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>isSourceTypeAvailable</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1397</guid>
      <comments>https://zeddios.tistory.com/1397#entry1397comment</comments>
      <pubDate>Fri, 6 Oct 2023 17:01:56 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 전역 변수 사용시 주의할 점 / global</title>
      <link>https://zeddios.tistory.com/1396</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오늘 Python에게 한번 더 당해버림 &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[문제 상황]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Flask 서버가 떠있는 상황&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 스크립트내에서 특정 API 호출 -&amp;gt; 전역변수로 선언되어있는 dictionary에 값을 넣어줌&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Flask 서버에 있는 스크립트를 호출하면 계속 이전에 호출했던 값과 달라지지 않는 문제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. But 로컬로 돌리면 잘 됨. 서버에 있는것도 한번 배포를 하면 잘 되고 그 이후부터는 또 똑같은 응답줌&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;처음에는 API가 캐싱해서 주나.. 라고 의심했는데, 로컬에서는 잘되고 왜 서버에 떠있는것만 문제일까 끙끙대다가 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;동료분의 도움을 받아서 원인을 찾을 수 있었다 (감사합니다  &amp;zwj;♀️)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[원인]&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694581905408&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my_dict = {}

def test():
    my_dict[&quot;Zedd&quot;] = &quot;Hello&quot;

def 매번불리는함수():
    test()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대충 이런코드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;로컬에 있는건 매번 스크립트를 새로 실행하니까 my_dict이 매 실행시 마다 빈 값으로 초기화되지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;서버에 있는건 계속 떠있으니까 전역변수인 my_dict이 처음에만 초기화되고.. 로컬처럼 스크립트 실행시마다 초기화되지 않는것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;너무나도 당연한 소리같이 느껴지지만 이 부분 생각을 못했다 ㅋ~~!!!!!!! 전 보초니까요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[해결]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;처음에는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694581913197&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my_dict = {}

def test():
    my_dict[&quot;Zedd&quot;] = &quot;Hello&quot;

def 매번불리는함수():
    my_dict = {} # ✅ 초기화 한번 해주기
    test()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;응 test()호출전에 my_dict을 한번 초기화시켜주면 그만이야~&lt;/b&gt; 라고 생각했는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;my_dict을 print해보니 {} 이렇게 빈값이 나오는것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;찾아보니 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;&lt;b&gt;global&lt;/b&gt;&lt;/span&gt; 키워드를 사용하면 된단다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Pyton에서 &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;함수 내부에서 &lt;b&gt;전역 변수를 사용하기 위해서는 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;global&lt;/span&gt; 키워드를 사용하여 해당 전역 변수를 재선언해야 한다&lt;/b&gt;고 한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;그렇지 않으면 지역변수로 취급한다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694582272277&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my_dict = {}

def test():
    my_dict[&quot;Zedd&quot;] = &quot;Hello&quot; # 지역변수

def 매번불리는함수():
    my_dict = {} # ✅ 초기화 한번 해주기
    test()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;위 코드에서 test()내의 my_dict은 전역변수가 아닌 my_dict이라는 지역변수가 새로 하나 생긴것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #575757;&quot;&gt;&lt;span style=&quot;caret-color: #575757; background-color: #ffffff;&quot;&gt;내가&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694582551748&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my_dict = {} # ✅ 초기화 한번 해주기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;이렇게 해준것도 전역변수인 my_dict을 초기화한게 아니라 그냥 새로운 지역변수를 선언한것이다 ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;global&lt;/b&gt; 키워드를 사용하여 수정해보자&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694582619444&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my_dict = {}

def test():
    global my_dict
    my_dict[&quot;Zedd&quot;] = &quot;Hello&quot;

def 매번불리는함수():
    global my_dict
    my_dict = {}
    test()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;이렇게 해주면 된다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;[참고]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #3cb09c; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;http://www.tcpschool.com/python2018/python_function_scope&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.tcpschool.com/python2018/python_function_scope&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1396</guid>
      <comments>https://zeddios.tistory.com/1396#entry1396comment</comments>
      <pubDate>Wed, 13 Sep 2023 14:28:48 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 기초 문법들 끄적</title>
      <link>https://zeddios.tistory.com/1394</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;GPT도&amp;nbsp;좋은데..GTP로&amp;nbsp;해결하니까&amp;nbsp;이상하게&amp;nbsp;기본적인&amp;nbsp;문법들도&amp;nbsp;돌아서면&amp;nbsp;까먹는다&amp;nbsp;데헷&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;너무&amp;nbsp;간단해서&amp;nbsp;좀&amp;nbsp;현타오지만&amp;nbsp;그냥&amp;nbsp;틈틈히&amp;nbsp;기록하려고..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;참고로 나는 파이썬 초보도 아니고 거의 보초수준&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;어떤&amp;nbsp;값이&amp;nbsp;배열에&amp;nbsp;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;들어있는지&lt;/span&gt;&amp;nbsp;검사&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1694259127622&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;array = ['zedd', 'martin', 'walker']
if 'zedd' in array:
  print(&quot;zedd가 있음&quot;)
else:
  print(&quot;zedd가 없음&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 어떤 값이 배열에 &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;없는지&lt;/span&gt; 검사&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1694259136023&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;array = ['zedd', 'martin', 'walker']
if not 'zedd' in array:
    print(&quot;zedd가 없음&quot;)
else:
    print(&quot;zedd가 있음&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;if문에서&amp;nbsp;아무것도&amp;nbsp;하지&amp;nbsp;않고&amp;nbsp;넘어가기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;if-else&amp;nbsp;조건문&amp;nbsp;안을&amp;nbsp;그냥&amp;nbsp;비워놨더니&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;IndentationError: expected an indented block 요 오류가 났었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무것도 안하고싶을때는 pass를 해주면 된다. 그럼 계속 메소드 실행함&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694259159372&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;array = ['zedd', 'martin', 'walker']
if 'zedd' in array:
  pass # 아무것도 하고싶지 않을때 
else:
  pass # 아무것도 하고싶지 않을때&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;return은&amp;nbsp;메소드를&amp;nbsp;종료하기&amp;nbsp;때문에&amp;nbsp;아래&amp;nbsp;코드들이&amp;nbsp;실행안될&amp;nbsp;수&amp;nbsp;있음~!&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# String trim하는 법&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1694259169988&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;value = &quot;  Zedd, martin, walker  &quot;
print(value.strip()) # zedd, martin, walker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;strip에 인자를 넣어줄 수도 있다. 위 코드처럼 아무것도 안넣어주면 기본적으로 공백을 제거하도록 되어있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내&amp;nbsp;케이스에는&amp;nbsp;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;,&lt;/span&gt;가&amp;nbsp;마지막에&amp;nbsp;들어가서&amp;nbsp;이것도&amp;nbsp;제거하고싶었는데&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694259178688&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;value = &quot;  zedd, martin, walker,  &quot;
print(value.strip(', '))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게&amp;nbsp;strip에&amp;nbsp;제거하고싶은&amp;nbsp;character들을&amp;nbsp;넣어주면된다.&amp;nbsp;위에서는&amp;nbsp;,와&amp;nbsp;공백을&amp;nbsp;넣어준것!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;,만 넣어주면 안되는데 왜냐면 끝이 ,로 안끝나니까 ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;동일하지 않은 텍스트가 나올때 까지 계속 제거한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694259191505&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;value = &quot;  zedd, martin, walker, , ,&quot;
print(value.strip(', ')) # zedd, martin, walker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;lstrip과&amp;nbsp;rstrip도&amp;nbsp;있는데&amp;nbsp;l은&amp;nbsp;왼쪽,&amp;nbsp;r은&amp;nbsp;오른쪽에&amp;nbsp;있는&amp;nbsp;것들을&amp;nbsp;제거한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내&amp;nbsp;경우(공백은&amp;nbsp;양쪽&amp;nbsp;다&amp;nbsp;지우고&amp;nbsp;오른쪽에만&amp;nbsp;,이&amp;nbsp;있어서&amp;nbsp;이걸&amp;nbsp;지우고&amp;nbsp;싶은&amp;nbsp;경우)에&amp;nbsp;rstrip을&amp;nbsp;적용해보면&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694259200521&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;value = &quot;  zedd, martin, walker,  &quot;
print(value.strip().rstrip(',')) # zedd, martin, walker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;같은&amp;nbsp;결과를&amp;nbsp;낸다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;Dictionary&amp;nbsp;쓸&amp;nbsp;때&amp;nbsp;주의점&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1694259206141&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dict = {}
dict['Zedd'].append('Hello')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 하기전에 &amp;lsquo;Zedd&amp;rsquo; key에 대해서 초기화를 한번 해줘야한다. 안해주면 에러남&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694259212254&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dict = {}
dict['Zedd'] = []
dict['Zedd'].append('Hello') # {'Zedd': ['Hello']}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일단 이정도!! 막힐때 마다 해결한 방법들 추가해야겠다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;문법도 문법이지만 가장 중요한건 indent를 적절하게 잘 해준다..가 아닐까 싶다. 몇번을 당하는지 ㅎ&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>pyton</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1394</guid>
      <comments>https://zeddios.tistory.com/1394#entry1394comment</comments>
      <pubDate>Sat, 9 Sep 2023 20:37:11 +0900</pubDate>
    </item>
    <item>
      <title>[삽질 기록] GradationView 만들기</title>
      <link>https://zeddios.tistory.com/1393</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 삽질 기록..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내가 해결한 방법이 정답이 아닐 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;삽질은 엄청 했지만 그냥 짧게(???) 좋은 경험 한 것 같아서 남겨보려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.40.26.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duJRFA/btsqFsqXHvz/ALRc0knmmZpCQz224azKRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duJRFA/btsqFsqXHvz/ALRc0knmmZpCQz224azKRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duJRFA/btsqFsqXHvz/ALRc0knmmZpCQz224azKRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduJRFA%2FbtsqFsqXHvz%2FALRc0knmmZpCQz224azKRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;540&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.40.26.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위와같은 뷰를 만들었어야 했는데, 딱 봤을 때 응 그냥 그라데이션이야~하고 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;CAGradientLayer이용하면 되지 않을까?? 싶었다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대충 예전에 쓴&amp;nbsp;&lt;b&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;/948&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;iOS ) CAGradientLayer&lt;/span&gt; &lt;/a&gt;&lt;/b&gt;글을 보면서 작업을 시작했음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;나는 View는 UIKit으로 만드는게 편해서 UIKit으로 만들기 시작했다!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;딴 이야기지만 중간에 코드 그냥 이미지로 넣은거 보고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.38.04.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;1210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duF7Rg/btsqJCsPqwM/fPDP1A6x85tBoOq3dQ4cfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duF7Rg/btsqJCsPqwM/fPDP1A6x85tBoOq3dQ4cfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duF7Rg/btsqJCsPqwM/fPDP1A6x85tBoOq3dQ4cfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduF7Rg%2FbtsqJCsPqwM%2FfPDP1A6x85tBoOq3dQ4cfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1414&quot; height=&quot;1210&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.38.04.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;1210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;진짜 또라인가?? 싶었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아니 이걸 왜 이미지로 넣으세요. 하~~~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;s&gt;이미지로 넣어서 미안합니다.&amp;nbsp;&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[첫번째 시도]&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duJRFA/btsqFsqXHvz/ALRc0knmmZpCQz224azKRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duJRFA/btsqFsqXHvz/ALRc0knmmZpCQz224azKRK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;540&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.40.26.png&quot; data-widthpercent=&quot;49.13&quot; style=&quot;width: 48.555789%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duJRFA/btsqFsqXHvz/ALRc0knmmZpCQz224azKRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduJRFA%2FbtsqFsqXHvz%2FALRc0knmmZpCQz224azKRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOJTyu/btsqLShfBzm/zJJIfSBvJfCvVZoRMKvZD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOJTyu/btsqLShfBzm/zJJIfSBvJfCvVZoRMKvZD0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;454&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.43.57.png&quot; data-widthpercent=&quot;50.87&quot; style=&quot;width: 50.28142%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOJTyu/btsqLShfBzm/zJJIfSBvJfCvVZoRMKvZD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOJTyu%2FbtsqLShfBzm%2FzJJIfSBvJfCvVZoRMKvZD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;내가 원하는거 / CAGradientLayer 삽질 중 하나&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;CAGradientLayer만들고 이것저것 해보는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 첫번째 그림처럼 경계선이 진짜 다 풀어져있는 그런걸 원했지만 두번째 그림처럼 경계선이 너무 자기주장이 심한것이다. ㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/948&quot;&gt;iOS ) CAGradientLayer &lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 에서 radial(방사형) 예제가 있길래&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.55.27.png&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;1212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AZFOP/btsqJQK5nDd/xtksUcezB27YWWVUAKjIpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AZFOP/btsqJQK5nDd/xtksUcezB27YWWVUAKjIpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AZFOP/btsqJQK5nDd/xtksUcezB27YWWVUAKjIpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAZFOP%2FbtsqJQK5nDd%2FxtksUcezB27YWWVUAKjIpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1342&quot; height=&quot;1212&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.55.27.png&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;1212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이거야!! 싶어서 적용했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duJRFA/btsqFsqXHvz/ALRc0knmmZpCQz224azKRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duJRFA/btsqFsqXHvz/ALRc0knmmZpCQz224azKRK/img.png&quot; style=&quot;width: 50.398632%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;540&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.40.26.png&quot; data-widthpercent=&quot;50.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duJRFA/btsqFsqXHvz/ALRc0knmmZpCQz224azKRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduJRFA%2FbtsqFsqXHvz%2FALRc0knmmZpCQz224azKRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BylDM/btsqLkLPWvA/vK0b2Kf2SzbzTcDXC0XVAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BylDM/btsqLkLPWvA/vK0b2Kf2SzbzTcDXC0XVAK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;630&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.57.41.png&quot; data-widthpercent=&quot;49.01&quot; style=&quot;width: 48.438577%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BylDM/btsqLkLPWvA/vK0b2Kf2SzbzTcDXC0XVAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBylDM%2FbtsqLkLPWvA%2FvK0b2Kf2SzbzTcDXC0XVAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;내가 원하는거 / radial type 적용한거&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나쁘진 않은데, 이것도 뭔가 경계선이 자기주장을 하는 느낌?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;주변 백그라운드와 이질감 없이 어우러지는걸 원했고, ㅅ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 내가 만들려는건 구형이 아니라 사각형에 radius가 50정도 먹여져있는 그런 형태여서 (첫번째 이미지에서 거의 티는 안나지만;;) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 방법은 패스하기로 했다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[두번째 시도]&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이때부터 이거 그냥 뚝딱할 수 있는게 아닌가..? 싶어서 찾아보는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.50.03.png&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCZOXm/btsqJsc3s5O/7wBFHs7lmtko4JQ5WiRmFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCZOXm/btsqJsc3s5O/7wBFHs7lmtko4JQ5WiRmFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCZOXm/btsqJsc3s5O/7wBFHs7lmtko4JQ5WiRmFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCZOXm%2FbtsqJsc3s5O%2F7wBFHs7lmtko4JQ5WiRmFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;720&quot; data-filename=&quot;스크린샷 2023-08-09 오후 10.50.03.png&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://stackoverflow.com/questions/41093305/swift-3-how-to-create-blurred-side-edges-corners-of-a-uiimageview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;스택오버플로우 글&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;을 발견. 코드를 보니&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691589090494&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let maskLayer = CAGradientLayer()
maskLayer.frame = yourImageView.bounds
maskLayer.shadowRadius = 5
maskLayer.shadowPath = CGPath(roundedRect: YourImagView.bounds.insetBy(dx: 5, dy: 5), cornerWidth: 10, cornerHeight: 10, transform: nil)
maskLayer.shadowOpacity = 1
maskLayer.shadowOffset = CGSize.zero
maskLayer.shadowColor = UIColor.white.cgColor        
yourImageView.layer.mask = maskLayer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;shadow로 뭔가 좀 해보려고 한 것 같은데, shadow로는 내가 원하는게(경계선 자기주장 X) 절대 안나올 것 같아서 얘도 패스..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[세번째 시도]&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 뚝딱할 수 있을 줄 알았는데, 내 예상과 달라서 당황하다가 갓PT에게 물어봄&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693117722138&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit

class BlurredBorderView: UIView {
    private let blurRadius: CGFloat = 10.0
    
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        
        guard let context = UIGraphicsGetCurrentContext() else { return }
        
        // Draw the content of the view
        let contentRect = CGRect(x: blurRadius, y: blurRadius, width: bounds.width - 2 * blurRadius, height: bounds.height - 2 * blurRadius)
        context.saveGState()
        context.clip(to: contentRect)
        self.layer.render(in: context)
        context.restoreGState()
        
        // Apply blur effect to the border
        if let blurFilter = CIFilter(name: &quot;CIGaussianBlur&quot;) {
            let borderRect = CGRect(x: 0, y: 0, width: bounds.width, height: bounds.height)
            blurFilter.setValue(CIImage(image: snapshotImage(view: self)), forKey: kCIInputImageKey)
            blurFilter.setValue(blurRadius, forKey: kCIInputRadiusKey)
            if let outputImage = blurFilter.outputImage {
                let blurredImage = UIImage(ciImage: outputImage)
                blurredImage.draw(in: borderRect)
            }
        }
    }
    
    private func snapshotImage(view: UIView) -&amp;gt; UIImage? {
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
        defer { UIGraphicsEndImageContext() }
        
        if let context = UIGraphicsGetCurrentContext() {
            view.layer.render(in: context)
            let snapshotImage = UIGraphicsGetImageFromCurrentImageContext()
            return snapshotImage
        }
        
        return nil
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;당황.....&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;당연히 복붙했을 때 잘 안됐고.. 어디서부터 왜 안되는지, 뭐부터 봐야하는지 감이 안와서 이 방법도 포기했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 내심 아니 이게 이렇게 어렵게 짜야 구현할 수 있는거야? 그럴리 없어...;;; 하는 마음도 같이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[네번째 시도]&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;구글에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qKeeI/btssfWKmpNq/YXmucYLZ6nyYA95LV2Iq71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qKeeI/btssfWKmpNq/YXmucYLZ6nyYA95LV2Iq71/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;670&quot; data-filename=&quot;스크린샷 2023-08-27 오후 3.32.50.png&quot; data-widthpercent=&quot;59.69&quot; style=&quot;width: 58.991328%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qKeeI/btssfWKmpNq/YXmucYLZ6nyYA95LV2Iq71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqKeeI%2FbtssfWKmpNq%2FYXmucYLZ6nyYA95LV2Iq71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/512PC/btsshsPiUwE/FpR8w22TAWI3isYUKuTdVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/512PC/btsshsPiUwE/FpR8w22TAWI3isYUKuTdVK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1190&quot; data-filename=&quot;스크린샷 2023-08-27 오후 3.34.16.png&quot; data-widthpercent=&quot;40.31&quot; style=&quot;width: 39.845881%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/512PC/btsshsPiUwE/FpR8w22TAWI3isYUKuTdVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F512PC%2FbtsshsPiUwE%2FFpR8w22TAWI3isYUKuTdVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1526&quot; height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런게 보이길래 헉 이거다@!!!! 하고 들어갔는데, 제목에서 볼 수 있다시피 SwiftUI로 만든것이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위에서 말했듯이 나는 UIKit으로 View를 만드는게 익숙해서 그냥 아묻따 UIKit으로 시작했는데.. SwiftUI로 할 생각은 못했던 것이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;블로그에 나와있는 코드(오른쪽 사진)는 은근 긴데, 나는 내 버전으로 간소화 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(background modifier는 iOS 15부터 사용가능해서 내 경우엔 쓸 수 없었다.)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693118522306&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ContentView: View {
        
    var body: some View {
        Rectangle()
            .frame(width: 230, height: 162)
            .padding()
            .blur(radius: 50, opaque: false)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;결과!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-27 오후 3.42.44.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sos6o/btssf1kAuzo/Y4ntFPYnEPyE5M6VBqcTZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sos6o/btssf1kAuzo/Y4ntFPYnEPyE5M6VBqcTZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sos6o/btssf1kAuzo/Y4ntFPYnEPyE5M6VBqcTZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsos6o%2Fbtssf1kAuzo%2FY4ntFPYnEPyE5M6VBqcTZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;644&quot; data-filename=&quot;스크린샷 2023-08-27 오후 3.42.44.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다행히 이 결과는 마음에 들었고, 이걸 이제 UIView로 전환해야했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[SwiftUI -&amp;gt; UIKit View]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693119107771&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UIHostingController(rootView: ContentView()).view&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;UIHostingController를 이용하여 가져오면 된다고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서..대충 아래와 같은 방법으로 쓰면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693119186335&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ContentView: View {
        
    var body: some View {
        Rectangle()
            .padding()
            .blur(radius: 50, opaque: false)
    }
}

// ViewController
self.view.backgroundColor = .systemBlue
guard let backgroundView = UIHostingController(rootView: ContentView()).view else { return }

self.view.addSubview(backgroundView)
backgroundView.snp.makeConstraints {
    $0.size.equalTo(CGSize(width: 230, height: 162))
    $0.center.equalToSuperview()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그 결과..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oEXP6/btssilCmGvU/HYzbanflUMJjv8wX5DHHik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oEXP6/btssilCmGvU/HYzbanflUMJjv8wX5DHHik/img.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;456&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-08-27 오후 3.53.29.png&quot; data-widthpercent=&quot;46.28&quot; style=&quot;width: 45.74661%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oEXP6/btssilCmGvU/HYzbanflUMJjv8wX5DHHik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoEXP6%2FbtssilCmGvU%2FHYzbanflUMJjv8wX5DHHik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9VUli/btssinNIIu6/k6jOxbjfG5HCooj6waKNt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9VUli/btssinNIIu6/k6jOxbjfG5HCooj6waKNt1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;924&quot; data-filename=&quot;스크린샷 2023-08-27 오후 3.54.23.png&quot; data-widthpercent=&quot;53.72&quot; style=&quot;width: 53.090599%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9VUli/btssinNIIu6/k6jOxbjfG5HCooj6waKNt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9VUli%2FbtssinNIIu6%2Fk6jOxbjfG5HCooj6waKNt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1458&quot; height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;진짜 이번엔 될 줄 알았어서 그런지 살짝 당황&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;확인해보니 HostingView의 background가 systemBackground로 자동으로 들어간듯했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693119333741&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.view.backgroundColor = .systemBlue
guard let backgroundView = UIHostingController(rootView: ContentView()).view else { return }

backgroundView.backgroundColor = .clear // ✅
....&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;backgroundColor를 clear로 줘서 해결!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-27 오후 3.55.56.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBzuBY/btssk0rcbCW/W4vBH5OKkAQJuqWTF4gMc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBzuBY/btssk0rcbCW/W4vBH5OKkAQJuqWTF4gMc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBzuBY/btssk0rcbCW/W4vBH5OKkAQJuqWTF4gMc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBzuBY%2Fbtssk0rcbCW%2FW4vBH5OKkAQJuqWTF4gMc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;508&quot; data-filename=&quot;스크린샷 2023-08-27 오후 3.55.56.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;삽질하면서 느낀 장단점들&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[장점]&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;UIKit에서 힘들게 해야하는 이런류의 작업들을 SwiftUI로 간단하게 할 수 있는 것 같아보인다. (UIKit에서 하는 간단한 방법이 있다면 댓글로 알려주세요)&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;앞으로 무조건 UIKit으로 만들기보다는, 만들어야하는 View에 따라 적절한 선택을 할 수 있을 것 같다는 생각이 들었다!!&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[단점]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;SwiftUI에서 나오고 deprecate된것도 많고, 특정 OS버전 이상에서만 쓸 수 있는 modifier들이 많아서 적절히 변환해주는 작업이 필요하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(간단한 뷰여서 그런지 다른 단점을 느낄 새가 없었던 것 같기도.. )&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>Gradient</category>
      <category>SwiftUI</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1393</guid>
      <comments>https://zeddios.tistory.com/1393#entry1393comment</comments>
      <pubDate>Sun, 27 Aug 2023 16:13:48 +0900</pubDate>
    </item>
    <item>
      <title>viewIsAppearing</title>
      <link>https://zeddios.tistory.com/1390</link>
      <description>&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2023/10055/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WWDC23 What's new in UIKit&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;보다가.. &lt;b&gt;viewIsAppearing&lt;/b&gt; 이라는게 새로 나왔더라구요?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아직 뭔지는 모르지만 살짝 맛있을지도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# viewIsAppearing&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다들 잘 알고계시다시피 ViewController의 View의 가시성이 변경될때마다 ViewController는 자체 인스턴스 메소드를 호출합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;익숙한 3개의 메소드와 이 메소드가 언제 불리는지를 살펴보겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. viewDidLoad - ViewController의 view가 메모리에 올라가면 불림&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. viewWillAppear - View가 &lt;span style=&quot;text-align: start;&quot;&gt;View&amp;nbsp;&lt;/span&gt;hierarchy에 추가&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;될 예정임&lt;/b&gt;&lt;/span&gt;을 ViewController에게 알림&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. viewDidAppear - View가 &lt;span style=&quot;text-align: start;&quot;&gt;View&amp;nbsp;&lt;/span&gt;hierarchy에 추가&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;되었음&lt;/b&gt;&lt;/span&gt;을 ViewController에게 알림&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘 볼 &lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;viewIsAppearing은 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;viewWillAppear와 viewDidAppear 사이에서 불리게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span&gt;그러니까 &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;viewDidLoad &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span&gt;&lt;b&gt;➡️ &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;viewWillAppear &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;b&gt;➡️&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;viewIsAppearing&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;b&gt;➡️&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;text-align: start;&quot;&gt;viewDidAppear 요렇게 되겠죠!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;renderedDark2x-1683733156.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cp9bDa/btspeKe5UXJ/62koisvSgogJN9gkyhuaDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cp9bDa/btspeKe5UXJ/62koisvSgogJN9gkyhuaDK/img.png&quot; data-alt=&quot;https://developer.apple.com/documentation/uikit/uiviewcontroller&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cp9bDa/btspeKe5UXJ/62koisvSgogJN9gkyhuaDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcp9bDa%2FbtspeKe5UXJ%2F62koisvSgogJN9gkyhuaDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;692&quot; data-filename=&quot;renderedDark2x-1683733156.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://developer.apple.com/documentation/uikit/uiviewcontroller&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;중요한 특징 중 하나는, View가 추가되고 그 이후에 viewIsAppearing이 호출되게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;viewWillAppear는 단순히 View가 추가&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;될 예정&lt;/b&gt;&lt;/span&gt;을 알리는 메소드이기 때문에,&amp;nbsp;그 타이밍에는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 3.54.23.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qk47g/btsppIHh1Mt/vMmDccHZ3zrVTrptYzTsyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qk47g/btsppIHh1Mt/vMmDccHZ3zrVTrptYzTsyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qk47g/btsppIHh1Mt/vMmDccHZ3zrVTrptYzTsyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqk47g%2FbtsppIHh1Mt%2FvMmDccHZ3zrVTrptYzTsyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;682&quot; data-filename=&quot;스크린샷 2023-07-30 오후 3.54.23.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;view의 size라던가 trait collection 등이 정확하지 않습니다. (아직 view도 추가가 안된 상태여서)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이와 달리, &lt;span style=&quot;text-align: start;&quot;&gt;viewIsAppearing는&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 3.55.59.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x2JU2/btspmLxITQf/k7Rc6DOJ9XkHbl9eboHVoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x2JU2/btspmLxITQf/k7Rc6DOJ9XkHbl9eboHVoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x2JU2/btspmLxITQf/k7Rc6DOJ9XkHbl9eboHVoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx2JU2%2FbtspmLxITQf%2Fk7Rc6DOJ9XkHbl9eboHVoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;676&quot; data-filename=&quot;스크린샷 2023-07-30 오후 3.55.59.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1) ViewController의 View를 View hierarchy에 추가하고&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2) Superview가 이 View의 배치를 끝낸 뒤에&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;호출되기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- ViewController와 View모두 업데이트 된 trait collection을 가지고 있음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- View geometry(size, safe area 등)이 정확함&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이라는 특징을 가지고 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 애플피셜 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;view가 보일 때(appear) UI를 업데이트 하기 위한 최적의 장소&lt;/b&gt;&lt;/span&gt;라고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : view&lt;b&gt;Did&lt;/b&gt;Appear도 view가 추가된 이후에 불리기 때문에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- ViewController와 View모두 업데이트 된 trait collection을 가지고 있음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- View geometry(size, safe area 등)이 정확함&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;잖아?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 3.55.21.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egT92P/btspxrkCiTJ/cJUSwHKzhjL6PcEqViRJ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egT92P/btspxrkCiTJ/cJUSwHKzhjL6PcEqViRJ70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egT92P/btspxrkCiTJ/cJUSwHKzhjL6PcEqViRJ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegT92P%2FbtspxrkCiTJ%2FcJUSwHKzhjL6PcEqViRJ70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;694&quot; data-filename=&quot;스크린샷 2023-07-30 오후 3.55.21.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;viewDidAppear는 transition animation이 일어난 후에 마지막 CATransaction에서 불리기 때문에,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;transition하는 동안 보이게 하고픈 변화를 보여주기엔 &lt;b&gt;너무 늦은 타이밍&lt;/b&gt;입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 4.01.31.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lMeKY/btspl7HOaD8/QkQlcC3u9wnpbRzfaw1CBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lMeKY/btspl7HOaD8/QkQlcC3u9wnpbRzfaw1CBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lMeKY/btspl7HOaD8/QkQlcC3u9wnpbRzfaw1CBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlMeKY%2Fbtspl7HOaD8%2FQkQlcC3u9wnpbRzfaw1CBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1282&quot; height=&quot;742&quot; data-filename=&quot;스크린샷 2023-07-30 오후 4.01.31.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 그림을 자세히 보면 viewWillAppear와 &lt;span style=&quot;text-align: start;&quot;&gt;viewIsAppearing는 &lt;b&gt;같은 CATransaction내에서 발생&lt;/b&gt;하고있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;그러니까 좀 쉽게 말하면..&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;viewWillAppear와 &lt;span style=&quot;text-align: start;&quot;&gt;viewIsAppearing중 아무 메소드에서 변경을 해도 transition의 첫 프레임에서부터 사용자에게 보이게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;(&lt;span style=&quot;font-family: 'Nanum Gothic'; text-align: start;&quot;&gt;viewIsAppearing에서 하면 업데이트 된 trait collection, size등을 기반으로 변경할 수 있겠죠)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Q : viewWillLayoutSubviews() / &lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;viewDidLayoutSubviews()는?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 4.12.18.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kROPN/btsplb4LkHt/LFSuVHXGYzqkH6NxroSdNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kROPN/btsplb4LkHt/LFSuVHXGYzqkH6NxroSdNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kROPN/btsplb4LkHt/LFSuVHXGYzqkH6NxroSdNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkROPN%2Fbtsplb4LkHt%2FLFSuVHXGYzqkH6NxroSdNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;694&quot; data-filename=&quot;스크린샷 2023-07-30 오후 4.12.18.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;view의 layoutSubviews이 실행될때마다 위와같이 ~LayoutSubviews 메소드들이 불리는데요. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;이런 친구들은 transition중이나 후에(trait collection이 바뀐다거나) 여러번 불릴 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이에 반해&amp;nbsp;&lt;b&gt;viewIsAppearing은 transition중에 한번만 호출되고 view가 나타날때 레이아웃이 필요하지 않더라도* 호출됩니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;(* 그런경우가 있을진 모르겠지만 layoutSubviews같은게 안불려서 ~&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;LayoutSubviews 메소드가 안불리는 경우를 말하는 듯 하다..?)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아무튼 핵심은 여러번 호출될 가능성이 있는 &lt;span style=&quot;text-align: start;&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;LayoutSubviews 와 다르게 &lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;viewIsAppearing는 딱 한번만 호출된다는 거!@@@!!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왜 &lt;span style=&quot;text-align: start;&quot;&gt;viewIsAppearing가&amp;nbsp;&lt;/span&gt;&lt;b&gt;view가 보일 때(appear) UI를 업데이트 하기 위한 최적의 장소&lt;/b&gt;인지 아시겠죠?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;transition의 첫 프레임부터 변경이 들어가면서도 trait collection이나 size도 다 정확해;;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;맛있다;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 그럼 언제 viewWillAppear를 사용해야할까&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;지금 거의 뭐 '&lt;i&gt;&lt;b&gt;엥..? viewWillAppear 그런게 있었나? ㅋ~&lt;/b&gt;&lt;/i&gt;' 까지 와있는 상태인데요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;viewWillAppear는 언제 사용해야할까요?!?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. Alongside&amp;nbsp;animations을 추가하기 위해 transitionCoordinator에 접근해야할 때과 같이 view transition이 시작되기 전에 callback이 필요할 때.&lt;/b&gt; (Alongside&amp;nbsp;animations는 view controller transition animations과 동시에 수행하도록 프레임워크에 지시하는 애니메이션이 있음)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위에서 말하는 Alongside animations은&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 4.39.06.png&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b77CrS/btsplQ7o7Eg/ZL2SOxFE1JCtkGZB8cvck1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b77CrS/btsplQ7o7Eg/ZL2SOxFE1JCtkGZB8cvck1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b77CrS/btsplQ7o7Eg/ZL2SOxFE1JCtkGZB8cvck1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb77CrS%2FbtsplQ7o7Eg%2FZL2SOxFE1JCtkGZB8cvck1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1700&quot; height=&quot;338&quot; data-filename=&quot;스크린샷 2023-07-30 오후 4.39.06.png&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이건듯해요..?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 잘 이해를 못하겠어서 원문도 첨부합니다 ㅎ;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;You need a callback before the view transition begins, such as when accessing the&amp;nbsp;transitionCoordinator&amp;nbsp;to add alongside animations. Alongside animations are animations that you direct the framework to perform concurrently with the view controller transition animations.&lt;br /&gt;&lt;br /&gt;출처 : &lt;a href=&quot;https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing&lt;/a&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2.  View Controller / View traits / hierarchy / geometry등에 의존하지 않는 작업을 수행할 때.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ex. viewWillAppear - notifications 등록&amp;nbsp; / viewDidDisappear - &lt;span style=&quot;text-align: start;&quot;&gt;notifications &lt;/span&gt;등록 취소&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;애플 문서&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에 viewWillAppear와의 차이를 잘 정리한 표가 있길래 첨부합니드.. ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 5.01.41.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEE2Jq/btspsWeb9Os/nACkbMdGYOGNWCz4kwK5NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEE2Jq/btspsWeb9Os/nACkbMdGYOGNWCz4kwK5NK/img.png&quot; data-alt=&quot;https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEE2Jq/btspsWeb9Os/nACkbMdGYOGNWCz4kwK5NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEE2Jq%2FbtspsWeb9Os%2FnACkbMdGYOGNWCz4kwK5NK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;656&quot; data-filename=&quot;스크린샷 2023-07-30 오후 5.01.41.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이렇게 맛있는게 iOS17부터 쓸 수 있으면 너무 마음이 아프겠쬬&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;iOS 13부터 지원한다는 사실!&lt;/b&gt; (사용은 Xcode 15부터 가능합니다)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;viewIsAppearing 하나에 이렇게 기쁜 마음이 드는 저를 보면서 순간..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;'&lt;i&gt;아니 근데 왜 이제서야 내준거지..?&lt;/i&gt;' 하는 생각이 들었.......&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/43&quot;&gt;iOS ) View Controller의 생명주기(Life-Cycle)&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; 요 글도 수정해야겠군요&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[요약]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. viewWillAppear(_:) 와 viewDidAppear(_:) 의 사이에서 불림&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. view가 보일 때(appear) UI를 업데이트하기 위한 최적의 장소&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. iOS 13부터 지원&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[참고]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2023/10055/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/videos/play/wwdc2023/10055/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>Life Cycle</category>
      <category>UIKit</category>
      <category>viewIsAppearing</category>
      <category>WWDC23</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1390</guid>
      <comments>https://zeddios.tistory.com/1390#entry1390comment</comments>
      <pubDate>Mon, 31 Jul 2023 13:44:01 +0900</pubDate>
    </item>
    <item>
      <title>Structured Concurrency / Unstructured Concurrency</title>
      <link>https://zeddios.tistory.com/1389</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Concurrency는 뭔가 아~~하고 나서 또 안보면 까먹는 그런 친구같네..&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;간단한게만 살펴보자~~&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# &lt;a href=&quot;https://developer.apple.com/documentation/swift/task&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Task&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;비동기 작업 단위 (A unit of asynchronous work)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;모든 비동기(asynchronous) 코드는 어떠한 Task의 일부로 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# Structured&amp;nbsp;Concurrency&amp;nbsp;/&amp;nbsp;Unstructured&amp;nbsp;Concurrency&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;우선 결론!! 이미지로 간단하게 보자면 아래와 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-23 오후 4.06.37.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y6rBW/btsoybdzJyQ/nsJuNKEoSaaKLvgbK4Q3m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y6rBW/btsoybdzJyQ/nsJuNKEoSaaKLvgbK4Q3m0/img.png&quot; data-alt=&quot;https://developer.apple.com/wwdc23/10170&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y6rBW/btsoybdzJyQ/nsJuNKEoSaaKLvgbK4Q3m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy6rBW%2FbtsoybdzJyQ%2FnsJuNKEoSaaKLvgbK4Q3m0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1210&quot; height=&quot;536&quot; data-filename=&quot;스크린샷 2023-07-23 오후 4.06.37.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://developer.apple.com/wwdc23/10170&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Structured Concurrency(구조화된 동시성)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[Swift에서 Structured Task를 만드는 방법]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. async let&lt;/b&gt;&amp;nbsp;➡️&amp;nbsp;내부적으로 Child Task 생성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. TaskGroup&lt;/b&gt; ➡️ 명시적으로 Child Task를 추가할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[Structured Task? Structured Concurrency?]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;async let, TaskGroup.. 일단 두개가 뭔지는 몰라도 괜찮고, 우선 Child Task가 만들어진다는 것만 알면 된다!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Child Task가 있다는 것은 Parent Task도 있다는 것!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;예를들어 async let의 경우&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-23 오후 6.37.19.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buChcj/btsoypbxrot/1DMymA8JkLm9S4RXpm3PO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buChcj/btsoypbxrot/1DMymA8JkLm9S4RXpm3PO0/img.png&quot; data-alt=&quot;https://developer.apple.com/wwdc21/10134&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buChcj/btsoypbxrot/1DMymA8JkLm9S4RXpm3PO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuChcj%2Fbtsoypbxrot%2F1DMymA8JkLm9S4RXpm3PO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;576&quot; data-filename=&quot;스크린샷 2023-07-23 오후 6.37.19.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://developer.apple.com/wwdc21/10134&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ee2323; font-family: 'Noto Serif KR';&quot;&gt;fetchOneThunbnail&lt;/span&gt;이 Parent가 되게 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 Task간의 명시적인 관계(Parent-Child)를 형성하기 때문에 이를 조직화할 수 있으며, 이러한 특성 때문에 Structured Concurrency라고 불린다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(Task Tree에 대한 자세한 설명은 다음에..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;---&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Structured &lt;b&gt;Task&lt;/b&gt;는 async let이나 TaskGroup으로 만들어진 Task(작업의 단위)를 의미하며&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Structured &lt;b&gt;Concurrency&lt;/b&gt;는 이러한 Structured Task를 조직화하는 방법론이라고 생각하면 될 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;+ WWDC나 Swift 공식문서에서 (Un)Structured Task, (Un)Structured Concurrency가 같이 나오는데, 그냥 한번 분리해서 정리해봤따..&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;물론 async let, TaskGroup중 하나만 선택해서 써야하는 건 아니고,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt; 필요에 따라 TaskGroup안에서 async let Task를 호출하는 등(혹은 그 반대) 조합해서 사용할 수 있다,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[Structured Concurrency가 왜 좋을까?]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 명시적인 관계(Parent-Child) 를 통해 취소 전파(propagating cancellation)를 쉽게 처리할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 직접 or 간접적으로 생성된 모든 Structured Child Task가 완료되어야만 Parent Task가 완료될 수 있음.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- Task간의 상호작용을 쉽게 추적하고 관리가 가능&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Unstructured Concurrency&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[Swift에서 Unstructured Task를 만드는 방법]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Task.init&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Task.detached&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[Unstructured Task? Unstructured Concurrency?]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Structured Concurrency가 Task간 명확한 관계를 형성하기 때문에 구조적이었다면,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Unstructured Concurrency는 Task간 명확한 관계가 없기때문에 '구조화되지 않았다'고 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Child Task가 만들어지던 Structured Task와는 달리&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Task간 실행순서나 상호작용이 서로 독립적이며 상호작용이 자유로워 유연성은 뛰어나지만, 추적이 어렵고 취소 전파가 자동으로 되지 않는 등 관리가 어려울 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[언제 Unstructured Task를 만들어야 할까?]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;좋은점(?)은 바로 위에서 설명했으니 언제 만들어야하는지 보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다들 이미 잘 쓰고 있을 것 같은데, &lt;b&gt;non-async 컨텍스트에서 Task를 실행하고 싶을 때&lt;/b&gt; 유용하게 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690103431500&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@MainActor
class MyDelegate: UICollectionViewDelegate {
    
    func collectionView(_ view: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt item: IndexPath) {
        let ids = getThumbnailIDs(for: item)
        let thumbnails = await fetchThumbnails(for: ids)
        display(thumbnails, in: cell)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;예를 들어 위와같이 UICollectionViewDelegate 메소드는 async가 아니기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369; font-family: 'Noto Serif KR';&quot;&gt;await fetchThumnails&lt;/span&gt;를 사용할 수 없다. 이럴 때&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690103500896&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@MainActor
class MyDelegate: UICollectionViewDelegate {
    func collectionView(_ view: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt item: IndexPath) {
        let ids = getThumbnailIDs(for: item)
        Task {
            let thumbnails = await fetchThumbnails(for: ids)
            display(thumbnails, in: cell)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Task.init을 사용하여 비동기 작업을 수행할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[언제 어느것을 써야할까?]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;정답은 없고, 적재적소에 맞는 Concurrency 모델을 사용해야겠다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하지만 가능하면&amp;nbsp;Structured Concurrency를 선택하는 것이 좋다. (&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/wwdc23/10170&quot;&gt;Beyond the basics of structured concurrency&lt;/a&gt; &lt;/span&gt;&lt;/b&gt;에서도 그렇게 말하고있음)&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;[참고]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/swift/task&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/documentation/swift/task&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: center;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/wwdc21/10134&quot;&gt;https://developer.apple.com/wwdc21/10134&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/wwdc23/10170&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/wwdc23/10170&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/&quot;&gt;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Swift/Concurrency</category>
      <category>concurrency</category>
      <category>Structured Concurrency</category>
      <category>Unstructured Concurrency</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1389</guid>
      <comments>https://zeddios.tistory.com/1389#entry1389comment</comments>
      <pubDate>Sun, 23 Jul 2023 18:54:39 +0900</pubDate>
    </item>
    <item>
      <title>Xcode 15 톺아보기</title>
      <link>https://zeddios.tistory.com/1387</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오늘은 Xcode 15를 간단히 살펴보려고 합니다. (쓸 날은 멀었지만 ㅎㅎ..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[읽기전에 참고]&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 아직 정식 릴리스가 아닌 베타&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- New feature 위주로 볼건데, 안보는 내용도 있을 수 있음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 내 맘대로 좀 쉽게 풀어서 쓰는것도 있을것 같음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# 용량&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fx62FWoaAAEo8bz.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IhMJP/btsjk5XmXrx/kGSSKjCGfWbuMH3KaEaQN0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IhMJP/btsjk5XmXrx/kGSSKjCGfWbuMH3KaEaQN0/img.jpg&quot; data-alt=&quot;출처:&amp;amp;amp;nbsp;https://twitter.com/sarunw/status/1665969701019865088&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IhMJP/btsjk5XmXrx/kGSSKjCGfWbuMH3KaEaQN0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIhMJP%2Fbtsjk5XmXrx%2FkGSSKjCGfWbuMH3KaEaQN0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;558&quot; data-filename=&quot;Fx62FWoaAAEo8bz.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:&amp;amp;nbsp;https://twitter.com/sarunw/status/1665969701019865088&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;용량이 50% 작아졌다고 했는데 진짜 그런듯;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# 인터페이스&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqFSsu/btsjx4vpRvK/ArKquGgendxqg7rtdjLUYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqFSsu/btsjx4vpRvK/ArKquGgendxqg7rtdjLUYk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;898&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.08.41.png&quot; data-widthpercent=&quot;52.11&quot; style=&quot;width: 51.507722%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqFSsu/btsjx4vpRvK/ArKquGgendxqg7rtdjLUYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqFSsu%2Fbtsjx4vpRvK%2FArKquGgendxqg7rtdjLUYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1580&quot; height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EHmX7/btsjlXLafXH/KXswKA6KEtwcHg3YGUGag0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EHmX7/btsjlXLafXH/KXswKA6KEtwcHg3YGUGag0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;908&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.09.54.png&quot; data-widthpercent=&quot;47.89&quot; style=&quot;width: 47.329487%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EHmX7/btsjlXLafXH/KXswKA6KEtwcHg3YGUGag0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEHmX7%2FbtsjlXLafXH%2FKXswKA6KEtwcHg3YGUGag0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1468&quot; height=&quot;908&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이건 그냥 내가 넣고싶어서 ㅎ.. 더 이뻐진게 &lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;기특해서 넣음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# 북마크 기능&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 특정 파일 자체를 북마크&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 특정 파일의 특정 라인을 북마크&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;둘 다 가능.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Project Navigator에서 파일 &amp;gt; 우클릭하면 북마크 기능을 볼 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.16.46.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHBNPR/btsjpEYsjEJ/YKH4LMP4slNy6nSn8kzkgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHBNPR/btsjpEYsjEJ/YKH4LMP4slNy6nSn8kzkgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHBNPR/btsjpEYsjEJ/YKH4LMP4slNy6nSn8kzkgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHBNPR%2FbtsjpEYsjEJ%2FYKH4LMP4slNy6nSn8kzkgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1110&quot; height=&quot;278&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.16.46.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;파일 자체를 북마크하거나, 현재 해당 파일에 커서가 있는 라인이 자동으로 나옴&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;코드 소스 내에서도 당연히 북마크 가능!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.18.44.png&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vBf4R/btsjpDyvopd/9DFHlEMtJqw1pZJiKVvRik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vBf4R/btsjpDyvopd/9DFHlEMtJqw1pZJiKVvRik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vBf4R/btsjpDyvopd/9DFHlEMtJqw1pZJiKVvRik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvBf4R%2FbtsjpDyvopd%2F9DFHlEMtJqw1pZJiKVvRik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1706&quot; height=&quot;530&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.18.44.png&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;어디에서나 우클릭하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;북마크한 파일들은 '&lt;b&gt;Bookmark Navigator&lt;/b&gt;'에서 볼 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.19.08.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT817Q/btsjm95vnbU/4fQJ72JGdhpoiSQB8ZBVR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT817Q/btsjm95vnbU/4fQJ72JGdhpoiSQB8ZBVR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT817Q/btsjm95vnbU/4fQJ72JGdhpoiSQB8ZBVR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT817Q%2Fbtsjm95vnbU%2F4fQJ72JGdhpoiSQB8ZBVR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;328&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.19.08.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;으음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Apple-Clang-Compiler&quot; data-v-b3bf35a0=&quot;&quot;&gt;Apple Clang Compiler&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 애플 플랫폼에서 C++ 지원을 위한 페이지 생김 (&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/xcode/cpp/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/xcode/cpp/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Clang과 빌드 시스템은 빌드 성능, 안정성, 정확성을 개선하는 &quot;explicit modules&quot;라는 모듈 종속성을 빌드하는 새로운 모드를 지원&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Asset-Catalogs&quot; data-v-b3bf35a0=&quot;&quot;&gt;Asset Catalogs&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Xcode는 에셋 카탈로그의 각 Color와 Image에 대해 &lt;b&gt;Swift / Objc 심볼을 생성&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이건 그냥 눈으로 보는게 빠를듯&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 3.04.22.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOc82f/btsjwrjPADt/0kUbl8GNjW6L8TPqi0hlB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOc82f/btsjwrjPADt/0kUbl8GNjW6L8TPqi0hlB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOc82f/btsjwrjPADt/0kUbl8GNjW6L8TPqi0hlB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOc82f%2FbtsjwrjPADt%2F0kUbl8GNjW6L8TPqi0hlB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;836&quot; data-filename=&quot;스크린샷 2023-06-11 오후 3.04.22.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Color / Image를 넣으면 알아서 심볼을 만들어줘서&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 3.04.54.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ii2vq/btsjqxdLsLZ/6Ca0NRvZMuLpqbjrJ1BUS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ii2vq/btsjqxdLsLZ/6Ca0NRvZMuLpqbjrJ1BUS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ii2vq/btsjqxdLsLZ/6Ca0NRvZMuLpqbjrJ1BUS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIi2vq%2FbtsjqxdLsLZ%2F6Ca0NRvZMuLpqbjrJ1BUS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;294&quot; data-filename=&quot;스크린샷 2023-06-11 오후 3.04.54.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;resource 파라미터가 있는 이니셜라이저로 바로 접근이 가능. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(나는 zedd_white로 만들었지만 자동으로 카멜로 바꿔주는 듯 하다?)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;만약 리소스 이름을 바꾸면 심볼도 달라지기 때문에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 3.41.10.png&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DLYp3/btsjk6Wc4Wz/y7waXeriQXbQ52s99Td7Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DLYp3/btsjk6Wc4Wz/y7waXeriQXbQ52s99Td7Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DLYp3/btsjk6Wc4Wz/y7waXeriQXbQ52s99Td7Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDLYp3%2Fbtsjk6Wc4Wz%2Fy7waXeriQXbQ52s99Td7Y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;688&quot; data-filename=&quot;스크린샷 2023-06-11 오후 3.41.10.png&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;컴파일 에러가 나게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이름 변경 및 오타에 탄력적으로(resilient) 대응 + 컴파일러 타입 검사 + 코드 completion = 보다 안정하고 보조적인 에셋 참조 방법&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;으음~~&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Build-System&quot; data-v-b3bf35a0=&quot;&quot;&gt;Build System&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 이제 아카이브 빌드는 다른 빌드 작업과 동일한 컴파일 최적화 set을 지원하여 빌드 성능을 개선 (원래는 아니었군..;;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 이제 Xcode는 프로젝트의 Dynamic Library 및 프레임워크에 대한 중간 텍스트 기반 Dynamic Library(TBD) 파일을 자동으로 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;  이러한 Stub을 사용하면 링커 종속성을 더 정확하게 추적 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt; &amp;nbsp; export된 심볼 집합을 변경하지 않는 변경사항은 더이상 모든 transitive dependencies(전이 종속성?;;)을 다시 링크할 필요가 없으므로 증분 빌드 속도가 빨라짐&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;대충 증분 빌드 속도가 빨라진것으로 이해 완료;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;- 이제 Xcode는 Swift Package에 정의된 매크로 빌드 및 사용을 지원함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;span style=&quot;text-align: start; font-family: 'Nanum Gothic';&quot;&gt;- 비트 코드 지원이 제거되었으며 ENABLE_BITCODE 빌드 설정이 더 이상 적용되지 않음&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;# &lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Console&quot; data-v-b3bf35a0=&quot;&quot;&gt;Console&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;- 콘솔에 os_log를 스트리밍함&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;예전에 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/979&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;os_log&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 글을 쓴 적이 있었는데.. 내가 쏜 os_log들을 볼려면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-3.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YwFtn/btsjmwGAKeh/7zmTZ5Glyn24vwPNvBQES1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YwFtn/btsjmwGAKeh/7zmTZ5Glyn24vwPNvBQES1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YwFtn/btsjmwGAKeh/7zmTZ5Glyn24vwPNvBQES1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYwFtn%2FbtsjmwGAKeh%2F7zmTZ5Glyn24vwPNvBQES1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;286&quot; data-filename=&quot;R1280x0-3.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 콘솔앱을 따로 열어서 확인이 가능했음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이것이 Xcode console에 통합된다고 보면됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;예제로 살펴보자&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686467684765&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os 

extension OSLog {
    private static var subsystem = Bundle.main.bundleIdentifier!

    static let ui = OSLog(subsystem: subsystem, category: &quot;UI&quot;)
    static let network = OSLog(subsystem: subsystem, category: &quot;Network&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.15.21.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z3Ao7/btsjlXxzaBf/Dx9L8gUUcSnVjtFeAcKG7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z3Ao7/btsjlXxzaBf/Dx9L8gUUcSnVjtFeAcKG7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z3Ao7/btsjlXxzaBf/Dx9L8gUUcSnVjtFeAcKG7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz3Ao7%2FbtsjlXxzaBf%2FDx9L8gUUcSnVjtFeAcKG7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2144&quot; height=&quot;910&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.15.21.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 os_log를 남기면 console에 바로 나오게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;심지어 error와 fault는 console에서 나오는 색상도 달라서 유용할 듯 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDsnIc/btsjx3DbO83/aENjOGubhfg80kqQelxBkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDsnIc/btsjx3DbO83/aENjOGubhfg80kqQelxBkK/img.png&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;730&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.07.46.png&quot; data-widthpercent=&quot;50.12&quot; style=&quot;width: 49.533956%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDsnIc/btsjx3DbO83/aENjOGubhfg80kqQelxBkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDsnIc%2Fbtsjx3DbO83%2FaENjOGubhfg80kqQelxBkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1036&quot; height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8xRgR/btsjkLYIGQH/MalykaELKKlJQnKjGm4h9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8xRgR/btsjkLYIGQH/MalykaELKKlJQnKjGm4h9K/img.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;732&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.08.22.png&quot; data-widthpercent=&quot;49.88&quot; style=&quot;width: 49.303253%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8xRgR/btsjkLYIGQH/MalykaELKKlJQnKjGm4h9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8xRgR%2FbtsjkLYIGQH%2FMalykaELKKlJQnKjGm4h9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1034&quot; height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하단에 필터도 있기 때문에 내가 원하는것만 필터링해서 볼 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Q : 여기서 내가 넣은 log (.ui, .network) 같은건 못보나?;;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.15.21.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z3Ao7/btsjlXxzaBf/Dx9L8gUUcSnVjtFeAcKG7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z3Ao7/btsjlXxzaBf/Dx9L8gUUcSnVjtFeAcKG7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z3Ao7/btsjlXxzaBf/Dx9L8gUUcSnVjtFeAcKG7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz3Ao7%2FbtsjlXxzaBf%2FDx9L8gUUcSnVjtFeAcKG7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2144&quot; height=&quot;910&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.15.21.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;A : 콘솔의 왼쪽 switch 같은 버튼을 눌러 메타데이터 역시 같이 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.16.41.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyqGyK/btsjpC0zwDe/E2cBPNO6n1zYCXf7dHNJKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyqGyK/btsjpC0zwDe/E2cBPNO6n1zYCXf7dHNJKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyqGyK/btsjpC0zwDe/E2cBPNO6n1zYCXf7dHNJKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyqGyK%2FbtsjpC0zwDe%2FE2cBPNO6n1zYCXf7dHNJKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1466&quot; height=&quot;654&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.16.41.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.17.54.png&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;1082&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O2QeX/btsjjAKanf5/MTcGY7DpOAK6I3k3iQXb7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O2QeX/btsjjAKanf5/MTcGY7DpOAK6I3k3iQXb7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O2QeX/btsjjAKanf5/MTcGY7DpOAK6I3k3iQXb7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO2QeX%2FbtsjjAKanf5%2FMTcGY7DpOAK6I3k3iQXb7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1866&quot; height=&quot;1082&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.17.54.png&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;1082&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;으음 맛있다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Debugging&quot; data-v-b3bf35a0=&quot;&quot;&gt;Debugging&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- LLDB는 타입 요약(type summaries)에서 기본 템플릿 arguments를 생략&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AS-IS&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686468070727&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(lldb) frame variable
(std::vector&amp;lt;std::vector&amp;lt;std::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;, std::allocator&amp;lt;std::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt; &amp;gt; &amp;gt;, std::allocator&amp;lt;std::vector&amp;lt;std::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;, std::allocator&amp;lt;std::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator &amp;lt;char&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt;) nested = size=0 {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;TO-BE&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686468078929&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(lldb) frame variable
(std::vector&amp;lt;std::vector&amp;lt;std::string&amp;gt; &amp;gt;) nested = size=0 {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;--raw-output 옵션을 사용하면 기본 arguments들 계속 볼 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- LLDB는 expression evaluation에서 generic type parameters를 지원&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686468265429&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func use&amp;lt;T&amp;gt;(_ t: T) { 
  print(t) // Break here 
}


use(5)
use(&quot;Hello!&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;요런게 있을 때 T.self == String.self 일때만 브레이크 포인트가 걸리게 할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Xcode에 AppKit 런타임 문제가 표시됨.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;FyDDKGyaEAAe1N4.jpeg&quot; data-origin-width=&quot;1756&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z3rCU/btsjlYJ5I9q/ykCMQkq8i2bH8JNuPojRMk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z3rCU/btsjlYJ5I9q/ykCMQkq8i2bH8JNuPojRMk/img.jpg&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://twitter.com/twannl/status/1666546528364949504/photo/1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z3rCU/btsjlYJ5I9q/ykCMQkq8i2bH8JNuPojRMk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz3rCU%2FbtsjlYJ5I9q%2FykCMQkq8i2bH8JNuPojRMk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1756&quot; height=&quot;634&quot; data-filename=&quot;FyDDKGyaEAAe1N4.jpeg&quot; data-origin-width=&quot;1756&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://twitter.com/twannl/status/1666546528364949504/photo/1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Documentation&quot; data-v-b3bf35a0=&quot;&quot;&gt;Documentation&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Xcode 15에는 입력하는 동안 Swift-DocC문서를 실시간으로 미리 볼 수 있는 보조 편집기가 포함됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(Editor &amp;gt; Assistant &amp;gt; Documentation Preview 선택)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Xcode 15로 작성된 Document에 외부 모듈에 대한 Swift extensions이 포함됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;예를 들어 내가 SwiftUI의 Image를 extension 했어&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686468901406&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public extension Image {
   /// Create an image from the given sloth.
   ///
   /// This initializer is useful for displaying static sloth
   /// images. To create an interactive view containing a sloth,
   /// use ``SlothView``.
   ///
   /// ![A screenshot of an ice sloth, with the text Ice Sloth underneath.](iceSloth)
   init(_ sloth: Sloth) {
      self.init(&quot;\(sloth.power)-sloth&quot;)
   }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그럼 이 init(_ sloth:) 에 대한 문서가 프로젝트의 나머지 문서와 함께 포함됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;페이지를 제외하려면 DOCC_EXTRACT_EXTENSION_SYMBOLS 빌드 세팅을 NO로 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Instruments&quot; data-v-b3bf35a0=&quot;&quot;&gt;Instruments&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Allocations, Leaks, VM Tracker 에서 .memgraph 파일을 열고 프로세스에 대해 Malloc 스택 로깅이 활성화 된 경우 실시간 Allocations 타임라인을 시각화 할 수 있음. Xcode 메모리 그래프 디버거에 캡쳐된 .memgraph 파일을 기기에서 볼 수 있는 새로운 공유 버튼이 추가됨.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- &amp;nbsp;앱 시작 프로파일링과 관련된 static initializers 및 기타 dyld 통계를 시각화하는 dyld Activity가 App Launch 템플릿에 포함되어있음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.45.16.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lJByY/btsjlF43ZhT/0NfjdcBdweuhnkPiB87dLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lJByY/btsjlF43ZhT/0NfjdcBdweuhnkPiB87dLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lJByY/btsjlF43ZhT/0NfjdcBdweuhnkPiB87dLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlJByY%2FbtsjlF43ZhT%2F0NfjdcBdweuhnkPiB87dLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1672&quot; height=&quot;1402&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.45.16.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;1402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;푸드트럭 앱으로 해보니까.. Xcode 빌드 타임라인처럼 시각화된게 보이긴 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.46.36.png&quot; data-origin-width=&quot;2336&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bezlqQ/btsjx4vlz0u/6AYchbYMqqh4fzlSO09BJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bezlqQ/btsjx4vlz0u/6AYchbYMqqh4fzlSO09BJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bezlqQ/btsjx4vlz0u/6AYchbYMqqh4fzlSO09BJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbezlqQ%2Fbtsjx4vlz0u%2F6AYchbYMqqh4fzlSO09BJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2336&quot; height=&quot;646&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.46.36.png&quot; data-origin-width=&quot;2336&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 오디오 및 운영체제에 대한 포괄적인 view를 제공하는 Audio System Trace 템플릿이 추가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Linking&quot; data-v-b3bf35a0=&quot;&quot;&gt;Linking&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 정적 링크 속도를 크게 향상시키는 새로운 링커가 작성됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 링커는 모든 iOS 바이너리와 'Mergeable Libraries'기능을 사용하는 모든 사용자에게 기본값으로 제공됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(클래식 링커는 여전히 -ld64를 사용하여 명시적으로 요청할 수 있으며, 향후 릴리스에서 제거될 예정)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Localization&quot; data-v-b3bf35a0=&quot;&quot;&gt;Localization&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;String Catalogs (.xcstrings)는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. 문자열을 관리하고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. 번역 진행 상황을 추적하여 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;=&amp;gt; 앱을 쉽게 localize할 수 있도록 해주는 Xcode의 새로운 파일 타입.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pp0Jx/btsjlYQSFud/yJYo1RAn06Sn7sEM0xxZZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pp0Jx/btsjlYQSFud/yJYo1RAn06Sn7sEM0xxZZK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;1020&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.54.25.png&quot; data-widthpercent=&quot;49.64&quot; style=&quot;width: 49.062719%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pp0Jx/btsjlYQSFud/yJYo1RAn06Sn7sEM0xxZZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpp0Jx%2FbtsjlYQSFud%2FyJYo1RAn06Sn7sEM0xxZZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1422&quot; height=&quot;1020&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmJOiq/btsjpGoniAw/5HrB3a3J9N8CwfMQiUZKM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmJOiq/btsjpGoniAw/5HrB3a3J9N8CwfMQiUZKM1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;1004&quot; data-filename=&quot;스크린샷 2023-06-11 오후 4.53.48.png&quot; data-widthpercent=&quot;50.36&quot; style=&quot;width: 49.77449%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmJOiq/btsjpGoniAw/5HrB3a3J9N8CwfMQiUZKM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmJOiq%2FbtsjpGoniAw%2F5HrB3a3J9N8CwfMQiUZKM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1420&quot; height=&quot;1004&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Xcode 14 / Xcode 15 Beta&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Xcode는 소스코드에서 loclization 가능한 문자열을 자동으로 추출하여 모든 String Catalogs를 동기화 상태로 유지함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;String Catalogs를 기본 에디터에서 보고 편집하여 프로젝트에서 localize된 String을 미리 보고 관리할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;헐???&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;한번 해보자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;File &amp;gt; New &amp;gt; File &amp;gt; Strng Catalogs 추가하면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.00.36.png&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cscplA/btsjlX5v518/hE1kFTfknhSCBBon2O2IL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cscplA/btsjlX5v518/hE1kFTfknhSCBBon2O2IL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cscplA/btsjlX5v518/hE1kFTfknhSCBBon2O2IL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcscplA%2FbtsjlX5v518%2FhE1kFTfknhSCBBon2O2IL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1778&quot; height=&quot;854&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.00.36.png&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Xcode는 소스코드에서 &lt;b&gt;loclization 가능한 문자열을 자동으로 추출&lt;/b&gt;하여 모든 String Catalogs를 동기화 상태로 유지함&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;그러니까 그냥 print(&quot;안녕하세요&quot;) 이런거를 자동으로 추출해준다는게 아니라..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686470820262&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let _ = String(localized: &quot;Hello&quot;)
let _ = NSLocalizedString(&quot;World!&quot;, comment: &quot;어쩌구저쩌구&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;이런식으로 &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;loclization 가능한 문자열이 있는 상태에서 빌드 &lt;/b&gt;-&amp;gt; Strng Catalogs를 보면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.09.20.png&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vPa0q/btsjsgpqhi4/OQwLiDXEF7BFc5KhDY5MkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vPa0q/btsjsgpqhi4/OQwLiDXEF7BFc5KhDY5MkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vPa0q/btsjsgpqhi4/OQwLiDXEF7BFc5KhDY5MkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvPa0q%2Fbtsjsgpqhi4%2FOQwLiDXEF7BFc5KhDY5MkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1790&quot; height=&quot;332&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.09.20.png&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 자동으로 추출된 문자열을 볼 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;물론 Key를 바꾸면 &lt;b&gt;Strng Catalogs도 같이 바뀐다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.11.42.png&quot; data-origin-width=&quot;2140&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGWwP/btsjlFRzdBx/emsgIvHo4veUVKWetawGkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGWwP/btsjlFRzdBx/emsgIvHo4veUVKWetawGkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGWwP/btsjlFRzdBx/emsgIvHo4veUVKWetawGkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGWwP%2FbtsjlFRzdBx%2FemsgIvHo4veUVKWetawGkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2140&quot; height=&quot;472&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.11.42.png&quot; data-origin-width=&quot;2140&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;state도 확인할 수 있는 것 같은데 잘 모르겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;동기화되면&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.25.09.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDdGlQ/btsjmvnr39k/QCkKl6JKYaZxwck7G5rKXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDdGlQ/btsjmvnr39k/QCkKl6JKYaZxwck7G5rKXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDdGlQ/btsjmvnr39k/QCkKl6JKYaZxwck7G5rKXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDdGlQ%2Fbtsjmvnr39k%2FQCkKl6JKYaZxwck7G5rKXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1412&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.25.09.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 Report Navigator에도 나오는 듯 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Organizer&quot; data-v-b3bf35a0=&quot;&quot;&gt;Organizer&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Foundation exception로 인해 발생한 일부 crash는 Organizer에 이유가 표시됨. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;있는 경우 backtrace view의 오른쪽에 있는 인스펙터에 표시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Playgrounds&quot; data-v-b3bf35a0=&quot;&quot;&gt;Playgrounds&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Playgrounds 콘솔은 Xcode 15의 새로운 콘솔을 사용.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[Xcode 14]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.23.42.png&quot; data-origin-width=&quot;2324&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKdF1/btsjlEkQfRP/2nji5zvQNnLFgeUtmHj8J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKdF1/btsjlEkQfRP/2nji5zvQNnLFgeUtmHj8J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKdF1/btsjlEkQfRP/2nji5zvQNnLFgeUtmHj8J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKdF1%2FbtsjlEkQfRP%2F2nji5zvQNnLFgeUtmHj8J0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2324&quot; height=&quot;662&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.23.42.png&quot; data-origin-width=&quot;2324&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[Xcode 15]&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.22.26.png&quot; data-origin-width=&quot;2332&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eCJuVj/btsjlVGx8Dp/xcrPPjSvkHJcZdU0m1ayj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eCJuVj/btsjlVGx8Dp/xcrPPjSvkHJcZdU0m1ayj0/img.png&quot; data-alt=&quot;??? : 필터 기능이 생겼습니다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eCJuVj/btsjlVGx8Dp/xcrPPjSvkHJcZdU0m1ayj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeCJuVj%2FbtsjlVGx8Dp%2FxcrPPjSvkHJcZdU0m1ayj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2332&quot; height=&quot;670&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.22.26.png&quot; data-origin-width=&quot;2332&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;??? : 필터 기능이 생겼습니다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 결과 사이드바에는 모든 expressions에 대한 요약이 표시되며 새로운 컨트롤을 사용하면 각 expressions에 대한 세부 정보가 포함된 팝오버 표시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[Xcode 14]&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.21.32.png&quot; data-origin-width=&quot;2142&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqPPp7/btsjnbIW1XX/4K0u303afLZot99je1aUJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqPPp7/btsjnbIW1XX/4K0u303afLZot99je1aUJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqPPp7/btsjnbIW1XX/4K0u303afLZot99je1aUJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqPPp7%2FbtsjnbIW1XX%2F4K0u303afLZot99je1aUJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2142&quot; height=&quot;744&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.21.32.png&quot; data-origin-width=&quot;2142&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[Xcode 15]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.23.15.png&quot; data-origin-width=&quot;2126&quot; data-origin-height=&quot;972&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8eKBl/btsjk6aRgi9/TdZg4SdEvQpIutCs9hWiy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8eKBl/btsjk6aRgi9/TdZg4SdEvQpIutCs9hWiy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8eKBl/btsjk6aRgi9/TdZg4SdEvQpIutCs9hWiy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8eKBl%2Fbtsjk6aRgi9%2FTdZg4SdEvQpIutCs9hWiy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2126&quot; height=&quot;972&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.23.15.png&quot; data-origin-width=&quot;2126&quot; data-origin-height=&quot;972&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Previews&quot; data-v-b3bf35a0=&quot;&quot;&gt;Previews&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- preview에서 사용할 디바이스를 선택할 수 있는 새로운 컨트롤이 생김. &lt;b&gt;기본적으로 선택한 run destination의 디바이스를 추적함&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;예를 들어서 내가 iPhone 14 Pro로 선택하고 프리뷰 시작하면 기본적으로 iPhone 14 Pro로 나옴&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.30.25.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCNKBj/btsjmC03hdq/6pNFdzYmfvyyXZO8InkDwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCNKBj/btsjmC03hdq/6pNFdzYmfvyyXZO8InkDwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCNKBj/btsjmC03hdq/6pNFdzYmfvyyXZO8InkDwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCNKBj%2FbtsjmC03hdq%2F6pNFdzYmfvyyXZO8InkDwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;84&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.30.25.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;새로운 컨트롤이 생겼다는 건&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.30.55.png&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6h8Bx/btsjmA9ZSH7/XEZ1fouxgkXyt1Dt7xw1xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6h8Bx/btsjmA9ZSH7/XEZ1fouxgkXyt1Dt7xw1xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6h8Bx/btsjmA9ZSH7/XEZ1fouxgkXyt1Dt7xw1xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6h8Bx%2FbtsjmA9ZSH7%2FXEZ1fouxgkXyt1Dt7xw1xK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;504&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.30.55.png&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;요걸 말하는 듯 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하지만 특정 디바이스 (ex. iPhone 12) 를 보고싶다면 기존의 &lt;i&gt;previewDevice&lt;/i&gt; modifier를 사용해야한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;-&lt;b&gt; #Preview&lt;/b&gt; 매크로로 preview를 만들 수 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686472368430&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SwiftUI

UIView &amp;amp; UIViewController

NSView &amp;amp; NSViewController

widget timeline providers

timeline entries

live activities&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;모두 지원&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Swift Macro뭐 자세히 몰라도됨 #Preview만 사용해보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;SwiftUI는 됐고.. UIKit으로 해보자&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686472811432&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit

final class ZeddView: UIView {

    override init(frame: CGRect) {
        super.init(frame: .zero)
        self.backgroundColor = .gray
    }
    
    required init?(coder: NSCoder) {
        fatalError(&quot;init(coder:) has not been implemented&quot;)
    }
}
#Preview {
    ZeddView()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;그냥 #Preview 하고 block에 대충 이런식으로 넣어주면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.40.53.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IbFCy/btsjx3Xxsze/M9bK2iSQ8rjpECH4uqitOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IbFCy/btsjx3Xxsze/M9bK2iSQ8rjpECH4uqitOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IbFCy/btsjx3Xxsze/M9bK2iSQ8rjpECH4uqitOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIbFCy%2Fbtsjx3Xxsze%2FM9bK2iSQ8rjpECH4uqitOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2144&quot; height=&quot;1034&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.40.53.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;으음 ~~~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686480119626&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ContentView_Previews: PreviewProvider {

    static var previews: some View {
        ContentView()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제는 위 코드 안쓰고 #Preview {} 로 깔끔하게 할 수 있을듯!?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Signing-and-Distribution&quot; data-v-b3bf35a0=&quot;&quot;&gt;Signing and Distribution&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 이제 시뮬레이터 실행 대상을 선택해도 아카이브 작업을 사용할 수 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnFb1m/btsjjCVxIoU/AaAKxnKxUnFOFFO5t7wQE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnFb1m/btsjjCVxIoU/AaAKxnKxUnFOFFO5t7wQE0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;314&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.47.38.png&quot; data-widthpercent=&quot;50.88&quot; style=&quot;width: 50.284176%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnFb1m/btsjjCVxIoU/AaAKxnKxUnFOFFO5t7wQE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnFb1m%2FbtsjjCVxIoU%2FAaAKxnKxUnFOFFO5t7wQE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KAohp/btsjtzWKiGj/HHHxhK4kWnwcvDoGhv3N80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KAohp/btsjtzWKiGj/HHHxhK4kWnwcvDoGhv3N80/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;306&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.48.13.png&quot; data-widthpercent=&quot;49.12&quot; style=&quot;width: 48.553033%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KAohp/btsjtzWKiGj/HHHxhK4kWnwcvDoGhv3N80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKAohp%2FbtsjtzWKiGj%2FHHHxhK4kWnwcvDoGhv3N80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;542&quot; height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Xcode 14 시뮬레이터를 선택한 상태에서는 아카이브가 비활성화 되어있다. / Xcode 15&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;시뮬레이터를 선택한 상태에서 아카이브를 빌드하면 선택한 플랫폼의 장치에 대한 모든 CPU 아키텍쳐가 포함된 앱이 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- Xcode &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Signing &amp;amp; Capabilities탭에서 개발 팀 및 앱 ID와 연결된 Apple 승인 관리 기능 추가 지원&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;- xcodebuild -exportArchive는 App Store Connect 인증 키를 사용하여 App Store Connect 및 애플 공증 서비스(Apple notary service)에 앱을 업로드할 수 있도록 지원&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;- Xcode에서 앱 업로드 상태 푸시 알림을 App Store Connect에 업로드한 사람에게 전달&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left; font-family: 'Nanum Gothic';&quot;&gt;- Xcode Organizer에서 간소화된 아카이브 배포를 지원. 이제 클릭 한번으로 아카이브 업로드 또는 export를 수행할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #1d1d1f; background-color: #ffffff;&quot;&gt;# &lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Source-Control&quot; data-v-b3bf35a0=&quot;&quot;&gt;Source Control&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Source Control 작업 + Xcode Cloud -&amp;gt; 'Integrate' 메뉴로 이동 (기존에는 'Source Control')&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[Xcode 14]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.53.54.png&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L0Mzl/btsjqweXztp/L0kKaBFJ9nRh6Tkhqm735K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L0Mzl/btsjqweXztp/L0kKaBFJ9nRh6Tkhqm735K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L0Mzl/btsjqweXztp/L0kKaBFJ9nRh6Tkhqm735K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL0Mzl%2FbtsjqweXztp%2FL0kKaBFJ9nRh6Tkhqm735K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1926&quot; height=&quot;62&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.53.54.png&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[Xcode 15]&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.53.35.png&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ib9Fx/btsjx4a4MbH/3SeLxXmih8ZY4eCrIHGfFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ib9Fx/btsjx4a4MbH/3SeLxXmih8ZY4eCrIHGfFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ib9Fx/btsjx4a4MbH/3SeLxXmih8ZY4eCrIHGfFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIb9Fx%2Fbtsjx4a4MbH%2F3SeLxXmih8ZY4eCrIHGfFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1864&quot; height=&quot;66&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.53.35.png&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Xcode가 git 스테이징 기능과 완전히 통합되어 코드 커밋이 non-modal 방식으로 수행됨.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이전에는 커밋을 수행하는 동안 다른 작업을 수행할 수 없었는데, 이제는 사용자 작업 흐름을 중단시키지 않고 커밋 할 수 있다는 뜻 같음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Source-Editor&quot; data-v-b3bf35a0=&quot;&quot;&gt;Source Editor&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- #if&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;hellip;&lt;/span&gt;#endif 블록의 비활성 코드가 이제 흐리게 표시됨.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9F1Af/btsjlkNqSxd/KBVypgJG79elBqEiwPvsk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9F1Af/btsjlkNqSxd/KBVypgJG79elBqEiwPvsk0/img.png&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;412&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.39.15.png&quot; data-widthpercent=&quot;49.28&quot; style=&quot;width: 48.704867%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9F1Af/btsjlkNqSxd/KBVypgJG79elBqEiwPvsk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9F1Af%2FbtsjlkNqSxd%2FKBVypgJG79elBqEiwPvsk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4oTzy/btsjqvNVN1T/CkNTahw8i23aemSLLR7QQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4oTzy/btsjqvNVN1T/CkNTahw8i23aemSLLR7QQk/img.png&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;424&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.39.29.png&quot; data-widthpercent=&quot;50.72&quot; style=&quot;width: 50.132342%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4oTzy/btsjqvNVN1T/CkNTahw8i23aemSLLR7QQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4oTzy%2FbtsjqvNVN1T%2FCkNTahw8i23aemSLLR7QQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;이게 내 환경에 따라 결정되는 것 같다!?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o4V8g/btsjnH2awwU/arRKPoAcN5ekCnEjznpFDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o4V8g/btsjnH2awwU/arRKPoAcN5ekCnEjznpFDK/img.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;428&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.40.10.png&quot; data-widthpercent=&quot;48.65&quot; style=&quot;width: 48.088501%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o4V8g/btsjnH2awwU/arRKPoAcN5ekCnEjznpFDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo4V8g%2FbtsjnH2awwU%2FarRKPoAcN5ekCnEjznpFDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;516&quot; height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eBxVYA/btsjlZbhnE2/PKZYhTPdCYhHsRECPqyRUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eBxVYA/btsjlZbhnE2/PKZYhTPdCYhHsRECPqyRUk/img.png&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;426&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.40.23.png&quot; data-widthpercent=&quot;51.35&quot; style=&quot;width: 50.748708%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eBxVYA/btsjlZbhnE2/PKZYhTPdCYhHsRECPqyRUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeBxVYA%2FbtsjlZbhnE2%2FPKZYhTPdCYhHsRECPqyRUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;542&quot; height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 기능은 Text Editing &amp;gt; Display 환경설정에서 비활성화할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.00.16.png&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmTbtN/btsjx34iLHR/aTQ5Q5oV2AF4iKQJRCzhx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmTbtN/btsjx34iLHR/aTQ5Q5oV2AF4iKQJRCzhx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmTbtN/btsjx34iLHR/aTQ5Q5oV2AF4iKQJRCzhx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmTbtN%2Fbtsjx34iLHR%2FaTQ5Q5oV2AF4iKQJRCzhx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1638&quot; height=&quot;1100&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.00.16.png&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;1100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Quick Help에서 문서 주석에 포함된 이미지 렌더링이 지원. (URL같은 외부이미지 + 프로젝트에 있는 로컬이미지 모두 지원)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;음 해보니까 안되는데 되시는분..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Xcode는 모듈 이름에 대한 참조에서 Quick Help를 호출하여 SDK프레임워크 문서에 접근할 수 있도록 지원.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ex. SwiftUI import문을 option + 클릭하여 Quick Help를 활성화하면 SwiftUI문서가 표시&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.08.33.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkCFEz/btsjkMpSP3q/aV1okLUDF3erus3xqpS7mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkCFEz/btsjkMpSP3q/aV1okLUDF3erus3xqpS7mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkCFEz/btsjkMpSP3q/aV1okLUDF3erus3xqpS7mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkCFEz%2FbtsjkMpSP3q%2FaV1okLUDF3erus3xqpS7mK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1576&quot; height=&quot;868&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.08.33.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Show Code Actions이 Show Quick Actions로 대체. 모든 메뉴 커맨드에 빠르게 접근가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Command + Shift + A 단축키를 쓰면됨&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.31.46.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hs9HR/btsjAvsPQnL/sfskV97guoqH1U15335bek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hs9HR/btsjAvsPQnL/sfskV97guoqH1U15335bek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hs9HR/btsjAvsPQnL/sfskV97guoqH1U15335bek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHs9HR%2FbtsjAvsPQnL%2FsfskV97guoqH1U15335bek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;920&quot; height=&quot;736&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.31.46.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 이제 에디터에서 Command + 클릭하면 기본적으로 Definition으로 이동이 수행. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. Command + Click&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[Xcode 14]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Command + 클릭하면 뭐 선택할 수 있는게 뜨고 여기서 선택할 수 있었음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Definition로 가려면 여기서 Jump to Definition 선택하거나, control + command + 클릭 해야함&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.27.54.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwRq8D/btsjpEjQmNX/G7eqKJYOvT8iZhzGzrrY9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwRq8D/btsjpEjQmNX/G7eqKJYOvT8iZhzGzrrY9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwRq8D/btsjpEjQmNX/G7eqKJYOvT8iZhzGzrrY9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwRq8D%2FbtsjpEjQmNX%2FG7eqKJYOvT8iZhzGzrrY9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;712&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.27.54.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[Xcode 15]&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Command + 클릭 -&amp;gt; 바로 Definition&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. Option + Click&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[Xcode 14]&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.30.15.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC3zMj/btsjqvUDa6z/G3GuKKx8rr04jVNqJdZvhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC3zMj/btsjqvUDa6z/G3GuKKx8rr04jVNqJdZvhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC3zMj/btsjqvUDa6z/G3GuKKx8rr04jVNqJdZvhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC3zMj%2FbtsjqvUDa6z%2FG3GuKKx8rr04jVNqJdZvhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1010&quot; height=&quot;576&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.30.15.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[Xcode 15]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.31.49.png&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cORR4c/btsjpFiJhvC/YH94MI1VllaO1hBcz3vw00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cORR4c/btsjpFiJhvC/YH94MI1VllaO1hBcz3vw00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cORR4c/btsjpFiJhvC/YH94MI1VllaO1hBcz3vw00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcORR4c%2FbtsjpFiJhvC%2FYH94MI1VllaO1hBcz3vw00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1452&quot; height=&quot;782&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.31.49.png&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. Control + Click&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;같음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000; text-align: start;&quot;&gt;이런것들 Navigation preferences에서 변경할 수 있음&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.53.29.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chgyu2/btsjlWZPo0g/VkWRkBqsczHWo3rL8gtQL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chgyu2/btsjlWZPo0g/VkWRkBqsczHWo3rL8gtQL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chgyu2/btsjlWZPo0g/VkWRkBqsczHWo3rL8gtQL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchgyu2%2FbtsjlWZPo0g%2FVkWRkBqsczHWo3rL8gtQL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1884&quot; height=&quot;1224&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.53.29.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 'Format to multiple lines' 리팩터 액션 추가. (코드를 여러줄로 분할할 수 있음!!!!!!!!!!)&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-video-to-gif.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dd9kHV/btsjse6gJ7w/S21phA3OvSXBMU2lUKkMz0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dd9kHV/btsjse6gJ7w/S21phA3OvSXBMU2lUKkMz0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dd9kHV/btsjse6gJ7w/S21phA3OvSXBMU2lUKkMz0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dd9kHV/btsjse6gJ7w/S21phA3OvSXBMU2lUKkMz0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;450&quot; data-filename=&quot;ezgif.com-video-to-gif.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;으음...맛있네요 ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Format to multiple lines가 안보일 수도 있는데 그럴때는 영역 선택을 잘 해주면 뜬다. (ex. test영역만 선택하면 안됨)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- default parameter가 &lt;b&gt;하나만 포함된 함수&lt;/b&gt;는 이제 &lt;span style=&quot;text-align: start;&quot;&gt;Code completion에서 자동으로 확장된 상태로 표시.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686476616293&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func test(a: Int = 1, b: Int, c: Int, d: Int) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런 코드가 있다고 했을 때,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[Xcode 14]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.43.51.png&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfTkcU/btsjlXxDkyN/m89dNNQew51mYibbv4wFgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfTkcU/btsjlXxDkyN/m89dNNQew51mYibbv4wFgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfTkcU/btsjlXxDkyN/m89dNNQew51mYibbv4wFgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfTkcU%2FbtsjlXxDkyN%2Fm89dNNQew51mYibbv4wFgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1486&quot; height=&quot;140&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.43.51.png&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[Xcode 15]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.44.04.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxlNjz/btsjwrEfuuz/qRCCRDpP0iqJhS852xPbO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxlNjz/btsjwrEfuuz/qRCCRDpP0iqJhS852xPbO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxlNjz/btsjwrEfuuz/qRCCRDpP0iqJhS852xPbO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxlNjz%2FbtsjwrEfuuz%2FqRCCRDpP0iqJhS852xPbO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1508&quot; height=&quot;220&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.44.04.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- default parameter가 &lt;b&gt;2개 이상 포함된 함수&lt;/b&gt;에서 오른쪽 방향키를 누르면 해당 parameter의 가능한 모든 순열(permutations)을 표시하도록 확장됨&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686476706751&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func test(a: Int = 1, b: Int = 2, c: Int, d: Int) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런 코드가 있다고 했을 때,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Xcode 15에서 처음 test를 호출하려고 할 때 아래와 같이 뜸&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.45.38.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwxZ99/btsjlXK9ASR/wGdQgtKVIadwyTEKDVBcYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwxZ99/btsjlXK9ASR/wGdQgtKVIadwyTEKDVBcYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwxZ99/btsjlXK9ASR/wGdQgtKVIadwyTEKDVBcYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwxZ99%2FbtsjlXK9ASR%2FwGdQgtKVIadwyTEKDVBcYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1524&quot; height=&quot;166&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.45.38.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그 상태에서 오른쪽 방향키 한번 누르면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.46.39.png&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQKR2/btsjllFwrbC/qSZ3LetWXfmPCkwwxSJZi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQKR2/btsjllFwrbC/qSZ3LetWXfmPCkwwxSJZi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQKR2/btsjllFwrbC/qSZ3LetWXfmPCkwwxSJZi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQKR2%2FbtsjllFwrbC%2FqSZ3LetWXfmPCkwwxSJZi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1462&quot; height=&quot;350&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.46.39.png&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이건 정말 맛있을지도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14 방식 개인적으로 불편했거든여ㅛ &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그놈의 frame..에서 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.36.11.png&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yvzsb/btsjnbbaF21/SXkXQpkJ2uT8MiCTOFWhck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yvzsb/btsjnbbaF21/SXkXQpkJ2uT8MiCTOFWhck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yvzsb/btsjnbbaF21/SXkXQpkJ2uT8MiCTOFWhck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYvzsb%2FbtsjnbbaF21%2FSXkXQpkJ2uT8MiCTOFWhck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;248&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.36.11.png&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오른쪽 방향키 한번만 눌러주면?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.36.39.png&quot; data-origin-width=&quot;2238&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WeBaw/btsjk5XnEGe/LfhKEHGKpJD4tSG8e5BnP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WeBaw/btsjk5XnEGe/LfhKEHGKpJD4tSG8e5BnP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WeBaw/btsjk5XnEGe/LfhKEHGKpJD4tSG8e5BnP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWeBaw%2Fbtsjk5XnEGe%2FLfhKEHGKpJD4tSG8e5BnP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2238&quot; height=&quot;626&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.36.39.png&quot; data-origin-width=&quot;2238&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;편-안&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Code completion은 이제 Swift에서 타입을 선언할 때 이름을 제안함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;우리는 일단 파일을 만들고 코드를 작성하는데, 타입 이름은 파일의 이름과 같은 경우가 많음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그럴 때..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.34.04.png&quot; data-origin-width=&quot;1692&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q9Kko/btsjnai3el8/6eKL3wOyLnOjGE8ehh2atK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q9Kko/btsjnai3el8/6eKL3wOyLnOjGE8ehh2atK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q9Kko/btsjnai3el8/6eKL3wOyLnOjGE8ehh2atK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq9Kko%2Fbtsjnai3el8%2F6eKL3wOyLnOjGE8ehh2atK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1692&quot; height=&quot;804&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.34.04.png&quot; data-origin-width=&quot;1692&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;맛있다 ㅠ&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Swift&quot; data-v-b3bf35a0=&quot;&quot;&gt;Swift&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이건 따로 보는 것으로!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Swift-and-C++-Interoperability&quot; data-v-b3bf35a0=&quot;&quot;&gt;Swift and C++ Interoperability&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Swift는 C++/객체지향-C++와의 양방향 상호운용성을 지원. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. Swift에서 C++ API의 하위 집합을 사용 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. C++에서 Swift API를 사용할 수 있음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;빌드 세팅에서 'C++ and Objective-C interoperability'를 활성화하면됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://swift.org/documentation/cxx-interop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://swift.org/documentation/cxx-interop&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;color: #000000;&quot;&gt;참고!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Test-Navigator&quot; data-v-b3bf35a0=&quot;&quot;&gt;Test Navigator&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Test navigator는 더 빠른 개발-테스트-디버그 루프를 위해 재설계 / 재작성됨. 테스트를 더 빠르게 보고하고 실행하며, 새로운 필터링 시스템을 갖춤&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Test navigator 필터에서 토큰 사용.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[Xcode 14]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.57.21.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dv04H4/btsjlV0T6M2/bD0t9o69kAwazRiSVBx8dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dv04H4/btsjlV0T6M2/bD0t9o69kAwazRiSVBx8dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dv04H4/btsjlV0T6M2/bD0t9o69kAwazRiSVBx8dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdv04H4%2FbtsjlV0T6M2%2FbD0t9o69kAwazRiSVBx8dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;920&quot; height=&quot;84&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.57.21.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[Xcode 15]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.58.24.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecKiE7/btsjlZPPBHn/5yNhmujHeV1AA0KZDL7zjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecKiE7/btsjlZPPBHn/5yNhmujHeV1AA0KZDL7zjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecKiE7/btsjlZPPBHn/5yNhmujHeV1AA0KZDL7zjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecKiE7%2FbtsjlZPPBHn%2F5yNhmujHeV1AA0KZDL7zjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;906&quot; height=&quot;464&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.58.24.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;필터를 설정한 후에는 is / is not도 선택할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bML7zI/btsjlWepm1g/eHw3WDLreyxrvSdhtECoNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bML7zI/btsjlWepm1g/eHw3WDLreyxrvSdhtECoNK/img.png&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;358&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-06-11 오후 6.59.37.png&quot; data-widthpercent=&quot;41.55&quot; style=&quot;width: 41.066504%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bML7zI/btsjlWepm1g/eHw3WDLreyxrvSdhtECoNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbML7zI%2FbtsjlWepm1g%2FeHw3WDLreyxrvSdhtECoNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;414&quot; height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rXXkz/btsjk5QCE21/4U8kisBU0VvcU2wl5lDKlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rXXkz/btsjk5QCE21/4U8kisBU0VvcU2wl5lDKlk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;552&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.00.04.png&quot; data-widthpercent=&quot;58.45&quot; style=&quot;width: 57.770706%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rXXkz/btsjk5QCE21/4U8kisBU0VvcU2wl5lDKlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrXXkz%2Fbtsjk5QCE21%2F4U8kisBU0VvcU2wl5lDKlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;is not failed로 선택하면 failed를 제외한 성공, 스킵, 패스된거만 나오게 될 듯&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- XCTest는 스크린샷 이외에도 자동 녹화 기능 지원. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;화면 녹화를 사용하면 테스트 실행중에 발생한 상황을 세밀하게 볼 수 있으므로 UI Test 실패를 조사하는데 유용.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;화면 녹화는 기본적으로 활성화 되어있음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 다양한 기기 및 테스트 구성에 대한 테스트 결과를 쉽게 이해할 수 있도록 Xcode의 Test Report가 재설계됨&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.05.37.png&quot; data-origin-width=&quot;2328&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/86T3e/btsjlZCkYnb/c5k8t5ZKejSbaSU6jHXdC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/86T3e/btsjlZCkYnb/c5k8t5ZKejSbaSU6jHXdC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/86T3e/btsjlZCkYnb/c5k8t5ZKejSbaSU6jHXdC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F86T3e%2FbtsjlZCkYnb%2Fc5k8t5ZKejSbaSU6jHXdC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2328&quot; height=&quot;460&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.05.37.png&quot; data-origin-width=&quot;2328&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;요런 화면이 추가된 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.05.56.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0eSBc/btsjqvG8RUa/4B6TTJ9qpnxCTmUrEhU1Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0eSBc/btsjqvG8RUa/4B6TTJ9qpnxCTmUrEhU1Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0eSBc/btsjqvG8RUa/4B6TTJ9qpnxCTmUrEhU1Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0eSBc%2FbtsjqvG8RUa%2F4B6TTJ9qpnxCTmUrEhU1Y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1850&quot; height=&quot;456&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.05.56.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;옵션을 설정할 수도 있고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.06.11.png&quot; data-origin-width=&quot;1840&quot; data-origin-height=&quot;1112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GIoan/btsjlYDpt2n/vBZ9eudZt3TfcFgTP46j90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GIoan/btsjlYDpt2n/vBZ9eudZt3TfcFgTP46j90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GIoan/btsjlYDpt2n/vBZ9eudZt3TfcFgTP46j90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGIoan%2FbtsjlYDpt2n%2FvBZ9eudZt3TfcFgTP46j90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1840&quot; height=&quot;1112&quot; data-filename=&quot;스크린샷 2023-06-11 오후 7.06.11.png&quot; data-origin-width=&quot;1840&quot; data-origin-height=&quot;1112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Configuration도 설정가능!?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이거 맛있을지도..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;댓글이 먼가 이상해서 막아둡니다. 매크로인가?... ㅠ 아니라면 죄송&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# 참고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/xcode/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/xcode/&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Overview&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Xcode</category>
      <category>WWDC</category>
      <category>WWDC23</category>
      <category>Xcode</category>
      <category>Xcode 15</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1387</guid>
      <comments>https://zeddios.tistory.com/1387#entry1387comment</comments>
      <pubDate>Sun, 11 Jun 2023 19:56:03 +0900</pubDate>
    </item>
    <item>
      <title>[Xcode 14+] 시뮬레이터에 Remote notifications 보내기</title>
      <link>https://zeddios.tistory.com/1385</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14 릴리스노트를 다시 보던 중&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Simulator now supports remote notifications in iOS 16 when running in macOS 13 on Mac computers with Apple silicon or T2 processors. Simulator supports the Apple Push Notification Service Sandbox environment. Your server can send a remote notification to your app running in that simulator by connecting to the APNS Sandbox (api.sandbox.push.apple.com). Each simulator generates registration tokens unique to the combination of that simulator and the Mac hardware it&amp;rsquo;s running on.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;이제 시뮬레이터는 Apple 실리콘 또는 T2 프로세서가 탑재된 Mac 컴퓨터에서 macOS 13으로 실행할 때 iOS 16에서 원격 알림을 지원합니다. 시뮬레이터는 Apple 푸시 알림 서비스 샌드박스 환경을 지원합니다. &lt;br /&gt;서버는 APNS 샌드박스(api.sandbox.push.apple.com)에 연결하여 해당 시뮬레이터에서 실행 중인 앱에 원격 알림을 보낼 수 있습니다.&lt;br /&gt;각 시뮬레이터는 해당 시뮬레이터와 시뮬레이터가 실행 중인 Mac 하드웨어의 조합에 고유한 등록 토큰을 생성합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;이런게 있어서 자세히 살펴보려고 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;핵심은 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;시뮬레이터에서 Remote notificaton을 지원한다는 것&lt;/span&gt;&lt;/b&gt;인데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;보통&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt; &lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/954&quot;&gt;Xcode 11.4 ) Remote Push Notifications in Simulator (feat. APNs file)&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;/b&gt;에서 본 것 처럼 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;.apns 파일을 끌어다 놓는식(drag and drop)으로 &amp;nbsp;테스트 했는데&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmDPaf/btr1p1i1Ol0/NC4sXm6pt2d9dI0YjmugF1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmDPaf/btr1p1i1Ol0/NC4sXm6pt2d9dI0YjmugF1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmDPaf/btr1p1i1Ol0/NC4sXm6pt2d9dI0YjmugF1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cmDPaf/btr1p1i1Ol0/NC4sXm6pt2d9dI0YjmugF1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;1018&quot; data-filename=&quot;img.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1018&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;이제 진짜로 시뮬레이터에 &lt;b&gt;Remote&lt;/b&gt; notification을 보낼 수 있다니!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 준비물&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://support.apple.com/ko-kr/HT211814&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apple 실리콘 또는 T2 프로세서가 탑재된 Mac 컴퓨터&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;2.&lt;/span&gt; macOS 13 (Ventura)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Xcode 14&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 시뮬레이터에 Remote Notification 보내보기&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 프로젝트 만들기 (Xcode 14+로)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 대충 ZeddPushTest로 만들어줬따..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. Capabilities &amp;gt; Push Notification 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.33.19.png&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCBKP/btr1fPqcwXV/VZ8KdhuEc5m6msArJz4NK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCBKP/btr1fPqcwXV/VZ8KdhuEc5m6msArJz4NK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCBKP/btr1fPqcwXV/VZ8KdhuEc5m6msArJz4NK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCBKP%2Fbtr1fPqcwXV%2FVZ8KdhuEc5m6msArJz4NK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1362&quot; height=&quot;586&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.33.19.png&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. AppDelegate.swift 수정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677648318619&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.reduce(&quot;&quot;) {
        $0 + String(format: &quot;%02X&quot;, $1)
    }
    print(token)
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print(error.localizedDescription)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot; data-v-9c59eaca=&quot;&quot; data-v-53c3ef2a=&quot;&quot;&gt;DeviceToken 얻어오는 부분 추가해주기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. 알림 권한 요청&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677648318620&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {
    didAllow,Error in

    DispatchQueue.main.async {
        UIApplication.shared.registerForRemoteNotifications()
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;5. 빌드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;6. DeviceToken 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;DeviceToken이 무사히 나왔는지 확인해야한다. 잘 나왔다면 복사 ㄱㄱ &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;평소보다(?) 살짝 길텐데 아래와 같은 이유때문인 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;각 시뮬레이터는 해당 시뮬레이터와 시뮬레이터가 실행 중인 Mac 하드웨어의 조합에 고유한 등록 토큰을 생성합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;7. DeviceToken을 가지고 Remote Notification 보내보기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 나는 &lt;a style=&quot;color: #000000;&quot; href=&quot;/1384&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;Sending push notifications using command-line tools (feat. Token / .p8&lt;/span&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&amp;nbsp;글 쓸때 만들어둔 프로젝트와 스크립트가 있어서 그대로 썼다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;FCM을 이용하든 커맨드라인툴로 하든 이미 세팅이 끝난 상태라면 DeviceToken만 있으면 되니까....ㅎ;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;DeviceToken입력하는 부분에 복사한 시뮬레이터 DeviceToken을 넣어준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나의 경우   와 같음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1678107114340&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TEAM_ID=Team ID
TOKEN_KEY_FILE_NAME=path to the private key file
AUTH_KEY_ID=your key identifier
TOPIC=App ID
DEVICE_TOKEN=복사한 시뮬레이터 Device Token 넣어주기 ✅
APNS_HOST_NAME=api.sandbox.push.apple.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;주의 할 점은 &lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;서버는 APNS 샌드박스(api.sandbox.push.apple.com)에 연결하여 해당 시뮬레이터에서 실행 중인 앱에 원격 알림을 보낼 수 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;때문에 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677745967836&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TEAM_ID=Team ID
TOKEN_KEY_FILE_NAME=path to the private key file
AUTH_KEY_ID=your key identifier
TOPIC=App ID
DEVICE_TOKEN=복사한 시뮬레이터 Device Token 넣어주기
APNS_HOST_NAME=api.sandbox.push.apple.com ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;HOST는 반드시 sandbox여야 하는 것 같다.&lt;/b&gt; (아니면 Bad Device Token 에러남)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;8. Remote notification이 잘 오는지 확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-video-to-gif-4.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1Ljla/btr2u0XGHGy/hjjYimUGaUu7vw8gWy9D0K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1Ljla/btr2u0XGHGy/hjjYimUGaUu7vw8gWy9D0K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1Ljla/btr2u0XGHGy/hjjYimUGaUu7vw8gWy9D0K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b1Ljla/btr2u0XGHGy/hjjYimUGaUu7vw8gWy9D0K/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;479&quot; data-filename=&quot;ezgif.com-video-to-gif-4.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;야호&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 테스트하면서 이상했던 점&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14.2에서 시뮬레이터에서 DeviceToken이 안나오는 경우가 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;분명히 예전에 테스트했을 때는 나왔는데.. 갑자기 안나오는게 너무 이상해서 다른 시뮬레이터로 테스트하니까 나옴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다른 시뮬레이터에서 테스트하다가 안된 시뮬레이터에서 다시 해보니까 또 이제는 나온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;DeviceToken이 안나온다면 그냥 다른 시뮬레이터로 일단 해보는 것을 추천...ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 처음에는 푸시를 보내니까 바로 안왔었는데, 이것도 너무 이상해서;; 뭐지.. 하고 삽질하는 동안 푸시가 왔다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그 뒤로는 스크립트 실행하자마자 잘 옴 ㅎ;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[참고]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>Simulator</category>
      <category>simulator remote notification</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1385</guid>
      <comments>https://zeddios.tistory.com/1385#entry1385comment</comments>
      <pubDate>Tue, 7 Mar 2023 09:45:44 +0900</pubDate>
    </item>
    <item>
      <title>Sending push notifications using command-line tools (feat. Token / .p8)</title>
      <link>https://zeddios.tistory.com/1384</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오늘 의식의 흐름&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. Remote Notification을 테스트 해보고싶음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. 개인적으로 Remote Notification은 Firebase를 통해서만 써봤음.. (FCM)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;3. Firebase 프로젝트 세팅하고 뭐 프로젝트에 SDK 추가할 생각하니까 갑자기 아득해짐..ㄹㅇ;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 진심 이게 최선임..? 에반데 하다가&lt;/span&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/usernotifications/sending_push_notifications_using_command-line_tools#3694579&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Sending push notifications using command-line tools&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;color: #000000;&quot;&gt;이런게 있길래 도전&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;참고로 위 링크에 2가지 방법(Certiticate, Token)이 있는데 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;나는 Token을 이용해서 해볼거&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Certificate와 Token 방식에 대한 차이점은&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/1373&quot;&gt;[Remote Notification 한판 정리] APNs / Token Based / Certificate Based / .p8과 .p12&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;글을 참고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;당연히 애플 개발자 프로그램 가입이 되어있어야합니다?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 프로젝트 만들기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나는 대충 ZeddPushTest로 만들어줬따..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;2. Capabilities &amp;gt; Push Notification 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.33.19.png&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLHrYQ/btr0RPZsBYs/bPoZQ671hTBSs6te5dLKtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLHrYQ/btr0RPZsBYs/bPoZQ671hTBSs6te5dLKtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLHrYQ/btr0RPZsBYs/bPoZQ671hTBSs6te5dLKtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLHrYQ%2Fbtr0RPZsBYs%2FbPoZQ671hTBSs6te5dLKtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1362&quot; height=&quot;586&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.33.19.png&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;3. AppDelegate.swift 수정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677577933282&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.reduce(&quot;&quot;) {
        $0 + String(format: &quot;%02X&quot;, $1)
    }
    print(token)
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print(error.localizedDescription)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot; data-v-9c59eaca=&quot;&quot; data-v-53c3ef2a=&quot;&quot;&gt;DeviceToken 얻어오는 부분 추가해주기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;4. 알림 권한 요청 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677577967497&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge], completionHandler: {
    didAllow,Error in

    DispatchQueue.main.async {
        UIApplication.shared.registerForRemoteNotifications()
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;5. DeviceToken 복사해두기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6.&lt;/span&gt;&amp;nbsp;&lt;a href=&quot;https://developer.apple.com/account/resources/authkeys/list&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;Certificates, Identifiers &amp;amp; Profile&lt;/span&gt;s&lt;/a&gt; &lt;span style=&quot;color: #000000;&quot;&gt;사이트로 이동&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;7. 왼쪽에 Keys 선택 후 + 버튼 누르기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.38.53.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtmvdG/btr0RJx5xNY/r2JAXgKEPUJ9syW8chHSd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtmvdG/btr0RJx5xNY/r2JAXgKEPUJ9syW8chHSd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtmvdG/btr0RJx5xNY/r2JAXgKEPUJ9syW8chHSd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtmvdG%2Fbtr0RJx5xNY%2Fr2JAXgKEPUJ9syW8chHSd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1148&quot; height=&quot;718&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.38.53.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;8. KeyName 입력, APNs 체크 후 Continue&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.41.26.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzNM72/btr1nCDnMGC/fEUoHDSUr8De9TGZ5w8QC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzNM72/btr1nCDnMGC/fEUoHDSUr8De9TGZ5w8QC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzNM72/btr1nCDnMGC/fEUoHDSUr8De9TGZ5w8QC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzNM72%2Fbtr1nCDnMGC%2FfEUoHDSUr8De9TGZ5w8QC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1760&quot; height=&quot;706&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.41.26.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;9. Register 클릭&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.42.18.png&quot; data-origin-width=&quot;1762&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cykUqA/btr1dmg7vp1/KKfItqWJpKnYFz6lMc9my0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cykUqA/btr1dmg7vp1/KKfItqWJpKnYFz6lMc9my0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cykUqA/btr1dmg7vp1/KKfItqWJpKnYFz6lMc9my0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcykUqA%2Fbtr1dmg7vp1%2FKKfItqWJpKnYFz6lMc9my0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1762&quot; height=&quot;562&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.42.18.png&quot; data-origin-width=&quot;1762&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;10. 한번 다운받으면 다시 다운로드 할 수 없으니 주의. 다운 고고&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.44.55.png&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DDtMV/btr1f2bBstF/PedkUpK5pZLUTuy46XaKNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DDtMV/btr1f2bBstF/PedkUpK5pZLUTuy46XaKNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DDtMV/btr1f2bBstF/PedkUpK5pZLUTuy46XaKNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDDtMV%2Fbtr1f2bBstF%2FPedkUpK5pZLUTuy46XaKNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1882&quot; height=&quot;646&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.44.55.png&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;여기서 Key ID가 중요한데, 다시 들어가서 볼 수 있으니 걱정 ㄴㄴ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아무튼 .p8 파일이 다운받아졌을거임&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;11. TeamID 가져오기&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/account&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/account&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;여기 들어가서&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.47.46.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vY6P8/btr1dl3yMss/PX3EksX1EL2naafBojt3vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vY6P8/btr1dl3yMss/PX3EksX1EL2naafBojt3vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vY6P8/btr1dl3yMss/PX3EksX1EL2naafBojt3vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvY6P8%2Fbtr1dl3yMss%2FPX3EksX1EL2naafBojt3vK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;852&quot; height=&quot;396&quot; data-filename=&quot;스크린샷 2023-02-28 오후 6.47.46.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;팀 ID 부분 써야하니 이 창 켜두고 있기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p id=&quot;3694579&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이제 조합할 일만 남았는데...&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;3694579&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/usernotifications/sending_push_notifications_using_command-line_tools#3694579&quot; data-v-1c6ef997=&quot;&quot;&gt;Send a Push Notification Using a Token&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;이쪽 보면&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 7.11.27.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;1514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQRpe/btr1lvxNwMK/o4AtPCfj3R6kRCNKWKbPJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQRpe/btr1lvxNwMK/o4AtPCfj3R6kRCNKWKbPJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQRpe/btr1lvxNwMK/o4AtPCfj3R6kRCNKWKbPJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQRpe%2Fbtr1lvxNwMK%2Fo4AtPCfj3R6kRCNKWKbPJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1514&quot; height=&quot;1514&quot; data-filename=&quot;스크린샷 2023-02-28 오후 7.11.27.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;1514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;사실 이거 보고 살짝 아득해짐&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;해봅시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;12. 터미널 열고 쉘 스크립트 파일 만들어주기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 7.24.18.png&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AmpMt/btr01Uy3K8E/kJQ9uXgaqD5pOkzZ9OJ9j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AmpMt/btr01Uy3K8E/kJQ9uXgaqD5pOkzZ9OJ9j0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AmpMt/btr01Uy3K8E/kJQ9uXgaqD5pOkzZ9OJ9j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAmpMt%2Fbtr01Uy3K8E%2FkJQ9uXgaqD5pOkzZ9OJ9j0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;104&quot; data-filename=&quot;스크린샷 2023-02-28 오후 7.24.18.png&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이번 스텝은 전부 다 개인취향임&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. 나는 Desktop에서 보는게 편해서 Desktop에 만들려고 이동했고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. 나는 나노충이라 nano로 만듬&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;3. 파일명 암거나 ㄱㄱ .sh 만 잘 붙혀주면됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;13. 첫 줄에 #!/bin/bash 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677580028482&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;14. &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/usernotifications/sending_push_notifications_using_command-line_tools#3694579&quot; data-v-1c6ef997=&quot;&quot;&gt;Send a Push Notification Using a Token&lt;/a&gt;&lt;/span&gt;&amp;nbsp;로 가서 스크립트 복사해주기&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 7.27.51.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;1348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbqztW/btr1be4N8Y6/JmFWWPsofQK3qjn4LP0edk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbqztW/btr1be4N8Y6/JmFWWPsofQK3qjn4LP0edk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbqztW/btr1be4N8Y6/JmFWWPsofQK3qjn4LP0edk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbqztW%2Fbtr1be4N8Y6%2FJmFWWPsofQK3qjn4LP0edk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;1348&quot; data-filename=&quot;스크린샷 2023-02-28 오후 7.27.51.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;1348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;빨간색 네모 친거 쉘 스크립트 파일에 복붙&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;⚠️ &lt;/span&gt;&lt;/b&gt;주의사항 ⚠️ 마지막 curl 앞에있는 %는 빼주기!!!!&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677580259295&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

TEAM_ID=Team ID
TOKEN_KEY_FILE_NAME=path to the private key file
AUTH_KEY_ID=your key identifier
TOPIC=App ID
DEVICE_TOKEN=device token for your app
APNS_HOST_NAME=api.sandbox.push.apple.com


JWT_ISSUE_TIME=$(date +%s)
JWT_HEADER=$(printf '{ &quot;alg&quot;: &quot;ES256&quot;, &quot;kid&quot;: &quot;%s&quot; }' &quot;${AUTH_KEY_ID}&quot; | 
openssl base64 -e -A | tr -- '+/' '-_' | tr -d =)
JWT_CLAIMS=$(printf '{ &quot;iss&quot;: &quot;%s&quot;, &quot;iat&quot;: %d }' &quot;${TEAM_ID}&quot; 
&quot;${JWT_ISSUE_TIME}&quot; | openssl base64 -e -A | tr -- '+/' '-_' | tr -d =)
JWT_HEADER_CLAIMS=&quot;${JWT_HEADER}.${JWT_CLAIMS}&quot;
JWT_SIGNED_HEADER_CLAIMS=$(printf &quot;${JWT_HEADER_CLAIMS}&quot; | openssl dgst 
-binary -sha256 -sign &quot;${TOKEN_KEY_FILE_NAME}&quot; | openssl base64 -e -A | tr 
-- '+/' '-_' | tr -d =)
AUTHENTICATION_TOKEN=&quot;${JWT_HEADER}.${JWT_CLAIMS}.${JWT_SIGNED_HEADER_CLAIMS}&quot;


curl -v --header &quot;apns-topic: $TOPIC&quot; --header &quot;apns-push-type: alert&quot; 
--header &quot;authorization: bearer $AUTHENTICATION_TOKEN&quot; --data 
'{&quot;aps&quot;:{&quot;alert&quot;:&quot;test&quot;}}' --http2 
https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;파일 상태가 지금 이럴텐데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677580305281&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TEAM_ID=Team ID
TOKEN_KEY_FILE_NAME=path to the private key file
AUTH_KEY_ID=your key identifier
TOPIC=App ID
DEVICE_TOKEN=device token for your app
APNS_HOST_NAME=api.sandbox.push.apple.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;우리는   이 부분만 수정하면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ &lt;b&gt;Team_ID&lt;/b&gt; &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;11번으로 이동. 팀 ID 부분 복붙&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;&lt;b&gt;TOKEN_KEY_FILE_NAME&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;10번으로 이동. 아까 다운로드 받은 .p8의 Path를 입력해주면됨. (&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ex. /Users/zedd/Downloads/AuthKey_어쩌구.p8)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;&lt;b&gt;AUTH_KEY_ID&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;10번으로 이동. 아까 만든 Key에 들어가서 Key ID 복붙&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;&lt;b&gt;TOPIC&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;처음에 만든 프로젝트의 Bundle ID 복붙 (ex.&amp;nbsp;com.zedd.ZeddPushTest)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;&lt;b&gt;DEVICE_TOKEN&lt;/b&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;/b&gt; 5번으로 이동. 아까 만들어둔 토큰 복붙&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;&lt;b&gt;APNS_HOST_NAME&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;수정안해도 됨&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;15. 스크립트 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677580689656&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; ./send_notification.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;만약 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;zsh: permission denied: ./send_notification.sh&lt;/span&gt; 이런식으로 권한 거부 메시지가 나오면..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;실행권한이 없는거여서 실행권한을 부여해줘야함.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677580794209&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod 755 send_notification.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;권한 부여하고 다시 스크립트 실행 ㄱㄱ&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;전부 제대로 입력했다면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 7.43.36.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYh7pt/btr1dlo1x4s/yLXGK6zk0GtoefOLS7g9RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYh7pt/btr1dlo1x4s/yLXGK6zk0GtoefOLS7g9RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYh7pt/btr1dlo1x4s/yLXGK6zk0GtoefOLS7g9RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYh7pt%2Fbtr1dlo1x4s%2FyLXGK6zk0GtoefOLS7g9RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1038&quot; height=&quot;518&quot; data-filename=&quot;스크린샷 2023-02-28 오후 7.43.36.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;뭐 이런거 쫘라락 나오고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_9235.jpg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu1VMO/btr07zH8sT2/5d2WAx8jHJnIkWnhlT03T0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu1VMO/btr07zH8sT2/5d2WAx8jHJnIkWnhlT03T0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu1VMO/btr07zH8sT2/5d2WAx8jHJnIkWnhlT03T0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu1VMO%2Fbtr07zH8sT2%2F5d2WAx8jHJnIkWnhlT03T0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;247&quot; data-filename=&quot;IMG_9235.jpg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;야호 ㅠㅠㅠ!!!!!&amp;nbsp;한번에 되가지고 행복..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 개선해보기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;지금 curl 쪽 명령어 보면 data 부분이&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677581860735&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'{&quot;aps&quot;:{&quot;alert&quot;:&quot;test&quot;}}'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 되어있어서 가독성이 떨어지는데, 이것도 변수로 빼보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;APNS_HOST_NAME 밑에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677581934242&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;read -r -d '' PAYLOAD &amp;lt;&amp;lt;'EOF'
{
   &quot;aps&quot;: {
      &quot;badge&quot;: 1,
      &quot;alert&quot;: {
         &quot;title&quot;: &quot;불꽃남자&quot;,
         &quot;subtitle&quot;: &quot;정대만&quot;,
         &quot;body&quot;: &quot;❤️&quot;
      }
   }
}
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대충 이런식으로 정의해두고, curl 부분을 아래와같이 수정해주기!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677581957974&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -v --header &quot;apns-topic: $TOPIC&quot; --header &quot;apns-push-type: alert&quot; --header &quot;authorization: bearer $AUTHENTICATION_TOKEN&quot; --data &quot;${PAYLOAD}&quot; --http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 &quot;${PAYLOAD}&quot;로 바꾼거밖에 없음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다시 스크립트 실행하면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_1DEDBFA248C6-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbVDyQ/btr1nC4wFyY/mElT0zXKkaTP6fLQpT274k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbVDyQ/btr1nC4wFyY/mElT0zXKkaTP6fLQpT274k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbVDyQ/btr1nC4wFyY/mElT0zXKkaTP6fLQpT274k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbVDyQ%2Fbtr1nC4wFyY%2FmElT0zXKkaTP6fLQpT274k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;267&quot; data-filename=&quot;IMG_1DEDBFA248C6-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;야호&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# APNs 에러&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보내고나면 이게 성공적으로 보내졌는지, 에러가 났는지 나온다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;200이면 정상적으로 보내진건데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 8.05.14.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G3tPy/btr0WeEBfDJ/rZ7DuJya6P3V9ntq29fMbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G3tPy/btr0WeEBfDJ/rZ7DuJya6P3V9ntq29fMbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G3tPy/btr0WeEBfDJ/rZ7DuJya6P3V9ntq29fMbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG3tPy%2Fbtr0WeEBfDJ%2FrZ7DuJya6P3V9ntq29fMbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;920&quot; height=&quot;146&quot; data-filename=&quot;스크린샷 2023-02-28 오후 8.05.14.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 처럼 에러케이스들이 몇개 있음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-28 오후 8.06.20.png&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M9GzN/btr0VJxSxzD/khmsGy5XpuiQE2B5Aoq65k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M9GzN/btr0VJxSxzD/khmsGy5XpuiQE2B5Aoq65k/img.png&quot; data-alt=&quot;https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M9GzN/btr0VJxSxzD/khmsGy5XpuiQE2B5Aoq65k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM9GzN%2Fbtr0VJxSxzD%2FkhmsGy5XpuiQE2B5Aoq65k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1404&quot; height=&quot;728&quot; data-filename=&quot;스크린샷 2023-02-28 오후 8.06.20.png&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Status Code랑 Reason이 나오니깐 참고하기!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;전체 코드는 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://gist.github.com/Zedd0202/46d5ac491160c9422f8cc90f327e3e6d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;gist&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에&amp;nbsp;올려두었으니&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/46d5ac491160c9422f8cc90f327e3e6d.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;변수 부분들만 수정해서 사용하시면 됩니다~!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;저는 개인적으로 간단히 푸시 테스트 해보고싶을때 요거 완전 유용하게 잘 쓸 것 같아요..!?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt; 일단 Firebase 관련 세팅을 안해도 된다는게 굿&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;s&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이걸 이제야 알다니&amp;nbsp;&lt;/span&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;틀린 부분있으면 댓글 남겨주세요!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부</category>
      <category>APNS</category>
      <category>Notification</category>
      <category>p12</category>
      <category>P8</category>
      <category>Push</category>
      <category>Remote Notification</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1384</guid>
      <comments>https://zeddios.tistory.com/1384#entry1384comment</comments>
      <pubDate>Tue, 28 Feb 2023 20:02:25 +0900</pubDate>
    </item>
    <item>
      <title>[iOS 16+] Live Activity</title>
      <link>https://zeddios.tistory.com/1382</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기술조사가 필요해서 간단히 정리해보기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Live&amp;nbsp;Activity&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱의 최신 정보를 표시하여, 사람들이 이벤트 또는 작업의 진행상황을 한눈에 볼 수 있도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Live&amp;nbsp;Activity는 아이폰에서&lt;b&gt;만&lt;/b&gt; 사용가능&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Live&amp;nbsp;Activity가 나타날 수 있는 위치&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 잠금화면&lt;/b&gt; (Dynamic&amp;nbsp;Island 지원여부와 상관없이 16+&amp;nbsp;모든 디바이스에서 나타남.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2-1. Dynamic&amp;nbsp;Island 지원 O&lt;/b&gt; ➡️&amp;nbsp;Dynamic&amp;nbsp;Island에 나옴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2-2. Dynamic&amp;nbsp;Island 지원 X&lt;/b&gt; ➡️&amp;nbsp;사람들이&amp;nbsp;홈&amp;nbsp;화면을&amp;nbsp;보거나&amp;nbsp;다른&amp;nbsp;앱을&amp;nbsp;사용하는&amp;nbsp;동안&amp;nbsp;잠시상단 화면에 나타나는 배너 (앱에서&amp;nbsp;업데이트가&amp;nbsp;사람들을&amp;nbsp;방해할&amp;nbsp;만큼&amp;nbsp;중요하다고&amp;nbsp;판단하는&amp;nbsp;경우에만&amp;nbsp;표시됨.&amp;nbsp;이건 따로 코드로 작업해줘야하는거라 일반적인(?) 상황에서는 안보이는게 맞음.&amp;nbsp;)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;live-activity-notch-dark_2x.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dACyga/btrZH2dsr3g/kyO0pDcyjZ8FkI3bI7iFk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dACyga/btrZH2dsr3g/kyO0pDcyjZ8FkI3bI7iFk1/img.png&quot; data-alt=&quot;잠금화면에서 보여질 때 /&amp;amp;amp;nbsp;Dynamic&amp;amp;amp;nbsp;Island 지원 X &amp;amp;amp;&amp;amp;amp; 배너형태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dACyga/btrZH2dsr3g/kyO0pDcyjZ8FkI3bI7iFk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdACyga%2FbtrZH2dsr3g%2FkyO0pDcyjZ8FkI3bI7iFk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;928&quot; height=&quot;891&quot; data-filename=&quot;live-activity-notch-dark_2x.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잠금화면에서 보여질 때 /&amp;amp;nbsp;Dynamic&amp;amp;nbsp;Island 지원 X &amp;amp;&amp;amp; 배너형태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 권한&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Live&amp;nbsp;Activity는 따로 권한 요청 Alert를 띄우는건 아니고..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;처음에 잠금화면에서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5n6nS/btrZImPZMQ8/gjK2oRKpArAZrTb53Qk9g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5n6nS/btrZImPZMQ8/gjK2oRKpArAZrTb53Qk9g0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (3rd generation) - 2023-02-16 at 22.28.34.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5n6nS/btrZImPZMQ8/gjK2oRKpArAZrTb53Qk9g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5n6nS%2FbtrZImPZMQ8%2FgjK2oRKpArAZrTb53Qk9g0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c23dkO/btrZIG1Jj4a/tgJtr1349rkGF87zrMAtB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c23dkO/btrZIG1Jj4a/tgJtr1349rkGF87zrMAtB0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (3rd generation) - 2023-02-17 at 14.37.03.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c23dkO/btrZIG1Jj4a/tgJtr1349rkGF87zrMAtB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc23dkO%2FbtrZIG1Jj4a%2FtgJtr1349rkGF87zrMAtB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 뜬다. (잠금화면에서만 나오고,&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;Dynamic&amp;nbsp;Island 에서는 따로 권한 설정 버튼이 나오진 않는다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;설정에서 각 앱의 &lt;b&gt;실시간 현황(Live&amp;nbsp;Activity)&lt;/b&gt; 권한을 on/off 할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;권한을 off하면 Dynamic&amp;nbsp;Island에서도 안나옴.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Presentation&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;시스템이 Live&amp;nbsp;Activity를 표시하기 위해 여러 Presentation을 사용함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;Compact&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;Minimal&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;Expanded&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;Lock Screen&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Live&amp;nbsp;Activity를 지원하는 모든 디바이스 제대로 동작할 수 있도록 모든 타입을 지원해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 제약&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Live&amp;nbsp;Activity는 앱이나 사용자가 종료하지 않는 이상 &lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic'; background-color: #f6e199;&quot;&gt;최대 8시간 동안 활성화 될 수 있음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;이 8시간 제한이 지나면 시스템이 자동으로 종료&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Live&amp;nbsp;Activity이 종료되면 시스템은 이를 Dynamic&amp;nbsp;Island에서 즉시 제거&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Live&amp;nbsp;Activity는 사람 or 시스템이 제거하기 전 최대 4시간 동안 잠금 화면에 남아있음.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;결과적으로 Live&amp;nbsp;Activity는 &lt;b&gt;최대 12시간&lt;/b&gt;동안 &lt;b&gt;잠금화면에&lt;/b&gt; 남아있을 수 있음.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;2. 디바이스 presentation 크기보다 작거나 같은 해상도를 사용하려면&amp;nbsp;Live&amp;nbsp;Activity에 대한 이미지 Asset이 시스템에 필요함.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Live&amp;nbsp;Activity Presentation 크기보다 큰 이미지 Asset을 사용하는 경우, 시스템이 Live&amp;nbsp;Activity를 시작하지 못할 수 있음.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;참고 : &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/design/human-interface-guidelines/components/system-experiences/live-activities&quot;&gt;Human Interface Guidelines &amp;gt; Live Activities&lt;/a&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;3. 각 Live&amp;nbsp;Activity는 자체 샌드박스에서 실행되며, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Widget과 달리 네트워크에 접근하거나 위치 업데이트를 받을 수 없음&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;현재 실행중인 Live&amp;nbsp;Activity의 동적 데이터를 업데이트하려면,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;앱에서 ActivityKit 프레임워크를 사용하거나, ActivityKit 푸시알림을 사용할 수 있음.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;But&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;업데이트된 동적&amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot; data-token-index=&quot;1&quot;&gt;데이터는 크기가 4KB&lt;/span&gt;&lt;/b&gt;를 초과할 수 없음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;참고 : &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/activitykit/updating-and-ending-your-live-activity-with-activitykit-push-notifications&quot;&gt;Updating and ending your Live Activity with ActivityKit push notifications&lt;/a&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;Best practices&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 시작과 끝이 있는 작업 / 라이브 이벤트에 대해 Live&amp;nbsp;Activity를 제공할 것&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;8시간을 초과하는 작업에 대해서는 Live&amp;nbsp;Activity를 제공하지 말고, 작업/이벤트가 종료된 직후에 Live&amp;nbsp;Activity를 잘 종료하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. 정말 필수적인 컨텐츠만 제시할 것 (== TMI ㄴㄴ)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사람들은 작업/이벤트에 대한 요약, 핵심정보를 얻는걸 좋아하지 세부정보 표시하지 말것.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. 새로운 컨텐츠를 사용할 수 있을때만&amp;nbsp;Live&amp;nbsp;Activity 업데이트 / 주의를 끄는것이 꼭 필요한 경우에만 유저에게 알리기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Live&amp;nbsp;Activity는 그냥 혼자 업데이트 하면 되는데, 꼭 유저에게 알려야겠다면 꼭 필요할 때만 알려라..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;너무 자주 경고하거나, 중요하지 않은 업데이트에 대해 계속 알리면 짜증나고 &lt;b&gt;결국&amp;nbsp;Live&amp;nbsp;Activity 사용을 중단하도록 할 수 있음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Dynamic&amp;nbsp;Island를 지원하지 않는 기기 &amp;amp;&amp;amp; 사용자에게 Alert을 보내는 코드를 작성하게 되면&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와같이 배너로 뜨게 되는데,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이게 홈 or 다른 앱을 사용중일때 뜰 수 있기 때문에 진짜 꼭 필요할때만 유저가 알 수 있도록 하기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-17 오후 4.09.15.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AhSOw/btrZJcGhYvg/KrbpHo2EEcp1vi3DSodps1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AhSOw/btrZJcGhYvg/KrbpHo2EEcp1vi3DSodps1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AhSOw/btrZJcGhYvg/KrbpHo2EEcp1vi3DSodps1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhSOw%2FbtrZJcGhYvg%2FKrbpHo2EEcp1vi3DSodps1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;920&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2023-02-17 오후 4.09.15.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. Live&amp;nbsp;Activity에 민감한 정보 표시 X&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Live&amp;nbsp;Activity를 탭해야 더 많은 정보를 얻도록 하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;5. Live&amp;nbsp;Activity를 사용하여 광고 또는 프로모션 X&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;6. 사용자가 직접 Live&amp;nbsp;Activity의 시작과 종료를 제어할 수 있도록 하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[시작]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱 내에서 Live&amp;nbsp;Activity를 시작하도록 하는 버튼을 제공하는 것도 괜찮음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데!!!! Live&amp;nbsp;Activity가 자동으로 시작될것으로 예상하는 몇가지 상황이 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ex. 음식 배달, 차량 호출 등을 했을 때 즉시 자동으로&amp;nbsp;Live&amp;nbsp;Activity를 시작하는 게 좋음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic'; background-color: #f6e199;&quot;&gt;&lt;b&gt;But. 설정에서 Live&amp;nbsp;Activity를 끌 수 있으므로 예상하지 못한 Live&amp;nbsp;Activity를 시작하여 사람들을 놀라게 하지 않는것이 중요!!!!!!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[종료]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;작업/이벤트가 완료되지 않아도 사람들이 Live&amp;nbsp;Activity를 종료할 수 있도록 Live&amp;nbsp;Activity를 중지하거나 취소하는 버튼을 제공할 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그 Live&amp;nbsp;Activity 보여주는 Presentation쪽에서 보여줘야한다는건 아니고, 앱 내에서 종료할 수 있도록 제공하라~~는 뜻&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;참고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/design/human-interface-guidelines/components/system-experiences/live-activities/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;https://developer.apple.com/design/human-interface-guidelines/components/system-experiences/live-activities/&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>Dynamic Island</category>
      <category>Live Activity</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1382</guid>
      <comments>https://zeddios.tistory.com/1382#entry1382comment</comments>
      <pubDate>Mon, 20 Feb 2023 10:12:30 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] Escape sequence / Extended String Delimiters</title>
      <link>https://zeddios.tistory.com/1381</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 용어 정리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;String literals&lt;/b&gt; - 소스의 문자 시퀀스(sequence&amp;nbsp;of&amp;nbsp;characters) &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;String&amp;nbsp;delimiters&lt;/b&gt; - 문자 시퀀스(sequence&amp;nbsp;of&amp;nbsp;characters)의 시작과 끝에서 경계를 설정. Swift의 string&amp;nbsp;delimiter는 &quot;(큰따옴표)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Escape&amp;nbsp;characters&lt;/b&gt; - String literals내에서 하나 이상의 후속 Character를 특별하게 해석한다. Swift의 Escape&amp;nbsp;character는 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;(백슬래시)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Escape&amp;nbsp;character&amp;nbsp;sequences&lt;/b&gt;(== Escape sequence) - 특수한 문자를 나타내며,&amp;nbsp;Escape&amp;nbsp;characters(&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;)로 시작하게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Escape sequence는 다음과 같은것들이 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. String&amp;nbsp;interpolation(문자열 보간)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675583863283&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let name = &quot;정대만&quot;
let str = &quot;불꽃남자 \(name)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. E&lt;b&gt;scaped special characters&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675583984418&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\0 (null character), 
\\ (backslash), 
\t(horizontal tab), 
\n (line feed), 
\r (carriage return), 
\&quot; (double quotation mark) 
\' (single quotation mark)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;3. 유니코드 스칼라 나타내기&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675583916264&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let sparklingHeart = &quot;\u{1F496}&quot; //  &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Escaped special characters&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 escape sequence중 2번인&amp;nbsp;Escaped special characters를 사용할 때를 보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675582461103&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = &quot;정대만\t&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;t는 horizontal tab을 의미하기 때문에 컴파일러가 아 ㅇㅋ 하면서 컴파일에러가 나지 않지만..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675582461103&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = &quot;정대만\e&quot; // ⛔️ Invalid escape sequence in literal&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift에서는 반드시 이&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;escaped special characters가 유효한 것이어야 하는데, &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;e같은것들은 유효하지 않기 때문에 에러가 발생하는 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이러한 String literal에서 굳이 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;(백슬래시)를 사용하여 문자를 나타내고 싶다면,&amp;nbsp;&lt;b&gt;또 다른&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; \&lt;/span&gt;(백슬래시)로 escape해야한다. (&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\\&lt;/span&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675582461104&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = &quot;정대만\\e&quot; // ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Invalid escape sequence in literal 에러는&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Multiline String Literals에서도 동일하게 발생한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675582461104&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = &quot;&quot;&quot;
            	정대만\e // ⛔️ Invalid escape sequence in literal
          &quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Raw&amp;nbsp;string&amp;nbsp;literals&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Raw&amp;nbsp;string&amp;nbsp;literals은 escape sequence를 무시한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;즉, 위에서 우리가 봤던 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1.&amp;nbsp;String&amp;nbsp;interpolation(문자열 보간)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Escaped special characters&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;3. 유니코드 스칼라 나타내기&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;는 Raw&amp;nbsp;string&amp;nbsp;literals에서는 무시되고 &quot;Raw(원시)&quot; Text로 나타낼 수 있게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift 5.0에서 이를 가능하게 하는&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;Extended String Delimiters&lt;/b&gt; 라는 것이 나왔다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Extended String Delimiters #&quot;..&quot;#&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Extended String Delimiters를 사용하면 raw&amp;nbsp;string&amp;nbsp;literal를 나타낼 수 있게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;#&quot;String literal&quot;&lt;/b&gt;&lt;b&gt;#&lt;/b&gt;&lt;/span&gt; 로 표현할 수 있다. 원래 &quot;(큰따옴표)로 감싸줘야하니&amp;nbsp;양 끝에 #을 붙힌다고 생각하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. String&amp;nbsp;interpolation(문자열 보간)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675584905650&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let name = &quot;정대만&quot;
let str = #&quot;불꽃남자 \(name)&quot;# // 불꽃남자 \(name)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;불꽃남자 정대만이 나오지 않고 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;(name) 그 자체가 나오게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Escaped special characters&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675584962175&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = #&quot;서태웅\n서태웅\e&quot;# // 서태웅\n서태웅\e&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;n이&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;escaped special characters임에도 불구하고 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;n그대로 나온것을 볼 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;유니코드 스칼라 나타내기&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675585091371&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let sparklingHeart = #&quot;\u{1F496}&quot;# // \u{1F496}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; 로 나오지 않고 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;u{1F496}문자 그자체가 나온것을 볼 수 있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;문자열을 감싸는 #의 개수는 상관없다. 앞뒤 #의 개수가 맞기만 하면 된다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675584989489&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = ####&quot;서태웅\n서태웅\e&quot;#### // 서태웅\n서태웅\e&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Extended String Delimiters +&amp;nbsp;&lt;/span&gt;Multiline String Literals조합도 당연히 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675585032924&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = #&quot;&quot;&quot;
서태웅
\n
서태웅
\e
&quot;&quot;&quot;#
// 서태웅
// \n
// 서태웅
// \e&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그렇다면 Extended String Delimiters를 사용하면 무조건 escape sequence는 무시되는 것일까?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;아니다. 요것도 필요하다면 할 수 있는데,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;(백슬래시) 다음에 #를 붙혀주는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. String&amp;nbsp;interpolation(문자열 보간)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675585281495&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let name = &quot;정대만&quot;
let str = #&quot;불꽃남자 \#(name)&quot;# // 불꽃남자 정대만&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Escaped special characters&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675585335792&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = #&quot;서태웅\#n서태웅\e&quot;#
// 서태웅
// 서태웅\e&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;유니코드 스칼라 나타내기&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675585393123&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let sparklingHeart = #&quot;\#u{1F496}&quot;# //  &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이때 주의해야할 사항이 있는데,&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;(백슬래시)뒤에 붙는 #의 개수가 문자열을 감싼 #의 개수가 맞아야 한다는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675585497820&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = ##&quot;서태웅\#n서태웅\e&quot;## 
// 서태웅\#n서태웅\e 

let str = ##&quot;서태웅\##n서태웅\e&quot;##
// 서태웅
// 서태웅\e&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;첫번째 str은 2개의 #으로 감싸져있지만 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;#n으로 나타냈기 때문에 &lt;b&gt;E&lt;b&gt;scaped special characters가 무시되고 그냥 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;#n문자 그 자체가 나온것을 볼 수 있다.&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#을 몇개를 붙히든 상관없다. 문자열을 감싼 #과 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;뒤에 붙는 #의 개수가 맞기만 하면된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Extended String Delimiters +&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Multiline String Literals 조합에서도 적용되는 규칙이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675585667957&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = ##&quot;&quot;&quot;
서태웅\##n
서태웅
\e
&quot;&quot;&quot;##
// 서태웅
// 
// 서태웅
// \e&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;문자열을 감싼 #가 2개니, &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;n을 문자열 그대로가 아닌&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;escaped special characters로서 나타내고 싶다면&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;##n으로 표시해줘야하는 것.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Extended String Delimiters는&amp;nbsp;&lt;/span&gt;정규식에서 굉장히 유용한 기능인데, 예를 들어 정규식에서는 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;d는 [0-9]를 나타낸다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만 Swift에서는 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;d는 유효하지 않은 escaped character이기 때문에 한번더 escape하여 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\\&lt;/span&gt;d로 표현해줘야한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675585783316&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func isValid(_ digits: String) -&amp;gt; Bool {

    let pattern = &quot;\\d&quot; // &quot;\d&quot;로 할 경우 컴파일에러
    let range = digits.range(of: pattern, options: .regularExpression)
    return range != nil
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;짧은 정규식은 괜찮을지 몰라도, 계속 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\\&lt;/span&gt;를 붙혀주다보면 가독성도 떨어지기 마련인데&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Extended String Delimiters를 사용하면 &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;d로만 적어줘도 되는 것이다. &lt;span style=&quot;color: #000000;&quot;&gt;(== &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;\&lt;/span&gt;(백슬래시)를 한번만 적어줘도 되는것이다.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675585847012&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func isValid(_ digits: String) -&amp;gt; Bool {

    let pattern = #&quot;\d&quot;# 
    let range = digits.range(of: pattern, options: .regularExpression)
    return range != nil
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span&gt;Regex 공부하다가 요거 먼저 정리해두면 좋을 것 같아서.. 틀린부분이 있다면 댓글 달아주세요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;애매하게 알던 지식이었는데, 이번기회에 확실하게 알게 된 것 같아서 좋네요!&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;예제는 아 얘 슬램덩크 진짜 재밌게 봤나보다...하고 넘어가주세여ㅛ &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;슬램덩크라는거 정말 아름다운거였구나&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[참고]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0200-raw-string-escaping.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/apple/swift-evolution/blob/main/proposals/0200-raw-string-escaping.m&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Swift</category>
      <category>escape sequence</category>
      <category>Swift</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1381</guid>
      <comments>https://zeddios.tistory.com/1381#entry1381comment</comments>
      <pubDate>Sun, 5 Feb 2023 17:44:41 +0900</pubDate>
    </item>
    <item>
      <title>[Swift 5.7] Actor 관련 warning들 원인 파악해보기</title>
      <link>https://zeddios.tistory.com/1379</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14.2로 올리고 Actor관련 warning 3종류를 보게 되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift 5.7에 대한 변경사항때문인지는 확실하지는 않지만;; 일단 그런것으로 생각하기로함 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일단 내가 파악해본것을 써보려고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Actor-isolated instance method 'testMethod()' can not be referenced from a non-isolated context; this is an error in Swift 6&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Actor-isolated property 'name' can not be mutated from a non-isolated context; this is an error in Swift 6&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Cannot access property 'disposeBag' here in non-isolated initializer; this is an error in Swift 6&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1.&amp;nbsp;Actor-isolated instance method 'testMethod()' can not be referenced from a non-isolated context; this is an error in Swift 6&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1675072323187&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;actor Person {
    
    init() {
        testMethod() // ⚠️ Actor-isolated instance method 'testMethod()' can not be referenced from a non-isolated context; this is an error in Swift 6
    }
    
    func testMethod() {}
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 actor의 프로퍼티, 인스턴스 메소드는 전부 isolation하니 initializer도 그런 줄 알았는데, 아닌 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;testMethod -&amp;gt; isolation&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;initializer -&amp;gt; non-isolation&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;non-isolation한 곳에서 isolation한 메소드를 호출하는것은 암시적으로 비동기로 호출된다고 한다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675092429173&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Calls to instance method 'testMethod()' from outside of its actor context are implicitly asynchronous&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;해결방법 1 - init을 async하게 만든다. (비동기로 호출되고 있다고 했으니까)&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675092606933&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;actor Person {
    
    init() async {
        testMethod()
    }
    
    func testMethod() {}
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;해결방법 2 - Task &amp;amp; await 조합&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Task로 묶어주고..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675092687924&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;init() {
    Task {
        self.testMethod()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;원래 Task로 묶어줘도 async가 아닌 메소드는 await을 안써도 되는 것은 알고있을것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;testMethod는 async메소드가 아니지만.. 암시적으로 비동기로 호출되고 있기 때문에 await을 붙혀주지 않으면 컴파일 에러가 난다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;최종!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675092726763&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;actor Person {
    
    init() {
        Task {
            await self.testMethod()
        }
    }
    
    func testMethod() {}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2.&amp;nbsp;&amp;nbsp;Actor-isolated property 'name' can not be mutated from a non-isolated context; this is an error in Swift 6&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1675142162967&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;actor Person {
    
    var name: String = &quot;&quot;
    let disposeBag = DisposeBag()
    
    init() {
        Observable&amp;lt;Int&amp;gt;.interval(.seconds(1), scheduler: MainScheduler.asyncInstance)
            .subscribe(onNext: { _ in
                self.name = &quot;Zedd&quot; // ⚠️ Actor-isolated property 'name' can not be mutated from a non-isolated context; this is an error in Swift 6
            }).disposed(by: disposeBag)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대충 이런 컨텍스트에서 warning이 나고있는데, 설명으로 아래와 같이 나오고 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675142379777&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Mutation of this property is only permitted within the actor&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 프로퍼티의 변경은 actor 내에서만 허용된다..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;처음에는 actor안에서 변경중인데 왜이래;; 하면서 너무 헷갈렸는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;저렇게 비동기 컨텍스트를 가지면서 저게 &lt;b&gt;actor바깥에서 실행되기 때문인 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675143723946&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;actor Person {
    
    var name: String = &quot;&quot;

    init() {
        Task {
            self.name = &quot;zedd&quot; // ⛔️ error! Actor-isolated property 'name' can not be mutated from a non-isolated context
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Task로 하면 warning이 아니라 error가 뜬다. RxSwift로 짠 코드도 Swift 6가면 에러가 된다고 하니.. 미리미리 수정해두면 좋을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;당연히 위의 Task, RxSwift 코드를 actor의 인스턴스 메소드에서 실행하면 아무 warning도 뜨지 않는데, initializer안에서 해서 그런 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;해결방법&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;굳이 initializer에서 name을 바꿔야한다면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675145595830&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;actor Person {
    
    var name: String = &quot;&quot;
    let disposeBag = DisposeBag()
    
    init() {
        Observable&amp;lt;Int&amp;gt;.interval(.seconds(1), scheduler: MainScheduler.asyncInstance)
                   .subscribe(onNext: { _ in
                       Task {
                           await self.setName(&quot;Zedd&quot;)
                       }
                   }).disposed(by: disposeBag)
    }
    
    func setName(_ name: String) async {
        self.name = name
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;initializer내부에서 수정하는게 아니라 name만 처리하는 인스턴스 메소드 하나 만들어서 처리하기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그게 아니라면 인스턴스 메소드로 하나 빼고 1번의 해결방법으로 수정하기&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675146040873&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;actor Person {
    
    var name: String = &quot;&quot;
    let disposeBag = DisposeBag()
    
    init() {
        Task {
            await bind()
        }
    }
    
    func bind() {
    	Observable&amp;lt;Int&amp;gt;.interval(.seconds(1), scheduler: MainScheduler.asyncInstance)
            .subscribe(onNext: { _ in
                self.name = &quot;Zedd&quot;
            }).disposed(by: disposeBag)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Cannot access property 'disposeBag' here in non-isolated initializer; this is an error in Swift 6&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1675143855329&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;actor Person {
    
    var name: String = &quot;&quot;
    let disposeBag = DisposeBag()
    
    init() {
        Observable&amp;lt;Int&amp;gt;.interval(.seconds(1), scheduler: MainScheduler.asyncInstance)
            .subscribe(onNext: { _ in
                self.name = &quot;Zedd&quot; 
            }).disposed(by: disposeBag) // ⚠️ Cannot access property 'disposeBag' here in non-isolated initializer; this is an error in Swift 6
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2번과 똑같은 예제에서 disposeBag부분에서 warning이 뜨고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자세한 설명을 보면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675143889649&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;After making a copy of 'self', only non-isolated properties of 'self' can be accessed from this init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;'self'의&amp;nbsp;복사본을&amp;nbsp;만든&amp;nbsp;후에는 이 initializer에서(== non-isolated initializer) 'self'의 non-isolated 프로퍼티에만&amp;nbsp;액세스할&amp;nbsp;수&amp;nbsp;있다고 나온다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;subscribe부분에서 self가 캡쳐되어 self의 복사본이 만들어진 후에 actor의 isolated 프로퍼티에 접근하는것이 안되는 것 같다?..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;nonisolated&amp;nbsp;키워드를 붙히고 싶은 욕구가 들지만 computed와 메소드에만 붙힐 수 있다.&amp;nbsp;&lt;b&gt;즉 date race를 일으키지 않는것들만 붙힐 수 있고,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;var같은 mutable property는 non-isolated가 되면 data race를 일으킬 수 있기 때문에 붙힐 수 없다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 RxSwift 예제 말고 좀 더 쉽게 보면..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675144213434&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;actor Person {
    
    var name: String = &quot;&quot;

    init() {
        Task {
            await self.testMethod()
        }

        self.name = &quot;Zedd&quot; // ⚠️ Cannot access property 'name' here in non-isolated initializer; this is an error in Swift 6
    }
    
    func testMethod() {}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Task내부에서 self가 복사된 후에 name에 접근하는&amp;nbsp;이런 흐름..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;결국 initializer가 non-isolated하기 때문에 이런 일들이 일어나는 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;아무튼 3번문제도 2번의 해결방법으로 자연스럽게 해결됨.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0327-actor-initializers.md&quot;&gt;SE-0327&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 이해하는데 너무 어려웠어서 내가 우아하게 해결한건지는 잘 모르겠는데..&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(status는 Accepted이나&lt;/span&gt;&amp;nbsp;&lt;a href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;Xcode 14 Release Notes&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 보면 SE-0327에 대한 내용이 일부 구현이 된 것 같다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;내가 틀린 말을 했거나;; 더 좋은 방법이 있다면 댓글 부탁드립니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1379</guid>
      <comments>https://zeddios.tistory.com/1379#entry1379comment</comments>
      <pubDate>Tue, 31 Jan 2023 15:31:31 +0900</pubDate>
    </item>
    <item>
      <title>2022년 회고와 2023년 다짐</title>
      <link>https://zeddios.tistory.com/1378</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/652&quot;&gt;2018년 회고와 2019년 다짐&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/928&quot;&gt;2019년 회고와 2020년 다짐&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1192&quot;&gt;2020년 회고와 2021년 다짐&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1330&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021년 회고와 2022년 다짐&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2018년부터 회고를 쓰기 시작했지만,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 연말에 회고해야하는것도 아닌데..뭔가 숙제같은 기분이 들기도 하고&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;lsquo;이럴거면 그냥 쓰지말자~~!!!~~!!!!&amp;rsquo;고 생각했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어쩌다 내가 작년에 쓴 회고를 다시 보게됐는데, 읽는데 너무 즐거운 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아 진짜 이때 이랬지&amp;hellip;..엄청 오래된 일 같았는데 작년이라니!! 하는 이런저런 생각이 들면서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Zedd : 연말하면 회고지&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;혼자 그냥 개인적으로 써도 되지만, 이왕 쓰기로한거 원래대로 티스토리에 써보려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 이번에는 이런저런 생각이 들었어서..쓰기전에 주절주절 말해봤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;올해 내가 느꼈던 것들 위주로 써보려고 한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 올해의 키워드&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;올해 나에게 큰 변화를 가져다줬던 것들이 몇 가지있는데, 내면으로나 외면으로나 나를 한뼘 더 자라게 해준 고마운 것들이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 중국어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 첫 해외여행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 다이어트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 독서모임&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 중국어&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;작년 9월 말부터 듀오링고로 중국어 공부를 시작해서.. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;작년 회고 쓸때쯤에는 70일? 80일정도 밖에 안했던때라 아는 중국어도 극히 적었었다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;일단 오늘(12/31) 기준으로 462일째 공부중인데, 1년 넘게 (듀오링고로만..) 중국어를 공부하면서 느낀 것들을 써보려고 한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;(새삼 듀오링고의 리텐션이 어마어마하겠다는 생각이 든다..)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;중국어가 나에게 변화를 줬다고 생각하는 포인트는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 일상생활에서 &lt;b&gt;어 이거 중국어로 뭘까?&lt;/b&gt; 하는 생각을 엄청 많이 하게 됐다는 거!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 외에도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ 한자로 된 간판 중국어로 읽어보기 (번외로 아파트도 있음zzz)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&lt;/span&gt;&amp;nbsp;중국음식점가서 메뉴판보면 중국어 있나 찾아보기 &amp;rarr; 아는 단어 나오면 혼자 내심 뿌듯해함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&lt;/span&gt;&amp;nbsp;박물관같은게 가서 설명문? 같은거 보면 중국어부터 읽어봄&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&lt;/span&gt;&amp;nbsp;(중국인이 하는 마라탕 먹으러 갔을 때) 주방에서 말하는거 들을려고 귀 쫑긋하고 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&lt;/span&gt;&amp;nbsp;중국인이 길 물어봤을 때의 대처 시뮬레이션 (제발 중국인과 이야기해보고싶다는 내 염원이 담겼다고 볼 수 있음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;✔️&lt;/span&gt;&amp;nbsp;중국어로 언어유희 (아무도 이해못하기 때문에 혼자 하고 혼자 웃음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;굉장히 소소하게 보일 수 있는데, 그냥.. 이런 소소한것들을 궁금해하고 상상하고 있는 나를 보고있으면 신기하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 예전엔 몰랐던 단어들이 눈에 들어올 때의 그 기쁨, 뿌듯함은 말로 표현이 안된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;올해 5월에는 작고 귀여운 HSK 2급에도 도전했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;시험보고 한달 뒤 쯤 성적표가 우편으로 날라온다. (온라인에서도 확인할 수 있음)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_8602.jpg&quot; data-origin-width=&quot;2656&quot; data-origin-height=&quot;3262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5Sc6t/btrUVi0zsjv/fjQTa3Rh1FBivSQV6fcrcK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5Sc6t/btrUVi0zsjv/fjQTa3Rh1FBivSQV6fcrcK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5Sc6t/btrUVi0zsjv/fjQTa3Rh1FBivSQV6fcrcK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5Sc6t%2FbtrUVi0zsjv%2FfjQTa3Rh1FBivSQV6fcrcK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2656&quot; height=&quot;3262&quot; data-filename=&quot;IMG_8602.jpg&quot; data-origin-width=&quot;2656&quot; data-origin-height=&quot;3262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2급이 어려운 급수도 아니고 &amp;nbsp;(1급이 가장 낮은 급)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자격증을 따서 어디 쓸데도 없지만&amp;hellip;(심지어 토익처럼 2년 유효기간이 있음ㅎ)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 경험 자체가 나에게 너무 소중했다!!! 자세한 내용은 브런치에 썼으니 참고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://brunch.co.kr/@zedd/361&quot;&gt;https://brunch.co.kr/@zedd/361&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1672460531157&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;HSK 2급 지필 후기&quot; data-og-description=&quot;2022.05.14 | 2022.05.14 오늘, HSK 2급 지필시험을 봤다. HSK가 총 6급까지 있고, 2급은 쉬운축에 속한다고 볼 수 있는데..그렇게 잘 본건 아닌 것 같아서 ^^.... 후기를 쓸까말까 하다가..그래도 나중에 보&quot; data-og-host=&quot;brunch.co.kr&quot; data-og-source-url=&quot;https://brunch.co.kr/@zedd/361&quot; data-og-url=&quot;https://brunch.co.kr/@zedd/361&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f55Ob/hyQ5xe3z2v/zP8NljGp9KKjEChF92xSSk/img.jpg?width=1170&amp;amp;height=646&amp;amp;face=0_0_1170_646,https://scrap.kakaocdn.net/dn/cnC5Co/hyQ5uWXWa8/KaYrAAsJ5NS3111kj8MZd0/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/b0wFp8/hyQ6XpEOcG/r8ykGCNozDkIu7HEjkGKy1/img.jpg?width=1170&amp;amp;height=646&amp;amp;face=0_0_1170_646&quot;&gt;&lt;a href=&quot;https://brunch.co.kr/@zedd/361&quot; data-source-url=&quot;https://brunch.co.kr/@zedd/361&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f55Ob/hyQ5xe3z2v/zP8NljGp9KKjEChF92xSSk/img.jpg?width=1170&amp;amp;height=646&amp;amp;face=0_0_1170_646,https://scrap.kakaocdn.net/dn/cnC5Co/hyQ5uWXWa8/KaYrAAsJ5NS3111kj8MZd0/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/b0wFp8/hyQ6XpEOcG/r8ykGCNozDkIu7HEjkGKy1/img.jpg?width=1170&amp;amp;height=646&amp;amp;face=0_0_1170_646');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;HSK 2급 지필 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2022.05.14 | 2022.05.14 오늘, HSK 2급 지필시험을 봤다. HSK가 총 6급까지 있고, 2급은 쉬운축에 속한다고 볼 수 있는데..그렇게 잘 본건 아닌 것 같아서 ^^.... 후기를 쓸까말까 하다가..그래도 나중에 보&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brunch.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4급에도 도전해보려고 책도 샀는데..듀오링고와 수준차이가 갑자기 어마어마하게 나서 지레 겁먹고있는중 OTL&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;HSK도 올해 11월부터 9급까지 확장되었는데.. 언젠가 나도 9급을 볼 수 있는 날이 오겠지!?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그&lt;span style=&quot;color: #000000;&quot;&gt;리고 6월에 유튜브&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&amp;nbsp;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://www.youtube.com/@realchinese2534&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;진짜중국어 채널&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에서 운영하는 하루 한문장 챌린지에 도전했었다!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하루에 하나씩 유튜브 채널에 한문장씩 올라오고 설명적기 + 내가 그 문장 연습하고 녹음해서 보내는 식...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러면 선생님(진짜중국어 채널 주인..) 녹음해서 피드백을 보내주신다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;통과 될때까지 계속 다시 녹음해서 보내야함zzzzz ㅋ큐ㅠ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7vIjt/btrU6YTdNxZ/ddaITbVjROcKZgm611lAPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7vIjt/btrU6YTdNxZ/ddaITbVjROcKZgm611lAPk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_8608.PNG&quot; data-widthpercent=&quot;33.33&quot; style=&quot;width: 32.55813953488373%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7vIjt/btrU6YTdNxZ/ddaITbVjROcKZgm611lAPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7vIjt%2FbtrU6YTdNxZ%2FddaITbVjROcKZgm611lAPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qHR8W/btrUVjyAqPg/FTcvU9Y4IvbjayKuTzbQj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qHR8W/btrUVjyAqPg/FTcvU9Y4IvbjayKuTzbQj1/img.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_8609.PNG&quot; data-widthpercent=&quot;33.33&quot; style=&quot;width: 32.55813953488373%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qHR8W/btrUVjyAqPg/FTcvU9Y4IvbjayKuTzbQj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqHR8W%2FbtrUVjyAqPg%2FFTcvU9Y4IvbjayKuTzbQj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EVq36/btrU1MzpuBC/RlJyjFR4vVKaTFmvd7dvDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EVq36/btrU1MzpuBC/RlJyjFR4vVKaTFmvd7dvDK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_8610.PNG&quot; data-widthpercent=&quot;33.34&quot; style=&quot;width: 32.55813953488373%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EVq36/btrU1MzpuBC/RlJyjFR4vVKaTFmvd7dvDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEVq36%2FbtrU1MzpuBC%2FRlJyjFR4vVKaTFmvd7dvDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;챌린지 도전한 사람만 100명? 200명 가까이 되는것으로 알고있는데.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;진짜 꼼꼼하게 피드백해주시고 이분 진짜 대단하다고 생각함......zzzzzz 파고다에서 강의도 하시는 것 같던데..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이거하면서 느꼈던게..처음엔 진짜 바보같이 내가 피드백받는게 무서웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나는 중국어 발음도 유튜브 + 듀오링고로 공부하고 그냥 못하는게 너무너무너무 당연하고 걍 멍청이인데..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;저분이 녹음으로 피드백 보내주시면 재생버튼 누르는게 진짜 힘들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;점점 하다보니 'ㅇㅋ 피드백 할거리 없게 완벽하게 연습해서 보내주겠어' 라는 마인드를 장착하고..익숙해져서인지 처음보다는 쉽게 피드백 녹음을 재생할 수 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;나도 날 잘 모르겠다.. 이때의 내가 넘 븅딱같이 인상적이었어서 써봄..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 첫 해외여행&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 예전부터 귀찮음도 많고..집에있는 것을 좋아해서 여행과는 담을 쌓고 살았었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;i&gt;&lt;b&gt;여행? 구글어스로해&lt;/b&gt; (&lt;/i&gt;번외로&lt;i&gt; '&lt;b&gt;세계 여행? 오버워치로해&lt;/b&gt;'&lt;/i&gt; 도 있음&lt;i&gt;)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런 마인드였다가 작년부터 국내여행을 나름 자주 다니고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러다보니 비행기도 제주도 간다고 작년에 처음 타봤었고.. 여권은 아예 만들생각도 하지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그런데 갑자기 8월쯤 친구들이 같이 괌을 가자고 해서!!!!!!! 어찌저찌 같이 가게됐다. (가는건 12월)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;WWDC가 나의 첫 해외여행이지 않을까..했던 나에게는 정말 큰 도전이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왜 큰 도전이였나면..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 첫 해외여행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 첫 여권&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 첫 비행기표 예매 (내가 직접한건 처음..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. 첫 친구들과의 여행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;비행기표 예매부터 준비, 갔다올때까지 정말 내가 몰랐던 세계를 알게된 기분이었고..이 모든 것을 해낸 내가 뿌듯하다!?!?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;괌은 한국어패&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;치가 정말 잘되어있어서..여행하는데 수월하긴했지만 !!!!외국!!!! 이런 느낌이 없어서 아쉬웠다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;(하지만 첫 해외여행이 이런곳이었어서 다행이었을수도...)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;하지만 아쉬움보다는 내가 보고 느꼈던 좋은 것들이 훨씬 많아서 가길 정말 잘했다는 생각이 든다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(괌을 간건 12월이었어서) 한국은 추운데 그렇게 더운 나라를 간것도, 돌고래를 처음 본것도, 그렇게나 맑은 바다를 본것도, 스노우 쿨링, 물안경 너머로 보이던 수많은 물고기, 맑은 하늘, 맑은 하늘에 갑자기 내리는 비, 웃통까고 조깅하는 사람들 등등 모든게 처음이었고 신기했고, 좋았고..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 단순한 출국심사까지도 나에게 처음이었어서 마냥 좋았다. 너의 첫 해외여행이 맞니? &amp;lt; 이렇게 물어봐주심..  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그리고 무사히 돌아와서 정말 감사하다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nNGn6/btrUV2QUqJ8/IKKhScAKQLdF6M7vgFkeLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nNGn6/btrUV2QUqJ8/IKKhScAKQLdF6M7vgFkeLk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;IMG_6560.jpg&quot; data-widthpercent=&quot;50.03&quot; style=&quot;width: 49.4529469754513%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nNGn6/btrUV2QUqJ8/IKKhScAKQLdF6M7vgFkeLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnNGn6%2FbtrUV2QUqJ8%2FIKKhScAKQLdF6M7vgFkeLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh5PUo/btrU2K2p0yQ/oCOvamnvsAsfa0Kjt4xgCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh5PUo/btrU2K2p0yQ/oCOvamnvsAsfa0Kjt4xgCk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;960&quot; data-filename=&quot;IMG_9CC402F9A433-1.jpeg&quot; data-widthpercent=&quot;49.97&quot; style=&quot;width: 49.38426232687427%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh5PUo/btrU2K2p0yQ/oCOvamnvsAsfa0Kjt4xgCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh5PUo%2FbtrU2K2p0yQ%2FoCOvamnvsAsfa0Kjt4xgCk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;719&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;같이 간 친구들과 맛있는거 사서 호텔방에서 같이 먹고..자고..수영장도 가고 사진도 많이 찍고!! &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;너무 좋은 기억으로 12월을 시작했어서 행복했다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;더 많은 내용은 브런치에 시리즈로 쓸 예정!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그러고보니 올해 국내여행도 많이 갔는데, 요것들도 글로 남기면 좋을 것 같기도?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 다이어트&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 나는 올해 다이어트를 한것만으로도 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;'와 나도 할 수 있구낰ㅋㅋㅋ와 진짜 이게 되는구나..했구나 나도..'&lt;/b&gt; &amp;lt; 로 생각할만큼.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;올해는 진짜 다이어트를 했던 경험이 진짜로!!!!!!!!!!!1 진짜 나에게 너무 많은 내/외면의 성장을 가져다준 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 다이어트를 대하는 나의 자세&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 과식 자제. 식사량 조절&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 운동 의지&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;등.. 나 자신이 많이 달라진걸 나 스스로 느끼니까 그게 너무 뿌듯하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;올해 7월 1일 건강검진때 나왔던 체중에서 &lt;b&gt;10kg를 감량&lt;/b&gt;했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(체중이 중요한건 아니지만..체지방량은 8kg 줄어들었다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;체중은 비밀...............................................&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-31 오후 2.39.22.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1E0Fh/btrUYQhZKbc/ByqG3R7W5KNRfwcdMikXA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1E0Fh/btrUYQhZKbc/ByqG3R7W5KNRfwcdMikXA0/img.png&quot; data-alt=&quot;2022년 7월 1일 건강검진&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1E0Fh/btrUYQhZKbc/ByqG3R7W5KNRfwcdMikXA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1E0Fh%2FbtrUYQhZKbc%2FByqG3R7W5KNRfwcdMikXA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1144&quot; height=&quot;186&quot; data-filename=&quot;스크린샷 2022-12-31 오후 2.39.22.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2022년 7월 1일 건강검진&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-31 오후 2.40.38.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q96Lz/btrU1pxqQvq/z64RkfO0fYkkBTOkxg2T6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q96Lz/btrU1pxqQvq/z64RkfO0fYkkBTOkxg2T6K/img.png&quot; data-alt=&quot;2022년 12월 14일 헬스장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q96Lz/btrU1pxqQvq/z64RkfO0fYkkBTOkxg2T6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ96Lz%2FbtrU1pxqQvq%2Fz64RkfO0fYkkBTOkxg2T6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;150&quot; data-filename=&quot;스크린샷 2022-12-31 오후 2.40.38.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2022년 12월 14일 헬스장&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(체지방&lt;b&gt;률&lt;/b&gt;은 BMI랑 같이 있어서 캡쳐는 따로 안함 하하!!!!)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;감량한 지금 몸무게도 많이 나가는 편이라..그냥 나를 매일 보는 사람들만 어? 살 좀 빠진듯..? 하고 살짝 느끼는 수준같다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 키가 170으로 그리 작지 않은 키를 가지고 있는데 (170.6나올때도 있고 170.3나올때도 있고..맨날 다르게 나와서 그냥 170이라 하고 다님..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;골격도 큰편이라 나는 정말 평생을 '&lt;i&gt;다이어트 해야겠다&lt;/i&gt;' &amp;lt; 마인드로 살아갔다고 해도 과언이 아니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만 성공적인 다이어트를 해본 적은 한번도 없고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;진짜 예전에 딱 한번 굶어서 살을 5kg 정도 뺀적이 있다. (당연히 요요^_^..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 이번에는 정말 건강하게!! 근육도 지키면서 체지방만 감량한 것 같아서 내 자신이 자랑스럽다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥..올해 이 경험이 너무너무 감사하고 앞으로 더더 건강해질 내가 정말 기대된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나름 나에게 큰 동기부여가 되었던 소소한 사건이 있었는데 바로 '반지'다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 반지를 계속 만지작거리면서 뺐다 꼈다하는 버릇이 있는데, 어느 순간 이 반지가 안빠지는 것이다..??!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;엥;; ㅎㅎ;; 아침이라 부었나~? 라고 생각했지만 저녁까지 빼기 힘든 반지를 보며..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;'와 손가락에도 살이 찌는구나!!'를 깨달았고 살을 진짜 빼야겠다는 생각을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다행히 지금은 반지가 정말 잘빠지는데..가끔씩 안빠졌던 반지가 생각이 나서 웃겼어서..써본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다이어트 하면서 클라이밍도 잠시 중단했다. (아쉽)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;클라이밍은 나를 들어올리는 운동이다보니..체중이 가벼울수록 더 잘해지는 운동이다. (그걸 이기는 악력이 있으면 ㄱㅊ)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 살을 빼고 다시 시작하는게 낫다고 생각해서 잠시 멈추고 헬스장에서 혼자 운동했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그리고 다이어트를 하면서 내 몸을 대하는 자세/마인드도 더욱 진지해졌다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;처음에는 탄수화물을 극히 제한하는 식단을 했지만, 단순히 탄수화물을 줄여서는 답이 없구나도 몸소 깨달았고,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;(액상)과당을 줄이려는 노력을 정말 많이 했다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그리고 예전에는 먹고싶은거 다 시켜서 먹어보자~! 여기 언제 또 오겠어~! 이런 마인드였다면&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;지금은 ㅇㅇ너무 많아 딱 먹을것만 시키자 이런 마인드로 바뀌었다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;물론 많이 시킬때도 있지만, 그럴때는 먹는 양을 조절하는 등 예전의 나와 정말.....달라졌다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;진짜 저는 밥을 싹싹 비우는 사람이었거든요.............&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다이어트 관련해서만 글을 10개는 쓸 수 있을만큼 하고싶은 말이 많은데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내가 혼자 목표하는 체중과 체지방률/골격근량이 있기 때문에 이걸 달성하고 회고하는 기념으로 글을 한판 쓸까한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 왠지..나는 달성할 수 있을 것만 같은 자신감이 든다. 헤헤&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;달성이라고 해서 이게 목표!! 내년 안에!!! 이런거는 아니고, 내 삶의 자세 같은거라고 생각하고 살 생각이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;시간이 얼마나 걸리든 꾸준히 하는 자세!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;중요한건&amp;nbsp;꺾이지&amp;nbsp;않는&amp;nbsp;마음!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 독서모임&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;올해 친구들과 독서모임을 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;~ 종로에 클라이밍 하러갔다가 끝나고 카페에서 이야기 중 ~&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아 책 읽어야 하는데.. &amp;rarr; 서로 책 추천 &amp;rarr;&amp;nbsp;우리 독서모임 해볼래? 로 되어서 갑자기 독서모임이 결성되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 뭐 빡빡한 제한같은거는 없고.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;책 읽고 (다 안읽어도됨) 느낀점을 카톡에 바로 올리던가 블로그같은데 올려서 주소공유하는식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;나는 다 못읽었을 때는 카톡으로 바로 올릴때도 있고..브런치에 독후감을 써서 올렸다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://brunch.co.kr/magazine/lonelyhumanzedd&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://brunch.co.kr/magazine/lonelyhumanzedd&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1672485659768&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;고독한 인간의 성장 매거진&quot; data-og-description=&quot;#성장&quot; data-og-host=&quot;brunch.co.kr&quot; data-og-source-url=&quot;https://brunch.co.kr/magazine/lonelyhumanzedd&quot; data-og-url=&quot;https://brunch.co.kr/magazine/lonelyhumanzedd&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bsB8ez/hyQ5DzK4gv/zvqqqQxK6GYwKQcpk9pfm0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/buCdJi/hyQ6VetIVQ/QuQ98eN44egCkuqTqedJZK/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500&quot;&gt;&lt;a href=&quot;https://brunch.co.kr/magazine/lonelyhumanzedd&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brunch.co.kr/magazine/lonelyhumanzedd&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bsB8ez/hyQ5DzK4gv/zvqqqQxK6GYwKQcpk9pfm0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/buCdJi/hyQ6VetIVQ/QuQ98eN44egCkuqTqedJZK/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;고독한 인간의 성장 매거진&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;#성장&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brunch.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(일단은) 매주 월요일 밤 10시로 시간이 정해져있긴 한데..못올리겠으면 도토리가 1개 적립된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;도토리가 쌓이면................&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_8607.JPG&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM28XR/btrU1OjD1eX/uB0pXRKoBwmsU2tJGUkW4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM28XR/btrU1OjD1eX/uB0pXRKoBwmsU2tJGUkW4k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM28XR/btrU1OjD1eX/uB0pXRKoBwmsU2tJGUkW4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM28XR%2FbtrU1OjD1eX%2FuB0pXRKoBwmsU2tJGUkW4k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;759&quot; data-filename=&quot;IMG_8607.JPG&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(큰일) 도토리가 많이 쌓이게된다 (큰일)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;친구들끼리 하는거라 더 자유롭게 이야기할 수도 있고, 서로 책 추천도 하고..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;올해 이런거라도 있어서 책을 보게됐던 것 같다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그냥 단순히 책 읽었다!가 아니라 독후감을 쓰는 나의 자세라던가(잘써야겠다는 압박 X) 전자책에 익숙해졌다거나 여러모로 얻은게 많았다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1672474527019&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;2022 독서 연말정산&quot; data-og-description=&quot;얼마전 독서모임 단톡방에서 선물(?)을 받았다. 연말정산을 할 만큼 많은 책을 읽은건 아니지만... 재밌을 것 같아서 해보려고 한다. 1. 가장 재밌게 읽은 책 1번부터 어렵네.. 고민하다가 &amp;lt;딱 하나&quot; data-og-host=&quot;brunch.co.kr&quot; data-og-source-url=&quot;https://brunch.co.kr/@zedd/377&quot; data-og-url=&quot;https://brunch.co.kr/@zedd/377&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bLm5ok/hyQ60z0lVg/kMgAmyU2DL0jOF4kPMDBV1/img.jpg?width=1170&amp;amp;height=1194&amp;amp;face=0_0_1170_1194,https://scrap.kakaocdn.net/dn/byDt4Y/hyQ5zxhdKM/pHrVQ78EvHEF8iN09SZ2SK/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/cnBvyo/hyQ60fIkU1/1NdG2wQNHBKAFNLH3daQXk/img.jpg?width=1170&amp;amp;height=1194&amp;amp;face=0_0_1170_1194&quot;&gt;&lt;a href=&quot;https://brunch.co.kr/@zedd/377&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brunch.co.kr/@zedd/377&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bLm5ok/hyQ60z0lVg/kMgAmyU2DL0jOF4kPMDBV1/img.jpg?width=1170&amp;amp;height=1194&amp;amp;face=0_0_1170_1194,https://scrap.kakaocdn.net/dn/byDt4Y/hyQ5zxhdKM/pHrVQ78EvHEF8iN09SZ2SK/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/cnBvyo/hyQ60fIkU1/1NdG2wQNHBKAFNLH3daQXk/img.jpg?width=1170&amp;amp;height=1194&amp;amp;face=0_0_1170_1194');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2022 독서 연말정산&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;얼마전 독서모임 단톡방에서 선물(?)을 받았다. 연말정산을 할 만큼 많은 책을 읽은건 아니지만... 재밌을 것 같아서 해보려고 한다. 1. 가장 재밌게 읽은 책 1번부터 어렵네.. 고민하다가 &amp;lt;딱 하나&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brunch.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# iOS / 블로그&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 올해 iOS개발자로서 어땠냐고 본다면 썩 좋지는 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 회고에서 나를 비판하거나 왜 그랬어!! 더 잘했어야지!! 라고 할 생각은 없고, 그냥 내가 느꼈던 감정들을 그대로 쓰고싶다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 우리 팀 내에서의 iOS개발자 역할은 잘 수행했던 것 같지만..?! (당연한거)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;iOS챕터내에서 뭔가 기술적으로 다른사람들에게 임팩트를 주거나 했던 건 거의 없었던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다른 사람들은 다 잘하는데 나는 왜이래 ㅠ..라는 생각도 했었고 (그냥 하면되는데!!!!!!!!!!!!!!) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;전체적으로 자신감이 많이 떨어졌다. 그냥 나는 아무것도 모르는 바보같음..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정말 솔직하게 말하면 신규 입사자분들이 내 블로그를 잘 봐주시고 나를 알아봐주시는게 참 부끄럽기도 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Zedd : 아 안녕하세요..!! ㅎㅎ (나는 진짜 사실 바보라구요 난 진짜 바본데 내가 왜 블로그같은걸 해가지고)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러던 중&amp;nbsp;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하반기쯤 팀이 바뀌었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;바뀐 팀 업무를 하면서 커뮤니케이션 할 일도 많아졌는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러다보니 내 의견을 일목요연하게 말하는게 얼마나 중요한지 또 한번 실감하게 되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어떤 기획이나 디자인에 대한 의견을 빠르게, 그러면서도 논리정연하게 주고받는 사람들이 정말 많아서, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 이런 소프트스킬을 더 키울 필요가 있다는 생각이 들었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고&amp;nbsp;자연스럽게 그냥 한명의 직장인으로서 &lt;b&gt;일을 잘하고싶다!&lt;/b&gt; 라는 생각이 들었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러면서 뭔가 iOS/개발역량에 대한 집착? 압박같은게 아주 살짝 사라졌었던 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그리고 기술보다는 비즈니스가 우선 &amp;lt; 요 마인드가 제대로 장착이 된 영향도 큰 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예전에는 개발을 잘하고싶다!!는 생각만 했다면 지금은 일을 잘하고 싶다!!!는 갈망...&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;소프트스킬이 중요하다는 건 익히 알고있었지만, 유독 이번 하반기에 더 절절하게 실감한 느낌이라 써보았다!!!!!&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그래서 인프콘 때&amp;nbsp;&lt;/span&gt;&lt;u&gt;&lt;i&gt;나와 팀을 성장시키는 리뷰들 - 코드리뷰만 리뷰가 아니라니까?&lt;/i&gt;&lt;/u&gt;세션을 인상깊게 들었던 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;/1370&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;[후기] INFCON 2022&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&amp;nbsp;참고)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;사실 블로그 포스팅도 많이 못했고 그러다보니 관리도 소홀해지기도 했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;나는 뭔가 딱 꽂히면 파바박 하는 스타일인데, 올해 나를 꽂히게 하는 것들이 몇개 없었다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;뭐 내가 애써 외면한걸수도 있지만..실제로 그랬어서 뭔가 글 쓰는것도 잘 안되고 동기부여가 안됐다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;예전에는 지금 당장 필요없어도 그냥 공부해보자~~!!! 이런 느낌으로 많이 썼었는데, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;요즘은 &lt;b&gt;지금&lt;/b&gt; 나에게 도움이 되는거 위주로 쓰게되는 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;지금 당장 필요하지 않은 무언가를 공부해보는 것도 좋다! &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나도 이 방식으로 나름 공부해봤다고..할 수 있을 것 같은데,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;물론 이 방식에도 좋은 점은 분명히 있지만 머리속에서 금방 잊혀져 버리는 단점이 있는 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그럴 때 내가 쓴 글을 보면 되지만... 사실 지금 당장 필요해서 적용하면서 쓰는 글보다는 얕게 쓰이는 것 같다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;뭐 그래서 결론이 한달에 글 한개씩은 꼭 쓰자~!! 이런건 아니고..결론은 없다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;쓰고싶으면 쓰는거고....안쓰고싶으면 안쓰는거고.. &amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 새로운것에 많이 도전해보기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1330&quot;&gt;작년 회고&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;때 2022년 다짐으로 '새로운 것에 많이 도전해보기'를 써두었다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내년에는 재지않고 이것저것 많이 도전하기!!를 목표로 하는 한해가 되고싶다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;...&lt;/span&gt;&lt;br /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 나도 지금 내가 할 줄 아는 것들에 안주하는게 아니라,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이것저것 내가 해보지못한 것들에 도전해보자!는 결심을 하게됐다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;뭔가 새로운것들을 엄청했다!!! 이건 아니지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;원래같으면 아 귀찮아..하고 안했던것들을 의도적으로 더 해보려고 노력했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그게 사격, 그릇 만들기, 여행같은 정말 새로운 '&lt;b&gt;것&lt;/b&gt;'을 해보는것도 있었지만&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;단순히 주말에 어디갈까? 할때도 귀찮지만 일부러 멀리 나가본다던지&amp;hellip;같은&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;마음가짐&lt;/b&gt;일때도 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;무조건 새로운것을 많이 해보는게 마냥 좋은게 아닐수도 있다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 나는 워낙 그런 경험이 적었기 때문에.. 지금에라도 많이 해볼려고 하는거!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;하지만 새로운것을 많이 해봤냐!! 안했냐!! 그 양이 중요한건 아닌 것 같고..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;귀찮음을 극복해보려고 하는 생각/행동이 예전보다는 많아진것 같아서 그걸로 만족한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;예전: 강원도에 바다 보러 갈래? &amp;rarr;&amp;nbsp;귀찮...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;지금 : 강원도에 바다 보러 갈래? &amp;rarr;&amp;nbsp;귀찮...지만 가보자!!!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이런 상태인듯.. 실제로 이렇게 바다를 보러 속초에 갔었다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# 2023년 다짐&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;목표와 다짐은 다르니..나는 목표를 세우기 보다는 다짐을 하고싶다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;아직도 헬스장을 가려고 하면 &lt;i&gt;으 5분만...&lt;/i&gt;하는 생각이 드는데, 그냥 이럴때 바로 가버리기!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그냥 생각하지 말고 바로 실천하는 내가 되었으면 한다. (대신 말은 생각하고 하기~~!)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;헬스장가기 &amp;lt; 이런걸 뭔가 해치워야하는 미션같이 생각하지말고 그냥 습관처럼 할 수 있도록 시스템화하기 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;(== 양치하는거랑 똑같이 그냥 당연히 해야할 때 해야하는 것으로 인식하게 만들기)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 끝으로&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;내년에도 이거보면서 아 이때 이랬지!~~~~하고 웃겠지..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 쓰고보니 올해가 나에게 정말 의미있는 해였구나..하는 생각이 든다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그래서인지 2023년이 더 기대된다. 2023년 회고를 쓸 때쯤에 나의 모습이 너무 기대된다. (&lt;s&gt;체지방률 몇퍼일까?&lt;/s&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내년에도 왠지 쓸 내용이 엄청 많을 것 같다 :D&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일상</category>
      <category>2022 회고</category>
      <category>2022년</category>
      <category>2022년 회고</category>
      <category>회고</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1378</guid>
      <comments>https://zeddios.tistory.com/1378#entry1378comment</comments>
      <pubDate>Sat, 31 Dec 2022 21:48:25 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] Opaque Type</title>
      <link>https://zeddios.tistory.com/1366</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift 5.7에 추가된 Opaque Parameter Declarations을 보기 전에.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Opaque&amp;nbsp;Type이 어떤건지!!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Opaque&amp;nbsp;Type은 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://swift.org/blog/swift-5-1-released/&quot;&gt;Swift 5.1&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에 추가되었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2021-02-26 오후 7.39.06.png&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;496&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ThcAO/btqYxqnlSeP/4rYSY2DoLvk2m3GKLVxyCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FThcAO%2FbtqYxqnlSeP%2F4rYSY2DoLvk2m3GKLVxyCK%2Fimg.png&quot; data-filename=&quot;스크린샷 2021-02-26 오후 7.39.06.png&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;496&quot; data-ke-mobilestyle=&quot;widthContent&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Opaque Type을 직역하면 &lt;b&gt;불분명한 타입&lt;/b&gt; 정도가 되겠네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;불투명 타입이라고 부르는 사람도 있는데, 저는 불분명한 타입! 요게 더 와닿는것 같아서 ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Generic&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;(갑자기) 우리에게 익숙한 Generic을 보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671693316139&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Stack&amp;lt;Element&amp;gt; {
    var items: [Element] = []
    
    mutating func push(_ item: Element) {
        items.append(item)
    }
    
    mutating func pop() -&amp;gt; Element {
        return items.removeLast()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;위 Stack 구조체는 Generic Type인 Element를 사용하고있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;우리가 이 코드를 작성할 때 이렇게 생각할 수 있겠죠.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;'&lt;b&gt;아 Element로 어떤 타입이 올지 모르겠으니&lt;/b&gt;&amp;nbsp;특정 타입에 국한되게 만드는게 아니라 좀 추상적으로/일반적으로 만들어야겠다! Int든 String이든 내가 만든 Custom Type이든 모든 타입에서 동작할 수 있게!'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;핵심은, 이 Stack 구조체를 &lt;b&gt;작성할때&lt;/b&gt; 우리는 Element가 어떤 타입인지 알 수 없습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;언제 Element의 타입을 알수있냐?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671694490437&quot; class=&quot;excel&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var intStack = Stack&amp;lt;Int&amp;gt;()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사용하는 &lt;b&gt;호출부&lt;/b&gt;에서 타입을 지정해줘야 비로소 Element의 타입이 결정되는것이죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Int로 지정했으므로, intStack.items의 타입은 [Int]로 나오는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-22 오후 5.03.38.png&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCLZZt/btrUlJQ9lHF/d9MkAkDLXHtG0H72fSgm00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCLZZt/btrUlJQ9lHF/d9MkAkDLXHtG0H72fSgm00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCLZZt/btrUlJQ9lHF/d9MkAkDLXHtG0H72fSgm00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCLZZt%2FbtrUlJQ9lHF%2Fd9MkAkDLXHtG0H72fSgm00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;804&quot; height=&quot;212&quot; data-filename=&quot;스크린샷 2022-12-22 오후 5.03.38.png&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;예제는 struct로 들었지만 Generic으로 작성된 함수(메소드)도 다 똑같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;간단히 정리하면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;구현부 - 추상화하여 작성&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;호출부 - 구체적인 타입 지정 (타입을 알 수 있음)&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Opaque Type&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Opaque Type은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;some 키워드 + 프로토콜&lt;/b&gt;&lt;/span&gt;로 사용할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671695058918&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ContentView: View {

    var body: ✅some View✅ {}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;우리가 SwiftUI에서 주구장창 본 some View. 이것이 Opaque Type입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Opaque Type은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;- 함수(메소드)의 리턴타입&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;- stored property&amp;nbsp;타입&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;- computed property&amp;nbsp;타입&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;- subscripts&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;- (Swift 5.7 부터) 함수 파라미터 타입&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;으로 사용될 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;함수(메소드)의 리턴타입으로 사용된 Opaque Type의 간단한 예를 봅시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671694579202&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func makeArray() -&amp;gt; some Collection {
    return [1, 2, 3]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런 Opaque Type은&amp;nbsp;&lt;b&gt;Generic과 반대로 작동하므로&lt;/b&gt; 위에서 Generic을 먼저 설명했던것인데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어떤 부분이 Generic과 반대인지 살펴봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 코드에서는 [1, 2, 3]을 바로 리턴했는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Generic때 처럼 내부가 추상적으로 작성되지 않고 KTX타고 가면서 봐도 구체타입인 [Int]을 리턴하는 것 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;makeArray함수 내부에서는 [Int]라는 구체타입을 알고있는 것이죠.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;makeArray를 호출하는 &lt;b&gt;호출부&lt;/b&gt;의 입장을 생각해보겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-22 오후 5.04.11.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byVfA7/btrUlBTpgkS/gkTtEdDKs6RFtMkkUzLAj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byVfA7/btrUlBTpgkS/gkTtEdDKs6RFtMkkUzLAj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byVfA7/btrUlBTpgkS/gkTtEdDKs6RFtMkkUzLAj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyVfA7%2FbtrUlBTpgkS%2FgkTtEdDKs6RFtMkkUzLAj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;166&quot; data-filename=&quot;스크린샷 2022-12-22 오후 5.04.11.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Generic과 다르게 호출부에서 알 수 있는것은 &lt;b&gt;아 Collection 프로토콜을 준수하는 어떤 구체 타입이구나..&lt;/b&gt;만 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Generic과 다르게 &lt;b&gt;호출부&lt;/b&gt;가&amp;nbsp;일반적/추상적으로 작성되어야 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671700405309&quot; class=&quot;excel&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var intStack = Stack&amp;lt;Int&amp;gt;()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 &lt;b&gt;호출부가 완전히 구체적인 타입을 알고 있던 Generic과는 완전히 반대되는 경우&lt;/b&gt;인데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[Generic]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;구현부 - 추상화하여 작성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;호출부 - 구체적인 타입 지정 (타입을 알 수 있음)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[Opaque Type]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;구현부 - 구체적인 타입 지정 (타입을 알 수 있음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;호출부 - 추상화하여 작성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이것이 Opaque Type이 &lt;b&gt;역 제네릭 타입(reverse generic type)&lt;/b&gt;으로 불리는 이유입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 이러한 특성때문에&amp;nbsp;&quot;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Opaque&amp;nbsp;Type을 사용하여 리턴 타입의 정보를 숨길 수 있다&lt;/span&gt;&lt;/b&gt;&quot;고 말하는 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;말 그대로 불분명한 타입인거죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Protocol Type&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Opaque Type은 some 키워드 + 프로토콜이었는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 some 키워드만 빠지면 우리가 자주 사용하는 Protocol Type입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671697487480&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol TestProtocol {}
func somethings() -&amp;gt; some TestProtocol {} // Opaque Type
func somethings() -&amp;gt; TestProtocol {} // Protocol Type&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;호출부에서 somethings 함수를 호출했을 때,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;호출부는 &lt;b&gt;TestProtocol 타입을 준수하는 어떤 타입이구나!&lt;/b&gt;로&amp;nbsp;아는건 똑같아보이는데..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Protocol Type과 Opaque Type은 어떤점이 다를까요?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;caret-color: #24292f; background-color: #ffffff;&quot;&gt;#&amp;nbsp;&lt;/span&gt;Differences Between &lt;b&gt;Protocol Types and&amp;nbsp;&lt;/b&gt;Opaque Types&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;✔️ [Protocol Type을 리턴할 때] &lt;b&gt;✔️&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Protocol Type을 리턴하는 함수 내에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;조건에 따라 해당 Protocol을 준수하는 어떤 타입이든 리턴할 수 있습니다&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671698182947&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct 오버워치: TestProtocol {}
struct 롤: TestProtocol {}

func somethings() -&amp;gt; TestProtocol {
    let 재밌다 = true
    if 재밌다 { return 롤() }
    
    return 오버워치()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;핵심 : 특정 조건에 따라 리턴하는 구체타입을 달리할 수 있다는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;b&gt;✔️&amp;nbsp;&lt;/b&gt;[Opaque Type을 리턴할 때] &lt;b&gt;✔️&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 코드에서 &lt;b&gt;some&lt;/b&gt; 키워드만 추가해주겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671698385623&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct 오버워치: TestProtocol {}
struct 롤: TestProtocol {}

func somethings() -&amp;gt; ✅some✅ TestProtocol {
    let 재밌다 = true
    if 재밌다 { return 롤() }
    
    return 오버워치()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러면 아래와 같은 컴파일 에러가 발생하는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671698443541&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Function declares an opaque return type, but the return statements in its body do not have matching underlying types&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Opaque Type으로 사용하려면 해당 프로토콜을 준수하는 &lt;u&gt;단 하나의&lt;/u&gt; 구체타입을 리턴해야만 합니다&lt;/span&gt; &lt;b&gt; &lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671698526268&quot; class=&quot;autoit&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func somethings() -&amp;gt; some TestProtocol {
    return 롤()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 정리할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Protocol Type - &lt;b&gt;프로토콜을 준수하는 모든 타입을 참조할 수 있음&lt;/b&gt; (a&amp;nbsp;protocol&amp;nbsp;type&amp;nbsp;can&amp;nbsp;refer&amp;nbsp;to&amp;nbsp;any&amp;nbsp;type&amp;nbsp;that&amp;nbsp;conforms&amp;nbsp;to&amp;nbsp;the&amp;nbsp;protocol)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Opauqe Type - &lt;b&gt;하나의 특정 구체 타입을 참조하지만 함수 호출자는 어떤 타입인지 볼 수 없음&lt;/b&gt; (An&amp;nbsp;opaque&amp;nbsp;type&amp;nbsp;refers&amp;nbsp;to&amp;nbsp;one&amp;nbsp;specific&amp;nbsp;type,&amp;nbsp;although&amp;nbsp;the&amp;nbsp;caller&amp;nbsp;of&amp;nbsp;the&amp;nbsp;function&amp;nbsp;isn&amp;rsquo;t&amp;nbsp;able&amp;nbsp;to&amp;nbsp;see&amp;nbsp;which&amp;nbsp;type)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 둘을 딱 봤을 때 코드를 더 유연하게 작성할 수 있는 타입은 Protocol Type인데요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671699178102&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct 오버워치: TestProtocol {}
struct 롤: TestProtocol {}

func somethings() -&amp;gt; TestProtocol {
    let 재밌다 = true
    if 재밌다 { return 롤() }
    
    return 오버워치()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Protocol을 준수하는 어떤 타입이든 &lt;b&gt;특정&amp;nbsp;조건에 따라&amp;nbsp;리턴할 수 있게 때문에&lt;/b&gt;&amp;nbsp;유연성이 높은 코드를 작성할 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;다만 이러한 유연성의 대가도 있는데요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;반환된 값에 대해 일부 작업을 수행할 수 없다는 것입니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;예를 들어봅시다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 두고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671701337699&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct 오버워치: TestProtocol {}
struct 롤: TestProtocol {}

func somethings() -&amp;gt; TestProtocol {
    let 재밌다 = true
    if 재밌다 { return 롤() }
    
    return 오버워치()
}

-------

let a = somethings()
let b = somethings()

print(a == b)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;a와 b가 같은지 비교해보려고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⛔️ 문제 1.&amp;nbsp;== 연산자가 TestProtocol에 포함되어있지 않기 때문에 ==를 추가하려고 시도&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671701464670&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol TestProtocol: Hashable {}

extension TestProtocol {
    
    static func == (...) -&amp;gt; Bool {
        return lhs.hashValue == rhs.hashValue
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(Equatable을 사용하지 않은건 hashValue를 사용하려고,..Hashable이 Equatable을 준수하고 있는건 아시죠!?)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⛔️&amp;nbsp;&lt;/span&gt;문제 2. == 연산자는 좌항과 우항의 타입을 알아야함&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;보통&lt;b&gt; 이 TestProtocol을 채택하는 구체적인 타입과 일치하는 Self&lt;/b&gt;를 파라미터로 사용하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671701563089&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol TestProtocol: Hashable {}

extension TestProtocol {
    
    static func == (lhs: Self, rhs: Self) -&amp;gt; Bool {
        return lhs.hashValue == rhs.hashValue
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⛔️&amp;nbsp;&lt;/span&gt;문제 3. Protocol 'TestProtocol' can only be used as a generic constraint because it has Self or associated type requirements&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671701819522&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func somethings() -&amp;gt; TestProtocol {
    let 재밌다 = true
    if 재밌다 { return 롤() }
    
    return 오버워치()
}
// Protocol 'TestProtocol' can only be used as a generic constraint because it has Self or associated type requirements&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여기서 안본 사람이 없다는 '그 에러'..가 발생하게 됩니다. (물론 Xcode 14에서는 조금 다른 에러가 나오긴 하지만..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;지금은 Self제약 때문에 난 에러긴 하지만, 프로토콜이&amp;nbsp;Associated type을 가지고 있을때도 같은 에러가 발생합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위에서 언급했지만 &lt;b&gt;==에서 사용된 Self는 TestProtocol을 채택하는 구체적인 타입&lt;/b&gt;을 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 컴파일시에는 이 Self가 어떤타입인지 모르기 때문에 에러가 나게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;에러메시지에 나와있는 것 처럼, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;프로토콜 내에서 Self나 Associated type을 사용할 때 이 프로토콜을 단독으로 리턴타입이나 파라미터타입으로 쓸 수 없고&amp;nbsp;&lt;b&gt;generic&amp;nbsp;constraint으로만 사용될 수 있습니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671702775321&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func somethings&amp;lt;T: TestProtocol&amp;gt;(source: T) -&amp;gt; Int {
    return source.hashValue
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로요. 리턴타입으로 사용할 수 없으니 구체타입인 Int를 리턴하게 해주었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671702846596&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = somethings(source: 롤())
let b = somethings(source: 오버워치())
print(a == b) // true or false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;드디어 컴파일이 되지만..&amp;nbsp;결과적으로 &lt;b&gt;TestProtocol (Protocol Type)을 리턴하면서 ==를 사용할 수 있는 방법은 없습니다&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;문제는 하나 더 있습니다. 있었습니다..? Swift 5.7에서 아래 문제(문제 4)는 발생하지 않습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⛔️&amp;nbsp;&lt;/span&gt;문제 4. Protocol 'TestProtocol' as a type cannot conform to the protocol itself&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;== 연산자 같은 구현은 전부 지우고, somethings 함수를 살짝 수정했습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671703070648&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol TestProtocol {}

struct 오버워치: TestProtocol {}
struct 롤: TestProtocol {}

func somethings&amp;lt;T: TestProtocol&amp;gt;(source: T) -&amp;gt; TestProtocol {
    return source
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;somethings함수는 TestProtocol을 준수하는 어떤 타입이든 파라미터로 받아서 그대로 리턴합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671703173678&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = somethings(source: 롤())
let b = somethings(source: a) // Protocol 'TestProtocol' as a type cannot conform to the protocol itself&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 somethings(source: 롤())로 리턴한 a도 역시 TestProtocol을 준수하기 때문에 이 a를 그대로 파라미터로 넘길 수 있는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이러면 컴파일에러가 발생하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671704065917&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = somethings(source: 롤())

let b = somethings(source: 오버워치()) // ✅ OK
let b = somethings(source: a) // ⛔️ Error!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왜 오버워치로 넣은건 됐는데, a를 그대로 넣으면 에러가 나냐?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671780400933&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func somethings&amp;lt;T: TestProtocol&amp;gt;(source: T) -&amp;gt; TestProtocol {
    return source
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Generic은 컴파일시 프로토콜을 준수하는 구체적인 타입이 필요한데&lt;/b&gt;, a는 구체타입이 아니라 그냥 TestProtocol타입이기 때문에 컴파일이 되지 않습니다. (컴파일타임에 구체타입을 알 수 없어서)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 generic이 아닌&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671704271690&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func somethings(source: TestProtocol) -&amp;gt; TestProtocol {
    return source
}
let a = somethings(source: 롤())
let b = somethings(source: a)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 사용해야하죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;⚠️&amp;nbsp;&lt;b&gt;문제 4&lt;/b&gt;는 Swift 5.7을 사용하는 Xcode 14에서는 에러가 안납니다~&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;관련 Proposal은&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0352-implicit-open-existentials.md#introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Implicitly Opened Existentials&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;을 참고해주세요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;----&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼 이러한 문제가 발생하는 이유는..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift의 Protocol은 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Type identity를 보존(preserve)하지 &lt;b&gt;않기&lt;/b&gt; 때문인데요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #24292f;&quot;&gt;&lt;span style=&quot;caret-color: #24292f; background-color: #ffffff;&quot;&gt;저는 도대체 이 Type Identity가 뭘까...헷갈려서 많이 찾아봤는데, 제가 이해한바를 간단하게 예제로 설명하자면&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671778615693&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func somethings() -&amp;gt; TestProtocol {
    return 롤()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 사용했을 때,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt; somethings를 호출하는 호출부에서는 &lt;b&gt;롤&lt;/b&gt;이라는 구체타입에 대한 정보를 전혀 모르고 TestProtocol로만 받게되는데...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;즉, 호출되었을 때 롤이라는 구체타입에 대한 정보를 잃어버리기 때문에? Type Identity를 preserve(보존)하지 않는다..라고 말하는것 같아요?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 Opaque Type은 Type Identity를 보존하냐? ➡️ 보존합니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671778851104&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol TestProtocol: Hashable {}

extension TestProtocol {
    
    static func == (lhs: Self, rhs: Self) -&amp;gt; Bool {
            return lhs.hashValue == rhs.hashValue
        }
}

struct 오버워치: TestProtocol {}
struct 롤: TestProtocol {}

func somethings() -&amp;gt; some TestProtocol {
    return 롤()
}

let a = somethings()
let b = somethings()
print(a == b) // true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이것이 가능합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왜냐면 Opaque Type으로 사용하여 타입은 숨겼지만, &lt;b&gt;컴파일러는 구체타입을 알기 때문에 Type Identity를 preserve(보존)할 수 있습니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이건 우리가 계속 봤던 예제라 넣은거고..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671779643710&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a: some SignedInteger = 1
let b: some SignedInteger = 2

print(a == b) // false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;간단하게 이런것이 그냥 가능하다!? &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(예제를 함수로만 본 것 같아서.. 위에서 말했듯이 stored property도 Opaque Type으로 선언할 수 있습니다)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 Opaque Type은 Swift 5.1나왔던 그 순간부터 쓰려고 했던 주제인데..이제야 ^^;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;틀린 부분이 있다면 댓글로 알려주세요!&lt;/span&gt;&lt;/p&gt;</description>
      <category>Swift</category>
      <category>Opaque type</category>
      <category>Swift</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1366</guid>
      <comments>https://zeddios.tistory.com/1366#entry1366comment</comments>
      <pubDate>Fri, 23 Dec 2022 17:18:41 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] NavigationView ➡️ NavigationStack</title>
      <link>https://zeddios.tistory.com/1376</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668928901870&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@available(iOS, introduced: 13.0, deprecated: 100000.0, message: &quot;use NavigationStack or NavigationSplitView instead&quot;)
public struct NavigationView&amp;lt;Content&amp;gt; : View where Content : View { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;WWDC22에서 NavigationView가 deprecated되고 NavigationStack/NavigationSplitView가 나왔는데...한번 바꿔보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;  &lt;span style=&quot;color: #000000;&quot;&gt;NavigationStack/NavigationSplitView가&lt;b&gt; iOS 16+ 부터 사용할 수 있기 때문에&lt;/b&gt;, 앱의 Deployment Target이 16+ 이상인경우에만 진행하는게 좋습니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;이 글에서 NavigationSplitView는 따로 다루지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# NavigationStack&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;div data-v-702ae484=&quot;&quot; data-v-b3ef72b8=&quot;&quot; data-v-97436168=&quot;&quot; data-v-1aa4701e=&quot;&quot;&gt;
&lt;pre id=&quot;code_1668929752937&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;RootView를 표시하고, Root View에 대한 추가(additional) View를 제공할 있는 View​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱이 굳이 Split 되어서 보여질 필요가 없다면, &lt;b&gt;즉 Single column navigation을 사용한다면 NavigationStack을 사용하는 것이 좋습니다.&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-v-702ae484=&quot;&quot; data-v-b3ef72b8=&quot;&quot; data-v-97436168=&quot;&quot; data-v-1aa4701e=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기존 (deprecated된) NavigationView를 사용할때는&lt;/span&gt;&lt;/p&gt;
&lt;div data-v-702ae484=&quot;&quot; data-v-b3ef72b8=&quot;&quot; data-v-97436168=&quot;&quot; data-v-1aa4701e=&quot;&quot;&gt;
&lt;pre id=&quot;code_1668929428176&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NavigationView { 
    /* content */
}
.navigationViewStyle(.stack) ✅&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 navigationViewStyle을 stack으로 주었을텐데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;NavigationStack을 사용한다면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668929464881&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NavigationStack {
    /* content */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게만 사용하면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Stack은 항상 제거되지 않은 가장 최근에 추가된 View를 표시하며, RootView는 제거할 수 없다!&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# NavigationLink와 .navigationDestination&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;NavigationStack을 사용한다면, &lt;b&gt;NavigationLink와 .navigationDestination modifier는 그냥 세트&lt;/b&gt;로 다닌다고 생각하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ &lt;b&gt;NavigationLink&lt;/b&gt; - 탐색 Presentation을 제어하는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;View&lt;/b&gt;&lt;/span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&amp;nbsp;&lt;b&gt;navigationDestination(for:destination:)&lt;/b&gt;&amp;nbsp; - Destination View를 NaviationLink에서 제시된 Data 타입과 연결해주는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Method&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668930105269&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
        NavigationStack {
            List {
                NavigationLink(&quot;Mint&quot;, value: Color.mint)
                NavigationLink(&quot;Pink&quot;, value: Color.pink)
                NavigationLink(&quot;Teal&quot;, value: Color.teal)
            }
            .navigationTitle(&quot;Colors&quot;)
        }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게만 해주면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-20 오후 4.42.56.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EfEis/btrRAiiyZPa/9bZ1iHzY8TQyMmO0nW10ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EfEis/btrRAiiyZPa/9bZ1iHzY8TQyMmO0nW10ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EfEis/btrRAiiyZPa/9bZ1iHzY8TQyMmO0nW10ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEfEis%2FbtrRAiiyZPa%2F9bZ1iHzY8TQyMmO0nW10ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;816&quot; height=&quot;494&quot; data-filename=&quot;스크린샷 2022-11-20 오후 4.42.56.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 Navigation을 위한 View들만 만들어지고, 클릭하면 아무런 이동도 안하는데요. (NaviationLink가 View니까)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;우리가 원하는 것 -&amp;gt; 눌렀을 때 내가 원하는 &lt;b&gt;1) View로&lt;/b&gt;&amp;nbsp; &lt;b&gt;2) Navigation되었으면 좋겠어.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[준비물]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 눌렀을 때 이동할 View&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668930349475&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ColorDetail: View {
    
    var color: Color
    
    var body: some View {
        Text(&quot;\(self.color.description)&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. navigationDestination(for:destination:) 사용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668930383866&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
            NavigationStack {
                List {
                    NavigationLink(&quot;Mint&quot;, value: Color.mint)
                    NavigationLink(&quot;Pink&quot;, value: Color.pink)
                    NavigationLink(&quot;Teal&quot;, value: Color.teal)
                }
                .navigationDestination(for: Color.self) { color in ✅
                    ColorDetail(color: color)
                }
                .navigationTitle(&quot;Colors&quot;)
            }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⚠️ 주의할 점 ⚠️&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668930503979&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NavigationLink(&quot;Teal&quot;, value: Color.teal)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;NavigationLink에 제시된 Data타입 ➡️ Color&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668930532042&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.navigationDestination(for: Color.self)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;navigationDestination(for:destination:) &lt;span style=&quot;color: #000000;&quot;&gt;➡️&lt;/span&gt; Color&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 Data 타입이 같지 않으면 Navigation을 하지 않으니 주의!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : 나는 List에 여러 Data타입이 들어있는데...  &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668930701325&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NavigationLink(&quot;Mint&quot;, value: Color.mint) ➡️ Color 타입
NavigationLink(&quot;Black&quot;, value: &quot;Black&quot;) ➡️ String 타입&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A : navigationDestination(for:destination:)를 여러개 쓰면 됨...&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668930746713&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List {
    NavigationLink(&quot;Mint&quot;, value: Color.mint)
    NavigationLink(&quot;Black&quot;, value: &quot;Black&quot;)
}
.navigationDestination(for: Color.self) { color in
    ColorDetailForColor(color: color) // Color 타입 용
}
.navigationDestination(for: String.self) { color in
    ColorDetailForString(color: color) // String 타입 용
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;이런식으로!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기존 NavigationView를 사용했다면&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668932364025&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
        NavigationView { // This is deprecated.
            List {
                NavigationLink(&quot;Purple&quot;) {
                    ColorDetail(color: .purple)
                }
                NavigationLink(&quot;Pink&quot;) {
                    ColorDetail(color: .pink)
                }
                NavigationLink(&quot;Orange&quot;) {
                    ColorDetail(color: .orange)
                }
            }
        }
        .navigationViewStyle(.stack)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 NavigationLink마다 Destination View를 지정했어야 했는데...훨씬 간결해지고 편해진 것 같아요?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;물론 위 코드도 NavigationLink를 1개만 쓰도록 개선될 수 있겠지만.. 일단 그렇다~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Manage navigation state&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기본적으로 NavigationStack은 state를 관리하여 stack에 있는 view들을 추적하는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이걸 내가 직접 관리할수도 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668931397879&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@State private var presentedColor: [Color] = [] ✅

var body: some View {
       NavigationStack(path: $presentedColor) { ... } ✅
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 State변수를 만들고, NavigationStack의 생성자 파라미터인 path에 넣어줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 NavigationStack은 우리가 만든 presentedColor State를 관찰하게 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 presentedColor에 값들을 넣어봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668931748314&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@State private var presentedColor: [Color] = [Color.brown, Color.cyan]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 앱을 실행하면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Simulator Screen Recording - iPhone 14 Pro Max - 2022-11-20 at 17.10.00.gif&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vg9OT/btrRBaEkdPK/KlIlP3dWSfo4Z0AP0z02gk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vg9OT/btrRBaEkdPK/KlIlP3dWSfo4Z0AP0z02gk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vg9OT/btrRBaEkdPK/KlIlP3dWSfo4Z0AP0z02gk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/Vg9OT/btrRBaEkdPK/KlIlP3dWSfo4Z0AP0z02gk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;296&quot; height=&quot;640&quot; data-filename=&quot;Simulator Screen Recording - iPhone 14 Pro Max - 2022-11-20 at 17.10.00.gif&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱을 실행하자마자&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668931826135&quot; class=&quot;dos&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@State private var presentedColor: [Color] = [Color.brown, Color.cyan]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;root &amp;gt; brown &amp;gt; cyan 순으로 stack이 쌓인것을 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;NavigationLink 를 사용하지 않고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668931939234&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List {
    NavigationLink(&quot;Mint&quot;, value: Color.mint)
    NavigationLink(&quot;Pink&quot;, value: Color.pink)
    NavigationLink(&quot;Teal&quot;, value: Color.teal)
    Button(&quot;DeepLink&quot;, action: {
        self.showColors()
    })
}
func showColors() {
    self.presentedColor = [Color.gray, Color.green]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 제가 직접 값을 지정해주거나, 제거해주면 그대로 Navigation Stack이 수정됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Button을 클릭했을 때 presentedColor 값을 수정해주는 메소드를 호출하게 했습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Simulator Screen Recording - iPhone 14 Pro Max - 2022-11-20 at 17.14.50.gif&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEJ0BN/btrRFfkjvUl/ykzASS1laN0mxZkK5yisW0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEJ0BN/btrRFfkjvUl/ykzASS1laN0mxZkK5yisW0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEJ0BN/btrRFfkjvUl/ykzASS1laN0mxZkK5yisW0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dEJ0BN/btrRFfkjvUl/ykzASS1laN0mxZkK5yisW0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;296&quot; height=&quot;640&quot; data-filename=&quot;Simulator Screen Recording - iPhone 14 Pro Max - 2022-11-20 at 17.14.50.gif&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;보신 것 같이 NavigationStack의 path를 이용하면 &lt;b&gt;딥링크나 상태복원 등등을 쉽게 할 수 있게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SwiftUI</category>
      <category>NavigationLink</category>
      <category>NavigationStack</category>
      <category>navigationview</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1376</guid>
      <comments>https://zeddios.tistory.com/1376#entry1376comment</comments>
      <pubDate>Sun, 20 Nov 2022 17:38:58 +0900</pubDate>
    </item>
    <item>
      <title>Heroku에서 Fly.io로 (feat. Fly.io를 통한 배포 과정)</title>
      <link>https://zeddios.tistory.com/1375</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Heroku에서 자꾸 메일이 오길래 봤더니, free plan을 삭제한다는 것이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;11월 28일까지 조치를 취해야하는데 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내 작고..작은....&lt;s&gt;너무 작아서 안보이는&lt;/s&gt; 토이 프로젝트 하나에 plan을 업그레이드 할만한 가치는 없다고 느껴져서(?)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대체제를 찾다 Fly.io를 발견했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Heroku 미안&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Fly.io 가입&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://fly.io&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fly.io&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;로 가서 가입을 해주고..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668236400881&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ brew install flyctl&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하라는대로 명령어를 터미널에 입력해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Heroku처럼 로그인을 해야하는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668236572433&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ flyctl auth login&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;터미널에 입력하면 알아서 브라우저 열리고 로그인되어있으면 알아서 잘 넘어간다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 카드 등록&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일단 카드를 등록해야한다. 무료 Plan을 사용하려고 해도 카드를 일단 등록해야한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대시보드로 가서 오른쪽에 보면 Add Payment method..? 로 버튼이 있는데 거기서 카드를 등록해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;등록을 완료하면 Hobby플랜으로 시작된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-12 오후 4.16.44.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/984Bg/btrQ3SQkXXg/sybaVDe1ZdBaI6My1nP0J1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/984Bg/btrQ3SQkXXg/sybaVDe1ZdBaI6My1nP0J1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/984Bg/btrQ3SQkXXg/sybaVDe1ZdBaI6My1nP0J1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F984Bg%2FbtrQ3SQkXXg%2FsybaVDe1ZdBaI6My1nP0J1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;498&quot; data-filename=&quot;스크린샷 2022-11-12 오후 4.16.44.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Hobby Plan은 무료사용량을 넘은 것만큼만 지불하는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Up to 3 shared-cpu-1x 256mb VMs&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3GB persistent volume storage (total)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;160GB outbound data transfer&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이정도가 무료인듯&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;내 앱은 찐따여서 상관없을 듯 한데, 아예 막히는게 아니라 넘으면 과금이라 이건 지켜봐야 할 것 같다. ㅎ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;아무튼 카드 등록을 안하면 배포를 못하니까 꼭 해주기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Deploy&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1668236961216&quot; class=&quot;shell&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd {소스코드 경로}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;터미널에서 소스코드가 있는 경로로 이동해준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668236977906&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ fly launch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그 상태에서 위 명령어를 쳐주면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;스캔하고 알아서 app 종류(?)를 선택해주는 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 앱 이름을 입력해달라고 하는데, 입력해주고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-12 오후 4.10.00.png&quot; data-origin-width=&quot;2352&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEwaua/btrQ1lyTxFZ/dIANIpNJs3CJrF977e4i41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEwaua/btrQ1lyTxFZ/dIANIpNJs3CJrF977e4i41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEwaua/btrQ1lyTxFZ/dIANIpNJs3CJrF977e4i41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEwaua%2FbtrQ1lyTxFZ%2FdIANIpNJs3CJrF977e4i41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2352&quot; height=&quot;284&quot; data-filename=&quot;스크린샷 2022-11-12 오후 4.10.00.png&quot; data-origin-width=&quot;2352&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 리전을 선택해달라는 메시지가 나온다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-11-12 오후 5.21.22.png&quot; data-origin-width=&quot;2128&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KFaOb/btrQ0GXQY3p/Yez5ZYrUbEZd0YquhpDmd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KFaOb/btrQ0GXQY3p/Yez5ZYrUbEZd0YquhpDmd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KFaOb/btrQ0GXQY3p/Yez5ZYrUbEZd0YquhpDmd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKFaOb%2FbtrQ0GXQY3p%2FYez5ZYrUbEZd0YquhpDmd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2128&quot; height=&quot;978&quot; data-filename=&quot;스크린샷 2022-11-12 오후 5.21.22.png&quot; data-origin-width=&quot;2128&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;암거나 하고..엔터치삼&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 질문이 막 나오는데 자기 프로젝트에 맞게 알아서 대답하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;Would you like to set up a Postgresql database now?&lt;/b&gt; &amp;nbsp;➡️ No로 함 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;Would you like to set up an Upstash Redis database now?&lt;/b&gt; ➡️&amp;nbsp;No로 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;Would you like to deploy now?&lt;/b&gt; ➡️&amp;nbsp;Yes&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 열심히 뭔가를 알아서 돌려준다. 기다리면댐&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668240583667&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;==&amp;gt; Creating release
--&amp;gt; release v1 created

--&amp;gt; You can detach the terminal anytime without stopping the deployment
==&amp;gt; Monitoring deployment

 1 desired, 1 placed, 1 healthy, 0 unhealthy [health checks: 1 total, 1 passing]
--&amp;gt; v1 deployed successfully&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 &lt;b&gt;deployed&amp;nbsp;successfully&lt;/b&gt; 가 보이면 배포 성공..ㅎ_ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 계속&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668240624550&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;v0 failed - Failed due to unhealthy allocations - no stable job version to auto revert to and deploying as v1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런 오류가 나서 좀 고생했는데.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;내 소스코드의 index.js 파일의 포트와 fly.toml의 포트가 안맞아서 나는 문제였다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;배포가 실패했다면&amp;nbsp;원인을 수정한 뒤 fly launch 말고 &lt;b&gt;fly deploy&lt;/b&gt;를 쳐주면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(그럼 알아서 v0, v1, v2...순으로 릴리즈함)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;+ 실패 원인을 찾기 위해 로그를 보고싶다면&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668241751159&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ fly logs -a {앱 이름}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;을 통해 확인 할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대시보드로 가면, 처음에 앱 이름으로 등록한 앱이 추가되어있을거다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱에서 사용하는 Host를 herokuapp에서 fly.dev로 수정해주면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;계속 마음의 짐이었는데...하나 덜었군&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>fly.io</category>
      <category>flyio</category>
      <category>heroku</category>
      <category>헤로쿠</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1375</guid>
      <comments>https://zeddios.tistory.com/1375#entry1375comment</comments>
      <pubDate>Sat, 12 Nov 2022 17:38:28 +0900</pubDate>
    </item>
    <item>
      <title>[Remote Notification 한판 정리] APNs / Token Based / Certificate Based / .p8과 .p12</title>
      <link>https://zeddios.tistory.com/1373</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아주 예전에..FCM으로 Remote notification작업을 해본적은 있긴 한데&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;DeviceToken이나 APNs같은 기본적인것들은 알았어도 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;전체적인 플로우에 대한&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정확한 이해가 없이 진행했던것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Remote Notification관련하여 테스트해보고 싶은게 생겼는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;관련하여 똑같은 작업을 하기전에 나 스스로 정리해보고싶은것들이 몇가지 있어 정리해보려고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Notification종류&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- local &lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&amp;nbsp;앱에서 직접 만드는 notification&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- remote &lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&amp;nbsp;서버 등 원격(remote)에서 만들어지는 notification&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# APNs&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Apple Push Notification service의 약자로. &lt;b&gt;앱에 notification을 보낼 수 있도록&lt;/b&gt; 애플이 만든 서비스이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Remote notification의 경우 아묻따 이 APNs를 거쳐와야한다. (local은 거치지 X)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;APNs가 내가 보내려는 notification을 &lt;b&gt;사용자로 기기로 전달하는 역할&lt;/b&gt;을 하기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Remote Notification을 위한 준비물&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 Remote notification(이하 알림)의 경우 4가지의 준비물이 필요하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Provider&amp;nbsp;server (그냥 알림을 만들어내는 어떤것이든 여기에 포함될 수 있다. FCM, 본인 회사 서버같은것들 포함)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. APNs&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 사용자의 기기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. 사용자의 기기에 설치된 너의 앱 (권한도 필요하지만, 이건 나중에..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# 전체적인 플로우&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 생각해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;알림의 컨텐츠와 언제보낼지, 누구한테 보낼지 등을 결정하는 것은 온전히 우리의 서버(provider)일것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;즉, 알림은 provider에서부터 시작된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 provider는 알림을 보내야할 때,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 알림 컨텐츠&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 알림을 보낼 디바이스의 unique&amp;nbsp;identifier (내가 특정 사람에게 알림을 보내야하니까. 아마도 DeviceToken)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;를 포함한 요청을 생성하게 되고, 이 요청은 APNs로 전달된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위에서도 말했지만, APNs가 내가 보내려는 알림을&amp;nbsp;&lt;b&gt;사용자로 기기로 전달하는 역할&lt;/b&gt;을 하기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;APNs는 알림을 사용자의 기기로 전달하게 되고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기기가 알림을 수신하게 되면 &lt;b&gt;기기의 OS가&lt;/b&gt; 모든 사용자 상호작용을 처리하고 알림을 앱에 전달한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1415edc2-0262-4180-a678-7ffce5599358.png&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O72HY/btrN8z0tPXc/OOhe63ZMGHsfsauGm6vysK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O72HY/btrN8z0tPXc/OOhe63ZMGHsfsauGm6vysK/img.png&quot; data-alt=&quot;https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O72HY/btrN8z0tPXc/OOhe63ZMGHsfsauGm6vysK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO72HY%2FbtrN8z0tPXc%2FOOhe63ZMGHsfsauGm6vysK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1329&quot; height=&quot;393&quot; data-filename=&quot;1415edc2-0262-4180-a678-7ffce5599358.png&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;#&amp;nbsp;Establish a Trusted Connection to APNs&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내가 대충 서버 만들고 APNs에 야 알림 보내!!!!!!!!!!!!요청을 보내고 싶지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;알림 요청을 APNs로 보내려면 Provider 서버가 HTTP/2 및 TLS를 사용하여&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Token(토큰) 기반&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Certificate(인증서) 기반&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;둘 중 하나로 신뢰를 설정&lt;/b&gt;해야한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;두 기술 모두 장단점이 있으며 환경에 따라 가장 적합한 기술을 결정하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns&quot;&gt;Establishing a Token-Based Connection to APNs&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;토큰 기반 인증은 APNs와 &lt;b&gt;stateless한 방법&lt;/b&gt;으로 통신하는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;stateless 통신은 APNs가 Provider서버와 관련된 Certificate or 기타 정보를 &lt;b&gt;조회할 필요가 없기 때문에&lt;/b&gt; Certificate 기반 통신보다 빠르다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[토큰 기반 인증의 장점]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 여러 Provider 서버에서 동일한 토큰 사용 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 하나의 토큰을 사용하여 회사의 모든 앱에 대한 Notification을 보낼 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;매번 요청시 마다 인증 토큰을 요청에 포함시켜야해서 &lt;b&gt;인증서 기반보다 요청이&lt;/b&gt; &lt;b&gt;살짝 크다&lt;/b&gt;고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;또한 Apple에서 제공하는 Provider Token Signing Key를 사용하여 &lt;b&gt;한시간에 한번 이상 토큰을 업데이트하고 암호화해야한다&lt;/b&gt;고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 Signing Key는 개발 및 프로덕션 환경 모두에서 동작하며,&amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Signing Key&lt;/span&gt;는 만료되지 않지만&lt;/b&gt; 취소할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;#&amp;nbsp;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Establishing a Certificate-Based Connection to APNs&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;인증서 기반은, 인증서를 사용하여 Provider와 APNs의 보안연결을 설정한다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;개발자 계정을 통해 이 인증서를 발급받을 수 있다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;토큰 기반과 달리, 신뢰는 서버레벨에서 설정되어있기 때문에 각 요청에는 인증 토큰이 없어도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;각 앱에 대해 별도의 인증서를 생성해야하며, 각 앱의 알림에 대해 별도의 APNs연결을 관리해야한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(여러 앱을 지원하고자한다면 토큰기반 연결을 사용하는 것이 더 간단하다.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;즉, 토큰 기반 연결의 장점이었던,&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하나의 토큰을 사용하여 회사의 모든 앱에 대한 Notification을 보낼 수 있음&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;는 인증서 기반 연결에서는 간단히 할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;또한 매년 인증서를 갱신해야하며&lt;/b&gt; 이를 까먹으면 큰 문제가 발생할 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(반면에 토큰 기반에서 사용되는 Signing Key는 만료되지 않음)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Provider 서버에서 인증서를 설치했다면, 아래와같은 플로우로 APNs와 연결을 시도하게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;b4f0b7ae-f9ed-4863-aced-ade4cdfb6a82.png&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddh6e4/btrN39I2yxk/peNkTCEgKDoKmLSL0UzCkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddh6e4/btrN39I2yxk/peNkTCEgKDoKmLSL0UzCkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddh6e4/btrN39I2yxk/peNkTCEgKDoKmLSL0UzCkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fddh6e4%2FbtrN39I2yxk%2FpeNkTCEgKDoKmLSL0UzCkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;977&quot; height=&quot;691&quot; data-filename=&quot;b4f0b7ae-f9ed-4863-aced-ade4cdfb6a82.png&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 과정이 끝나야지 APNs에 알림 요청을 보낼 수 있게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 Provider와 APNs사이에 자격 증명들이 전송되기 때문에 (자주 재생성되고 암호화되어있는) 토큰 기반 연결보다 &lt;b&gt;보안이 떨어진다&lt;/b&gt;고 &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://aws.amazon.com/ko/blogs/compute/token-based-authentication-for-ios-applications-with-amazon-sns/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;아마존 블로그&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;에 나오는데, 정말 상대적으로 보안이 떨어지는거라고 보면될 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여기까지 읽었으면 응 토큰쓸거야~ 라는 생각이 들텐데..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;맞다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;애플은 각각 장단점이 있다고 했지만.. 내 생각엔 인증서 기반을 쓸 이유가 없는 것 같다. (물론 잘 쓰는 곳도 있겠지만..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(실제로 토큰 방식 연결이 더 최신이다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 그놈의 p8과 p12가 각각 어떤것인지 살펴보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# p8&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;p8 포맷은 key이다. 그것도 &lt;b&gt;Token Signing Key&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Token Signing Key는 위에서 Token-Based 연결쪽에서 봤는데..&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;또한 Apple에서 제공하는 Provider Token Signing Key를 사용하여&amp;nbsp;한시간에 한번 이상 토큰을 업데이트하고 암호화해야한다고 한다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이&amp;nbsp;Signing Key는 개발 및 프로덕션 환경 모두에서 동작하며,&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Signing Key&lt;/span&gt;는 만료되지 않지만 취소할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;맞다. 이 p8은 &lt;b&gt;Token-based 연결에서 사용되는것&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# p12&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;p12 포맷은 인증서다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;즉, &lt;b&gt;Certificate-Based 연결에서 사용&lt;/b&gt;된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러니까 어떤 포맷을 썼다!만 듣고 어떤 방식의 연결인지 알 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;보통 FCM을 Provider Server로서 많이 사용하게되는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-08 오후 6.46.34.png&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;1058&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AgsDf/btrN6n7cclP/oXJGkRlw7o95tPcKimghaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AgsDf/btrN6n7cclP/oXJGkRlw7o95tPcKimghaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AgsDf/btrN6n7cclP/oXJGkRlw7o95tPcKimghaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAgsDf%2FbtrN6n7cclP%2FoXJGkRlw7o95tPcKimghaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1656&quot; height=&quot;1058&quot; data-filename=&quot;스크린샷 2022-10-08 오후 6.46.34.png&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;1058&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;APN 인증키 &lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&amp;nbsp;p8 /&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;APN 인증서 &lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&amp;nbsp;p12&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;를 업로드하면 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그림에도 나와있듯이 파베도 인증 키방식(Token-based)을 더 추천한다는거..&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;p8 포맷을 사용하여 remote notification을 보내는 방법에 대해서도 간단히 정리해보려고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대부분 문서를 참고했으나 틀린 부분이 있다면 댓글 ㄱ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[참고]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2016/724/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WWDC 16 -&amp;nbsp;What's New in the Apple Push Notification Service&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://help.apple.com/developer-account/#/deva05921840&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://help.apple.com/developer-account/#/deva05921840&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://aws.amazon.com/ko/blogs/compute/token-based-authentication-for-ios-applications-with-amazon-sns/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://aws.amazon.com/ko/blogs/compute/token-based-authentication-for-ios-applications-with-amazon-sns/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>APNS</category>
      <category>Notification</category>
      <category>p12</category>
      <category>P8</category>
      <category>Remote Notification</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1373</guid>
      <comments>https://zeddios.tistory.com/1373#entry1373comment</comments>
      <pubDate>Sat, 8 Oct 2022 19:17:06 +0900</pubDate>
    </item>
    <item>
      <title>[후기] INFCON 2022</title>
      <link>https://zeddios.tistory.com/1370</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;제가 오늘 인프콘을 다녀왔는데요 ^_^ 이게 얼마만의 오프라인 컨퍼런스 후기인지!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;원래&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_79188FC75246-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DL4lg/btrKHZhIh36/uKX1bKYYcqnM7LzRpBHXmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DL4lg/btrKHZhIh36/uKX1bKYYcqnM7LzRpBHXmk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DL4lg/btrKHZhIh36/uKX1bKYYcqnM7LzRpBHXmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDL4lg%2FbtrKHZhIh36%2FuKX1bKYYcqnM7LzRpBHXmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1163&quot; data-filename=&quot;IMG_79188FC75246-1.jpeg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;신청했을 때는 탈락했었는데요  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;운좋게 회사를 통해 티켓을 하나 구하게 되어서 갈 수 있게 되었답니다 \ㅎ_ㅎ/&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tempImagetjDZcr.gif&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7hvgp/btrKFQzLQY7/65sGtuizW5ur3WWw6piV10/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7hvgp/btrKFQzLQY7/65sGtuizW5ur3WWw6piV10/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7hvgp/btrKFQzLQY7/65sGtuizW5ur3WWw6piV10/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b7hvgp/btrKFQzLQY7/65sGtuizW5ur3WWw6piV10/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; data-filename=&quot;tempImagetjDZcr.gif&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;코엑스 그랜드볼룸에 열리는 컨퍼런스를 간다면 꼭 거치는 이길...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;역시나 길을 헤매서 물어물어 왔어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tempImagesRw96O.gif&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQMQjh/btrKIzb0d3v/NsKrCTTrunih9mAUpsXTO0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQMQjh/btrKIzb0d3v/NsKrCTTrunih9mAUpsXTO0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQMQjh/btrKIzb0d3v/NsKrCTTrunih9mAUpsXTO0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bQMQjh/btrKIzb0d3v/NsKrCTTrunih9mAUpsXTO0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot; data-filename=&quot;tempImagesRw96O.gif&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;저 가방은 와서 열어보니까&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;티셔츠 + 마스크 + 볼펜 + 스티커 + 물로 구성되어있더라구요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sNPPD/btrKFQT69xZ/qQoHLjjBL6muPsW5HEqX5K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sNPPD/btrKFQT69xZ/qQoHLjjBL6muPsW5HEqX5K/img.gif&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;tempImageUTNIkT.gif&quot; data-widthpercent=&quot;33.33&quot; style=&quot;width: 32.558139534883715%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sNPPD/btrKFQT69xZ/qQoHLjjBL6muPsW5HEqX5K/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsNPPD%2FbtrKFQT69xZ%2FqQoHLjjBL6muPsW5HEqX5K%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFEjXS/btrKHYJSnrc/WXMQfSi2cxm4wJAli0hn21/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFEjXS/btrKHYJSnrc/WXMQfSi2cxm4wJAli0hn21/img.gif&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;tempImage6a0Fsc.gif&quot; data-widthpercent=&quot;33.33&quot; style=&quot;width: 32.558139534883715%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFEjXS/btrKHYJSnrc/WXMQfSi2cxm4wJAli0hn21/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFEjXS%2FbtrKHYJSnrc%2FWXMQfSi2cxm4wJAli0hn21%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B1cBD/btrKHbwcRxf/e9ZK8Qdpn7iNXVXfakedLk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B1cBD/btrKHbwcRxf/e9ZK8Qdpn7iNXVXfakedLk/img.gif&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;tempImageDZJ0XM.gif&quot; data-widthpercent=&quot;33.34&quot; style=&quot;width: 32.558139534883715%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B1cBD/btrKHbwcRxf/e9ZK8Qdpn7iNXVXfakedLk/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB1cBD%2FbtrKHbwcRxf%2Fe9ZK8Qdpn7iNXVXfakedLk%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;물이 들어있었군....몰랐어..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 오프닝&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tempImageZ9YIMt.gif&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlZ5lV/btrKHwUnRzB/fhzU3B2aZeEZ94X6rEPzaK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlZ5lV/btrKHwUnRzB/fhzU3B2aZeEZ94X6rEPzaK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlZ5lV/btrKHwUnRzB/fhzU3B2aZeEZ94X6rEPzaK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dlZ5lV/btrKHwUnRzB/fhzU3B2aZeEZ94X6rEPzaK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; data-filename=&quot;tempImageZ9YIMt.gif&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오프닝 하는 곳이 꽉차서 저는 다른방으로..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;인프런이 이것저것 많이 시도하는구나 싶었던!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEA3sU/btrKFPHFgQ6/CvkIwddcGd8EwhSyTGBFqK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEA3sU/btrKFPHFgQ6/CvkIwddcGd8EwhSyTGBFqK/img.gif&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;tempImageK2gvtj.gif&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEA3sU/btrKFPHFgQ6/CvkIwddcGd8EwhSyTGBFqK/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEA3sU%2FbtrKFPHFgQ6%2FCvkIwddcGd8EwhSyTGBFqK%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TkHYa/btrKIxebsw7/WF2VCcKjrSOQgROfnbFP70/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TkHYa/btrKIxebsw7/WF2VCcKjrSOQgROfnbFP70/img.jpg&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2880&quot; data-filename=&quot;IMG_4860.JPG&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TkHYa/btrKIxebsw7/WF2VCcKjrSOQgROfnbFP70/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTkHYa%2FbtrKIxebsw7%2FWF2VCcKjrSOQgROfnbFP70%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2880&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;입장할 때 팜플렛도 받았는데, 뒤에 스탬프 이벤트 같은것도 있더라구요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v7yt3/btrKHYQFxWD/oY8C0qYSKbxcC6DpGTsowk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v7yt3/btrKHYQFxWD/oY8C0qYSKbxcC6DpGTsowk/img.gif&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot; data-widthpercent=&quot;50&quot; data-filename=&quot;tempImageSyaUi2.gif&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v7yt3/btrKHYQFxWD/oY8C0qYSKbxcC6DpGTsowk/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv7yt3%2FbtrKHYQFxWD%2FoY8C0qYSKbxcC6DpGTsowk%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n8mEO/btrKHdAL0mu/ZEvnzx49d010fWLnJcVCs0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n8mEO/btrKHdAL0mu/ZEvnzx49d010fWLnJcVCs0/img.gif&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot; data-widthpercent=&quot;50&quot; data-filename=&quot;tempImage5ud4N8.gif&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n8mEO/btrKHdAL0mu/ZEvnzx49d010fWLnJcVCs0/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn8mEO%2FbtrKHdAL0mu%2FZEvnzx49d010fWLnJcVCs0%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 줄이 에바라서 받지는 않음...ㅋ... 근데 사람들 굿즈 받은것들 보니까 넘넘넘 이뻐서 줄 설걸!!하고 후회했읍니다 ^^;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다들 그러셨겠지만 저 역시&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://infcon.day/session/&quot;&gt;인프콘 발표 시간표&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;를 미리 보고 제가 들을것들을 미리 정해두고 갔습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://infcon.day/speaker/%ed%95%9c%ec%a0%95%ec%88%98-%ec%8b%a4%eb%a6%ac%ec%bd%98%eb%b0%b8%eb%a6%ac-%eb%b9%84%ec%a0%84%ea%b3%b5-%ea%b0%9c%eb%b0%9c%ec%9e%90-%ed%9a%8c%ea%b3%a0/&quot;&gt;실리콘밸리로 떠나는 비전공자 개발자의 지난 4년 회고 - 좋았던 선택 vs 후회되는 선택&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1년차 ~ 4년차까지 각 년차에 뭘 했고 그때 했던 좋았던 선택/후회되는 선택들을 차근차근 이야기해주는 세션.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_4934.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H4VTR/btrKGw1SGYT/Up9iqqMrKEYpqKraUuCaN1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H4VTR/btrKGw1SGYT/Up9iqqMrKEYpqKraUuCaN1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H4VTR/btrKGw1SGYT/Up9iqqMrKEYpqKraUuCaN1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH4VTR%2FbtrKGw1SGYT%2FUp9iqqMrKEYpqKraUuCaN1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot; data-filename=&quot;IMG_4934.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;PPT를 잘 만드셔서 내용을 더 잘 이해할 수 있었다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://infcon.day/speaker/%ed%95%9c%ec%a3%bc%ec%8a%b9-%ed%85%8c%ec%8a%a4%ed%8a%b8-%ea%b8%b0%ec%96%b5%ed%95%a0-7%ea%b0%80%ec%a7%80/&quot;&gt;나도 내 코드의 문제를 찾고 싶다고요?! - 테스트 할 때 기억할 7가지&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;헉 저도 찾고싶어요 하면서 들었던 세션&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일단 인공위성에서 오는 데이터를 받는 그런 업무에 종사하신다고 하셨는데, 짱 멋있다...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chlKgx/btrKJ6UYn2P/Ng2UpoOUgkXfgKMIQVDqy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chlKgx/btrKJ6UYn2P/Ng2UpoOUgkXfgKMIQVDqy0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;IMG_4944.JPG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chlKgx/btrKJ6UYn2P/Ng2UpoOUgkXfgKMIQVDqy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchlKgx%2FbtrKJ6UYn2P%2FNg2UpoOUgkXfgKMIQVDqy0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmeP4f/btrKFRFukhV/nO2wJZOSx7TScCy1cYSj4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmeP4f/btrKFRFukhV/nO2wJZOSx7TScCy1cYSj4k/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;IMG_4945.JPG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmeP4f/btrKFRFukhV/nO2wJZOSx7TScCy1cYSj4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmeP4f%2FbtrKFRFukhV%2FnO2wJZOSx7TScCy1cYSj4k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다른 사람들의 생각/행동이 내 기준에서 이해가 가지 않을 때, 먼저 상대의 사고과정을 이해하는것부터 시작하면 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;테스트 케이스에 대한 올바른 정의가 필요. &amp;rarr;&amp;nbsp;기준이 되기 때문에 가장 중요. 잘못 정의하면 비정상이 정상으로 둔갑할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어떻게 테스트 케이스를 올바르게 정의할 수 있을까? &amp;rarr;&amp;nbsp;&amp;nbsp;제품 요구사항에 답이 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_4963.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djgsxK/btrKLf5bCAR/LlkNTUykzkRmZ7QTOa9eBk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djgsxK/btrKLf5bCAR/LlkNTUykzkRmZ7QTOa9eBk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djgsxK/btrKLf5bCAR/LlkNTUykzkRmZ7QTOa9eBk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjgsxK%2FbtrKLf5bCAR%2FLlkNTUykzkRmZ7QTOa9eBk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot; data-filename=&quot;IMG_4963.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;문제가 생겼을 때 가장 많은 시간을 할애하는 단계 &amp;rarr;&amp;nbsp;원인을 찾는데 가장 시간이 ⬆️&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;문제 해결을 위해&amp;nbsp;내부 구현 확인 / 외부 인터페이스 확인을 할 수 &amp;nbsp;있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 내부 구현확인 &amp;rarr; 개인의 자율에 맡겨진(짜여진) 코드를 확인하는 것이기 때문에 주관적인 근거로 대화가 이어질 수 있음. 감정적인 반응을 유발.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(ex. 제 코드엔 문제가 없는데... == 님 코드가 문제 인것 같은데 어떻게 생각하시는지..?)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;-&lt;b&gt; 외부 인터페이스 확인&lt;/b&gt; &amp;rarr;&amp;nbsp; 이것을 먼저 확인하는 것을 추천! 감정이 개입할 여지가 적다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_4969.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pPs7i/btrKJ4iwXP0/XevwXkVfgjk4d2dBer6yo0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pPs7i/btrKJ4iwXP0/XevwXkVfgjk4d2dBer6yo0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pPs7i/btrKJ4iwXP0/XevwXkVfgjk4d2dBer6yo0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpPs7i%2FbtrKJ4iwXP0%2FXevwXkVfgjk4d2dBer6yo0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot; data-filename=&quot;IMG_4969.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;우리는 언제 제품을 처음 만날까?(눈으로 확인할까)&amp;nbsp;&amp;rarr; 테스트 단계.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요구사항은 언제 정의될까? &amp;rarr; 제품을 만나기 전에 (눈으로 확인하기 전에)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;제품을 보지않은 상태에서 문제를 찾으려고 하면 힘들다. 디테일한 부분을 많이 놓치게됨. (맞어!!!!1)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 개발 프로세스에 아이러니가 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ycQX2/btrKHxFNEPa/blqNtkdgCTTwzii80knngK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ycQX2/btrKHxFNEPa/blqNtkdgCTTwzii80knngK/img.jpg&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_4978.JPG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ycQX2/btrKHxFNEPa/blqNtkdgCTTwzii80knngK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FycQX2%2FbtrKHxFNEPa%2FblqNtkdgCTTwzii80knngK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvsHxV/btrKLfYqb1z/HNtqpoJQTkfUhpxdZ6Nkz1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvsHxV/btrKLfYqb1z/HNtqpoJQTkfUhpxdZ6Nkz1/img.jpg&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_4982.JPG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvsHxV/btrKLfYqb1z/HNtqpoJQTkfUhpxdZ6Nkz1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvsHxV%2FbtrKLfYqb1z%2FHNtqpoJQTkfUhpxdZ6Nkz1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;눈으로 직접 보고 나면 진짜 요구사항에 더 가까이 다가갈 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어떻게 하면 이 간극을 줄일 수 있을까&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 내가 사용자 관점으로 내가 만든 제품의 첫 사용자가 되어본다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 고객의 상황을 상상해본다. &amp;rarr;&amp;nbsp;똑같은 기능을 좀 더 편하게 개선할 수 있게 됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사용자가 되어보니 개선할 점, 고객이 필요할 점이 보이기 시작.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일관성을 유지하는 것도 중요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 소프트웨어를 사용할 때 기억해야할 것을 최소화하는 것이 좋음. (쉽게 익숙해지도록)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 테스트단계에서 이 일관성을 개선하기 좋음(여러기능을 한번에 볼 수 있으니) &amp;rarr; 애초에 팀이 일관된 기준으로 만드는게 좋음(디자인 시스템이라던가..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;가장 기본적으로 '테스트'를 '해야함'&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 테스트 환경을 구성하기가 까다로워서 or 너무 간단한 기능이라서 테스트를 하지 않음. &amp;rarr; 너무 간단한 기능은 &quot;내가 보기에&quot; 그렇게 보이는 거임.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;컴퓨터가 음 이코드는 간단하네~~! 맛있다~! 이러는게 아님 (이렇게 말씀하진 않았습니다..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내가 간단하다고 &quot;판단&quot;하는 것임. 컴퓨터가 정상이라고 말하기 전에는 간단한 코드여도 믿지 않는것이 좋음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일단 목소리가 정말 나긋나긋하셔서 귀에 쏙쏙 들어오는 세션이었다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# &lt;/b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://infcon.day/speaker/%ec%84%9c%ec%a7%80%ec%97%b0-%ec%bd%94%eb%93%9c%eb%a6%ac%eb%b7%b0-%ea%b9%83%ed%97%99/&quot;&gt;&lt;b&gt;코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_4998.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCOeS/btrKSLcXbgm/P4kze9kX2mtuxdKXkKLFJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCOeS/btrKSLcXbgm/P4kze9kX2mtuxdKXkKLFJ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCOeS/btrKSLcXbgm/P4kze9kX2mtuxdKXkKLFJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCOeS%2FbtrKSLcXbgm%2FP4kze9kX2mtuxdKXkKLFJ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot; data-filename=&quot;IMG_4998.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Pull Request의 아쉬운점 &amp;rarr;&amp;nbsp;코드리뷰가 길어질 수 있음(시간적으로).&amp;nbsp;빨리 작업하고 릴리즈 해야하는데 그게 미뤄지고 그러면 쩜 별루임&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Stack Changes &amp;rarr; 흐름을 아래에서 위로 가져간다. 구현 하나하나 스택쌓듯이.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_5002.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Biea7/btrKTnC5k1P/ZSn0mDclhn6fSHZKAk1pf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Biea7/btrKTnC5k1P/ZSn0mDclhn6fSHZKAk1pf1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Biea7/btrKTnC5k1P/ZSn0mDclhn6fSHZKAk1pf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBiea7%2FbtrKTnC5k1P%2FZSn0mDclhn6fSHZKAk1pf1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot; data-filename=&quot;IMG_5002.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[장점]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 코드 변경 크기 줄어듬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 작업의 명확성 올라감&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 리뷰 속도 올라감&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Graphite (그라파이트)라는 도구로 Stack Changes를 해볼 수 있다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Pull Request 와 Graphite 비교&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kFuPC/btrKTTuWjTB/mWUST3BCPoSpDzQkkJu5kK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kFuPC/btrKTTuWjTB/mWUST3BCPoSpDzQkkJu5kK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;IMG_5020.JPG&quot; data-widthpercent=&quot;33.33&quot; style=&quot;width: 32.55813953488373%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kFuPC/btrKTTuWjTB/mWUST3BCPoSpDzQkkJu5kK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkFuPC%2FbtrKTTuWjTB%2FmWUST3BCPoSpDzQkkJu5kK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLlFNc/btrKT2STeum/wTcAE3FBK33gzjc8ya3Tw1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLlFNc/btrKT2STeum/wTcAE3FBK33gzjc8ya3Tw1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;IMG_5021.JPG&quot; data-widthpercent=&quot;33.33&quot; style=&quot;width: 32.55813953488373%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLlFNc/btrKT2STeum/wTcAE3FBK33gzjc8ya3Tw1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLlFNc%2FbtrKT2STeum%2FwTcAE3FBK33gzjc8ya3Tw1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLrliJ/btrKOIukVHH/E2nuV2IkC3si7DpUbdKx3k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLrliJ/btrKOIukVHH/E2nuV2IkC3si7DpUbdKx3k/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;IMG_5023.JPG&quot; data-widthpercent=&quot;33.34&quot; style=&quot;width: 32.55813953488373%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLrliJ/btrKOIukVHH/E2nuV2IkC3si7DpUbdKx3k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLrliJ%2FbtrKOIukVHH%2FE2nuV2IkC3si7DpUbdKx3k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 Stack Changes가 정확히 어떤것인지 감이 잘 안온다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;특히 나는 보통 이전 브랜치를 Base로 PR을 만드는데, 이게 Stack Changes랑 어떤 차이인지가 궁금..  &amp;zwj; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Stack Changes라는 개념도 처음 알게 되었고,&amp;nbsp;Graphite도 알게되어서 유익했던 세션!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://infcon.day/speaker/%eb%b0%95%eb%af%b8%ec%a0%95-%ed%8c%80%ec%84%b1%ec%9e%a5-%ec%bd%94%eb%93%9c%eb%a6%ac%eb%b7%b0/&quot;&gt;나와 팀을 성장시키는 리뷰들 - 코드리뷰만 리뷰가 아니라니까?&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_5029.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GdigD/btrKLgFcx8z/Nq2wSzZcPeWkMht5sShnW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GdigD/btrKLgFcx8z/Nq2wSzZcPeWkMht5sShnW0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GdigD/btrKLgFcx8z/Nq2wSzZcPeWkMht5sShnW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGdigD%2FbtrKLgFcx8z%2FNq2wSzZcPeWkMht5sShnW0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot; data-filename=&quot;IMG_5029.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;세션을 다 보고 나니 정말 딱 요 이야기를 해주신 것 같았던..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;개발자는 코드만 작성하지 않음. (==개발만 하지 않음). 개발자의 일 중 일부가 '코드를 작성하는 것'&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_5033.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HnpKQ/btrKOHhUlD0/aSJUszMVY7FbvZtLKAnTk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HnpKQ/btrKOHhUlD0/aSJUszMVY7FbvZtLKAnTk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HnpKQ/btrKOHhUlD0/aSJUszMVY7FbvZtLKAnTk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHnpKQ%2FbtrKOHhUlD0%2FaSJUszMVY7FbvZtLKAnTk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot; data-filename=&quot;IMG_5033.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요구사항(문제) 분석 단계의 리뷰&amp;nbsp;&amp;rarr;&amp;nbsp;문제를 명확히 정의해야함.&amp;nbsp;서로 '리뷰'하지 않으면 각자 다른 결과물을 생각할 수 있음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;설계 단계의 리뷰 &amp;rarr; 설계를 리뷰하지 않으면 기술에 집착하게 될 수 있음. 프로덕트(서비스) 측면에서는 지금 당장 하지 않아도 될일. 하면 좋은 일을 하다가 지금 진짜 필요한 일을 못하게 될 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;구현 단계의 리뷰 &amp;rarr; 코드리뷰. approve하는 이유를 적어주는 것이 좋다. PR에 충분한 설명이 없으면 집중해야할 코드가 어딘지 헷갈림. 코드작성자의 의무임&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;테스트 단계의 리뷰 &amp;rarr; 이미 '리뷰'라는 행위를 하고있음. 테스트 수행이 곧 리뷰 완료는 아님. (테스트에 결함이 있을 수 있기 때문에)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;배포 단계의 리뷰 &amp;rarr; 배포한 기능이 잘 쓰이고 있는지, 성능 문제는 없는지.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;각 단계의 리뷰를 잘하면 일을 잘하는 사람이 된다. &amp;rarr; 결국 팀원 개개인의 일하는 능력을 향상시킴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요 세션을 들으면서 앞으로 내가 시도해보면 좋을것들이 몇개 보였다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 기능조직에 있다가 목적조직으로 온 케이스인데, 와서 정말 뼈저리게 느끼는 건..&lt;b&gt;정말 개발은 일 중 일부구나ㅎ&lt;/b&gt;를 느꼈다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 나도 여기와서 자연스럽게 느낀건, 정말 일을 잘하는 사람은 개발을 잘하는 사람이 아니라는 것..!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일잘하는(함께 일하고 싶은) 사람이 되기 위해 열씸히 노력해야지  &amp;zwj;♀️&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# &lt;a style=&quot;color: #000000;&quot; href=&quot;https://infcon.day/speaker/%ea%b9%80%ec%b6%a9%ec%84%ad-devops/&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;지금 당장 DevOps를 해야 하는 이유&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;프로젝트에서 가장 중요한 것&amp;nbsp;&amp;rarr;&amp;nbsp;속도/일정. 빠르게하는것과 일정을 맞추는것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아마존&amp;nbsp;&amp;rarr; 11.7초에&amp;nbsp;한번씩&amp;nbsp;코드를&amp;nbsp;릴리즈&amp;nbsp;&amp;rarr; 데브옵스가 도움을 줄 수 있음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CXeQq/btrKUu9lcb5/p2Cy3fe23EaxjCVvmA3Fxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CXeQq/btrKUu9lcb5/p2Cy3fe23EaxjCVvmA3Fxk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;IMG_5048.JPG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CXeQq/btrKUu9lcb5/p2Cy3fe23EaxjCVvmA3Fxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCXeQq%2FbtrKUu9lcb5%2Fp2Cy3fe23EaxjCVvmA3Fxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8yKGi/btrKQi99KNl/xZuRFZulxWYNeJHuNLQDGK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8yKGi/btrKQi99KNl/xZuRFZulxWYNeJHuNLQDGK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;IMG_5051.JPG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8yKGi/btrKQi99KNl/xZuRFZulxWYNeJHuNLQDGK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8yKGi%2FbtrKQi99KNl%2FxZuRFZulxWYNeJHuNLQDGK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;조금씩 개선해보려는 시도가 중요함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 필요할 때 도구를 적절하게 사용하면 된다. (git, 젠킨스, aws, 그라파나 등등등등)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 자동화를 시도해보자&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PME4X/btrKME6QO6f/kK2YkvZImM70HC99JzIQYK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PME4X/btrKME6QO6f/kK2YkvZImM70HC99JzIQYK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;IMG_5055.JPG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PME4X/btrKME6QO6f/kK2YkvZImM70HC99JzIQYK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPME4X%2FbtrKME6QO6f%2FkK2YkvZImM70HC99JzIQYK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L78MV/btrKU7sw2Dr/ZblKxlxIVufUWFXweFKBDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L78MV/btrKU7sw2Dr/ZblKxlxIVufUWFXweFKBDk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;IMG_5061.JPG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L78MV/btrKU7sw2Dr/ZblKxlxIVufUWFXweFKBDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL78MV%2FbtrKU7sw2Dr%2FZblKxlxIVufUWFXweFKBDk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 처음 도입하면 프로세스가 더 느려질 수 있음(잘몰라서..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만 일단 시작하면 개선이 쌓이고 쌓여서 문화로 정착되면 큰 도움이 될 것이드..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;데브옵스 알못이라 들어봤는데, 확실히 이런 데브옵스 하시는 분들은 네트워크, 보안 지식이 몬가 뛰어나보이고...(대충 간지난다는 뜻)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일단 시작해보자!!! 작은거부터 시작하고 싶은데 뭐가 좋을까..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://infcon.day/speaker/%ec%a1%b0%ec%9d%80-%ed%94%84%eb%9f%b0%ed%8a%b8%ec%97%94%eb%93%9c-restful-api/&quot;&gt;FE 개발자도 할 수 있다! RESTful API 개발 (with Firebase, GCP)&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_5063.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA07eD/btrKQScuKt3/QlbNU5cpiXW6LW0CayV2H0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA07eD/btrKQScuKt3/QlbNU5cpiXW6LW0CayV2H0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA07eD/btrKQScuKt3/QlbNU5cpiXW6LW0CayV2H0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA07eD%2FbtrKQScuKt3%2FQlbNU5cpiXW6LW0CayV2H0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2160&quot; data-filename=&quot;IMG_5063.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;들으면서 느낀건 '헉.. FE개발자가 들어야 하는 세션이었군....'&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;코드가 많았는데, 사실 뭐 아 대충 이런 로직이군.. 하면서 짐작은 할 수 있지만,,ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하나 알았던건.. vercel!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://let-us-go-2020-summer.vercel.app&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;let us: Go! 홈페이지&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;나 다른 vercel.app으로 된 페이지 보면서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅎ&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅡ&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅁ... 얘는 몰까...(찾아보지는 않음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;했었는데, 저렇게 배포하는 거였구나~를 알게된..!!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 다음 세션도 있었는데, 오랜만에 만난 동료분과 저녁을 먹으러가서... 하하~!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼 정~~말 오랜만의 오프라인 컨퍼런스를 운좋게 다녀오고.. 좋은 세션들 들을 수 있어서 너무 감사한 하루였따.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그리고 역시나 자극도 많이 받은...  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;제가 요걸 딱 당일에 발행하려고 써놨었는데, 마무리를 못해서 이제야 발행하네요 핳&lt;/span&gt;&lt;/p&gt;</description>
      <category>일상</category>
      <category>INFCON 2022</category>
      <category>인프콘</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1370</guid>
      <comments>https://zeddios.tistory.com/1370#entry1370comment</comments>
      <pubDate>Mon, 29 Aug 2022 19:18:47 +0900</pubDate>
    </item>
    <item>
      <title>Lost connection to the debugger on &amp;ldquo;~&amp;rdquo;.</title>
      <link>https://zeddios.tistory.com/1369</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅋ... 노트북 세팅할때마다 이거 떠서 찾아보는 듯...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-25 오후 5.08.39.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GDHUh/btrKBrLtzEF/KL0KZWUtBvjGORknEsxRrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GDHUh/btrKBrLtzEF/KL0KZWUtBvjGORknEsxRrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GDHUh/btrKBrLtzEF/KL0KZWUtBvjGORknEsxRrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGDHUh%2FbtrKBrLtzEF%2FKL0KZWUtBvjGORknEsxRrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;532&quot; data-filename=&quot;스크린샷 2022-08-25 오후 5.08.39.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 원인&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일반적으로&amp;nbsp;종속성이&amp;nbsp;많은&amp;nbsp;앱에서&amp;nbsp;발생하므로&amp;nbsp;시작(Launch)하는&amp;nbsp;데 오래&amp;nbsp;걸림 -&amp;gt; 디버거가&amp;nbsp;중단되는 현상.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# 해결방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⚠️ &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/forums/thread/681037&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;어떤 사람이 Apple 개발자분과 이야기 하다가 얻은 정보&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;라 해결이 안될 수 있음 ⚠️&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;home directory(~) 에 &lt;span style=&quot;background-color: #f2f2f2;&quot;&gt;.lldbinit &lt;/span&gt;&lt;/span&gt;파일을 만든다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1661415132312&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nano .lldbinit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;저는 나노충이어서 ^-^&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-25 오후 5.12.21.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpHCLG/btrKzfZQIGg/u7jXXFODrgsaOvwKytWBX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpHCLG/btrKzfZQIGg/u7jXXFODrgsaOvwKytWBX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpHCLG/btrKzfZQIGg/u7jXXFODrgsaOvwKytWBX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpHCLG%2FbtrKzfZQIGg%2Fu7jXXFODrgsaOvwKytWBX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;66&quot; data-filename=&quot;스크린샷 2022-08-25 오후 5.12.21.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. .lldbinit에 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;settings set plugin.process.gdb-remote.packet-timeout 300&lt;/span&gt; 추가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-25 오후 5.14.00.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BrX0p/btrKwhRtIJr/le4k5JKm1dVmbwnkIbYag1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BrX0p/btrKwhRtIJr/le4k5JKm1dVmbwnkIbYag1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BrX0p/btrKwhRtIJr/le4k5JKm1dVmbwnkIbYag1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBrX0p%2FbtrKwhRtIJr%2Fle4k5JKm1dVmbwnkIbYag1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1014&quot; height=&quot;138&quot; data-filename=&quot;스크린샷 2022-08-25 오후 5.14.00.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 빌드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 재시작하라는 말도 있던데, 저는 안해도 잘 되더라구요~&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>Lost connection to the debugger on</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1369</guid>
      <comments>https://zeddios.tistory.com/1369#entry1369comment</comments>
      <pubDate>Thu, 25 Aug 2022 17:28:56 +0900</pubDate>
    </item>
    <item>
      <title>[Swift 5.7] Type inference from default expressions</title>
      <link>https://zeddios.tistory.com/1365</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Swift 5.7 이어서~~~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다음과 같은 간단한 Generic 메소드를 봅시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659506685932&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func compute&amp;lt;C: Collection&amp;gt;(_ values: C) -&amp;gt; Int {
    return values.count
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Collection protocol을 conform하고있는 generic parameter를 받도록 되어있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659506763336&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func compute&amp;lt;C: Collection&amp;gt;(_ values: C) -&amp;gt; Int {
    return values.count
}

compute([1, 2, 3]) // 3
compute([&quot;Zedd&quot;: &quot;안녕&quot;]) // 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 Array나 Dictionary같은 Collection 들을 넣을 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;default&amp;nbsp;value&amp;nbsp;expression&amp;nbsp;with&amp;nbsp;a&amp;nbsp;generic&amp;nbsp;parameter&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일반 메소드 parameter에 default value를 넣을 수 있듯이, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;generic parameter에도 default value를 넣어보고싶지만..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659506892397&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func compute&amp;lt;C: Collection&amp;gt;(_ values: C = ✅[1, 2, 3]✅) -&amp;gt; Int {
    return values.count
}
//   Default argument value of type '[Int]' cannot be converted to type 'C'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;컴파일 에러가 나는데요. 현재 semantic rule상 안된다고 함;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 &lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0347-type-inference-from-default-exprs.md&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;SE-0347&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&amp;nbsp;에서는 &lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;call site에서 명시적으로 파라미터를 안줬을 때&amp;nbsp;default value로 넣어둔 concrete type에 대해 타입 추론을 허용하자!&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;를 제안합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift 5.7에서는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659507667567&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func compute&amp;lt;C: Collection&amp;gt;(_ values: C = [1, 2, 3]) -&amp;gt; Int {
    return values.count
}

compute([1, 2, 3]) // 3
compute([&quot;Zedd&quot;: &quot;안녕&quot;]) // 1
compute() // 3 ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위와같이 &lt;b&gt;call site에서 명시적으로 파라미터를 안줬을 때&lt;/b&gt; default value로 넣어둔 [1, 2, 3]으로 타입 추론을 한다는 것이죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만 아묻따 generic parameter에 default value를 넣을 수 있는 것은 아니고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여전히 컴파일에러가 나는 상황이 있는데요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659508193757&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func compute&amp;lt;T, U: Collection&amp;gt;(value: T = 42,
                               collection: U) where U.Element == T {

}
//   Cannot use default expression for inference of 'T' because requirement 'T == U.Element' refers to other generic parameters&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;위와 같은 상황에서 여전히&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자 위에 T에 42라는 default value를 줬죠?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이러한 default parameter와 관련하여&amp;nbsp;암시적 or 명시적으로 call site에서 타입을 유추할 수 있다면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;concrete type으로 입력된 default value는 여전히 컴파일 에러가 납니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여기서는 U.Element = T라는 요구조건이 있고 여기서 T의 타입을 유추할 수 있기 때문에 컴파일 에러가 나는 것이죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659508869005&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func compute&amp;lt;T, U: Collection&amp;gt;(value: T = 42,
                               collection: U = []) where U.Element == Int {

} ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;만약 이렇게 T와 U가 서로 독립적으로 있다면 T의 default value가 허용됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;또 하나 허용 안되는 경우를 볼까요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://docs.swift.org/swift-book/LanguageGuide/Generics.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&amp;nbsp;Swift 공식문서 - Generic 파트&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에 있는 메소드입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659509163081&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func findIndex&amp;lt;T: Equatable&amp;gt;(of valueToFind: T, in array: [T]) -&amp;gt; Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 파라미터에 default value를 넣으면 잘 될 것 같지만,&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659509217303&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func findIndex&amp;lt;T: Equatable&amp;gt;(of valueToFind: T = 42 ✅, in array: [T]) -&amp;gt; Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}
//   cannot use default expression for inference of 'T' because it is inferrable from parameters #0, #1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;컴파일 에러가 나게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;첫번째, 두번째 파라미터로 (암시적 or 명시적으로) T를 유추할 수 있기 때문에.. default value를 넣어줄 수 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅎ&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅡ&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅁ.....&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift Generic이 runtime에 타입이 결정되는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659509674415&quot; class=&quot;stylus&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func compute&amp;lt;C: Collection&amp;gt;(_ values: C = [1, 2, 3]) -&amp;gt; Int {
    return values.count
}

compute([1, 2, 3]) // 3
compute([&quot;Zedd&quot;: &quot;안녕&quot;]) // 1
compute() // 3 ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위와 같을 때는 아직 타입을 유추할 수 없고...&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659509694596&quot; class=&quot;pgsql&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func findIndex&amp;lt;T: Equatable&amp;gt;(of valueToFind: T = 42 ✅, in array: [T]) -&amp;gt; Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}
//   cannot use default expression for inference of 'T' because it is inferrable from parameters #0, #1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이때는 call site에서 T를 &lt;b&gt;유추&lt;/b&gt;할 수 있기 때문에.. (첫번째, 두번째 파라미터에 같은 타입을 넣어줘야하니까..)&amp;nbsp;안되는 것 같네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;틀린 부분이 있으면 댓글 남겨주세요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요거 왜 안되는지, 되는지 잘 이해가 안가서 ㅎㅎ;; 계속 봤네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[참고]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0347-type-inference-from-default-exprs.md&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;SE-0347&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Swift</category>
      <category>Swift 5.7</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1365</guid>
      <comments>https://zeddios.tistory.com/1365#entry1365comment</comments>
      <pubDate>Fri, 5 Aug 2022 15:00:36 +0900</pubDate>
    </item>
    <item>
      <title>[Swift 5.7] Multi-statement closure type inference</title>
      <link>https://zeddios.tistory.com/1363</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Swift 5.7에서 추가된 기능인 Multi-statement&amp;nbsp;closure&amp;nbsp;type&amp;nbsp;inference를 살펴볼게요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Swift 5.7 이전&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;간단한 closure를 살펴봅시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657355316864&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let results = [&quot;Zedd&quot;, &quot;&quot;, &quot;Walker&quot;, &quot;&quot;].map { _ in
    return true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이럴 때는 closure내부에 리턴타입을 명시하지 않아도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이정도는 Swift가 추론할 수 있기 때문...이겠죠?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;다만,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657355507600&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let results = [&quot;Zedd&quot;, &quot;&quot;, &quot;Walker&quot;, &quot;&quot;].map { value in
    if value.isEmpty { return false }
    return true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런 if나 do-catch같은 statement가 closure내부에 추가되면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-07-09 오후 5.32.12.png&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nSsUv/btrGQn2guPB/GNJ6x4LyXZwSAyXrQKCWM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nSsUv/btrGQn2guPB/GNJ6x4LyXZwSAyXrQKCWM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nSsUv/btrGQn2guPB/GNJ6x4LyXZwSAyXrQKCWM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnSsUv%2FbtrGQn2guPB%2FGNJ6x4LyXZwSAyXrQKCWM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1788&quot; height=&quot;232&quot; data-filename=&quot;스크린샷 2022-07-09 오후 5.32.12.png&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Swift : 요 아이 Return타입 써주시겠어요?  &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Zedd : ㅋㅋ... **&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657355639233&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let results = [&quot;Zedd&quot;, &quot;&quot;, &quot;Walker&quot;, &quot;&quot;].map { value -&amp;gt; ✅Bool✅ in
    if value.isEmpty { return false }
    return true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;끝내 Return 타입을 붙히고 마는데..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;또 하나 익숙한 예를 들어봅시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657354418095&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let myView: UIView = {
    let view = UIView()
    // configure...
    return view
}()

let button: UIButton = {
    let button = UIButton()
    // configure...
    return button
}()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;custom decoder를 선언하고 싶을때도&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657354444562&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let decoder: JSONDecoder = {
    let decoder = JSONDecoder()
    // configure...
    return decoder
}()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런식으로 하곤 하죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아래와 같이&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657356151458&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let myView = {
    let view = UIView()
    // configure...
    return view
}()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여기서도 타입을 명시적으로 주지 않으면, 또 칼같이;;;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-07-09 오후 5.36.07.png&quot; data-origin-width=&quot;1784&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bynwQ1/btrGQbf2v5N/obLWaywC28Rv4IfPYglS7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bynwQ1/btrGQbf2v5N/obLWaywC28Rv4IfPYglS7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bynwQ1/btrGQbf2v5N/obLWaywC28Rv4IfPYglS7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbynwQ1%2FbtrGQbf2v5N%2FobLWaywC28Rv4IfPYglS7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1784&quot; height=&quot;226&quot; data-filename=&quot;스크린샷 2022-07-09 오후 5.36.07.png&quot; data-origin-width=&quot;1784&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위에서 본 똑같은!!!! 에러가 뜹니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;에러는 대충&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;multi statements가 있는 closure의 리턴 타입을 추론할 수 없다. 명확하게 하기 위해서 명시적으로 타입을 지정해라.&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;인데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Swift 5.7에서는 closures본문에서 타입 추론을 활성화 하여, multi-statement closures의 추론 동작이 개선되었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# Multi-statement&amp;nbsp;closure&amp;nbsp;type&amp;nbsp;inference&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Swift 5.7에서는 리턴타입을 명시하지 않은 아래 코드 모두 컴파일 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657356007971&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let results = [&quot;Zedd&quot;, &quot;&quot;, &quot;Walker&quot;, &quot;&quot;].map { value in
    if value.isEmpty { return false }
    return true
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1657356027311&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let myView = {
    let view = UIView()
    return view
}()

let button = {
    let button = UIButton()
    // configure...
    return button
}()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1657356068884&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let decoder = {
    let decoder = JSONDecoder()
    // configure...
    return decoder
}()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;으음 맛있다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;참고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0326-extending-multi-statement-closure-inference.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[SE-0326]&amp;nbsp;Enable multi-statement closure parameter/result type inference&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Swift</category>
      <category>Multi-statement closure type inference</category>
      <category>Swift 5.7</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1363</guid>
      <comments>https://zeddios.tistory.com/1363#entry1363comment</comments>
      <pubDate>Sat, 9 Jul 2022 17:48:39 +0900</pubDate>
    </item>
    <item>
      <title>[Swift 5.7] if let shorthand</title>
      <link>https://zeddios.tistory.com/1359</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift 5.7 변경사항 중 하나인&lt;span style=&quot;color: #3cb09c;&quot;&gt; &lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0345-if-let-shorthand.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;if let&amp;nbsp;shorthand&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;를 보려고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;if let foo = foo { .. }&lt;/span&gt; 를 사용하여 기존 optional variable를 &quot;숨기는&quot; optional binding은 굉장히 일반적인 패턴인데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;if let foo = foo 같이 식별자를 두번 써줘야해서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1656407584709&quot; class=&quot;lasso&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let someLengthyVariableName: Foo? = ...
let anotherImportantVariable: Bar? = ...

if let someLengthyVariableName = someLengthyVariableName, let anotherImportantVariable = anotherImportantVariable {
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 긴 이름으로 할 때 코드가 장황해지는 경우가 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;저는 저렇게 같은 이름으로 하는 것도 안좋아해서 ㅎ; 이름도 고민하게 되고 그러다보니 가독성도 떨어지는데요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1656406797232&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if let a = someLengthyVariableName, let b = anotherImportantVariable {
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그렇다고 이렇게 성의없는 이름으로 할 수는 없겠죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;#&amp;nbsp;if let&amp;nbsp;shorthand for shadowing an existing optional variable&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift 5.7에서는 Optional Binding에 단축 구문(shorthand&amp;nbsp;syntax)을 도입합니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1656407066228&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let zedd: String? = &quot;Zedd&quot;

if let zedd { ✅
   // zedd가 nil이 아닐때 실행될 코드 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;아래와 같은 것들도 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657352845015&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if let foo { ... }
if var foo { ... }

else if let foo { ... }
else if var foo { ... }

guard let foo else { ... }
guard var foo else { ... }

while let foo { ... }
while var foo { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;guard도 된다는거!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다만,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657353051683&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Person {

    let name: String?
}

let zedd = Person(name: &quot;Zedd&quot;)

if let zedd.name { //   Unwrap condition requires a valid identifier

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 인스턴스 안에 있는 멤버 변수를 바로 넣는것은 안됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;벌써 7월이라니..우리 모두 화이팅~~&lt;/span&gt;&lt;/p&gt;</description>
      <category>Swift</category>
      <category>if let shorthand</category>
      <category>Swift</category>
      <category>Swift 5.7</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1359</guid>
      <comments>https://zeddios.tistory.com/1359#entry1359comment</comments>
      <pubDate>Sat, 9 Jul 2022 17:04:16 +0900</pubDate>
    </item>
    <item>
      <title>[iOS 16] Developer Mode</title>
      <link>https://zeddios.tistory.com/1361</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대충 Developer Mode가 나왔다는 이야기는 들었는데...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-12 오후 6.02.14.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWiLun/btrEw8zeQDJ/nPVOnIQYZdvG4Kc22UCgL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWiLun/btrEw8zeQDJ/nPVOnIQYZdvG4Kc22UCgL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWiLun/btrEw8zeQDJ/nPVOnIQYZdvG4Kc22UCgL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWiLun%2FbtrEw8zeQDJ%2FnPVOnIQYZdvG4Kc22UCgL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;144&quot; data-filename=&quot;스크린샷 2022-06-12 오후 6.02.14.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;5분...?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅇㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;옛날에 막 40분씩 어떻게 봤지ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# What is&amp;nbsp;Developer&amp;nbsp;Mode&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 기본적으로 비활성화 되어있음. 명시적으로 개발자모드로 등록(enroll)해야함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 등록하면 재부팅 및 시스템 업데이트 후에도 유지&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 왜 생김&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;잠재적으로 유해한 소프트웨어를 실수로 기기에 설치하지 못하도록 보호&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 개발자 전용 기능으로 노출되는 공격(attack) 경로를 줄임&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Developer Mode의 핵심은 이겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;잠재적으로 유해한 소프트웨어를 실수로 기기에 설치하지 못하도록 보호&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;소프트웨어.. 그냥 앱은 보통&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. App Store&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Enterprise (In-House)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Test Flight&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;같은 데서 다운받아서 설치할 수 있는데, 이때는 Developer Mode가 필요하지 않습니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✅[Developer Mode를 켜야하는 경우]&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✅&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Development로 서명된 앱(Personal&amp;nbsp;Team포함)을 실행하고 설치해야할 때&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Testing 자동화&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 앱 Debug 및 Instrument&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. (WWDC에서 언급은 안됐지만)&amp;nbsp;Apple&amp;nbsp;Configurator로 .ipa파일을 설치할 때&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1번의 경우가 많을 텐데..한번 봅시다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14에서 iOS 16 기기를 연결하면 Scheme Selector쪽에 아래와 같이&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;developer-mode-01@2x.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b19VbI/btrEyvU1YFu/kaIkfz9Obz2KJQUapaG391/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b19VbI/btrEyvU1YFu/kaIkfz9Obz2KJQUapaG391/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b19VbI/btrEyvU1YFu/kaIkfz9Obz2KJQUapaG391/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb19VbI%2FbtrEyvU1YFu%2FkaIkfz9Obz2KJQUapaG391%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;490&quot; height=&quot;90&quot; data-filename=&quot;developer-mode-01@2x.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Developer Mode가 꺼져있기 때문에 Unavailable Device(사용할 수 없는 기기)라고 나오게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 선택하고 빌드하려고 하면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;developer-mode-02@2x.png&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KNKcz/btrExH2uNGb/X4TXWeq8ZaSKAoPMkkhk9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KNKcz/btrExH2uNGb/X4TXWeq8ZaSKAoPMkkhk9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KNKcz/btrExH2uNGb/X4TXWeq8ZaSKAoPMkkhk9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKNKcz%2FbtrExH2uNGb%2FX4TXWeq8ZaSKAoPMkkhk9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;546&quot; data-filename=&quot;developer-mode-02@2x.png&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;니 아이폰에 Developer Mode가 켜져있지 않네 ㅎ 하는 경고창이 뜨게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Developr Mode 켜는 방법&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;설정 &amp;gt; 개인정보 보호 및 보안 &amp;gt; Developer Mode(개발자 모드)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;에 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;(시뮬레이터는 없습니다)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;developer-mode-03@2x.png&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6qS9B/btrEyv8zug5/fUMFujM1qZkgTosZgouOV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6qS9B/btrEyv8zug5/fUMFujM1qZkgTosZgouOV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6qS9B/btrEyv8zug5/fUMFujM1qZkgTosZgouOV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6qS9B%2FbtrEyv8zug5%2FfUMFujM1qZkgTosZgouOV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;621&quot; height=&quot;330&quot; data-filename=&quot;developer-mode-03@2x.png&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Developer Mode를 on하면&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;1. 재부팅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;2. 재부팅하고 잠금해제하면 기기에 Developer Mode를 켤건지 확인하는 Alert이 뜸&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;3. ㅇㅋ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;하면 Developer Mode가 완전히 켜지게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;참고로 iOS, iPadOS, watchOS에 필요한거라&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;watchOS도 iOS와 똑같이 설정 &amp;gt; 개인 정보 보호 &amp;gt; Developer Mode(개발자 모드)에 가서 켜면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# When Developer Mode is turned on, your device security will be reduced&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;developer-mode-03@2x.png&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwQ9w3/btrExHnSHpD/KRDRr8aaofJFZViKk6Lrd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwQ9w3/btrExHnSHpD/KRDRr8aaofJFZViKk6Lrd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwQ9w3/btrExHnSHpD/KRDRr8aaofJFZViKk6Lrd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwQ9w3%2FbtrExHnSHpD%2FKRDRr8aaofJFZViKk6Lrd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;621&quot; height=&quot;330&quot; data-filename=&quot;developer-mode-03@2x.png&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;☝️ 설명 중 마지막줄에 나와있듯이... &lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;When Developer Mode is turned on,&amp;nbsp;your device security will be reduced.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;Developer Mode를 켜면, 기기의&amp;nbsp;보안이 약화될 것.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/wwdc22/110344&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WWDC&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에 따르면&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;To&amp;nbsp;acknowledge&amp;nbsp;the&amp;nbsp;reduction&amp;nbsp;in&amp;nbsp;security&amp;nbsp;protection&amp;nbsp;in&amp;nbsp;exchange&amp;nbsp;for&amp;nbsp;allowing&amp;nbsp;Xcode&amp;nbsp;and&amp;nbsp;other&amp;nbsp;tools&amp;nbsp;to&amp;nbsp;execute&amp;nbsp;code,&amp;nbsp;tap&amp;nbsp;Turn&amp;nbsp;On&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 및 기타 도구의 코드 실행을 허용하는 대신 &lt;span style=&quot;color: #ee2323;&quot;&gt;보안 보호가 감소했음을 확인&lt;/span&gt;했다면 On을 눌러&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;s&gt;&lt;br /&gt;난 보호도 받고싶고 빌드도 하고싶은데 얘네 뭐지???;;;&lt;br /&gt;&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정확히 어떤 종류의 보안에서 보호가 감소하는건지 나와있는게 없어서 쩜 무섭네여;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;암튼 이제 Developer Mode가 켜져있으므로 빌드하여 앱을 설치할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;Disable Developer Mode&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;똑같이 설정 &amp;gt; 개인정보 보호 및 보안 &amp;gt; Developer Mode(개발자 모드)가서 끄면 되고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;역시나 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 재부팅이 필요합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;- 다시 켤때 까지 Xcode에서 앱을 실행할 수 없습니다 ^^!!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;# Automation flows&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;암호가 없는 기기에만&lt;/b&gt;&lt;/span&gt; Developer Mode를 커맨드라인으로 활성화 할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(재시동 할 때 기기의 잠금을 해제해야하기 때문에 암호가 없는 기기만 가능하다는 식..)&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;devmodectl streaming&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;을 입력하면 연결된 모든 기기의 Developer Mode를 켤 수 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 1개 이상이 연결되어있어도 그냥 다 Developer Mode켜짐 (&lt;b&gt;암호가 없는 기기에만&lt;/b&gt;)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 당연히 재부팅 됨&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이게 시뮬레이터에서는 안나오기도 하고.. 제가 iOS 16 베타로 아직 올리질 않아서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;WWDC와 애플 문서를 기반으로 작성했는데, 틀린점이 있다면 댓글 주세요~!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[참고]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/wwdc22/110344&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[WWDC22] Get to Know Developer Mode&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Enabling Developer Mode on a device&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>Developer Mode</category>
      <category>Get to Know Developer Mode</category>
      <category>WWDC22</category>
      <category>개발자 모드</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1361</guid>
      <comments>https://zeddios.tistory.com/1361#entry1361comment</comments>
      <pubDate>Sun, 12 Jun 2022 19:08:23 +0900</pubDate>
    </item>
    <item>
      <title>Xcode 14 톺아보기</title>
      <link>https://zeddios.tistory.com/1358</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;웬만한 걸로 날 놀라게 할 수 없을걸 Xcode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ Xcode 14 미만 보다 30% 작아진 바이너리 &amp;rarr; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;다운로드 및 설치 속도가 훨씬 빠름&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.08.23.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvHM2O/btrEc4DtzPW/nMla259nUODWdvmng3xlW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvHM2O/btrEc4DtzPW/nMla259nUODWdvmng3xlW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvHM2O/btrEc4DtzPW/nMla259nUODWdvmng3xlW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvHM2O%2FbtrEc4DtzPW%2FnMla259nUODWdvmng3xlW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;976&quot; height=&quot;1030&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.08.23.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14 실행하려고 딱 누르면 요런 화면이 뜹니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;watchOS, tvOS 시뮬레이터 런타임 다운로드 여부를 내가 선택할 수 있게 되어 바이너리가&amp;nbsp;30% 작아졌다고 하는 것 같네요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&amp;nbsp;모듈 빌드 및 링크 단계에서 향상된 병렬처리 -&amp;gt; 프로젝트 빌드 속도가 최대 25% 빨라짐&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[기존]&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 11.40.03.png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bckFmt/btrEczxHFa3/f5YpK83xaFKfTxFXKL8GeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bckFmt/btrEczxHFa3/f5YpK83xaFKfTxFXKL8GeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bckFmt/btrEczxHFa3/f5YpK83xaFKfTxFXKL8GeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbckFmt%2FbtrEczxHFa3%2Ff5YpK83xaFKfTxFXKL8GeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1234&quot; height=&quot;522&quot; data-filename=&quot;스크린샷 2022-06-08 오전 11.40.03.png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode는 Application, framework와 같은 multiple&amp;nbsp;targets을 빌드할 때&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 프레임워크 소스를 컴파일&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 모듈을 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Application 소스를 Link 하고 컴파일&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. Application을 Link&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하여 빌드를 완료하는데, Xcode 14에서는 위와같은 작업들을 재정렬하여 병렬처리를 향상시켰다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 11.42.48.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crcJ9o/btrEhpzEuep/INk1XIt46HBuMidoNtgJfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crcJ9o/btrEhpzEuep/INk1XIt46HBuMidoNtgJfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crcJ9o/btrEhpzEuep/INk1XIt46HBuMidoNtgJfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrcJ9o%2FbtrEhpzEuep%2FINk1XIt46HBuMidoNtgJfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1222&quot; height=&quot;488&quot; data-filename=&quot;스크린샷 2022-06-08 오전 11.42.48.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;또한 Linker를 최대 2배 빠르게 만들었다고 하네요..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;rarr; 대충 이런 이유로 프로젝트 빌드 속도가 최대 25% 빨라졌다고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;응 안속아~ &amp;nbsp;(이러고 빌드 해봄)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아 근데 이거 아주 개인적인 느낌인데..제가 Xcode 12에서 13으로 딱 갔을 때&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아니 빌드가 왜이렇게 느려졌지?;;; 라는 생각했거든요?!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;진짜 가벼운 프로젝트인데도 빌드하면 뭔가 애매~하게 빌드 시간이 늘어난 느낌이었는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14로 해보니 빠릿빠릿한 느낌이네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  macOS 12에서 Xcode 14의 첫 실행은 유효성 검사로 인해 몇 분이 걸립니다.&amp;nbsp;(&lt;span style=&quot;background-color: #ffffff;&quot;&gt;89992778)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&amp;nbsp;  빌드 타임라인은 예기치 않게 오래 실행되는 빌드 작업 &amp;amp; 빌드 병목 현상을 식별하는데 도움이 됨&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;screen-lighter-medium_2x.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UOSa5/btrEaNJzoxL/qUxObSsv0PlbxhTglkPKtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UOSa5/btrEaNJzoxL/qUxObSsv0PlbxhTglkPKtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UOSa5/btrEaNJzoxL/qUxObSsv0PlbxhTglkPKtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUOSa5%2FbtrEaNJzoxL%2FqUxObSsv0PlbxhTglkPKtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;694&quot; data-filename=&quot;screen-lighter-medium_2x.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;보는 방법은 Report Navigator에 들어가면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.41.55.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXhaw6/btrEcQ6E5iH/Eb4XTOTOWalXr86opbFMTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXhaw6/btrEcQ6E5iH/Eb4XTOTOWalXr86opbFMTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXhaw6/btrEcQ6E5iH/Eb4XTOTOWalXr86opbFMTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXhaw6%2FbtrEcQ6E5iH%2FEb4XTOTOWalXr86opbFMTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;1136&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.41.55.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 나올텐데, Message들이 나와있는 Pane에 보고싶은 특정 메세지에 우클릭 &amp;gt; Show in Timeline을 하면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-gif-maker-7.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WlMu7/btrEdRKP6RE/WlftXyBw0MtK3pdRmqyEb1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WlMu7/btrEdRKP6RE/WlftXyBw0MtK3pdRmqyEb1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WlMu7/btrEdRKP6RE/WlftXyBw0MtK3pdRmqyEb1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/WlMu7/btrEdRKP6RE/WlftXyBw0MtK3pdRmqyEb1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;448&quot; data-filename=&quot;ezgif.com-gif-maker-7.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오른쪽에 가는게 아니라 아래로 위치하게 하고싶은데... 방법을 모르겠네요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&amp;nbsp;앱 아이콘 단순화&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Zedd : 앱 아이콘... 얘네 언제만듬?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.37.10.png&quot; data-origin-width=&quot;2742&quot; data-origin-height=&quot;1360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0VI4p/btrEejmtION/28hVT34K7uPTGKUpxtx6hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0VI4p/btrEejmtION/28hVT34K7uPTGKUpxtx6hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0VI4p/btrEejmtION/28hVT34K7uPTGKUpxtx6hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0VI4p%2FbtrEejmtION%2F28hVT34K7uPTGKUpxtx6hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2742&quot; height=&quot;1360&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.37.10.png&quot; data-origin-width=&quot;2742&quot; data-origin-height=&quot;1360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://makeappicon.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://makeappicon.com&lt;/a&gt; 이런데서 이미지 하나 넣고 다운받았지만..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14에서는 &lt;b&gt;단일 1024x1024 이미지로 앱 아이콘을 단순화&lt;/b&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;AppIcon &amp;gt; Attribute Inspector &amp;gt; Devices &amp;gt; iOS에서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.39.07.png&quot; data-origin-width=&quot;2910&quot; data-origin-height=&quot;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Pti2/btrEc2TeMdQ/18n7VKR9RjDHkxlRR0lreK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Pti2/btrEc2TeMdQ/18n7VKR9RjDHkxlRR0lreK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Pti2/btrEc2TeMdQ/18n7VKR9RjDHkxlRR0lreK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Pti2%2FbtrEc2TeMdQ%2F18n7VKR9RjDHkxlRR0lreK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2910&quot; height=&quot;920&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.39.07.png&quot; data-origin-width=&quot;2910&quot; data-origin-height=&quot;920&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;All Size를 Single Size로 변경해주면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대상에 맞게 자동으로 크기가 조정된다고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2ss85/btrEcyd7mY6/2b6t7vKN9yvk3MfzeXD9UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2ss85/btrEcyd7mY6/2b6t7vKN9yvk3MfzeXD9UK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2184&quot; data-origin-height=&quot;1448&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.40.32.png&quot; data-widthpercent=&quot;47.04&quot; style=&quot;width: 46.497779541502446%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2ss85/btrEcyd7mY6/2b6t7vKN9yvk3MfzeXD9UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2ss85%2FbtrEcyd7mY6%2F2b6t7vKN9yvk3MfzeXD9UK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2184&quot; height=&quot;1448&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vfjNP/btrEdzwbvI7/lT6fWETdiHgGsVkEh7YOpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vfjNP/btrEdzwbvI7/lT6fWETdiHgGsVkEh7YOpK/img.png&quot; data-origin-width=&quot;2292&quot; data-origin-height=&quot;1350&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.40.42.png&quot; data-widthpercent=&quot;52.96&quot; style=&quot;width: 52.339429760823144%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vfjNP/btrEdzwbvI7/lT6fWETdiHgGsVkEh7YOpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvfjNP%2FbtrEdzwbvI7%2FlT6fWETdiHgGsVkEh7YOpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2292&quot; height=&quot;1350&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;애플 날 살짝 놀라게 하는걸&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[Productive coding]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;더 스마트한 코드 컴플리션 및 추가된 코드 스니펫 -&amp;gt; 원하는 코드를 더 빠르게 얻을 수 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ &lt;b&gt;생성자 자동완성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654617133807&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Zedd {

    let name: String
    let age: Int64
    let company: String
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Type이름 우클릭 &amp;gt; Refactor &amp;gt; Generate memberwise initializer...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;도와줘요 Xcode 14!  &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.54.12.png&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EuuPW/btrEejtdS2f/KUu29mHOn1BZydA48BgMK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EuuPW/btrEejtdS2f/KUu29mHOn1BZydA48BgMK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EuuPW/btrEejtdS2f/KUu29mHOn1BZydA48BgMK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEuuPW%2FbtrEejtdS2f%2FKUu29mHOn1BZydA48BgMK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1916&quot; height=&quot;600&quot; data-filename=&quot;스크린샷 2022-06-08 오전 12.54.12.png&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;으음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Zedd 인스턴스를 생성해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.46.33.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs9OB2/btrEejG9QZy/3hQKwtazcQUPayws3IvZ01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs9OB2/btrEejG9QZy/3hQKwtazcQUPayws3IvZ01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs9OB2/btrEejG9QZy/3hQKwtazcQUPayws3IvZ01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs9OB2%2FbtrEejG9QZy%2F3hQKwtazcQUPayws3IvZ01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1514&quot; height=&quot;318&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.46.33.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;당연히 잘 나오겠죠?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러면 생성자에 기본값을 줘봅시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654652313185&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Zedd {

    let name: String
    let age: Int
    let company: String

    init(name: String, age: Int = 1, company: String = &quot;Test&quot;) {
        self.name = name
        self.age = age
        self.company = company
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 Zedd인스턴스를 생성해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.47.36.png&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u7S6u/btrD8ivQNB6/wh5Ia0G6gGdAEBKtpueqUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u7S6u/btrD8ivQNB6/wh5Ia0G6gGdAEBKtpueqUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u7S6u/btrD8ivQNB6/wh5Ia0G6gGdAEBKtpueqUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu7S6u%2FbtrD8ivQNB6%2Fwh5Ia0G6gGdAEBKtpueqUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1380&quot; height=&quot;482&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.47.36.png&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 기본값을 준 파라미터는 &lt;b&gt;이탤릭&lt;/b&gt;으로 나오게됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 상태로 엔터를 누르면, 기본값을 가지는 파라미터는 제외하고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654652901235&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Zedd(name: &amp;lt;#T##String#&amp;gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게만 나오게 되고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;옵션 + 엔터를 누르면 기본값 파라미터도 나오게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654652943449&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Zedd(name: &amp;lt;#T##String#&amp;gt;, age: &amp;lt;#T##Int#&amp;gt;, company: &amp;lt;#T##String#&amp;gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요 기능은 아주 유용하게 사용될 수 있는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기본값을 가지고 있는 파라미터가 엄청 많은 SwiftUI의 frame 메소드를 보겠습니다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.51.03.png&quot; data-origin-width=&quot;2690&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qxHpQ/btrEcNBOpwW/D79IDsPwqHkhTyj84eyTv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qxHpQ/btrEcNBOpwW/D79IDsPwqHkhTyj84eyTv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qxHpQ/btrEcNBOpwW/D79IDsPwqHkhTyj84eyTv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqxHpQ%2FbtrEcNBOpwW%2FD79IDsPwqHkhTyj84eyTv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2690&quot; height=&quot;462&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.51.03.png&quot; data-origin-width=&quot;2690&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내가 여기서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.52.46.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mhBVW/btrEc4qn4Ux/NjGClQABAOtcV792EmWIHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mhBVW/btrEc4qn4Ux/NjGClQABAOtcV792EmWIHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mhBVW/btrEc4qn4Ux/NjGClQABAOtcV792EmWIHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmhBVW%2FbtrEc4qn4Ux%2FNjGClQABAOtcV792EmWIHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1974&quot; height=&quot;332&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.52.46.png&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;☝️ 요 친구만 필요하다고 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기존 같았으면 그냥 모든 파라미터에 대한 생성자를 만들고, 내가 필요한 것만 남기고 지우는 식으로 했을텐데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-gif-maker-8.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PbgQU/btrEdSwgPs3/60HBvqfHlxYLX3bZwfAnJk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PbgQU/btrEdSwgPs3/60HBvqfHlxYLX3bZwfAnJk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PbgQU/btrEdSwgPs3/60HBvqfHlxYLX3bZwfAnJk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/PbgQU/btrEdSwgPs3/60HBvqfHlxYLX3bZwfAnJk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;137&quot; data-filename=&quot;ezgif.com-gif-maker-8.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 가능!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&amp;nbsp;명시적&amp;nbsp;Codable 구현을 ​​추가하기 위한 스니펫 제공&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-gif-maker-6.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bADhV0/btrEejteGyY/B1VchmHkA5C7mBLQpjaIPK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bADhV0/btrEejteGyY/B1VchmHkA5C7mBLQpjaIPK/img.gif&quot; data-alt=&quot;커맨드 누르고 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bADhV0/btrEejteGyY/B1VchmHkA5C7mBLQpjaIPK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bADhV0/btrEejteGyY/B1VchmHkA5C7mBLQpjaIPK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;428&quot; data-filename=&quot;ezgif.com-gif-maker-6.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커맨드 누르고 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;으음₩~~ &amp;nbsp;맛있다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 당연히 우클릭 &amp;gt; Refactor에서도 나옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- Decodable만 conform한 경우, init만 generate됩니다. (Encodable은 encode만)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- Refactor 꼭 안쓰고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-gif-maker-9.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyKPVe/btrEnRQWqlK/XUKUb0VwM5ZUuk14MDPng0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyKPVe/btrEnRQWqlK/XUKUb0VwM5ZUuk14MDPng0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyKPVe/btrEnRQWqlK/XUKUb0VwM5ZUuk14MDPng0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cyKPVe/btrEnRQWqlK/XUKUb0VwM5ZUuk14MDPng0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;268&quot; data-filename=&quot;ezgif.com-gif-maker-9.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 쳐도 스니펫으로 나옵니다~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ if case 코드 컴플리션 지원&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;맨날 if case . = xxx 이런거 할 때 자동완성 안되가지고;; 힘들었지만&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.20.43.png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ektamV/btrEbDmquwA/ftRABjtRyI68N8RDKvOsd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ektamV/btrEbDmquwA/ftRABjtRyI68N8RDKvOsd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ektamV/btrEbDmquwA/ftRABjtRyI68N8RDKvOsd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FektamV%2FbtrEbDmquwA%2FftRABjtRyI68N8RDKvOsd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1234&quot; height=&quot;512&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.20.43.png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 이런걸 보여주네요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ 스크롤시&amp;nbsp;code&amp;nbsp;structure를 편집기 상단에 고정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-gif-maker-5.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfpkGI/btrEcx0cPe4/nAQTMhM1uFzoUe1ZNdaUM0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfpkGI/btrEcx0cPe4/nAQTMhM1uFzoUe1ZNdaUM0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfpkGI/btrEcx0cPe4/nAQTMhM1uFzoUe1ZNdaUM0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bfpkGI/btrEcx0cPe4/nAQTMhM1uFzoUe1ZNdaUM0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;494&quot; data-filename=&quot;ezgif.com-gif-maker-5.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위에 고정되는거 보이시죠!?, 고정된 친구를 누르면 해당 위치로 이동도 합니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;끄고싶으면 Xcode Preprence에 들어가&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.01.31.png&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6dIsR/btrEcyrCDdz/ZDUM7PzRV56IPKpXOsgngk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6dIsR/btrEcyrCDdz/ZDUM7PzRV56IPKpXOsgngk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6dIsR/btrEcyrCDdz/ZDUM7PzRV56IPKpXOsgngk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6dIsR%2FbtrEcyrCDdz%2FZDUM7PzRV56IPKpXOsgngk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1646&quot; height=&quot;1100&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.01.31.png&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;1100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Code structure when scrolling을 체크 해제하면 됩니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;Definition&amp;nbsp;list&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Definition&amp;nbsp;list도 더 깔끔하게 바뀌었는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654762267912&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol Developer {

    func writeCode()
}

class Zedd: Developer {

    func writeCode() { }
}

class Walker: Developer {

    func writeCode() { }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;프로토콜이 있고, 해당 프로토콜을 준수하는 코드들이 있다고 생각해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654762267912&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let developer: Developer?

self.developer?.writeCode()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위와같은 상황에서 writeCode()에 대한 정의를 보고싶으면 3가지 후보가 존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Protocol 정의부&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Zedd 클래스 구현부&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Walker 클래스 구현부&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기존에는 위 구현부들이 잘 구분이 안가서 이것도 가보고 저것도 가보고 그랬는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14에서는 확실히 구분되도록 아래와 같이 띄워주게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 11.34.38.png&quot; data-origin-width=&quot;1930&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs1yT6/btrEc4jE0PK/cKqRpxYNVhZsOROKKM5Cs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs1yT6/btrEc4jE0PK/cKqRpxYNVhZsOROKKM5Cs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs1yT6/btrEc4jE0PK/cKqRpxYNVhZsOROKKM5Cs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs1yT6%2FbtrEc4jE0PK%2FcKqRpxYNVhZsOROKKM5Cs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1930&quot; height=&quot;458&quot; data-filename=&quot;스크린샷 2022-06-08 오전 11.34.38.png&quot; data-origin-width=&quot;1930&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[전체적인 UI]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ 코드 컴플리션 UI&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciMJqN/btrEdqTULfL/n8cy7nWtKLMYLAMUHTkMAK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciMJqN/btrEdqTULfL/n8cy7nWtKLMYLAMUHTkMAK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;670&quot; data-filename=&quot;이미지 2022. 6. 8. 오전 1.03.jpg&quot; data-widthpercent=&quot;58.51&quot; style=&quot;width: 57.8297400260924%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciMJqN/btrEdqTULfL/n8cy7nWtKLMYLAMUHTkMAK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciMJqN%2FbtrEdqTULfL%2Fn8cy7nWtKLMYLAMUHTkMAK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1298&quot; height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccVaVV/btrEaNv2dGE/WdNgQ8mELFCoYytoh90N1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccVaVV/btrEaNv2dGE/WdNgQ8mELFCoYytoh90N1K/img.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;808&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.03.01.png&quot; data-widthpercent=&quot;41.49&quot; style=&quot;width: 41.007469276233174%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccVaVV/btrEaNv2dGE/WdNgQ8mELFCoYytoh90N1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccVaVV%2FbtrEaNv2dGE%2FWdNgQ8mELFCoYytoh90N1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1110&quot; height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Xcode 13 / 14&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.05.52.png&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zb4mG/btrEfCy33m3/9xFEliZm2gLdP3Ty9szJCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zb4mG/btrEfCy33m3/9xFEliZm2gLdP3Ty9szJCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zb4mG/btrEfCy33m3/9xFEliZm2gLdP3Ty9szJCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzb4mG%2FbtrEfCy33m3%2F9xFEliZm2gLdP3Ty9szJCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1390&quot; height=&quot;822&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.05.52.png&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;생성자는 I로 표시되어서 확 눈에 들어오네요. (S는 struct, C는 class를 의미)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[SwiftUI]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✔️ Preview Canvas는 기본적으로 Interactive. 변경하는 즉시 변경사항이 적용됨&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✔️ 코드를 작성하지 않고&amp;nbsp;variants를 확인할 수 있게 됨&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;  : Preview에서 다크모드 확인하고 싶어 / &amp;nbsp;더 큰 텍스트 잘 나온는지 확인하고 싶어&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654651437049&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
        .preferredColorScheme(.dark)
        .environment(\.sizeCategory, .accessibilityExtraExtraExtraLarge)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;도와줘요 Xcode 14!  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.32.33.png&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZEwv9/btrEapnWld9/ftVMy8TIgD4hCTmqRBrOR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZEwv9/btrEapnWld9/ftVMy8TIgD4hCTmqRBrOR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZEwv9/btrEapnWld9/ftVMy8TIgD4hCTmqRBrOR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZEwv9%2FbtrEapnWld9%2FftVMy8TIgD4hCTmqRBrOR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1176&quot; height=&quot;488&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.32.33.png&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSMair/btrEdrr35dJ/akAf4gjx1joxG0vYPgIUFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSMair/btrEdrr35dJ/akAf4gjx1joxG0vYPgIUFK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1734&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.33.08.png&quot; data-widthpercent=&quot;49.72&quot; style=&quot;width: 49.14392327127737%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSMair/btrEdrr35dJ/akAf4gjx1joxG0vYPgIUFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSMair%2FbtrEdrr35dJ%2FakAf4gjx1joxG0vYPgIUFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1900&quot; height=&quot;1734&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p45Bo/btrEeKxk75y/rlRBN17SkXdVP9zZCxODg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p45Bo/btrEeKxk75y/rlRBN17SkXdVP9zZCxODg1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;1704&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.33.22.png&quot; data-widthpercent=&quot;50.28&quot; style=&quot;width: 49.69328603104821%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p45Bo/btrEeKxk75y/rlRBN17SkXdVP9zZCxODg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp45Bo%2FbtrEeKxk75y%2FrlRBN17SkXdVP9zZCxODg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1888&quot; height=&quot;1704&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2개 동시에 선택은 안됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[SF Symbols]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;Command + Shift + L을 눌러 SF Symbol들을 확인 할 수 있음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.36.16.png&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvbMHE/btrEdrMnazY/xXWt0fIB3Xiky9mKgP20H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvbMHE/btrEdrMnazY/xXWt0fIB3Xiky9mKgP20H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvbMHE/btrEdrMnazY/xXWt0fIB3Xiky9mKgP20H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvbMHE%2FbtrEdrMnazY%2FxXWt0fIB3Xiky9mKgP20H1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1354&quot; height=&quot;970&quot; data-filename=&quot;스크린샷 2022-06-08 오전 10.36.16.png&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;970&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[지원 중단]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ &quot;그&quot; bitcode가 더이상 사용되지 않습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.11.20.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ESLa/btrEcRxK0i6/IUKD1K4pI8KTf2IhRZPqV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ESLa/btrEcRxK0i6/IUKD1K4pI8KTf2IhRZPqV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ESLa/btrEcRxK0i6/IUKD1K4pI8KTf2IhRZPqV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ESLa%2FbtrEcRxK0i6%2FIUKD1K4pI8KTf2IhRZPqV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;140&quot; data-filename=&quot;스크린샷 2022-06-08 오전 1.11.20.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode 14로 열면 No로 되어있네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;iOS&lt;/b&gt;, tvOS 및 watchOS용 빌드에는 더 이상 기본적으로 비트코드가 포함되지 않습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;레거시 빌드 시스템 제거&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;armv7, armv7s 및 i386 아키텍처에 대한 배포 타겟을 사용하여 iOS 프로젝트를 빌드 -&amp;gt; &amp;nbsp;더 이상 지원되지 않음&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;Xcode 서버 -&amp;gt; 더 이상 지원되지 않음.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[참고]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2022/110427/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;What's New in Xcode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot; data-v-c8c6e5fc=&quot;&quot; data-v-91bcffaa=&quot;&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;Xcode 14 Beta Release Notes&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부</category>
      <category>What's New in Xcode</category>
      <category>WWDC 22</category>
      <category>WWDC Xcode</category>
      <category>Xcode</category>
      <category>Xcode 14</category>
      <category>Xcode14</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1358</guid>
      <comments>https://zeddios.tistory.com/1358#entry1358comment</comments>
      <pubDate>Thu, 9 Jun 2022 17:16:01 +0900</pubDate>
    </item>
    <item>
      <title>WWDC22 Sessions</title>
      <link>https://zeddios.tistory.com/1357</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;WWDC가 드디어 시작됐네요  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/wwdc22/sessions/&quot;&gt;https://developer.apple.com/wwdc22/sessions/&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&amp;nbsp;&lt;/span&gt;도 있고, Developer앱도 있지만!!!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;제 개인 노션에 WWDC22 Session들을 정리하려고 Session들 제목을 가져오다가.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;공유하면 좋을 것 같아 글을 써봅니다!~&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;제목들을 하나하나 복사한건 아니고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Xcode에서&amp;nbsp;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/wwdc22/sessions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/wwdc22/sessions/&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;페이지 소스코드를 가져온 뒤&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654600899088&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let endpointURL = URL(string: &quot;https://developer.apple.com/wwdc22/sessions/&quot;)!
for try await line in endpointURL.lines { print(line) }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Xcode 콘솔에서 &amp;lt;h4&amp;nbsp;class=&quot;cs-title&quot;&amp;gt;로 filtering하면 제목들이 쫙 나오는 데&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 제목 앞 뒤에 있는&amp;nbsp;&amp;lt;/h4&amp;nbsp;class=&quot;cs-title&quot;&amp;gt;와 &amp;lt;/h4&amp;gt;를&amp;nbsp;replacingOccurrences로 없애주면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvuroI/btrEcOgaQBx/FKnjRKnUCvYYya79Ci81b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvuroI/btrEcOgaQBx/FKnjRKnUCvYYya79Ci81b0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;1768&quot; data-filename=&quot;스크린샷 2022-06-07 오후 8.21.55.png&quot; data-widthpercent=&quot;35.19&quot; style=&quot;width: 34.777874963821006%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvuroI/btrEcOgaQBx/FKnjRKnUCvYYya79Ci81b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvuroI%2FbtrEcOgaQBx%2FFKnjRKnUCvYYya79Ci81b0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1244&quot; height=&quot;1768&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckvvEO/btrEc3xEeem/aRUavFiUg8thruShttAiQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckvvEO/btrEc3xEeem/aRUavFiUg8thruShttAiQK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2224&quot; data-origin-height=&quot;1716&quot; data-filename=&quot;스크린샷 2022-06-07 오후 8.22.10.png&quot; data-widthpercent=&quot;64.81&quot; style=&quot;width: 64.05933433850456%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckvvEO/btrEc3xEeem/aRUavFiUg8thruShttAiQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckvvEO%2FbtrEc3xEeem%2FaRUavFiUg8thruShttAiQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2224&quot; height=&quot;1716&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러면 1분만에 세션들 제목을 가져올 수 있게 됩니다~~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 날짜별 - &lt;u&gt;한국 시간 기준&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[6월 7일]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Apple Design Awards&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Apple Design Awards (ASL)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Keynote&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Keynote (ASL)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Monday@WWDC22&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Platforms State of the Union&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Platforms State of the Union (ASL)&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  ASL(American Sign Language)이 붙어있는 친구들은 영상에 수화가 같이 나옵니다&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[6월 8일]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Add accessibility to your Unity games&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Adopt desktop class editing interactions&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Adopt variable color in SF Symbols&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Bring Continuity Camera to your macOS app&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Bring your driver to iPad with DriverKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Bring your world into augmented reality&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Build your first app in Swift Playgrounds&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Capture machine-readable codes and text with VisionKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Complications and widgets: Reloaded&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create a more responsive media app&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create macOS or Linux virtual machines&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create parametric 3D room scans with RoomPlan&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Deliver reliable streams with HLS Content Steering&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Discover Metal 3&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Dive into App Intents&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Enhance collaboration experiences with Messages&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Enhance voice communication with Push to Talk&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore more content with MusicKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Get more mileage out of your app with CarPlay&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Get the most out of Xcode Cloud&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Get timely alerts from Bluetooth devices on watchOS&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Get to know Create ML Components&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Get to know Developer Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Hello Swift Charts&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Implement App Shortcuts with App Intents&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Load resources faster with Metal 3&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet Apple Maps Server APIs&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet Focus filters&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet Swift Async Algorithms&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet Swift Regex&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet WeatherKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet Web Push for Safari&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet desktop class iPad&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet passkeys&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Plug-in and play: Add Apple frameworks to your Unity game projects&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Program Metal in C++ with metal-cpp&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Qualities of great AR experiences&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;The SwiftUI cookbook for navigation&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Visualize and optimize Swift concurrency&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in App Clips&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in AppKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in Create ML&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in Nearby Interaction&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in SF Symbols 4&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in Safari and WebKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in SharePlay&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in Swift&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in SwiftUI&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in UIKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in Xcode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in managing Apple devices&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new with in-app purchase&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What&amp;rsquo;s new in notarization for Mac apps&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[6월 9일]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Add Live Text interaction to your app&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Add Shared with You to your app&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Adopt declarative device management&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Boost performance with MetalFX Upscaling&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Bring your iOS app to the Mac&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Build a desktop class iPad app&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Build a productivity app for Apple Watch&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Build global apps: Localization by example&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Compose advanced models with Create ML Components&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Compose custom layouts with SwiftUI&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create engaging content for Swift Playgrounds&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create your Privacy Nutrition Label&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Design App Shortcuts&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Design an effective chart&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Design app experiences with charts&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Discover advancements in iOS camera capture: Depth, focus, and multitasking&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Display ads and interstitials in SharePlay&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Eliminate data races using Swift Concurrency&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Embrace Swift generics&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore EDR on iOS&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore USD tools and rendering&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore in-app purchase integration and migration&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Improve the discoverability of your Swift-DocC content&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Integrate your custom collaboration app with Messages&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Link fast: Improve build and launch times&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet Apple Music API and MusicKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet Background Assets&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet CKTool JS&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet ScreenCaptureKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet Transferable&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet distributed actors in Swift&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet the expanded San Francisco font family&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Optimize your Core ML usage&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Optimize your use of Core Data and CloudKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Replace CAPTCHAs with Private Access Tokens&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Streamline local authorization flows&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Support multiple users in tvOS apps&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift Charts: Raise the bar&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift Regex: Beyond the basics&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Take ScreenCaptureKit to the next level&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Target and optimize GPU binaries with Metal 3&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Understand USD fundamentals&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Use Xcode to develop a multiplatform app&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in HealthKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in Swift-DocC&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new with SKAdNetwork&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What&amp;rsquo;s new in AVQT&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What&amp;rsquo;s new in CloudKit Console&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What&amp;rsquo;s new in Endpoint Security&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What&amp;rsquo;s new in Safari Web Extensions&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What&amp;rsquo;s new in Wallet and Apple Pay&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What&amp;rsquo;s new in iPad app design&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What&amp;rsquo;s new in privacy&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[6월 10일]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create Safari Web Inspector Extensions&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create a great video playback experience&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create camera extensions with Core Media IO&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Debug Swift debugging with LLDB&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Deep dive into Xcode Cloud for teams&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Demystify parallelization in Xcode builds&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Design for Arabic&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Design for Arabic &amp;middot; صمّم بالعربي&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Design for Collaboration with Messages&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Design protocol interfaces in Swift&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Discover ARKit 6&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Discover Managed Device Attestation&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Discover PhotoKit change history&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Discover Sign in with Apple at Work &amp;amp; School&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Display EDR content with Core Image, Metal, and SwiftUI&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Display HDR video in EDR with AVFoundation and Metal&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Enhance your Sign in with Apple experience&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Evolve your Core Data schema&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore App Tracking Transparency&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore navigation design for iOS&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Get it right (to left)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Go bindless with Metal 3&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Go further with Complications in WidgetKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Improve app size and runtime performance&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Make a great SharePlay experience&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Maximize your Metal ray tracing performance&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Meet Swift Package plugins&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Reach new players with Game Center dashboard&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Reduce networking delays for a more responsive app&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Simplify C++ templates with concepts&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;SwiftUI on iPad: Add toolbars, titles, and more&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;SwiftUI on iPad: Organize your interface&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;The craft of SwiftUI API design: Progressive disclosure&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Track down hangs with Xcode and on-device detection&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Transform your geometry with Metal mesh shaders&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Use SwiftUI with AppKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Use SwiftUI with UIKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in App Store Connect&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in MapKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in StoreKit testing&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in TextKit and text views&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in Vision&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in the Photos picker&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in web accessibility&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What&amp;rsquo;s new in HLS Interstitials&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Writing for interfaces&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[6월 11일]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Accelerate machine learning with Metal&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Author fast and reliable tests for Xcode Cloud&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Bring multiple windows to your SwiftUI app&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Build device-to-device interactions with Network Framework&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create Swift Package plugins&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create accessible Single App Mode experiences&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Create custom catalogs at scale with ShazamKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Discover Benchmarks in App Analytics&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Efficiency awaits: Background tasks in SwiftUI&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore Apple Business Essentials&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore SMS message filters&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore media metadata publishing and playback interactions&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Explore the machine learning development experience&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Implement proactive in-app purchase restore&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Improve DNS security for apps and servers&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Power down: Improve battery consumption&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Profile and optimize your game's memory&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Scale compute workloads across Apple GPUs&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Use Xcode for server-side development&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in PDFKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in Screen Time API&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;What's new in WKWebView&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;☝️ 복사해서 그냥 써도 되는데, 노션같은데 Table로 넣고싶으면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 복사&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 엑셀이나 Numbers에 있는 표에 복붙&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 그 표를 복사하여 노션 Table에 붙혀넣기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하면 손쉽게 옮길 수 있습니다 :D&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/wwdc22/sessions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/wwdc22/sessions/&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;에서 filter해서 봐도 되지만 그냥 추가&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# What's new&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in App Clips&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in AppKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in Create ML&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in Nearby Interaction&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in SF Symbols 4&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in Safari and WebKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in SharePlay&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in Swift&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in SwiftUI&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in UIKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in Xcode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in managing Apple devices&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new with in-app purchase&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What&amp;rsquo;s new in notarization for Mac apps&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in App Store Connect&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in MapKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in StoreKit testing&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in TextKit and text views&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in Vision&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in the Photos picker&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in web accessibility&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What&amp;rsquo;s new in HLS Interstitials&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in PDFKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in Screen Time API&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;What's new in WKWebView&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Meet&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet Apple Maps Server APIs&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet Focus filters&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet Swift Async Algorithms&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet Swift Regex&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet WeatherKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet Web Push for Safari&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet desktop class iPad&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet passkeys&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet Apple Music API and MusicKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet Background Assets&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet CKTool JS&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet ScreenCaptureKit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet Transferable&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet distributed actors in Swift&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Meet the expanded San Francisco font family&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;링크는 시간나면 달아볼게요.. 글 작성 날짜 기준으로 아직 첫째날 것 밖에 안나와서 ㅎㅎ..&lt;/span&gt;&lt;/p&gt;</description>
      <category>일상</category>
      <category>WWDC</category>
      <category>WWDC Sessions</category>
      <category>WWDC 세션</category>
      <category>WWDC22</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1357</guid>
      <comments>https://zeddios.tistory.com/1357#entry1357comment</comments>
      <pubDate>Tue, 7 Jun 2022 20:53:39 +0900</pubDate>
    </item>
    <item>
      <title>FlexLayout ) justifyContent / alignItems /  alignSelf  / alignContent 차이</title>
      <link>https://zeddios.tistory.com/1354</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;FlexLayout쓸 때 마다 헷갈리는 친구들이 있는데... 오늘 진짜 내 자신에게 너무 현타가와서 정리&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅎ ㅏ₩~~~~~~~~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# justifyContent&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정의 : flex container의 &lt;b&gt;main-axis을 따라&lt;/b&gt; 정렬을 정의하는 프로퍼티&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기본값 : start&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;가능한 값 : start&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;end&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;center&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;spaceBetween&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;spaceAround&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;spaceEvenly&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-24 오후 5.12.07.png&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;1672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pWRcy/btrCY6DshGS/ie2yzSgmHRBxCJ2X0gdWIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pWRcy/btrCY6DshGS/ie2yzSgmHRBxCJ2X0gdWIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pWRcy/btrCY6DshGS/ie2yzSgmHRBxCJ2X0gdWIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpWRcy%2FbtrCY6DshGS%2Fie2yzSgmHRBxCJ2X0gdWIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1706&quot; height=&quot;1672&quot; data-filename=&quot;스크린샷 2022-05-24 오후 5.12.07.png&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;1672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;저는 대충 뭐 워드나 한글의 글자 정렬과 비슷하다고 생각했기에 direction을 row로 테스트 해봅시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653465120429&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(100)
    .direction(.row)
    .backgroundColor(.systemYellow)
    .define { flex in
        flex.addItem().backgroundColor(UIColor.brown).size(50)
        flex.addItem().backgroundColor(UIColor.gray).size(50)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_A066C753A41A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brvbIo/btrC6HQfYA8/0sjgiPdK9BvL3pMo1FpHS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brvbIo/btrC6HQfYA8/0sjgiPdK9BvL3pMo1FpHS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brvbIo/btrC6HQfYA8/0sjgiPdK9BvL3pMo1FpHS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrvbIo%2FbtrC6HQfYA8%2F0sjgiPdK9BvL3pMo1FpHS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;345&quot; data-filename=&quot;IMG_A066C753A41A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아마도 가장 많이 쓰일 &lt;b&gt;center&lt;/b&gt;로 테스트.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653465671604&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(100)
    .direction(.row)
    .justifyContent(.center) // ✅
    .backgroundColor(.systemYellow).define { flex in
        flex.addItem().backgroundColor(UIColor.brown).size(50)
        flex.addItem().backgroundColor(UIColor.gray).size(50)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이러면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_629413A1FB74-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctX4Sd/btrC8mK8TuP/MSRZfx13JUHIkh55xRTaEK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctX4Sd/btrC8mK8TuP/MSRZfx13JUHIkh55xRTaEK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctX4Sd/btrC8mK8TuP/MSRZfx13JUHIkh55xRTaEK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctX4Sd%2FbtrC8mK8TuP%2FMSRZfx13JUHIkh55xRTaEK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;341&quot; data-filename=&quot;IMG_629413A1FB74-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 정렬됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왜냐? 지금 direction이 row. 즉 main-axis가 x축이기에 x축을 따라서 item들이 정렬되기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_629413A1FB74-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDTGed/btrC74ScbA7/RJRS8kKjk55niDcxNk43dK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDTGed/btrC74ScbA7/RJRS8kKjk55niDcxNk43dK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDTGed/btrC74ScbA7/RJRS8kKjk55niDcxNk43dK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDTGed%2FbtrC74ScbA7%2FRJRS8kKjk55niDcxNk43dK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;341&quot; data-filename=&quot;IMG_629413A1FB74-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 요렇게 x축을 따라서 이동하다 x축의 center에 정렬되게 되는 것이죠. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;주의할 점은....&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_EB359DB698FB-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IsBJp/btrC7JAeqpS/TtQnirGZhipZtfMtJ9CBGK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IsBJp/btrC7JAeqpS/TtQnirGZhipZtfMtJ9CBGK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IsBJp/btrC7JAeqpS/TtQnirGZhipZtfMtJ9CBGK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIsBJp%2FbtrC7JAeqpS%2FTtQnirGZhipZtfMtJ9CBGK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;300&quot; data-filename=&quot;IMG_EB359DB698FB-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 container에 추가된 flex item들이 x축-y축 center로 정렬되지 않는다는 것!!!!!!!!!!!!!!!!!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;당연하죠?!:;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# alignItems&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정의 : flex container의 &lt;b&gt;현재 main-axis의 cross-axis를 따라&lt;/b&gt;&amp;nbsp;정렬되는 방식을 정의하는 프로퍼티&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기본값 : stretch&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;가능한 값 : stretch&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;start&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;end&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;center&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;baseline&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;alignItems&lt;/b&gt;는 방금 봤던 justifyContent와 유사한데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;justifyContent가&amp;nbsp;flex container의&amp;nbsp;&lt;b&gt;main-axis을 따라 정렬을 정의&lt;/b&gt;하는 프로퍼티였다면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;alignItems&lt;/b&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;main-axis의 cross-axis를 따라 정렬되는 방식을 정의&lt;/b&gt;&lt;/span&gt;하는 프로퍼티입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-25 오후 4.48.24.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;1128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LmC52/btrC4icNE8i/TJdKCaCxte0WtQcKUcJepk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LmC52/btrC4icNE8i/TJdKCaCxte0WtQcKUcJepk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LmC52/btrC4icNE8i/TJdKCaCxte0WtQcKUcJepk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLmC52%2FbtrC4icNE8i%2FTJdKCaCxte0WtQcKUcJepk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1062&quot; height=&quot;1128&quot; data-filename=&quot;스크린샷 2022-05-25 오후 4.48.24.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;1128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;같은 예를 사용해보면,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653467257086&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(100)
    .direction(.row)
    .backgroundColor(.systemYellow)
    .define { flex in
        flex.addItem().backgroundColor(UIColor.brown).size(50)
        flex.addItem().backgroundColor(UIColor.gray).size(50)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_A066C753A41A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brvbIo/btrC6HQfYA8/0sjgiPdK9BvL3pMo1FpHS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brvbIo/btrC6HQfYA8/0sjgiPdK9BvL3pMo1FpHS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brvbIo/btrC6HQfYA8/0sjgiPdK9BvL3pMo1FpHS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrvbIo%2FbtrC6HQfYA8%2F0sjgiPdK9BvL3pMo1FpHS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;345&quot; data-filename=&quot;IMG_A066C753A41A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;현재 direction은 row. main-axis는 x니까.. cross-axis는 y입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 만약에 alignItems에 &lt;b&gt;end&lt;/b&gt;를 줬다고 생각해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_A066C753A41A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E0w7e/btrC7zrAGqV/GOsMpS5IcyT9cC7QXocGNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E0w7e/btrC7zrAGqV/GOsMpS5IcyT9cC7QXocGNk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E0w7e/btrC7zrAGqV/GOsMpS5IcyT9cC7QXocGNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE0w7e%2FbtrC7zrAGqV%2FGOsMpS5IcyT9cC7QXocGNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;345&quot; data-filename=&quot;IMG_A066C753A41A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;justifyContent 같았으면 현재 main-axis를 따라가므로, end를 줬다면 현재 axis인 x를 따라갔을테니 &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_732B16A7C4DA-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kVHxB/btrC8CmQilo/GQ6OIGTc7GyauxykgXDlik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kVHxB/btrC8CmQilo/GQ6OIGTc7GyauxykgXDlik/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kVHxB/btrC8CmQilo/GQ6OIGTc7GyauxykgXDlik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkVHxB%2FbtrC8CmQilo%2FGQ6OIGTc7GyauxykgXDlik%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;306&quot; data-filename=&quot;IMG_732B16A7C4DA-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 됐겠죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만!!!!! alignItems은 cross-axis를 따라가게 되고,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_A066C753A41A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GO4tT/btrC7K69TUY/mIhSz6FSqlZ7WDb7Vo00Qk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GO4tT/btrC7K69TUY/mIhSz6FSqlZ7WDb7Vo00Qk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GO4tT/btrC7K69TUY/mIhSz6FSqlZ7WDb7Vo00Qk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGO4tT%2FbtrC7K69TUY%2FmIhSz6FSqlZ7WDb7Vo00Qk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;345&quot; data-filename=&quot;IMG_A066C753A41A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;end를 줬으니.. column axis의 끝에 위치하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_A8FD1886DEC8-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJCP5F/btrC5MdAwh1/1SyKNHXmNWmCGazYXDePA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJCP5F/btrC5MdAwh1/1SyKNHXmNWmCGazYXDePA1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJCP5F/btrC5MdAwh1/1SyKNHXmNWmCGazYXDePA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJCP5F%2FbtrC5MdAwh1%2F1SyKNHXmNWmCGazYXDePA1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;321&quot; data-filename=&quot;IMG_A8FD1886DEC8-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 말이죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;가장 직관적으로 이해할 수 있는 것 같이 end 같이 보여서 선택했는데, justifyContent과의 차이점이 눈에 잘 들어오시나요?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 아주아주 간단한 문제! &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. direction이 row. 즉 main-axis가 row인 상태에서 alignItems(.center)를 하면 어떻게 될까&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정답:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_14711D145671-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5du1a/btrC886UJlO/JHTItpHbRrxGHKWqRYDywk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5du1a/btrC886UJlO/JHTItpHbRrxGHKWqRYDywk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5du1a/btrC886UJlO/JHTItpHbRrxGHKWqRYDywk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5du1a%2FbtrC886UJlO%2FJHTItpHbRrxGHKWqRYDywk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;300&quot; data-filename=&quot;IMG_14711D145671-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. direction이 column. 즉&amp;nbsp;main-axis가 y인 상태에서 alignItems(.center)를 하면 어떻게 될까&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정답:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_C53D10FD63C7-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDnI19/btrC7yseLJn/KUNkELUEoQC9N6hslTLnZK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDnI19/btrC7yseLJn/KUNkELUEoQC9N6hslTLnZK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDnI19/btrC7yseLJn/KUNkELUEoQC9N6hslTLnZK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDnI19%2FbtrC7yseLJn%2FKUNkELUEoQC9N6hslTLnZK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;494&quot; data-filename=&quot;IMG_C53D10FD63C7-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;justifyContent와 똑같이..주의할 점은....&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_EB359DB698FB-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IsBJp/btrC7JAeqpS/TtQnirGZhipZtfMtJ9CBGK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IsBJp/btrC7JAeqpS/TtQnirGZhipZtfMtJ9CBGK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IsBJp/btrC7JAeqpS/TtQnirGZhipZtfMtJ9CBGK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIsBJp%2FbtrC7JAeqpS%2FTtQnirGZhipZtfMtJ9CBGK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;300&quot; data-filename=&quot;IMG_EB359DB698FB-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 container에 추가된 flex item들이 x축-y축 center로 정렬되지 않는다는 것!!!!!!!!!!!!!!!!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : ㅋ그럼 저렇게 딱 x축-y축에 대해 center주고 싶으면 어떻게해냐되냐거&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ &lt;b&gt;justifyContent&lt;/b&gt;:&amp;nbsp;flex container의 &lt;b&gt;main-axis&lt;/b&gt;에 따라 정렬을 정의하는 프로퍼티&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ &lt;b&gt;alignItems&lt;/b&gt;: flex container의 현재 main-axis의 &lt;b&gt;cross-axis&lt;/b&gt;를 따라 배치되는 방식을 정의하는 프로퍼티&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하나는 main-axis..하나는 corss-axis...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;둘 다 center를 먹이면..?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653469453785&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(150)
    .justifyContent(.center) // ✅ 
    .alignItems(.center) // ✅
    .backgroundColor(.systemYellow).define { flex in
        flex.addItem().backgroundColor(UIColor.brown).size(50)
        flex.addItem().backgroundColor(UIColor.gray).size(50)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_EB359DB698FB-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc7c7b/btrC8CAqOgj/b0u82BkXK1PohzxSIckbL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc7c7b/btrC8CAqOgj/b0u82BkXK1PohzxSIckbL0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc7c7b/btrC8CAqOgj/b0u82BkXK1PohzxSIckbL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc7c7b%2FbtrC8CAqOgj%2Fb0u82BkXK1PohzxSIckbL0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;300&quot; data-filename=&quot;IMG_EB359DB698FB-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 x축-y축 center에 위치하도록 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아마도 가장 많이 쓰지 않을까..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# alignSelf&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정의 : &lt;b&gt;부모(parent)의 alignItems를 재정의(override)하여&lt;/b&gt; 자식(child)이 cross&amp;nbsp;direction으로 정렬되는 방식을 제어하는 프로퍼티&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기본값 : auto (flex container의 alignItems을 사용함을 의미)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;가능한 값 : auto&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;stretch&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;start&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;end&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;center&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;baseline&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아묻따 예제 코드부터 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653469918495&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(150)
    .direction(.row)
    .justifyContent(.center)
    .alignItems(.center) // ✅
    .backgroundColor(.systemYellow).define { flex in
        flex.addItem()
        .alignSelf(.end) // ✅
        .direction(.row)
        .backgroundColor(.systemRed)
        .define { flex in
            flex.addItem().backgroundColor(UIColor.brown).size(50)
            flex.addItem().backgroundColor(UIColor.gray).size(50)

        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;코드가 길어보이지만..;;; alignItems와 alignSelf를 봐주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자.. 우리가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653469957482&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(150)
    .direction(.row)
    .justifyContent(.center)
    .alignItems(.center) // ✅
    ....&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;딱 여기까지만 보면, 위에서 봤던거랑 똑같이&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_EB359DB698FB-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc7c7b/btrC8CAqOgj/b0u82BkXK1PohzxSIckbL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc7c7b/btrC8CAqOgj/b0u82BkXK1PohzxSIckbL0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc7c7b/btrC8CAqOgj/b0u82BkXK1PohzxSIckbL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc7c7b%2FbtrC8CAqOgj%2Fb0u82BkXK1PohzxSIckbL0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;300&quot; data-filename=&quot;IMG_EB359DB698FB-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 나오겠죠??&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 제가 &lt;b&gt;또 다른 container&lt;/b&gt;를 만들고, 그 container에 alignSelf를 .end를 줬습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 &lt;b&gt;또 다른 container안에&lt;/b&gt; 갈색 View, 회색 View를 넣어줬어요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653469983316&quot; class=&quot;reasonml&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(150)
    .direction(.row)
    .justifyContent(.center)
    .alignItems(.center) // ✅
    .backgroundColor(.systemYellow).define { flex in
        flex.addItem()
        .alignSelf(.end) // ✅
        .direction(.row)
        .backgroundColor(.systemRed)
        .define { flex in
            flex.addItem().backgroundColor(UIColor.brown).size(50)
            flex.addItem().backgroundColor(UIColor.gray).size(50)

        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자!!! 그럼 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;alignSelf가 부모(parent)의 alignItems를 재정의(override)하기 때문에&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.alignItems(.center)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;ㄴ&amp;nbsp;alignSelf(.end)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;이렇게 되어있으면 alignItems은 .end가 먹여지게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 어떻게 되냐..alignItems랑 똑같습니다. alignSelf도 역시 cross-axis를 따라서 정렬되므로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;지금 alignSelf가 먹은 container의 main-axis가 x이기 때문에 (&lt;i&gt;direction(.row)&lt;/i&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;x의 cross-axis인 y를 따라 정렬됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러니까...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_5349CECA97EA-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qCdcA/btrC8mru9ZT/f29O9CDK0rBhhK0h1rwdlk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qCdcA/btrC8mru9ZT/f29O9CDK0rBhhK0h1rwdlk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qCdcA/btrC8mru9ZT/f29O9CDK0rBhhK0h1rwdlk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqCdcA%2FbtrC8mru9ZT%2Ff29O9CDK0rBhhK0h1rwdlk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;490&quot; data-filename=&quot;IMG_5349CECA97EA-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 나오게 됩니다. (justifyContent는 center로 되어있으니까 center인거임)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;b&gt;alignSelf는 flex container에 안줘도되고, item에 줘도 됩니다.&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653471265248&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(150)
    .direction(.row)
    .justifyContent(.center)
    .alignItems(.center)
    .backgroundColor(.systemYellow).define { flex in
        flex.addItem().backgroundColor(UIColor.brown).size(50)
        	.alignSelf(.end) // ✅
        flex.addItem().backgroundColor(UIColor.gray).size(50)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 갈색 View에 &lt;b&gt;alignSelf&lt;/b&gt; end를 주면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0542C37EC8E6-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnpySo/btrC7IIfbO8/Qi8ujlwT2mkhxcLW7kqM7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnpySo/btrC7IIfbO8/Qi8ujlwT2mkhxcLW7kqM7K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnpySo/btrC7IIfbO8/Qi8ujlwT2mkhxcLW7kqM7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnpySo%2FbtrC7IIfbO8%2FQi8ujlwT2mkhxcLW7kqM7K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;459&quot; data-filename=&quot;IMG_0542C37EC8E6-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 갈색 View만 바뀌게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;alignContent&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⚠️ 주의 : alignContent를 이해하려면 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/layoutBox/FlexLayout#wrap​&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;wrap&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에 대한 이해가 필요합니다. ⚠️&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;정의 : FlexLayout에 있는 정의가 너무 이해가 안가서 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://www.codingfactory.net/12377&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;다른 블로그&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에 있는 정의를 가져왔습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- flex-wrap 속성의 값이 wrap인 경우, 아이템들의 가로폭의 합이 콘테이너의 가로폭을 넘어가면 아이템이 다음 줄로 내려갑니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;이때 여러 줄이 되어버린 아이템들의 정렬을 어떻게 할지 정하는 속성이 align-content입니다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 기본값은 stretch로, 높이를 꽉 채웁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기본값 : stretch&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;가능한 값 : stretch&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;start&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;end&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;center&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;/&amp;nbsp;&lt;/span&gt;baseline&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-25 오후 6.38.26.png&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;1494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m0Ufk/btrC7yslBzq/aic7a01oVSzQpsdMZWFwGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m0Ufk/btrC7yslBzq/aic7a01oVSzQpsdMZWFwGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m0Ufk/btrC7yslBzq/aic7a01oVSzQpsdMZWFwGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm0Ufk%2FbtrC7yslBzq%2Faic7a01oVSzQpsdMZWFwGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1288&quot; height=&quot;1494&quot; data-filename=&quot;스크린샷 2022-05-25 오후 6.38.26.png&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;1494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자..가장 처음의 예제 코드로 돌아가서 &lt;b&gt;alignContent&lt;/b&gt;를 줘봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653471566080&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(100)
    .direction(.row)
    .alignContent(.center) // ✅
    .backgroundColor(.systemYellow).define { flex in
        flex.addItem().backgroundColor(UIColor.brown).size(50)
        flex.addItem().backgroundColor(UIColor.gray).size(50)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : direction이 row고... alignContent를 center로 줬으니까..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-25 오후 6.40.12.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8kP69/btrC754h8fv/fgjrPV2kkejvfolBjuihW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8kP69/btrC754h8fv/fgjrPV2kkejvfolBjuihW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8kP69/btrC754h8fv/fgjrPV2kkejvfolBjuihW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8kP69%2FbtrC754h8fv%2FfgjrPV2kkejvfolBjuihW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;352&quot; data-filename=&quot;스크린샷 2022-05-25 오후 6.40.12.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 나오겠구만...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;결과 :&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_7DAEFE460351-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E8okd/btrC4eOIoGu/d8WtMQJkPQqkRgLBKjVgu1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E8okd/btrC4eOIoGu/d8WtMQJkPQqkRgLBKjVgu1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E8okd/btrC4eOIoGu/d8WtMQJkPQqkRgLBKjVgu1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE8okd%2FbtrC4eOIoGu%2Fd8WtMQJkPQqkRgLBKjVgu1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;290&quot; data-filename=&quot;IMG_7DAEFE460351-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;  : ⁉️&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;기본적으로 flex의 wrap값은 &lt;b&gt;unwrap&lt;/b&gt;인데요. unwrap이면 alignContent는 아무 효과가 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;wrap일 때 alignContent가 효과가 있는거 ㅇㅇ&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;flex-wrap 속성의 값이 wrap인 경우&lt;/b&gt;, 아이템들의 가로폭의 합이 콘테이너의 가로폭을 넘어가면 아이템이 다음 줄로 내려갑니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 여러 줄이 되어버린 아이템들의 정렬을 어떻게 할지 정하는 속성이 align-content입니다&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;일단 줄이 넘어가도록 여러개의 view를 넣어봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653472347847&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(150)
    .direction(.row)
    .wrap(.wrap) // ✅
    .backgroundColor(.systemYellow).define { flex in
        for _ in 1...10 {
            flex.addItem().backgroundColor(colors.randomElement()!).size(50)
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_CE050DE30986-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMOHDG/btrC7KMAbzf/Y9KvGo7st5gntafNg72de0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMOHDG/btrC7KMAbzf/Y9KvGo7st5gntafNg72de0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMOHDG/btrC7KMAbzf/Y9KvGo7st5gntafNg72de0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMOHDG%2FbtrC7KMAbzf%2FY9KvGo7st5gntafNg72de0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;443&quot; data-filename=&quot;IMG_CE050DE30986-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;wrap&lt;/b&gt;으로 설정되어있기 때문에 다음 줄로 잘 내려왔는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 상태에서 alignContent를 적용해봅시다. 대충 center로..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653472553771&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rootContainer.flex.height(150)
    .direction(.row)
    .wrap(.wrap)
    .alignContent(.center) // ✅
    .backgroundColor(.systemYellow).define { flex in
        for _ in 1...10 {
            flex.addItem().backgroundColor(colors.randomElement()!).size(50)
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8kP69/btrC754h8fv/fgjrPV2kkejvfolBjuihW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8kP69/btrC754h8fv/fgjrPV2kkejvfolBjuihW0/img.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;352&quot; data-filename=&quot;스크린샷 2022-05-25 오후 6.40.12.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 57.05772719022939%; margin-right: 10px;&quot; data-widthpercent=&quot;57.73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8kP69/btrC754h8fv/fgjrPV2kkejvfolBjuihW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8kP69%2FbtrC754h8fv%2FfgjrPV2kkejvfolBjuihW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vlb5N/btrC7JtD7tB/4LH3L2RganEbpjOvPYtTJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vlb5N/btrC7JtD7tB/4LH3L2RganEbpjOvPYtTJk/img.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;364&quot; data-filename=&quot;스크린샷 2022-05-25 오후 7.00.13.png&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;42.27&quot; style=&quot;width: 41.77948211209619%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vlb5N/btrC7JtD7tB/4LH3L2RganEbpjOvPYtTJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvlb5N%2FbtrC7JtD7tB%2F4LH3L2RganEbpjOvPYtTJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;842&quot; height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대충 잘 적용된 것을 볼 수 있읍니다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다시한번 말하지만, alignContent는 wrap이 적용되어있어야하므로..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;wrap이 적용되지 않은 상태에서는 alignContent를 해도&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_44F66D72A09B-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqW4ac/btrC7zEQ9vI/qKxKuhsTLkFxEnp0VyZIk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqW4ac/btrC7zEQ9vI/qKxKuhsTLkFxEnp0VyZIk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqW4ac/btrC7zEQ9vI/qKxKuhsTLkFxEnp0VyZIk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqW4ac%2FbtrC7zEQ9vI%2FqKxKuhsTLkFxEnp0VyZIk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;463&quot; data-filename=&quot;IMG_44F66D72A09B-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 이렇게 나오니 주의 ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;column도 동일하니까&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2EF6F4943C8A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3Ln8o/btrC7egoA2E/5t3WyDjqI9DmmpkbIVxpX1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3Ln8o/btrC7egoA2E/5t3WyDjqI9DmmpkbIVxpX1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3Ln8o/btrC7egoA2E/5t3WyDjqI9DmmpkbIVxpX1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3Ln8o%2FbtrC7egoA2E%2F5t3WyDjqI9DmmpkbIVxpX1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;478&quot; data-filename=&quot;IMG_2EF6F4943C8A-1.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;공식문서에 있는 이미지 참고하면 될 것 같아요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아 드디어 알겠내 편-안&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;혹시!! 틀린 부분이 있다면 꼭 댓글 부탁드립니다~  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[참고]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://www.codingfactory.net/12377&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.codingfactory.net/12377&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/layoutBox/FlexLayout&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/layoutBox/FlexLayout&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>공부</category>
      <category>alignContent</category>
      <category>alignitems</category>
      <category>alignSelf</category>
      <category>FlexLayout</category>
      <category>justifycontent</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1354</guid>
      <comments>https://zeddios.tistory.com/1354#entry1354comment</comments>
      <pubDate>Wed, 25 May 2022 22:38:34 +0900</pubDate>
    </item>
    <item>
      <title>Git Alias 사용해보기</title>
      <link>https://zeddios.tistory.com/1352</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# Git Alias 추가&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Alias. 말그대로 별칭.&amp;nbsp;명령에 매핑되는 더 짧은 명령을 만들수 있기 때문에 필요한 키 입력을 더 줄일 수 있어 효율적이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-stringify-type=&quot;pre&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;git pull origin develop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;alias를 등록하려면&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;git config -옵션 alias.{alias 이름} '{alias를 지정할 명령어}'&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;이렇게 하고 터미널에 입력하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ex.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;// global
git config --global alias.pd fetch 'pull origin develop'


// local
git config alias.pd 'pull origin develop'
git config --local alias.pd 'pull origin develop'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⚠️ [주의] &lt;span style=&quot;color: #000000;&quot;&gt;⚠️&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- pull&amp;nbsp;origin&amp;nbsp;develop같이 명령어에 공백이 있다면 작은 따옴표('')로 묶어줘야함.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- checkout같이 공백이 없다면 작은 따옴표('')로 묶어줄 필요 없음&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ex.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651655073627&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config alias.co checkout // 'checkout'이라고 안해줘도 됨.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 이제&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651655155990&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git co feature/~~~&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 쓸 수 있는것.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼 나는 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;pull origin develop&lt;/span&gt;을 alias로 지정해놨으므로&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651655379224&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// as-is
git pull origin develop

// to-be
git pd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;git pd&lt;/span&gt;만 쓰면 develop을 pull하게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;꼭 명령어로 안하고 직접&amp;nbsp;gitconfig파일을 수정해도 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;caret-color: #555555;&quot;&gt;✅ &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;global&lt;/b&gt;로 옵션으로 적용했다면 -&amp;gt; open ~/.gitconfig&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;caret-color: #555555;&quot;&gt;✅&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;local&lt;/b&gt; 옵션으로 적용했다면 -&amp;gt; 해당 디렉토리 -&amp;gt; 숨겨진 파일 보기 -&amp;gt; .git -&amp;gt; config 파일&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #555555;&quot;&gt;아무튼 둘 다&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-04 오후 6.14.26.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBwwSP/btrBhvXBUzJ/k2dmVk04PyxFWkLHKJzD3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBwwSP/btrBhvXBUzJ/k2dmVk04PyxFWkLHKJzD3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBwwSP/btrBhvXBUzJ/k2dmVk04PyxFWkLHKJzD3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBwwSP%2FbtrBhvXBUzJ%2Fk2dmVk04PyxFWkLHKJzD3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;732&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2022-05-04 오후 6.14.26.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic'; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;caret-color: #555555;&quot;&gt;이런식으로 들어가있을 것. 여기를 수정해줘도 된다.&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;caret-color: #555555;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# Alias 목록 보기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;당연히 위 config 파일을 보면 되긴 하는데 리스트를 터미널에서 보고싶다면&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651656169693&quot; class=&quot;jboss-cli&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// global
git config --global --get-regexp alias

// local
git config --local --get-regexp alias
git config --get-regexp alias&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 보면 된다. local에만 들어가있으면 --global로 했을 때 아무것도 안나오니 주의!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;caret-color: #555555;&quot;&gt;# Alias 삭제&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic'; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;caret-color: #555555;&quot;&gt;당연히;; 위 config파일에서 삭제해도 되고, 명령어로는 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;git config --옵션 --unset alias.{alias 이름}&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1651655732745&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// global
git config --global --unset alias.pd
 
// local
git config --local --unset alias.pd
git config --unset alias.pd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 활용&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;머지된 로컬 브랜치 삭제 명령어 같은거..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651656687461&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch --merged | grep -v &quot;master\|develop&quot; | xargs git branch -D&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;메모장에 넣어놓고 복붙하곤 그랬는데, 그냥 alias로 등록해두면 편하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651656782769&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config alias.db '!git branch --merged | grep -v \&quot;master\\|develop\&quot; | xargs git branch -d'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1651657637432&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git db&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;만 입력하면 머지된 로컬 브랜치들이 삭제된다~~ (master나 develop빼고)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이거 나만 안쓰고 있었던걸지도 모르는데... 그냥 이제부터라도 쓰는게 어디 ㅎㅋ.. 야호&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부</category>
      <category>Git</category>
      <category>git alias</category>
      <category>깃</category>
      <category>깃 alias</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1352</guid>
      <comments>https://zeddios.tistory.com/1352#entry1352comment</comments>
      <pubDate>Wed, 4 May 2022 18:50:34 +0900</pubDate>
    </item>
    <item>
      <title>Swift 5.6 ) Introduces existential any</title>
      <link>https://zeddios.tistory.com/1348</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;코로롱 에 걸려서 이래저래 굉장히 힘드네요   진짜 안걸리는게 제일 좋다~~!!!! 조심~~!!!&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오늘은 Swift 5.6에서 추가된 Introduces existential&amp;nbsp;any 요 기능만 호다닥 보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;먼저, Existential&amp;nbsp;type를 알아야 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Existential&amp;nbsp;type&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;직역하여 &quot;실존 타입&quot;정도로..이해하면 될 것 같아요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;우와 새로운 개념 ㄷㄷ;;;;이 아니라 Existential&amp;nbsp;type은 그냥 용어일 뿐, 우리가 계속 써왔던 개념입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648898139108&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol Pet {

  var name: String { get }
}

struct Cat: Pet {

  var name: String
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Pet이라는 프로토콜이 있고, Pet을 준수하는 Cat이 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Cat은 여기서 concrete type이라고 할 수 있겠죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648898168342&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var someCat = Cat(name: &quot;Yumi&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 Cat타입으로 someCat을 정의했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만 Cat이 Pet을 준수하고 있기 때문에,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648898266939&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var somePet: Pet = Cat(name: &quot;Yumi&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 코드도 전혀 문제없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;concrete&amp;nbsp;type인 Cat 대신에 Pet타입으로 somePet을 정의한것이죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여기서!!!! Pet을 existential&amp;nbsp;type이라고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Cat이라는 실존(존재)하고 있는 구조체를 참조하는 프로토콜인거죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://docs.swift.org/swift-book/LanguageGuide/Protocols.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Swift 공식문서 - Protocol 중 Protocols as Types&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에 가보면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Using a protocol as a type is sometimes called an&amp;nbsp;existential type&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;프로토콜을 타입으로 사용하는 것은&amp;nbsp;existential type이라고 불리기도 한다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 나와있네요 ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648898845747&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var somePet: Pet = Cat(name: &quot;Yumi&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼 이 경우 Pet은 existential type입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;existential type을 파라미터로 사용하는 경우도 있죠.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648959741303&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func 사료를_주다(to pet: Pet) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 말이죠!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;우리가 계속 써왔던거죠!?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Generic과 Existential&amp;nbsp;type&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Pet에 함수를 추가해주겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648959783837&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol Pet {
   func eat()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : 내가 Pet을 준수하는 타입을 만들어서 넘기면, eat을 호출해주는 함수를 만들어야겠어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1️⃣ : Generic을 쓰자!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648960184952&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func 사료를_주다&amp;lt;T: Pet&amp;gt;(to pet: T) {
    pet.eat()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Generic 함수에 protocol constraint를 걸어놨습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 이 함수는 Pet을 준수하는 concrete type만 받을 수 있게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 Pet을 준수하는 concrete type을 만들어서 &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;사료를_주다&lt;/span&gt;를 호출해봅시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648960228302&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Cat: Pet {
    
    let name: String
    
    func eat() { print(&quot;웅냥ㄴ양얀양냥&quot;) }
}

func 사료를_주다&amp;lt;T: Pet&amp;gt;(to pet: T) {
    pet.eat()
}

let cat = Cat(name: &quot;Yumi&quot;)
사료를_주다(to: cat) // 웅냥ㄴ양얀양냥&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 코드는 문제 없이 잘 돌아갑니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만 아래와같은 코드.. &lt;span style=&quot;color: #000000;&quot;&gt;existential type으로 사용한 코드&lt;/span&gt;는 컴파일 에러를 일으킵니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648960307582&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let cat: Pet = Cat(name: &quot;Yumi&quot;)
사료를_주다(to: cat) //   Protocol 'Pet' as a type cannot conform to the protocol itself&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;나는 Pet을 준수하는 타입만 받도록 했는데, &lt;b&gt;Pet 프로토콜 그 자체&lt;/b&gt;가 넘겨졌기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648960476035&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func 사료를_주다&amp;lt;T: Pet&amp;gt;(to pet: T) {
    pet.eat()
}
let cat = Cat(name: &quot;Yumi&quot;)
사료를_주다(to: cat) // 웅냥ㄴ양얀양냥&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 코드가 컴파일될 때, Swift는 이렇게 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Cat 인스턴스를 만듬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Cat 타입을 사료를_주다로 넘김&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Cat의 eat()을 호출함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (Swift) : 엥 그냥 Cat에 있는 eat()을 호출하면 되겠군..응 cat.eat()이야~~&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift는 그냥 Cat의 eat()을 직접(direct) 호출하는 최적화된 코드를 생성할 수 있게 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;컴파일시간에 Swift는 Cat의 eat()을 호출해야한다는 것을 아는것이죠.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이것이 바로 static dispatch입니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;컴파일타임에 어떤 구현을 실행하도록 결정할 수 있다면, 이를 static dispatch라고 합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;컴파일러가 실제로 어떤 구현이 실행될건지&amp;nbsp;&lt;b&gt;알기때문&lt;/b&gt;이죠. 즉, inline과 같은것을 포함하여 코드를 적극적으로 최적화 할 수 있게 됩니다.&lt;br /&gt;이러한 static dispatch는 dynamic dispatch와는 대조적인데요,&lt;br /&gt;dynamic dispatch는 컴파일러가&amp;nbsp;&lt;b&gt;컴파일타임에 어떤 구현을 실행할건지 결정 할 수 없습니다.&lt;br /&gt;&lt;/b&gt;런타임때만!!!! 실제로 구현된 곳으로&amp;nbsp;&lt;b&gt;jump&lt;/b&gt;하게 되죠(jump to it. jump라는 말이 너무 찰떡이라 굳이 번역하지 않았..)&lt;br /&gt;따라서 dynamic dispatch의 비용은 static dispatch보다 훨씬 큽니다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/597&quot;&gt;Swift ) (2) Understanding Swift Performance (Swift성능 이해하기)&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;참고&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2️⃣ : existential&amp;nbsp;type을 쓰자!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : ㅋㅋ 언제 &amp;lt;T: Pet&amp;gt; 이렇게 쎀ㅋㅋㅋ;;; 그냥&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648960890433&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func 사료를_주다(to pet: Pet) {
    pet.eat()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 쓰면 되는뎅ㅎㅎㅎㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648960954914&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func 사료를_주다(to pet: Pet) {
    pet.eat()
}
let cat = Cat(name: &quot;Yumi&quot;)
사료를_주다(to: cat) // 웅냥ㄴ양얀양냥&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;ㅎㅎ근데 1번에 비해&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648961531544&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let cat: Pet = Cat(name: &quot;Yumi&quot;)
사료를_주다(to: cat) // 웅냥ㄴ양얀양냥&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 Pet을 existential type으로 사용한 것도 들어가긴 하는데~~ &amp;nbsp;상관없지 모;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : 삐빅- dynamic dispatch입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자 아래 코드를 다시 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648962497100&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func 사료를_주다(to pet: Pet) {
    pet.eat()
}
let cat: Pet = Cat(name: &quot;Yumi&quot;)
사료를_주다(to: cat) // 웅냥ㄴ양얀양냥&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 코드가 컴파일 될 때 Swift는 어떤 타입의 eat()이 호출될지 모릅니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왜냐면 cat인스턴스는 Cat타입이 아니라 Pet타입으로 지정되어 있기 때문이죠(existential type)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Generic을 사용했을 때 처럼 코드 최적화를 하지 못하고, 런타임에 어떤 eat()을 호출해야할지 알수 있게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;즉, dynamic dispatch를 해야합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어떤 타입의 eat()을 호출해야하는지 알기 위해 Swift는 existential container라는 것도 만들고, Heap도 사용하게 됩니다. (무조건 사용하는건 아니지만)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;즉 대충 dynamic dispatch는 static dispatch에 비해 비용이 많이 든다는거..&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;dynamic dispatch 과정을 더 자세히 알고싶다면, &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/597&quot;&gt;Swift ) (2) Understanding Swift Performance (Swift성능 이해하기)&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;를 참고해주세요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  : 내가 Pet을 준수하는 타입을 만들어서 넘기면, eat을 호출해주는 함수를 만들어야겠다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648963233668&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1️⃣ : Generic을 쓰자!
func 사료를_주다&amp;lt;T: Pet&amp;gt;(to pet: T) {
    pet.eat()
}

// 2️⃣ : existential type을 쓰자!
func 사료를_주다(to pet: Pet) {
    pet.eat()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2번이 1번보다 &lt;b&gt;훨씬 비용이 많이 듬에도 불구하고&lt;/b&gt;,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1.&amp;nbsp;minimal&amp;nbsp;spelling. Existential&amp;nbsp;type이&amp;nbsp;Generic에 비해&amp;nbsp;더 적게 씀.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 코드상으로 existential&amp;nbsp;type에 대한 비용이 전혀 드러나지 않음.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위와같은 이유때문에 사람들은 주로 2번을 사용하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그로인해 개발자들은 이 둘을 혼동하게 됩니다. (엥 같은거 아냐?; 라는 식이라던가)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0335-existential-any.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;Introduce existential&amp;nbsp;any proposal&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;에서는 이를&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;language makes existential types too easy to reach for (...)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;언어(Swift겠죠)가 existential types에 너무 쉽게 도달하도록 만든다..&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;라고 표현합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;또한, &lt;b&gt;existential type을 사용하는 비용은 숨겨져서는 안되며&lt;/b&gt;, 개발자들은 이러한 의미 체계를 명시적으로 선택해야 한다는 뜻에서...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;existential any를 소개합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# existential any&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 Swift 5.6에서는 existential&amp;nbsp;type과 any를 같이 쓸 수 있게 됩니다. (나중에는 무조건 이렇게 써야함)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648963593269&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func 사료를_주다(to pet: ✅any✅ Pet) {
    pet.eat()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;구구절절 앞 설명이 길었지만, existential&amp;nbsp;type을 사용할 때 이제 any를 같이 써야한다는 그런 변경사항입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : 아 진짜요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : 단순한 변화같지만..Swift에 아주 큰 변화가 생긴겁니다. Swift 5.6에서는 별 다른 경고나 에러는 없지만..... 향후 Swift 버전에서는 경고가 생성될 예정이며 &lt;b&gt;Swift 6부터는 에러를 낼 계획&lt;/b&gt; ^^!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : ⁉️&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648964017172&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Swift 5 mode

protocol P {}
protocol Q {}
struct S: P, Q {}

let p1: P = S() // 'P' in this context is an existential type
let p2: any P = S() // 'any P' is an explicit existential type

let pq1: P &amp;amp; Q = S() // 'P &amp;amp; Q' in this context is an existential type
let pq2: any P &amp;amp; Q = S() // 'any P &amp;amp; Q' is an explicit existential type&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648964024965&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Swift 6 mode

protocol P {}
protocol Q {}
struct S: P, Q {}

let p1: P = S() //   error  
let p2: any P = S() // ✅ okay ✅

let pq1: P &amp;amp; Q = S() //   error  
let pq2: any P &amp;amp; Q = S() // ✅ okay ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : 나 이렇게 쓴 코드 개많은데.. 진심이야?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648964761550&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func 사료를_주다(to pet: Pet) {
    pet.eat()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : ㅇㅇSwift 6부터는 에러날거임&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# 참고&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ 프로토콜이 아닌 타입에 대해 any를 붙히면 에러가 납니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648964968632&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct S {}

let s: any S = S() //   error: 'any' has no effect on concrete type 'S'

func generic&amp;lt;T&amp;gt;(t: T) {
  let x: any T = t //   error: 'any' has no effect on type parameter 'T'
}

let f: any ((Int) -&amp;gt; Void) = generic //   error: 'any' has no effect on concrete type '(Int) -&amp;gt; Void'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[정리]&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 프로토콜&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 프로토콜 composition&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3.&amp;nbsp;metatypes&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앞에만 any를 붙힐 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ any는&amp;nbsp;Any&amp;nbsp;및&amp;nbsp;AnyObject에는 안붙혀줘도 됩니다. (protocol composition의 일부가 아닌 이상)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 붙혀도 에러는 나지 않음..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648965257648&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct S {}
class C {}

let value: any Any = S()
let values: [any Any] = []
let object: any AnyObject = C()

protocol P {}
extension C: P {}

let pObject: any AnyObject &amp;amp; P = C() // okay&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : 에엥&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648965546931&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol P {}
extension C: P {}

let pObject: any AnyObject &amp;amp; P = C() // okay&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;P앞에 왜 any없어.. any넣어야할 거 아니야&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이때는 protocol composition이라 앞에만 넣어주면 됨.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648965600467&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let pObject: any AnyObject &amp;amp; any P = C() //   error: 'any' should appear at the beginning of a composition&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;넣으면 에러납니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&amp;nbsp;Metatypes&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648965669271&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol P {}
struct S: P {}

let existentialMetatype: any P.Type = S.self

protocol Q {}
extension S: Q {}

let compositionMetatype: any (P &amp;amp; Q).Type = S.self

let protocolMetatype: (any P).Type = (any P).self&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;P.Type -&amp;gt; any P.Type&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;P.self -&amp;gt; (any P).self&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자세한 내용은 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0335-existential-any.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[SE-0335]&amp;nbsp;Introduce existential&amp;nbsp;any&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;를 참고해주세요 :D&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;틀린 내용이 있다면 댓글 부탁드립니다~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그건 그렇고..유미가 Yumi가 아니라 Yuumi 였군요?! 귀찮으니 그냥 둔다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[참고]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0335-existential-any.md&quot;&gt;&lt;b&gt;Introduce existential&amp;nbsp;any proposal&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://www.hackingwithswift.com/swift/5.6/existential-any&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.hackingwithswift.com/swift/5.6/existential-any&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift</category>
      <category>Dynamic Dispatch</category>
      <category>existential any</category>
      <category>Existential type</category>
      <category>Static Dispatch</category>
      <category>Swift</category>
      <category>Swift 5.6</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1348</guid>
      <comments>https://zeddios.tistory.com/1348#entry1348comment</comments>
      <pubDate>Sun, 3 Apr 2022 15:14:11 +0900</pubDate>
    </item>
    <item>
      <title>기본 앱 설정에 Custom Section 추가하기 (2) - Child Pane</title>
      <link>https://zeddios.tistory.com/1345</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/1344&quot;&gt;기본 앱 설정에 Custom Section 추가하기 (1)&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;에서 Settings Bundle에 들어가는 control type들을 살펴봤는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Group&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Text field&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Title&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Toggle switch&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Slider&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Multivalue&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Radio Group&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Child Pane&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Child Pane빼고 다 봤었어요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Child Pane은 어떤거냐면..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYVsWR/btruPaZHnk2/IcuHHzQi7ChbWeEAWpmNtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYVsWR/btruPaZHnk2/IcuHHzQi7ChbWeEAWpmNtk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_1297.PNG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYVsWR/btruPaZHnk2/IcuHHzQi7ChbWeEAWpmNtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYVsWR%2FbtruPaZHnk2%2FIcuHHzQi7ChbWeEAWpmNtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AblRV/btruKj4oRso/ilACYzQ38KYkmQrwG7q6SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AblRV/btruKj4oRso/ilACYzQ38KYkmQrwG7q6SK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_1298.PNG&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AblRV/btruKj4oRso/ilACYzQ38KYkmQrwG7q6SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAblRV%2FbtruKj4oRso%2FilACYzQ38KYkmQrwG7q6SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이름에서 볼 수 있다시피 새로운 (Child) 페이지를 만들 수 있는 type입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# Child Pane&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Child Pane은 Preference Items에서 +를 눌렀을때는 안보이는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.21.16.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eiH3N9/btruAjDrp5j/DqpdhE7gRd2yU0gh3XNXb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eiH3N9/btruAjDrp5j/DqpdhE7gRd2yU0gh3XNXb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eiH3N9/btruAjDrp5j/DqpdhE7gRd2yU0gh3XNXb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeiH3N9%2FbtruAjDrp5j%2FDqpdhE7gRd2yU0gh3XNXb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;352&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.21.16.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무거나 누르고 Type 변경 Drop Down 버튼을 누르면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.09.34.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ASEwS/btru2ndTkHa/lgPOqxlcT2Eqk4KlbC1jL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ASEwS/btru2ndTkHa/lgPOqxlcT2Eqk4KlbC1jL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ASEwS/btru2ndTkHa/lgPOqxlcT2Eqk4KlbC1jL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FASEwS%2Fbtru2ndTkHa%2FlgPOqxlcT2Eqk4KlbC1jL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1708&quot; height=&quot;308&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.09.34.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 나오게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;일단 소스코드..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/ddf12b7881836091c33cd378e9016c59.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 추가해주면 되는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아직 File key에 제대로 된 파일 이름을 넣어주지 않았지만, 실행해보면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GZcXO/btruITdUz5M/Jbfdo8kZrEc3iM10YSLMf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GZcXO/btruITdUz5M/Jbfdo8kZrEc3iM10YSLMf0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (2nd generation) - 2022-03-01 at 19.11.07.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GZcXO/btruITdUz5M/Jbfdo8kZrEc3iM10YSLMf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGZcXO%2FbtruITdUz5M%2FJbfdo8kZrEc3iM10YSLMf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeE0Io/btruO9NhT92/jM6IWMPv0WlA3fnKVfKnb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeE0Io/btruO9NhT92/jM6IWMPv0WlA3fnKVfKnb0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (2nd generation) - 2022-03-01 at 19.11.14.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeE0Io/btruO9NhT92/jM6IWMPv0WlA3fnKVfKnb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeE0Io%2FbtruO9NhT92%2FjM6IWMPv0WlA3fnKVfKnb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 새로운 하위 화면이 뜨게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# File 지정하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;글에서 Settings Bundle의 컨텐츠들 설명했던 부분 기억나시나요? (&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식문서 링크&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-6.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U9oRz/btruK6cakLB/fWrpOI0BgGq7YOJBry0SmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U9oRz/btruK6cakLB/fWrpOI0BgGq7YOJBry0SmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U9oRz/btruK6cakLB/fWrpOI0BgGq7YOJBry0SmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU9oRz%2FbtruK6cakLB%2FfWrpOI0BgGq7YOJBry0SmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;575&quot; data-filename=&quot;R1280x0-6.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여기서 &lt;b&gt;Additional .plist files&lt;/b&gt;가 있는데, 이게 왜 있냐면..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Child pane을 사용하는 경우, 요 새로운 pane에 대한 plist를 만들어줘야기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 7.15.54.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck8Ncs/btruE7CF76W/rb8rB8VIBvghfqufvbSDR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck8Ncs/btruE7CF76W/rb8rB8VIBvghfqufvbSDR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck8Ncs/btruE7CF76W/rb8rB8VIBvghfqufvbSDR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck8Ncs%2FbtruE7CF76W%2Frb8rB8VIBvghfqufvbSDR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;208&quot; data-filename=&quot;스크린샷 2022-03-01 오후 7.15.54.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;File key에는 plist이름이 들어가야 합니다. (Key이름은 File이 맞는데, 보여질때는 Filename으로 보여지네용)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;주의할 점은, Zedd.plist가 있으면 &quot;Zedd.plist&quot;를 넣는게 아니라, &quot;Zedd&quot;로 넣어야 합니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# plist 만들기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;귀찮으니까 Root를 복사해주겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Root.plist를 소스코드로 전환하여 복사&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.17.18.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MxpZW/btru4iDaCQo/cCKi3zf86QQiRobCQ4HbO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MxpZW/btru4iDaCQo/cCKi3zf86QQiRobCQ4HbO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MxpZW/btru4iDaCQo/cCKi3zf86QQiRobCQ4HbO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMxpZW%2Fbtru4iDaCQo%2FcCKi3zf86QQiRobCQ4HbO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;386&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.17.18.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Settings Bundle &amp;gt; New File하여 새로운 파일 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SvQlI/btruXTx7rC3/RyMSeIsohOgvk2KFQgklVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SvQlI/btruXTx7rC3/RyMSeIsohOgvk2KFQgklVk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;842&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.12.58.png&quot; data-widthpercent=&quot;34.55&quot; style=&quot;width: 34.14956547050609%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SvQlI/btruXTx7rC3/RyMSeIsohOgvk2KFQgklVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSvQlI%2FbtruXTx7rC3%2FRyMSeIsohOgvk2KFQgklVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHXdaY/btruZRmfiMJ/h3Lms0u4hhSHDpIdl8m7q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHXdaY/btruZRmfiMJ/h3Lms0u4hhSHDpIdl8m7q0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;262&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.13.28.png&quot; data-widthpercent=&quot;65.45&quot; style=&quot;width: 64.68764383181951%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHXdaY/btruZRmfiMJ/h3Lms0u4hhSHDpIdl8m7q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHXdaY%2FbtruZRmfiMJ%2Fh3Lms0u4hhSHDpIdl8m7q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 파일이름을 Zedd.plist로 변경&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.14.08.png&quot; data-origin-width=&quot;2178&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmSa1V/btruXVis7No/M5g5NxwZkTJBFCWzuUtkn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmSa1V/btruXVis7No/M5g5NxwZkTJBFCWzuUtkn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmSa1V/btruXVis7No/M5g5NxwZkTJBFCWzuUtkn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmSa1V%2FbtruXVis7No%2FM5g5NxwZkTJBFCWzuUtkn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2178&quot; height=&quot;796&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.14.08.png&quot; data-origin-width=&quot;2178&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왜 이렇게 힘들게 plist를 만들고 있는지 저도 잘 모르겠는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;번들안에서는 New File을 누르면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.23.25.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;1002&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFEcp8/btruNiyryFw/Uue1JgrokitwJJvYBtlWKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFEcp8/btruNiyryFw/Uue1JgrokitwJJvYBtlWKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFEcp8/btruNiyryFw/Uue1JgrokitwJJvYBtlWKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFEcp8%2FbtruNiyryFw%2FUue1JgrokitwJJvYBtlWKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1434&quot; height=&quot;1002&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.23.25.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;1002&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런게 안뜨고 그냥 바로 empty 파일이 만들어져버림;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Bundle말고 앱 코드 있는곳에서 property list만들고 옮겨도 되지만...Root를 복사하는게 맘편하다는게 제 생각 ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. &amp;nbsp;StringsTable key의 값을 변경.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.19.17.png&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbEgk4/btru4j9TXA9/pLsvK7KFN13Lww4gKvyVV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbEgk4/btru4j9TXA9/pLsvK7KFN13Lww4gKvyVV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbEgk4/btru4j9TXA9/pLsvK7KFN13Lww4gKvyVV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbEgk4%2Fbtru4j9TXA9%2FpLsvK7KFN13Lww4gKvyVV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1896&quot; height=&quot;708&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.19.17.png&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Root의 File은 &quot;파일의 이름&quot;을 보는거기 때문에 plist 내부의 값들은 따로 신경쓰지 않아도 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;5. Root.plist로 가서 File을 &quot;Zedd&quot;로 지정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.20.51.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cls8Ux/btruXUKwUvt/zgHAGitk0vCALnPKVkkAZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cls8Ux/btruXUKwUvt/zgHAGitk0vCALnPKVkkAZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cls8Ux/btruXUKwUvt/zgHAGitk0vCALnPKVkkAZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcls8Ux%2FbtruXUKwUvt%2FzgHAGitk0vCALnPKVkkAZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1108&quot; height=&quot;264&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.20.51.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;6. 빌드 후 설정 가보기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzsbBq/btru1cjmPew/U9DZHdizaeelEOoH4lUIh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzsbBq/btru1cjmPew/U9DZHdizaeelEOoH4lUIh1/img.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (2nd generation) - 2022-03-03 at 23.21.19.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzsbBq/btru1cjmPew/U9DZHdizaeelEOoH4lUIh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzsbBq%2Fbtru1cjmPew%2FU9DZHdizaeelEOoH4lUIh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ngL50/btru3trp3ch/zbU6VtD1veLGKI2Xegwy51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ngL50/btru3trp3ch/zbU6VtD1veLGKI2Xegwy51/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (2nd generation) - 2022-03-03 at 23.21.15.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ngL50/btru3trp3ch/zbU6VtD1veLGKI2Xegwy51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FngL50%2Fbtru3trp3ch%2FzbU6VtD1veLGKI2Xegwy51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;으음 굳.. 당연히 새로운 페이지에서는 Zedd.plist에 있는 Item들이 나오겠죠?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.27.06.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdkR2k/btru2m0mcgo/yTiGbNZZMspxGJuaWbglbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdkR2k/btru2m0mcgo/yTiGbNZZMspxGJuaWbglbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdkR2k/btru2m0mcgo/yTiGbNZZMspxGJuaWbglbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdkR2k%2Fbtru2m0mcgo%2FyTiGbNZZMspxGJuaWbglbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1296&quot; height=&quot;858&quot; data-filename=&quot;스크린샷 2022-03-03 오후 11.27.06.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼 이런식으로 자기 입맛대로 사용하면 된다는거~~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Child Pane 사용 예제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;대부분 앱 내에 설정을 두는 식으로 하는지, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;제가 설치한 앱들중에서는 기본 앱 설정에 설정을 둔게 많이 없더라구요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/1344&quot;&gt;기본 앱 설정에 Custom Section 추가하기 (1)&lt;/a&gt;&lt;/b&gt;&lt;/span&gt; 에서도 언급했듯이,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;변경이 거의 필요하지 않은 것들만 (기본) 설정 앱에 넣는것이 좋다&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;~~&lt;/b&gt;고 했는데요.&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Apple Developer 앱 처럼 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYVsWR/btruPaZHnk2/IcuHHzQi7ChbWeEAWpmNtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYVsWR/btruPaZHnk2/IcuHHzQi7ChbWeEAWpmNtk/img.png&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_1297.PNG&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYVsWR/btruPaZHnk2/IcuHHzQi7ChbWeEAWpmNtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYVsWR%2FbtruPaZHnk2%2FIcuHHzQi7ChbWeEAWpmNtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AblRV/btruKj4oRso/ilACYzQ38KYkmQrwG7q6SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AblRV/btruKj4oRso/ilACYzQ38KYkmQrwG7q6SK/img.png&quot; style=&quot;width: 49.41860465116279%;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_1298.PNG&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AblRV/btruKj4oRso/ilACYzQ38KYkmQrwG7q6SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAblRV%2FbtruKj4oRso%2FilACYzQ38KYkmQrwG7q6SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;사용권 / 오픈소스 라이선스등을 넣기 딱 좋을 것 같더라구요!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Apple Developer 앱 말고도 기본 앱 설정에 라이선스를 넣어둔 곳이..찾아보니&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yfx49/btrvLgSCE6R/Kg2tX52NrXkVYTpRlGKQM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yfx49/btrvLgSCE6R/Kg2tX52NrXkVYTpRlGKQM0/img.png&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_1473.PNG&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yfx49/btrvLgSCE6R/Kg2tX52NrXkVYTpRlGKQM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyfx49%2FbtrvLgSCE6R%2FKg2tX52NrXkVYTpRlGKQM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI3IXq/btrvLgkN2LP/vhWkRHJQtnKIaF8Agoaxxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI3IXq/btrvLgkN2LP/vhWkRHJQtnKIaF8Agoaxxk/img.png&quot; style=&quot;width: 49.41860465116279%;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_1474.PNG&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI3IXq/btrvLgkN2LP/vhWkRHJQtnKIaF8Agoaxxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI3IXq%2FbtrvLgkN2LP%2FvhWkRHJQtnKIaF8Agoaxxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;제가 설치한 앱들 중에선 리디북스와 아자르가!&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;s&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;리디북스는 눌러도 아무것도 안나오던데.... ....&lt;/span&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아자르의 오픈소스 소프트웨어 라이센스를 눌러보면,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGgr7/btrvJUpgkzc/EuGLrPHWeI1oQGa8YIsYU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGgr7/btrvJUpgkzc/EuGLrPHWeI1oQGa8YIsYU0/img.jpg&quot; data-is-animation=&quot;undefined&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_4574A98D5C70-1.jpeg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGgr7/btrvJUpgkzc/EuGLrPHWeI1oQGa8YIsYU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGgr7%2FbtrvJUpgkzc%2FEuGLrPHWeI1oQGa8YIsYU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GHabw/btrvF3fNQRo/N0hBr26CaIulk8ZvoaSWb0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GHabw/btrvF3fNQRo/N0hBr26CaIulk8ZvoaSWb0/img.jpg&quot; data-is-animation=&quot;undefined&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_C4EF1D33353B-1.jpeg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GHabw/btrvF3fNQRo/N0hBr26CaIulk8ZvoaSWb0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGHabw%2FbtrvF3fNQRo%2FN0hBr26CaIulk8ZvoaSWb0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이런식으로 나오게 됩니다. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(소소한 정보 : 국립국어원의 표기법에 따르면&amp;nbsp;&lt;/span&gt;&lt;b&gt;라이선스&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;가 맞는 표기입니다. &lt;a href=&quot;https://korean.go.kr/front/onlineQna/onlineQnaView.do?mn_id=216&amp;amp;qna_seq=210405&amp;amp;pageIndex=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;참고&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오른쪽 그림처럼 만들고 싶다면, &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Group의 Title이나 FooterText로 넣으면 됩니다.&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1646318790076&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MIT License

Copyright (c) 2022 Zedd

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the &quot;Software&quot;), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대충 이런 텍스트를 복사해주고&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/71862a1771a557408f341f10486e7f36.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 넣어주면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZoGZ2/btruNiSPmjn/M91Mwb1nabS01QZcerBg91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZoGZ2/btruNiSPmjn/M91Mwb1nabS01QZcerBg91/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (2nd generation) - 2022-03-03 at 23.53.25.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZoGZ2/btruNiSPmjn/M91Mwb1nabS01QZcerBg91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZoGZ2%2FbtruNiSPmjn%2FM91Mwb1nabS01QZcerBg91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bphHNP/btru2mTFpzL/KcWC57jaWnIpCRKOekgC3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bphHNP/btru2mTFpzL/KcWC57jaWnIpCRKOekgC3k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (2nd generation) - 2022-03-03 at 23.54.59.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bphHNP/btru2mTFpzL/KcWC57jaWnIpCRKOekgC3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbphHNP%2Fbtru2mTFpzL%2FKcWC57jaWnIpCRKOekgC3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왼쪽 - Title로 넣은거 / 오른쪽 - FooterText로 넣은거&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;살짝 다르죠!?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아무튼 이런식으로 사용하면 됩니다~~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;# 라이브러리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/mono0926/LicensePlist&quot; data-pjax=&quot;#repo-content-pjax-container&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;LicensePlist&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&amp;nbsp;라고 오픈소스 plist를 자동으로 만들어주는 라이브러리도 있는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-11 오후 11.34.41.png&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NNuDt/btrvLhYkmFK/LV7yZPAidnQr71DJf9tIA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NNuDt/btrvLhYkmFK/LV7yZPAidnQr71DJf9tIA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NNuDt/btrvLhYkmFK/LV7yZPAidnQr71DJf9tIA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNNuDt%2FbtrvLhYkmFK%2FLV7yZPAidnQr71DJf9tIA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1682&quot; height=&quot;1006&quot; data-filename=&quot;스크린샷 2022-03-11 오후 11.34.41.png&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아자르는 이걸 사용한게 아닐까!  &lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1345</guid>
      <comments>https://zeddios.tistory.com/1345#entry1345comment</comments>
      <pubDate>Sat, 12 Mar 2022 00:37:15 +0900</pubDate>
    </item>
    <item>
      <title>기본 앱 설정에 Custom Section 추가하기 (1)</title>
      <link>https://zeddios.tistory.com/1344</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;오늘은 얼마전에 &lt;/span&gt;우연히 Apple Developer 앱 설정에 들어갔다가&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQjqIv/btruKjQURTz/ePPEZFhkvkUjlmcagTwyuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQjqIv/btruKjQURTz/ePPEZFhkvkUjlmcagTwyuK/img.jpg&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_F9EFD452379A-1.jpeg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQjqIv/btruKjQURTz/ePPEZFhkvkUjlmcagTwyuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQjqIv%2FbtruKjQURTz%2FePPEZFhkvkUjlmcagTwyuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cj3IoT/btruQlBlCGR/rRNQ8IVcwaJajIe5W5tfN1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cj3IoT/btruQlBlCGR/rRNQ8IVcwaJajIe5W5tfN1/img.jpg&quot; data-is-animation=&quot;undefined&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-filename=&quot;IMG_F364D0C607A5-1.jpeg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cj3IoT/btruQlBlCGR/rRNQ8IVcwaJajIe5W5tfN1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcj3IoT%2FbtruQlBlCGR%2FrRNQ8IVcwaJajIe5W5tfN1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왼쪽 그림처럼 Custom Section(?)들이 있는 것을 보게 되었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;보통 앱 설정은 오른쪽 그림처럼... 뭔가 OS 관련 설정 그런것들만 있을 줄 알았는데, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;왼쪽 처럼 Custom 설정들이 있으니까 신기했어요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;어떻게 하는지 급 궁금해져서 한번 보도록 할려구요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 목차&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- HIG &amp;gt; Setting&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- Settings Bundle?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- Setting Bundle 추가하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- Root.plist에 들어갈 수 있는 item들의 control type 살펴보기&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Group&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Text field&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Title&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Toggle switch&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Slider&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Multivalue&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Radio Group&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Child Pane(이번글에서는 안다룸. 다음글에서)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# 설정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱에서 설정을 표시하기 위해 2가지 옵션 중 하나를 선택할 수 있는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 앱 내부에서 표시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. Settings Bundle을 사용하여 기본 설정앱에서 &amp;nbsp;표시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오늘 공부할 건 2번입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# HIG &amp;gt; Settings&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/design/human-interface-guidelines/ios/app-architecture/settings/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Human Interface Guidelines의 Settings&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;를 보면,&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;(&lt;span style=&quot;color: #000000;&quot;&gt;기본) 설정 앱은 시스템 전체에서 configuration을 변경하기 위한 중앙위치.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 거기에 가려면 우리 앱을 떠나야함.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;앱 내에서 직접 설정을 조정하는 것이 훨씬 더 편리!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변경이 거의 필요하지 않은 설정을 제공해야하는 경우, &lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;iOS&amp;nbsp;Settings&amp;nbsp;Bundle&lt;/a&gt; 구현 참고.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;라고 되어있는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;일단 &lt;b&gt;변경이 거의 필요하지 않은 것들만 (기본) 설정 앱에 넣는것이 좋다&lt;/b&gt;~~만 알고갑시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Settings Bundle?&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱 내부가 아닌 기본 설정앱에서 설정들을 보여주고싶다면, Settings Bundle을 사용해야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Settings Bundle - 설정앱에서 custom 설정을 보여주기 위한 특별한 Bundle&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1309&quot;&gt;Bundle&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;글에서&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Bundle : 디스크의 Bundle Directory에 저장된&amp;nbsp;executable&amp;nbsp;code /&amp;nbsp;images, sound, nib 파일과 같은 리소스 /&amp;nbsp;info.plist&amp;nbsp;의 표현&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;br /&gt;라고 했었는데요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;그럼 Settings Bundle안에 리소스나 plist들이 있겠죠?&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;맞습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Settings Bundle을 구성하는 컨텐츠들은 아래와 같아요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.28.27.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2EwDF/btruLtyP7w1/AYS11VL8rT3O5Ckq4M2esk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2EwDF/btruLtyP7w1/AYS11VL8rT3O5Ckq4M2esk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2EwDF/btruLtyP7w1/AYS11VL8rT3O5Ckq4M2esk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2EwDF%2FbtruLtyP7w1%2FAYS11VL8rT3O5Ckq4M2esk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1512&quot; height=&quot;680&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.28.27.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 있는데, 이건 직접 해보면서 보도록 합시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;일단 중요한건 Root.plist입니다!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Settings Bundle 추가하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. Settings Bundle을 추가해줍니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5WfO/btruNVBEkEQ/6611D2aD5KiEZgHK489ow1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5WfO/btruNVBEkEQ/6611D2aD5KiEZgHK489ow1/img.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;1006&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.16.37.png&quot; data-widthpercent=&quot;59.77&quot; style=&quot;width: 59.07324845752826%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5WfO/btruNVBEkEQ/6611D2aD5KiEZgHK489ow1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5WfO%2FbtruNVBEkEQ%2F6611D2aD5KiEZgHK489ow1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1430&quot; height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byIjQW/btruNW8lga8/fvATN4Ms897Y7JK292ZJN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byIjQW/btruNW8lga8/fvATN4Ms897Y7JK292ZJN1/img.png&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;556&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.18.58.png&quot; data-widthpercent=&quot;40.23&quot; style=&quot;width: 39.76396084479734%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byIjQW/btruNW8lga8/fvATN4Ms897Y7JK292ZJN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyIjQW%2FbtruNW8lga8%2FfvATN4Ms897Y7JK292ZJN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러면 오른쪽 그림과 같이 추가되어있으면 OK&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 앱 실행 후 설정 앱으로 가보기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEwRDt/btruLuqZqZR/M3qLk5bjL3ocBVqfkTwKf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEwRDt/btruLuqZqZR/M3qLk5bjL3ocBVqfkTwKf0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (2nd generation) - 2022-03-01 at 16.25.56.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEwRDt/btruLuqZqZR/M3qLk5bjL3ocBVqfkTwKf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEwRDt%2FbtruLuqZqZR%2FM3qLk5bjL3ocBVqfkTwKf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS851B/btruHxWjKCC/m4QzhL8ZYsKfPI1X4FdFvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS851B/btruHxWjKCC/m4QzhL8ZYsKfPI1X4FdFvK/img.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1334&quot; data-filename=&quot;Simulator Screen Shot - iPhone SE (2nd generation) - 2022-03-01 at 16.27.10.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.41860465116279%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS851B/btruHxWjKCC/m4QzhL8ZYsKfPI1X4FdFvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS851B%2FbtruHxWjKCC%2Fm4QzhL8ZYsKfPI1X4FdFvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Settings Bundle을 추가했을 뿐인데, GROUP Section이 생겼네요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. Root.plist 수정하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위에서&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Root.plist&lt;/b&gt;가 중요하다고 했죠?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Root.plist에 가보면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.31.43.png&quot; data-origin-width=&quot;2280&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nzYNt/btruIUXZNph/3OKz5y14ZJ0dYTiGgFQlEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nzYNt/btruIUXZNph/3OKz5y14ZJ0dYTiGgFQlEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nzYNt/btruIUXZNph/3OKz5y14ZJ0dYTiGgFQlEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnzYNt%2FbtruIUXZNph%2F3OKz5y14ZJ0dYTiGgFQlEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2280&quot; height=&quot;1164&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.31.43.png&quot; data-origin-width=&quot;2280&quot; data-origin-height=&quot;1164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 Preference Items이 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이걸 적절하게 수정하면서 제가 보여주고 싶은 것들로 수정하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Item의 Control type들은 아래와 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Group&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Text field&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Title&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Toggle switch&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Slider&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Multivalue&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Radio Group&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Child Pane(이번글에서는 안다룸. 다음글에서) &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  들어가기 전에...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Root.plist상에서 순서 변경이 안되므로...순서 변경을 하고싶다면,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.58.39.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L85WH/btruIUw3nwD/dJ6UaM5gj7j1TyjadDNuS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L85WH/btruIUw3nwD/dJ6UaM5gj7j1TyjadDNuS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L85WH/btruIUw3nwD/dJ6UaM5gj7j1TyjadDNuS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL85WH%2FbtruIUw3nwD%2FdJ6UaM5gj7j1TyjadDNuS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;320&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.58.39.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Source Code로 열고 변경하는 것을 추천합니다.  &lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;또한, 각 Control Type에 어떤 Key가 들어갈 수있는지 보고싶다면 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/library/archive/documentation/PreferenceSettings/Conceptual/SettingsApplicationSchemaReference/Articles/PSTitleValueSpecifier.html#//apple_ref/doc/uid/TP40007015-SW1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;를 참고해주세요!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# &lt;span style=&quot;color: #000000;&quot;&gt;Root.plist &amp;gt; item들의 control type 살펴보기&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ Group&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Group은 말 그대로 Group을 구성하기 위한 type입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.40.35.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tP0ir/btruLtZX77d/GEDcGJ0GTe7F6jZckevC20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tP0ir/btruLtZX77d/GEDcGJ0GTe7F6jZckevC20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tP0ir/btruLtZX77d/GEDcGJ0GTe7F6jZckevC20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtP0ir%2FbtruLtZX77d%2FGEDcGJ0GTe7F6jZckevC20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;384&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.40.35.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내가 이렇게 하나의 Group을 만들고 싶다면, Group 타입을 추가해주기만 하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.42.14.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/culFpZ/btruLsNs6el/Nz0edOkNT8CHhTmPQk1gHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/culFpZ/btruLsNs6el/Nz0edOkNT8CHhTmPQk1gHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/culFpZ/btruLsNs6el/Nz0edOkNT8CHhTmPQk1gHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FculFpZ%2FbtruLsNs6el%2FNz0edOkNT8CHhTmPQk1gHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;134&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.42.14.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : Group의 이름을 바꾸고 싶어요.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A : Item 안의 Title을 바꾸면 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.43.52.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXiFC/btruFeQxokQ/kKIoBa05w5BdEu7k39PTF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXiFC/btruFeQxokQ/kKIoBa05w5BdEu7k39PTF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXiFC/btruFeQxokQ/kKIoBa05w5BdEu7k39PTF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXiFC%2FbtruFeQxokQ%2FkKIoBa05w5BdEu7k39PTF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1220&quot; height=&quot;164&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.43.52.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.43.43.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SDkt9/btruIVilMLp/PqO3HjkHkgzhkICFd7kpP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SDkt9/btruIVilMLp/PqO3HjkHkgzhkICFd7kpP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SDkt9/btruIVilMLp/PqO3HjkHkgzhkICFd7kpP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSDkt9%2FbtruIVilMLp%2FPqO3HjkHkgzhkICFd7kpP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;782&quot; height=&quot;380&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.43.43.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : Group을 추가하고싶어요.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A : 해당 Group에 넣고싶은 Item들 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;앞에&lt;/u&gt;&lt;/span&gt; Group을 넣어주기만 하면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.46.46.png&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuUPny/btruQrUiOa6/SIA0wzIqOElVQVXAbJU1x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuUPny/btruQrUiOa6/SIA0wzIqOElVQVXAbJU1x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuUPny/btruQrUiOa6/SIA0wzIqOElVQVXAbJU1x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuUPny%2FbtruQrUiOa6%2FSIA0wzIqOElVQVXAbJU1x1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1026&quot; height=&quot;242&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.46.46.png&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Group 뒤에 오는 것들은 앞에 선언한 Group에 포함되게 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 그림처럼 Name다음에 Group을 넣게 되면 Group이 분리되게 되겠죠.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.47.33.png&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mevyw/btruLsUgjEs/Q1sFbGYlxDdk28oqLAzAKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mevyw/btruLsUgjEs/Q1sFbGYlxDdk28oqLAzAKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mevyw/btruLsUgjEs/Q1sFbGYlxDdk28oqLAzAKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmevyw%2FbtruLsUgjEs%2FQ1sFbGYlxDdk28oqLAzAKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;558&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.47.33.png&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : Apple Developer 앱 처럼 Group에 Footer를 추가하고싶어요&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.11.19.png&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjsHGR/btruNWtSjKt/NdsFQ7Z3ZjLu4P8iKXHPgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjsHGR/btruNWtSjKt/NdsFQ7Z3ZjLu4P8iKXHPgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjsHGR/btruNWtSjKt/NdsFQ7Z3ZjLu4P8iKXHPgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjsHGR%2FbtruNWtSjKt%2FNdsFQ7Z3ZjLu4P8iKXHPgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1654&quot; height=&quot;682&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.11.19.png&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A : &lt;span style=&quot;background-color: #dddddd; color: #ef5369;&quot;&gt;FooterText&lt;/span&gt;를 넣어주면 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.14.06.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRfmA/btruITEUi9G/XayxVWNqBNBaXYsa0tLKu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRfmA/btruITEUi9G/XayxVWNqBNBaXYsa0tLKu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRfmA/btruITEUi9G/XayxVWNqBNBaXYsa0tLKu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRfmA%2FbtruITEUi9G%2FXayxVWNqBNBaXYsa0tLKu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;164&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.14.06.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.13.47.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6k6Y/btruG0EwJ3q/22kGKDmDUboeYjPSWRrb9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6k6Y/btruG0EwJ3q/22kGKDmDUboeYjPSWRrb9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6k6Y/btruG0EwJ3q/22kGKDmDUboeYjPSWRrb9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6k6Y%2FbtruG0EwJ3q%2F22kGKDmDUboeYjPSWRrb9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;448&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.13.47.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ Text Field&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Title과 편집가능한 TextField를 표시하는 type.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사용자가 custom 문자열을 지정해야하는 경우 이 type을 사용하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.50.11.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJ4Ud/btruIUKtDGN/hczYy1SKfKRj7GjrPe0rN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJ4Ud/btruIUKtDGN/hczYy1SKfKRj7GjrPe0rN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJ4Ud/btruIUKtDGN/hczYy1SKfKRj7GjrPe0rN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJ4Ud%2FbtruIUKtDGN%2FhczYy1SKfKRj7GjrPe0rN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1038&quot; height=&quot;238&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.50.11.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;지금 보면 기본적으로 TextField가 들어가있죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Q : Title은 보이는데, Text Field는 없는데..?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.50.44.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q6GdC/btruLtFCOKh/K4lazUzQlCQTvOshCufbT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q6GdC/btruLtFCOKh/K4lazUzQlCQTvOshCufbT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q6GdC/btruLtFCOKh/K4lazUzQlCQTvOshCufbT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq6GdC%2FbtruLtFCOKh%2FK4lazUzQlCQTvOshCufbT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;212&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.50.44.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A : 놀랍게도 있다&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.51.32.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejZwUa/btruIUX0LsO/Go7oUUZP85pEeqOpP3MDU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejZwUa/btruIUX0LsO/Go7oUUZP85pEeqOpP3MDU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejZwUa/btruIUX0LsO/Go7oUUZP85pEeqOpP3MDU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejZwUa%2FbtruIUX0LsO%2FGo7oUUZP85pEeqOpP3MDU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;444&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.51.32.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서.. 이 Text Field를 입맛에 맞게 수정해주면 됩니다. 키보드 타입까지;;; 설정가능함&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.52.56.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXdt3/btruK6iSJkZ/BVBQm5hFoqCE9aqzeP4KH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXdt3/btruK6iSJkZ/BVBQm5hFoqCE9aqzeP4KH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXdt3/btruK6iSJkZ/BVBQm5hFoqCE9aqzeP4KH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXdt3%2FbtruK6iSJkZ%2FBVBQm5hFoqCE9aqzeP4KH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1394&quot; height=&quot;324&quot; data-filename=&quot;스크린샷 2022-03-01 오후 4.52.56.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;더이상의 설명은 생략한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ Title&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Read only 문자열&lt;/b&gt;을 표시해야하는 경우 사용하는 type&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.02.17.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY2EgV/btrup9hwPvR/YYOSJ7Kau5BkbZarOgnwfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY2EgV/btrup9hwPvR/YYOSJ7Kau5BkbZarOgnwfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY2EgV/btrup9hwPvR/YYOSJ7Kau5BkbZarOgnwfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY2EgV%2Fbtrup9hwPvR%2FYYOSJ7Kau5BkbZarOgnwfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;180&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.02.17.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;⚠️ 주의할 점 ⚠️&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;plist에서 +버튼을 누르면 type을 선택하는게 뜨는데, 거기서 Title을 누르면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.03.49.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oOjVo/btruHv5iDdy/Q7tbbYWwR8bkKsVV7KQEyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oOjVo/btruHv5iDdy/Q7tbbYWwR8bkKsVV7KQEyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oOjVo/btruHv5iDdy/Q7tbbYWwR8bkKsVV7KQEyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoOjVo%2FbtruHv5iDdy%2FQ7tbbYWwR8bkKsVV7KQEyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1238&quot; height=&quot;172&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.03.49.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 &lt;b&gt;기본적으로&lt;/b&gt; 값들이 들어가있는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;여기서 Default Value를 반~~~드시 추가해줘야 설정에 뜨게 됩니다.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.05.39.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHhELJ/btruMnysdIh/1ykubRsg4WFyNwz9FSbK61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHhELJ/btruMnysdIh/1ykubRsg4WFyNwz9FSbK61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHhELJ/btruMnysdIh/1ykubRsg4WFyNwz9FSbK61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHhELJ%2FbtruMnysdIh%2F1ykubRsg4WFyNwz9FSbK61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1072&quot; height=&quot;194&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.05.39.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/library/archive/documentation/PreferenceSettings/Conceptual/SettingsApplicationSchemaReference/Articles/PSTitleValueSpecifier.html#//apple_ref/doc/uid/TP40007015-SW1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식문서&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에서 Default Value가 &lt;b&gt;required&lt;/b&gt;로 되어있는데 왜 기본적으로 생성 안해주지 ㄱ-&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ Toggle switch, Slider&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 친구들은 간단해서 넘어가도록 하겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.06.15.png&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqiTj2/btruITLDffA/9qo5MquLkQNpURatWEnQpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqiTj2/btruITLDffA/9qo5MquLkQNpURatWEnQpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqiTj2/btruITLDffA/9qo5MquLkQNpURatWEnQpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqiTj2%2FbtruITLDffA%2F9qo5MquLkQNpURatWEnQpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1404&quot; height=&quot;496&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.06.15.png&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Settings Bundle추가하면 기본적으로 들어있으니까 이거 보고 하면 될 듯 ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ Multi Value&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Multi Value는 이름에서도 추측할 수 있듯이 여러값들 중 하나를 선택할 수 있는 타입입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;예를 들어.... ㅋㅋ 아니 예가 생각이 안남..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;음 토스트가 뜨는 Duration을....수정할 수 있게 하고싶다면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxMaeh/btruKixCP8g/TWNob4NfDyAADlysFCAe4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxMaeh/btruKixCP8g/TWNob4NfDyAADlysFCAe4k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;296&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.50.46.png&quot; data-widthpercent=&quot;57.1&quot; style=&quot;width: 56.4402233724911%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxMaeh/btruKixCP8g/TWNob4NfDyAADlysFCAe4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxMaeh%2FbtruKixCP8g%2FTWNob4NfDyAADlysFCAe4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7k44m/btruQlzSNu5/KBW4rYiZDWLWGUgU8Q8kDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7k44m/btruQlzSNu5/KBW4rYiZDWLWGUgU8Q8kDK/img.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;400&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.51.02.png&quot; data-widthpercent=&quot;42.9&quot; style=&quot;width: 42.3969859298345%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7k44m/btruQlzSNu5/KBW4rYiZDWLWGUgU8Q8kDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7k44m%2FbtruQlzSNu5%2FKBW4rYiZDWLWGUgU8Q8kDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;806&quot; height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게!!! 하고싶다면, Multi Value를 사용하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Multi Value의 특징은 위 그림에서 볼 수 있다시피, 한 Depth를 더 들어가서 나오게 됩니다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;두번째 그림에서 Back 버튼 보이시죠!?&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Multi Value를 추가하면 기본적으로 아래와 같이 나올텐데요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.52.00.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wakng/btruKjpJpIF/BNyPPYGr1MB2Zqkcrt8ZfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wakng/btruKjpJpIF/BNyPPYGr1MB2Zqkcrt8ZfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wakng/btruKjpJpIF/BNyPPYGr1MB2Zqkcrt8ZfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwakng%2FbtruKjpJpIF%2FBNyPPYGr1MB2Zqkcrt8ZfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;192&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.52.00.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Titles와 Values를 추가해줘야합니다. (&lt;a href=&quot;https://developer.apple.com/library/archive/documentation/PreferenceSettings/Conceptual/SettingsApplicationSchemaReference/Articles/PSMultiValueSpecifier.html#//apple_ref/doc/uid/TP40007016-SW1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;required key이기 때문에&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.52.35.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caWNS1/btruMoqCTdf/UjVPHB0cNnlBsSCgW5tic0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caWNS1/btruMoqCTdf/UjVPHB0cNnlBsSCgW5tic0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caWNS1/btruMoqCTdf/UjVPHB0cNnlBsSCgW5tic0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaWNS1%2FbtruMoqCTdf%2FUjVPHB0cNnlBsSCgW5tic0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1042&quot; height=&quot;400&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.52.35.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.53.44.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDymvR/btruPaZGeF8/ktMu0aWfXS2rkGzuKI73B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDymvR/btruPaZGeF8/ktMu0aWfXS2rkGzuKI73B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDymvR/btruPaZGeF8/ktMu0aWfXS2rkGzuKI73B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDymvR%2FbtruPaZGeF8%2FktMu0aWfXS2rkGzuKI73B1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;348&quot; data-filename=&quot;스크린샷 2022-03-01 오후 5.53.44.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Default Value에&lt;b&gt; 3초&lt;/b&gt;가 아닌...&lt;b&gt;3&lt;/b&gt;을 넣어야 한다는 사실만 주의하면 쉽습니다.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/bb91c49d9b4e719fc122a5b337d8cabd.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;소스코드도 첨부합니다 ㅎ&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(복사가 이상하게 된다면 우측하단의 view raw로 열어서 복사해주세요~)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;앱 안에 있으면 더 좋겠지만, api host (dev/real)을 선택한다거나 등등을 해도 될 것 같아요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ Radio Group&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요 &lt;a href=&quot;https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html#//apple_ref/doc/uid/10000059i-CH6-SW14&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;문서&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;에도 없어서 Radio Group은 있는지 몰랐는데;; &lt;a href=&quot;https://developer.apple.com/library/archive/documentation/PreferenceSettings/Conceptual/SettingsApplicationSchemaReference/Articles/RadioGroupElement.html#//apple_ref/doc/uid/TP30915196-SW2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;여기&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;에는 있더라구요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Q : Radio Group은 아예 옵션에 없는데?;;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.42.22.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk5KHh/btruE9AvlhV/Udq6lMfUORGe1awhovWop0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk5KHh/btruE9AvlhV/Udq6lMfUORGe1awhovWop0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk5KHh/btruE9AvlhV/Udq6lMfUORGe1awhovWop0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk5KHh%2FbtruE9AvlhV%2FUdq6lMfUORGe1awhovWop0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;324&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.42.22.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;b&gt;A : Root.plist에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;수동으로 추가해줘야하는 type&lt;/span&gt;입니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Radio Group이 뭔지는 바로 그림으로 보면 될 것 같은데요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Multi Value는 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.43.35.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QYaSG/btruG1pVsPh/IcbLGkkS1IJaOtabO9vFA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QYaSG/btruG1pVsPh/IcbLGkkS1IJaOtabO9vFA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QYaSG/btruG1pVsPh/IcbLGkkS1IJaOtabO9vFA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQYaSG%2FbtruG1pVsPh%2FIcbLGkkS1IJaOtabO9vFA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1760&quot; height=&quot;396&quot; data-filename=&quot;스크린샷 2022-03-01 오후 6.43.35.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 한 Depth를 들어가야 하는 반면, Radio Group은&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-01 오후 7.07.00.png&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MXflg/btruLsUnx9A/HO3LVJY1e4jC35Da71X6L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MXflg/btruLsUnx9A/HO3LVJY1e4jC35Da71X6L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MXflg/btruLsUnx9A/HO3LVJY1e4jC35Da71X6L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMXflg%2FbtruLsUnx9A%2FHO3LVJY1e4jC35Da71X6L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;360&quot; data-filename=&quot;스크린샷 2022-03-01 오후 7.07.00.png&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Radio 'Group'이라는 이름에 맞게 Group이 따로 생기며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 따로 한 Depth를 들어갈 필요없이 바로 펼쳐져서 보이게 됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- Group에서 사용했던 FooterText도 사용가능.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Multi Value에서 했던거랑 완전히 똑같이 해주면 되고, type만 &lt;b&gt;PSRadioGroupSpecifier&lt;/b&gt;로 바꿔주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/9ed7cbfa9041f940d9f6a0bdd749491c.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(복사가 이상하게 된다면 우측하단의 view raw로 열어서 복사해주세요~)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;✔️ Child Pane&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이건 &lt;a href=&quot;https://zeddios.tistory.com/1345&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;다음글&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;에서 따로 보도록 할게요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1345%20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #ffffff; font-family: 'Nanum Gothic';&quot;&gt;기본 앱 설정에 Custom Section 추가하기 (2) - Child Pane&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS</category>
      <category>Settings Bundle</category>
      <category>설정</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1344</guid>
      <comments>https://zeddios.tistory.com/1344#entry1344comment</comments>
      <pubDate>Fri, 11 Mar 2022 23:20:41 +0900</pubDate>
    </item>
    <item>
      <title>AsyncStream / AsyncThrowingStream (feat. RxSwift + Concurrency)</title>
      <link>https://zeddios.tistory.com/1341</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오늘은 AsyncStream에 대해서 공부해보려고 합니다 :D&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오늘 공부할 AsyncStream은 반드시 &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1339&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AsyncSequence&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;를 알아야 이해가 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/swift/asyncstream&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AsyncStream&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ 정의 : 순서가 있고, 비동기적으로 생성된 요소들의 sequence &lt;span style=&quot;color: #000000;&quot;&gt;✔️&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정의도 한번에 와닿지 않고, AsyncStream에 대한 이런 저런 이야기가 많지만 딱 하나만 기억하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; &amp;nbsp;AsyncSequence를 생성하는 인터페이스!!!!!!&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000; background-color: #ffffff;&quot;&gt;그래서&lt;b&gt; &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1339&quot;&gt;AsyncSequence&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 알아야 이해가 가능하다고 말한거였어요&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정말 간단한 예를 들어봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;비동기랑은 상관없지만;; 1부터 10까지의 요소가 있는 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncSequence를 생성하고 싶다고 칩시다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;물론 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1339&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Swift Concurrency ) AsyncSequence&lt;/a&gt;&lt;/b&gt;&lt;/span&gt; 에서 본 것 처럼 직접 타입을 만들어서 해도 되지만...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;AsyncStream을 이용하면 훨씬 간단해집니다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다음의 step을 따라 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncStream을 만들어봅시다!&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncStream을 만든다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;2. 타입을 지정한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;3. 클로져안에서 하고싶은 일들을 한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✔️ 1. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncStream을 만든다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644050166997&quot; class=&quot;nix&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncStream&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;2. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;타입을 지정한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;저는 1부터 10까지의 요소가 있는 Sequence를 만들고 싶기 때문에 Int로 지정해주겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644050211705&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncStream&amp;lt;Int&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;3. 클로져안에서 하고싶은 일들을 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644050234827&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncStream&amp;lt;Int&amp;gt; { continuation in
    for digit in 1...10 {
      continuation.yield(digit)
    }
    continuation.finish()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 하면 &lt;s&gt;얼렁뚱땅&lt;/s&gt; AsyncSequence가 만들어지고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Sequence이기 때문에 for-in loop에서 사용할 수 있게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644050282768&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for await digit in digits {
  print(digit)
}
/*
1
2
...
10
*/&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;&lt;b&gt;3. 클로져안에서 하고싶은 일들을 한다.&lt;/b&gt; 에서&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644050316527&quot; class=&quot;mipsasm&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncStream&amp;lt;Int&amp;gt; { continuation in
    for digit in 1...10 {
      continuation.yield(digit)
    }
    continuation.finish()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;continuation, yield, finish같은&amp;nbsp;뭔가 알수없는 것들이 나왔는데요! 하나씩 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Continuation&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;continuation은 그냥 parameters죠!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-02-06 오전 12.59.08.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ERUqK/btrsC8Qh8tk/Yvw7ofIrU6YoDS44BEVAQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ERUqK/btrsC8Qh8tk/Yvw7ofIrU6YoDS44BEVAQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ERUqK/btrsC8Qh8tk/Yvw7ofIrU6YoDS44BEVAQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FERUqK%2FbtrsC8Qh8tk%2FYvw7ofIrU6YoDS44BEVAQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;634&quot; height=&quot;182&quot; data-filename=&quot;스크린샷 2022-02-06 오전 12.59.08.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만 궁금한건 왜 하필!! &lt;b&gt;&lt;i&gt;continuation&lt;/i&gt;&lt;/b&gt;이라는 이름이냐..인 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;rarr;&lt;/b&gt;&lt;/span&gt; continuation 파라미터의 타입이&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/swift/asyncstream/continuation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;AsyncStream.Continuation&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;이기 때문입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# yield / finish&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1644136847305&quot; class=&quot;mipsasm&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncStream&amp;lt;Int&amp;gt; { continuation in
    for digit in 1...10 {
      continuation.yield(digit)
    }
    continuation.finish()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 yield와 finish는&amp;nbsp;AsyncStream.Continuation의 메소드겠네요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;맞습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아주 간단하게 설명하면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;✔️ yield - 스트림에 Element를 제공&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;b&gt;✔️&amp;nbsp;&lt;/b&gt;finish&amp;nbsp;- 정상적으로 스트림을 종료(sequence&amp;nbsp;iterator가 sequence를 종료하는 nil을 생성하도록 함)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다시 코드를 보도록 합시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644078613339&quot; class=&quot;mipsasm&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncStream&amp;lt;Int&amp;gt; { continuation in
    for digit in 1...10 {
      continuation.yield(digit)
    }
    continuation.finish()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내가 원하는건 1부터 10까지의 요소가 있는&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncSequence였습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;for문을 돌면서 1부터 10을 yield해주고, 스트림을 종료(finish)시켜 줍니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/swift/asyncthrowingstream&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AsyncThrowingStream&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1339&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Swift Concurrency ) AsyncSequence&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;에서 Throwable한 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncSequence도 만들어 봤었는데요.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncStream은 에러를 throw하지 못합니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;대신!!&amp;nbsp;&lt;/span&gt;AsyncThrowingStream이라는 것이 따로 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;AsyncStream이랑 다 똑같습니다! 다른점은&amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;에러를 던질 수 있는&amp;nbsp;&lt;/span&gt;AsyncSequence를 만드는 친구&lt;/b&gt;인거죠.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;위에서 했던거랑 똑같이 만들어보겠습니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;1. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncThrowingStream&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;을 만든다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;2. 타입을 지정한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;3. 클로져안에서 하고싶은 일들을 한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ &lt;b&gt;1.&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncThrowingStream&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;을 만든다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644077210737&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncThrowingStream&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✔️&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;2. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;타입을 지정한다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644077255280&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncThrowingStream&amp;lt;Int, Error&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncThrowingStream이기 때문에 Error타입도 같이 지정해줘야합니다.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✔️&amp;nbsp;&lt;/span&gt;&lt;b&gt;3. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;클로져안에서 하고싶은 일들을 한다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644077275231&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncThrowingStream&amp;lt;Int&amp;gt; { continuation in
    for digit in 1...10 {
      continuation.yield(digit)
    }
    continuation.finish()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;  여기서 continuation의 타입은&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: -1px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/swift/asyncthrowingstream/continuation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AsyncThrowingStream.Continuation&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-v-3042c2e3=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncThrowingStream이니 에러 한번 던져봐야겠죠&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644077399175&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncThrowingStream&amp;lt;Int, Error&amp;gt; { continuation in
    for digit in 1...10 {
      continuation.yield(digit)
    }
    continuation.finish(throwing: ZeddError.someError)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;finish()대신 finish(throwing: )을 사용하면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #5c5c5c; background-color: #ffffff;&quot;&gt;digits를 사용하는 곳에서는 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644077476337&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do {
    for try await digit in digits {
        print(digit)
    }
} catch {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;for-try-await-in loop를 사용해야겠죠?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;# onTermination&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1644134349082&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;continuation.onTermination = { termination in
    print(termination)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 onTermination 콜백을 설정할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;termination은 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/swift/asyncstream/continuation/termination&quot; data-v-38ec35d1=&quot;&quot;&gt;AsyncStream.Continuation.Termination&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;enum 타입인데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(물론 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncThrowingStream은 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/swift/asyncthrowingstream/continuation/termination&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AsyncThrowingStream.Continuation.Termination&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;이겠죠?)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;finished와 cancelled가 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ finish - 스트림이 finish메소드를 통해 종료되었을 때&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;cancelled - 스트림이 취소되었을 때&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 다음 코드와 같이&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644134445785&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncStream(Int.self) { continuation in
    continuation.onTermination = { termination in
        switch termination {
        case .finished:
            print(&quot;finished&quot;)
        case .cancelled:
            print(&quot;cancelled&quot;)
        }
    }

    for digit in 1...100 {
        print(digit) ✅
        continuation.yield(digit)
    }
    print(&quot;finish before&quot;) ✅
    continuation.finish()
    print(&quot;finish after&quot;) ✅
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;switch case문을 사용하여 print를 찍게 해줬습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 코드로 어떤 것들이 찍힐까요?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644134619630&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1
2
3
4
5
6
7
8
9
10
finish before
finished // onTermination callback
finish after&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 찍히게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;cancelled를 직접 줄 순 없을까요?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;줄 수 있습니다!!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644135304919&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;continuation.onTermination?(.cancelled)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 해줄 수 있어요. 물론&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644135324322&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;continuation.onTermination?(.finished)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;도 가능합니다 :D&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644135345217&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let digits = AsyncStream(Int.self) { continuation in
    continuation.onTermination = { termination in
        switch termination {
        case .finished:
            print(&quot;finished&quot;)
        case .cancelled:
            print(&quot;cancelled&quot;)
        }
    }

    for digit in 1...10 {
        if digit == 5 {
            continuation.onTermination?(.cancelled) ✅
        } else {
            continuation.yield(digit)
        }
        print(digit)
        continuation.yield(digit)
    }
    print(&quot;finish before&quot;)
    continuation.finish()
    print(&quot;finish after&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;코드가 길지만 봐야할 곳은 하나입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644135373248&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if digit == 5 {
    continuation.onTermination?(.cancelled)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;digit이 5일때 cancelled로 onTermination을 호출했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : cancelled는 스트림이 취소된다고 했으니까...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644135879795&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do {
    for try await digit in digits {
        print(digit)
    }
} catch {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1, 2, 3, 4 까지만 호출되고 스트림이 종료되는건가..?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;했는데, &lt;b&gt;그냥 1~10까지 정상적으로 다 나오더라구요.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644135945405&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;continuation.onTermination = { termination in
    switch termination {
    case .finished:
        print(&quot;finished&quot;)
    case .cancelled:
        continuation.finish() ✅
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 onTermination내에서 취소되었을 때 &lt;b&gt;니가 어떻게 하고싶은지 정의할 수 있게 한 것 같다&lt;/b&gt;는 생각이..(추측)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 위 코드처럼&lt;b&gt; cancelled되었을 때 finish()를 호출&lt;/b&gt;해주면&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644136031901&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do {
    for try await digit in digits {
        print(digit)
    }
} catch {

}
// 1
// 2
// 3
// 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 호출되더라구요 ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# RxSwift 6.5.0&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1339&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Swift Concurrency ) AsyncSequence에&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;서 RxSwift 6.5.0이야기도 했었죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644136117930&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do {
    for try await value in observable.values {
        print(&quot;Got a value:&quot;, value)
    }
} catch {
    print(&quot;Got an error:&quot;, error)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;저번 글에서는 그냥 &lt;i&gt;&lt;b&gt;observable.values가 AsyncSequence구나!&lt;/b&gt;&lt;/i&gt;로만 끝냈었는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오늘은 우리가 AsyncStream을 배웠잖아요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그렇다면 이제 values의 내부 구조를 이해할 수 있을 것 같습니다 :D&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Observable의 values는&lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/ReactiveX/RxSwift/blob/b4307ba0b6425c0ba4178e138799946c3da594f8/RxSwift/Observable%2BConcurrency.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/ReactiveX/RxSwift/blob/b4307ba0b6425c0ba4178e138799946c3da594f8/RxSwift/Observable%2BConcurrency.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Observable+Concurrency.swift&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에 구현 되어있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644136201625&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var values: AsyncThrowingStream&amp;lt;Element, Error&amp;gt; {
    AsyncThrowingStream&amp;lt;Element, Error&amp;gt; { continuation in
        let disposable = asObservable().subscribe(
            onNext: { value in continuation.yield(value) },
            onError: { error in continuation.finish(throwing: error) },
            onCompleted: { continuation.finish() },
            onDisposed: { continuation.onTermination?(.cancelled) }
        )

        continuation.onTermination = { @Sendable _ in
            disposable.dispose()
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ 보통 Observable은 error를 낼 수 있으니 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;AsyncThrowingStream&lt;/b&gt;로 정의가 되어있는 것을 확인할 수 있습니다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ on~ 일때마다 각각 상황에 맞는 메소드를 호출하고 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #24292f; background-color: #ffffff;&quot;&gt;또한 다음과 같이 Infallible,&amp;nbsp;Driver,&amp;nbsp;Signal은 Observable과 달리 &lt;b&gt;에러를 발생시키지 않도록 보장&lt;/b&gt;되어있는데요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;for await value in infallible.values {
    print(&quot;Got a value:&quot;, value)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 친구들에게도 values가 추가되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt; : Observable.values가 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;AsyncThrowingStream이었는데..에러를 발생시키지 않는다?&amp;nbsp;&lt;/span&gt;AsyncStream..??&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;맞습니다!! 이 친구들의 values는&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/ReactiveX/RxSwift/blob/5740d313d0c08c6ecaf47da34262e512a6cd3101/RxSwift/Traits/Infallible/Infallible%2BConcurrency.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Infallible+Concurrency.swift&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 에 구현 되어있는데요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644136642542&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var values: AsyncStream&amp;lt;Element&amp;gt; {
    AsyncStream&amp;lt;Element&amp;gt; { continuation in
        let disposable = subscribe(
            onNext: { value in continuation.yield(value) },
            onCompleted: { continuation.finish() },
            onDisposed: { continuation.onTermination?(.cancelled) }
        )

        continuation.onTermination = { @Sendable _ in
            disposable.dispose()
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 구현이 되어있습니다  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;역시나 &lt;b&gt;AsyncStream&lt;/b&gt;이네요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대충 AsyncStream과 AsyncThrowingStream이 어떤 친구들인지 이해가 가시나요!?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;저는 AsyncSequence는 뭐고 AsyncStream은 뭐야.. 왜이렇게 새로운거 많이 냈어 갑자기... 얘네 뭔데..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2021/10058/&quot;&gt;WWDC21 ) Meet AsyncSequence&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;보는데도 갑자기 AsyncStream이 왜나와... 이랬는데!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이젠 어느정도 이해한 것 같아 기분이 좋네요   &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 아직 AsyncStream / AsyncThrowingStream에서 안본것들이 좀 있기도하고(BufferingPolicy 같은거)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;실제 프로젝트에서 어떻게 쓸 수 있는지도 더 고민해보려고 해요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(참고로 AsyncStream / AsyncThrowingStream은 iOS 13부터 사용가능합니다 :D)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런것들은 시간되면 정리해보려고 합니다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;틀린점이 있다면 댓글 남겨주세요~&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift/Concurrency</category>
      <category>AsyncSequence</category>
      <category>AsyncStream</category>
      <category>AsyncThrowingStream</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1341</guid>
      <comments>https://zeddios.tistory.com/1341#entry1341comment</comments>
      <pubDate>Mon, 7 Feb 2022 08:08:00 +0900</pubDate>
    </item>
    <item>
      <title>AsyncSequence</title>
      <link>https://zeddios.tistory.com/1339</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오늘은 AsyncSequence에 대해서 공부해보겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;Sequence&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;AsyncSequence가 Sequence와 유사하기 때문에..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;/1340&quot;&gt;Swift ) Sequence&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;도 한번 보고 오시면 좋을 것 같습니다  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/swift/asyncsequence&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AsyncSequence&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;AsyncSequence는 Sequence와 유사하지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ &lt;b&gt;한번에 하나씩 단계(step)별로 진행할 수 있는 값 목록을 제공 + &lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;비동기성을 추가한 타입&lt;/span&gt;&lt;/b&gt; ✔️ 입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;AsyncSequence역시 for-in loop에 사용할 수 있는데요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644042797192&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for value in AsyncSequence타입 {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자 생각해봅시다. AsyncSequence는 뭔가 비동기~~친구인데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사용할 때 값이 전부 or 일부가 아직 없는 상태일 수도 있겠죠!!!!!!&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 AsyncSequence는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644042898053&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for await value in AsyncSequence타입 {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;await과 같이 사용하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러니까 AsyncSequence는 for-in loop가 아닌 &lt;b&gt;for-await-in loop&lt;/b&gt;를 사용하는 것이죠 :D&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;또한, AsyncSequence가 &lt;b&gt;throwable&lt;/b&gt;하다면, &lt;b&gt;for-&lt;u&gt;try&lt;/u&gt;-await-in loop&lt;/b&gt;를 사용해야합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;왜냐면, 일반 Sequence와 다르게 비동기적으로 요소를 가져오는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;비동기적으로 가져온다는 것 == 실패할 가능성이 있다는 걸 의미&lt;/b&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 try와 같이 사용되는것이구요 ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  참고로 실패하게 되면 for-loop문은 종료됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그러니까 AsyncSequence가 종료되려면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 완전히 끝나거나&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. error가 나거나&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;인거죠! 요건 아래에서 예제로 더 자세히 보도록 할게요 ㅎㅎ&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# 예제&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;대표적인 AsyncSequence를 살펴보겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644043343940&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let endpointURL = URL(string: &quot;https://zeddios.tistory.com&quot;)!
do {
    for try await line in endpointURL.lines {
        print(line)
    }
} catch {

}
/*
&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
....
....
...
&amp;lt;/html&amp;gt;
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;iOS 15에서, URL타입의 인스턴스 프로퍼티로 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/foundation/url/3767315-lines/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;lines&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;가 나왔습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;해당 URL의 리소스 데이터 (= text line)의 비동기 시퀀스입니다.&amp;nbsp;즉, AsyncSequence이죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(사실은 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/foundation/asynclinesequence&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AsyncLineSequence&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;인데, 일단 궁극적으로 AsyncSequence임)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 lines는 &lt;b&gt;throwable 하기 때문에 for-try-await-in loop&lt;/b&gt;를 사용한 것을 볼 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;또, &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/ReactiveX/RxSwift/blob/main/Documentation/SwiftConcurrency.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RxSwift가 6.5.0버전에서 Swift Concurrency를 지원&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;하게 되었는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644048490673&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do {
    for try await value in observable.values {
        print(&quot;Got a value:&quot;, value)
    }
} catch {
    print(&quot;Got an error:&quot;, error)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요런것이 가능해졌죠!!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  : &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;observable.values&lt;/span&gt;가 AsyncSequence구나..!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# AsyncSequence Operator&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Sequence와 유사하다고 계속 말씀드렸죠!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Sequence에서 사용되는 다양한 Operator를 AsyncSequence에서도 동일하게 사용할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-02-05 오후 4.03.43.png&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brrGIq/btrsveq07V2/rH60UOcCaf1YsT3FOJHEF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brrGIq/btrsveq07V2/rH60UOcCaf1YsT3FOJHEF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brrGIq/btrsveq07V2/rH60UOcCaf1YsT3FOJHEF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrrGIq%2Fbtrsveq07V2%2FrH60UOcCaf1YsT3FOJHEF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1126&quot; height=&quot;378&quot; data-filename=&quot;스크린샷 2022-02-05 오후 4.03.43.png&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1644045515884&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let endpointURL = URL(string: &quot;https://zeddios.tistory.com&quot;)!
let lineCount = endpointURL.lines.map { $0.count } ✅
do {
    for try await line in lineCount {
        print(line)
    }
} catch {

}
/*
15
16
6
...
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 사용할 수 있게 되는거죠!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;#&amp;nbsp;Conforming to the &lt;b&gt;AsyncSequence&lt;/b&gt;&amp;nbsp;Protocol&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;요부분은 &lt;a style=&quot;color: #000000;&quot; href=&quot;/1340&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;Swift ) Sequence&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;를 읽고오시면 이해가 더 잘되실 듯 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Custom Sequence를 만들때와 거의 똑같은데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ AsyncSequence,&amp;nbsp;AsyncIteratorProtocol을 준수해야한다는 것&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;✔️ &lt;b&gt;&lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;next()&lt;/span&gt;와 &lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;makeAsyncIterator()&lt;/span&gt;를 둘 다 구현해야한다는 것.&lt;/b&gt; (Sequence때는 next()만 구현하면 됐었음..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;만 다릅니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644045939036&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Zedd: AsyncSequence, AsyncIteratorProtocol {
    
    typealias Element = Int
    var current = 1

    mutating func next() async throws -&amp;gt; Element? {
        defer { current += 1 }
        return current
    }

    func makeAsyncIterator() -&amp;gt; Zedd {
        self
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로 해주면&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644046304899&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let zedd = Zedd()

Task {
    do {
        for try await value in zedd {
            if value &amp;gt; 10 { break }
            print(value)
        }
    } catch {

    }
}
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요렇게 zedd를 AsyncSequence로 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;현재 Zedd내의 next()는&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644046387401&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mutating func next() async ✅ throws ✅ -&amp;gt; Element? {
        defer { current += 1 }
        return current
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;throwable한 메소드인데요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[Throw Error]&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;위에서 실패(Error)가 나면 for-in loop는 종료된다고 그랬죠? &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;에러를 진짜 내보겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644046739215&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum ZeddError: Error {
    case someError
}

struct Zedd: AsyncSequence, AsyncIteratorProtocol {

    typealias Element = Int
    var current = 1

    mutating func next() async throws -&amp;gt; Element? {
        if current == 5 { throw ZeddError.someError } ✅
        defer { current += 1 }
        return current
    }

    func makeAsyncIterator() -&amp;gt; Zedd {
        self
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;current가 5가 되면 에러를 던지게 해놨습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;결과는~~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644046799246&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let zedd = Zedd()

Task {
    do {
        for try await value in zedd {
            if value &amp;gt; 10 { break }
            print(value)
        }
    } catch {
        print(error)
    }
}
// 1
// 2
// 3
// 4
// someError ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;에러가 방출되고 for-loop는 종료된 것을 볼 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;[throws 제거]&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1644046864332&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mutating func next() async ✅ throws ✅ -&amp;gt; Element? {
        defer { current += 1 }
        return current
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 throws를 뺄 수 있습니다. (컴파일 에러 안남)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그러면!!!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644046443682&quot; class=&quot;cs&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Task {
    for await value in zedd {
        if value &amp;gt; 10 { break }
        print(value)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이렇게 do-catch문도, try문도 없는 for-await-in loop를 사용할 수 있게됩니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;  AsyncSequence를 위처럼 만들수도 있지만, &lt;b&gt;AsyncStream&lt;/b&gt;을 사용해서 &lt;span style=&quot;color: #000000;&quot;&gt;AsyncSequence를&amp;nbsp;&lt;/span&gt;만들 수도 있습니다   &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그건 다음 글에서!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;➡️&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1341&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AsyncStream / AsyncThrowingStream 읽으러 가기&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;참고 : &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2021/10058/&quot;&gt;WWDC21 ) Meet AsyncSequence&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/swift/asyncsequence&quot;&gt;AsyncSequence&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Swift/Concurrency</category>
      <category>AsyncSequence</category>
      <category>Sequence</category>
      <category>WWDC21</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1339</guid>
      <comments>https://zeddios.tistory.com/1339#entry1339comment</comments>
      <pubDate>Sun, 6 Feb 2022 01:47:08 +0900</pubDate>
    </item>
    <item>
      <title>Swift ) Sequence</title>
      <link>https://zeddios.tistory.com/1340</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오늘은 Sequence에 대해서 공부!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Sequence&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Sequence가 익숙하지 않으시다면, 혹시 Collection은 들어보셨나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Collection은 프로토콜이며&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-02-05 오후 2.44.52.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpqu2b/btrstJLsMlm/zVkv72VtXkkL60QEnVkzp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpqu2b/btrstJLsMlm/zVkv72VtXkkL60QEnVkzp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpqu2b/btrstJLsMlm/zVkv72VtXkkL60QEnVkzp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpqu2b%2FbtrstJLsMlm%2FzVkv72VtXkkL60QEnVkzp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1430&quot; height=&quot;452&quot; data-filename=&quot;스크린샷 2022-02-05 오후 2.44.52.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift에서 가장 유명한 Collection Type들인 Array, Set, Dictionary는 Collection프로토콜을 conform하고 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그리고 이 Collection프로토콜은 Sequence를 conform하고 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-02-05 오후 2.44.11.png&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mhGFV/btrsvdMiJwH/xMS2FbKXnd4nIpsQ8wrvE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mhGFV/btrsvdMiJwH/xMS2FbKXnd4nIpsQ8wrvE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mhGFV/btrsvdMiJwH/xMS2FbKXnd4nIpsQ8wrvE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmhGFV%2FbtrsvdMiJwH%2FxMS2FbKXnd4nIpsQ8wrvE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1242&quot; height=&quot;94&quot; data-filename=&quot;스크린샷 2022-02-05 오후 2.44.11.png&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;네! 맞아요!&amp;nbsp;Sequence도 프로토콜입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644039662991&quot; class=&quot;ebnf&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol Sequence&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Sequence는 ✔️ 한번에 하나씩 단계(step)별로 진행할 수 있는 값 목록(list&amp;nbsp;of&amp;nbsp;values) ✔️ 입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 Sequence의 요소를 반복하는 가장 일반적인 방법은 &lt;b&gt;for-in loop&lt;/b&gt;를 사용하는 것이죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644039767946&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let oneTwoThree = 1...3
for number in oneTwoThree {
    print(number)
}
// Prints &quot;1&quot;
// Prints &quot;2&quot;
// Prints &quot;3&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;바로 이런식으로요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;Conforming to the Sequence Protocol&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;제가 만든 custom type인 Zedd로&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644040272658&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Zedd {}

let zedd = Zedd()
for value in zedd {}   // error! for-in loop requires 'Zedd' to conform to 'Sequence'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;for-in loop를 사용할 수 없는 이유는, &lt;b&gt;Zedd가 Sequence를 conform하고 있지 않기 때문&lt;/b&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그렇다면 일단 Zedd가 &lt;span style=&quot;color: #000000;&quot;&gt;Sequence를 conform하도록 해야겠네요.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644042147468&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Zedd: Sequence {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Sequence가 요구하는 required method는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644040831869&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public protocol Sequence {
   ...
   func makeIterator() -&amp;gt; Self.Iterator
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #ef5369; background-color: #dddddd;&quot;&gt;makeIterator()&lt;/span&gt;인데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Interator를 만드려면 IteratorProtocol을 conform하는 타입을 만들어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644041241107&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ZeddIterator: IteratorProtocol {
    typealias Element = Int
    var current = 1
    
    mutating func next() -&amp;gt; Element? {
        defer { current += 1 }
        return current
    }
}

struct Zedd: Sequence {
    
    func makeIterator() -&amp;gt; some IteratorProtocol {
        return ZeddIterator()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런식으로요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만, &lt;b&gt;타입이 Sequence,&amp;nbsp;IteratorProtocol 모두 conform한다면 &lt;u&gt;타입 자체가 Iterator로 행동할 수 있게 되기 때문에 &lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;makeIterator()를 구현해주지 않아도 됩니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;즉,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644041351250&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Zedd: Sequence, IteratorProtocol {
    
    typealias Element = Int
    var current = 1
    
    mutating func next() -&amp;gt; Element? {
        defer { current += 1 }
        return current
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게만 해주면 끝!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644041530973&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let zedd = Zedd()
for value in zedd { ✅
    print(value)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자..이제 위 코드는 컴파일에러를 일으키지 않습니다.  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다만 value가 언제까지 찍힐까요?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644041596585&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Zedd: Sequence, IteratorProtocol {
    
    var current = 1
    
    mutating func next() -&amp;gt; Int? {
        defer { current += 1 }
        return current
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그냥 무작정 +1을 더하고있기 때문에....&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;for loop는 끝나지 않습니다 ㅎ&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요런 상황을 방지하려면, &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644041655998&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방법 1
struct Zedd: Sequence, IteratorProtocol {
    
    var current = 1
    
    mutating func next() -&amp;gt; Int? {
        if current &amp;gt; 10 { return nil }
        defer { current += 1 }
        return current
    }
}

// 방법 2
for value in zedd {
    if value &amp;gt; 10 { break }
    print(value)
}

// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Zedd의 next쪽에다가 제한을 걸던가, for-in loop에 걸던가 하면 됩니다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;  Iterator에서 nil을 리턴하는것은 완료를 의미합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# &lt;span style=&quot;color: #000000;&quot;&gt;컴파일러&lt;/span&gt;가 for-in loop를 만났을 때&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자..이제 우리는 iterator도 알고.. 좀 아는 것 같습니다?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그럼 컴파일러가 for-in loop를 만났을 때 내부적으로 어떤 일들을 하는지 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644044127492&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr = [1, 2, 3]
for value in arr { }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아주 평범한 for-in loop입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;컴파일러는 이때 몇가지 간단한 변환을 하게 되는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644044198826&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var iterator = arr.makeIterator()
while let value = iterator.next() {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;iterator를 생성하고 while루프로 변환시킨다고 합니다.&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;요 내용은 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/videos/play/wwdc2021/10058/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WWDC21 ) Meet AsyncSequence&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에서 본 것을 참고하여 적어봤어요 ㅎㅎ&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사실 Sequence를 conform하는 타입을 만들거나 한 일이 거의 없어서 ㅎㅎ 몰랐던 부분도 알게되어서 좋네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;틀린점이 있다면 댓글로 남겨주세요!  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift</category>
      <category>Sequence</category>
      <category>Sequence Swift</category>
      <category>swift Collection</category>
      <category>Swift Sequence</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1340</guid>
      <comments>https://zeddios.tistory.com/1340#entry1340comment</comments>
      <pubDate>Sat, 5 Feb 2022 15:24:33 +0900</pubDate>
    </item>
    <item>
      <title>Xcode 13.3 Beta Release Notes (feat. iOS 15.4 Beta/Swift 5.6)</title>
      <link>https://zeddios.tistory.com/1337</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode&amp;nbsp;13.3&amp;nbsp;Beta가 또 고새 나왔네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-13_3-release-notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;릴리즈노트&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;를 보니 New Feature들도 좀 있는 것 같아서 New Feature위주로 호다닥 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Xcode 13.3부터는 반드시 macOS Monterey 12 or later가 필요하네요&lt;/b&gt;. (Xcode 13.2.1까지는 빅서여도 ㄱㅊ)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;저는 원래 빅서였는데, 이거 때문에 올림 ㅎ;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# Build System&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;빌드&amp;nbsp;시스템과 Swift&amp;nbsp;컴파일러 -&amp;gt; 사용&amp;nbsp;가능한&amp;nbsp;코어를&amp;nbsp;더&amp;nbsp;잘&amp;nbsp;활용하는&amp;nbsp;&lt;b&gt;새로운&amp;nbsp;모드&lt;/b&gt;가 나옴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;=&amp;gt; Swift&amp;nbsp;프로젝트의&amp;nbsp;빌드&amp;nbsp;속도가&amp;nbsp;빨라진다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;모드는&amp;nbsp;옵트인이며 전역적으로&amp;nbsp;활성화할&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643361327767&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;shell
defaults write com.apple.dt.XCBuild EnableSwiftBuildSystemIntegration 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;응 안속아~ (제발..  )&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Resolved-Issues&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# Build System &amp;gt; Resolved Issues&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- ASCII가&amp;nbsp;아닌&amp;nbsp;문자가&amp;nbsp;있는&amp;nbsp;파일&amp;nbsp;경로가&amp;nbsp;포함된&amp;nbsp;프로젝트를&amp;nbsp;빌드할&amp;nbsp;때&amp;nbsp;발생하는&amp;nbsp;충돌을&amp;nbsp;수정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;Debugging&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;최적화(optimizations)를&amp;nbsp;끈&amp;nbsp;상태에서&amp;nbsp;컴파일할&amp;nbsp;때&amp;nbsp;Swift&amp;nbsp;컴파일러와&amp;nbsp;Clang은&amp;nbsp;더&amp;nbsp;이상&amp;nbsp;ARM64&amp;nbsp;타겟에서&amp;nbsp;중복&amp;nbsp;분기&amp;nbsp;명령어를&amp;nbsp;제거하지&amp;nbsp;않음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이는&amp;nbsp;-Onone으로&amp;nbsp;컴파일할&amp;nbsp;때&amp;nbsp;&lt;b&gt;약간&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;바이너리를&amp;nbsp;생성하는&amp;nbsp;대신&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;중단점&amp;nbsp;위치를&amp;nbsp;활성화하여&amp;nbsp;디버그&amp;nbsp;가능성을&amp;nbsp;향상.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;Documentation&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode는 이제 apps &amp;amp;&amp;amp; 커맨드라인 툴과 같은 &amp;nbsp;executable&amp;nbsp;targets의 Swift 코드에서 documentation을 빌드할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(DocC말하는거겠죠?!)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Instruments&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# Instruments&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Xcode memory&amp;nbsp;graph&amp;nbsp;debugger&amp;nbsp;및 leaks&amp;nbsp;command&amp;nbsp;line의 정확도 개선&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;객체 참조를 더 정확하게 스캔 -&amp;gt; 더 정확한 메모리 누수 분석, strong,&amp;nbsp;weak, unowned&amp;nbsp;reference&amp;nbsp;types 식별 가능.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Organizer&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# Organizer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 10개 이하의 앱이 있고 이전에 어떤 앱도 구독하지 않은 경우, 앱에 대한 Smart&amp;nbsp;Insights&amp;nbsp;알림을&amp;nbsp;자동으로&amp;nbsp;보냄.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 기능을 활성화 하려면&amp;nbsp;Organizer에서 Regressions&amp;nbsp;item 또는 any&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Metrics&amp;nbsp;items 을 클릭.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(위에껄 클릭하라는데 어디서 클릭하라는지는 모르겠음..)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Organizer에 Regressions Section이 생기긴 했네요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-02-01 오후 4.42.10.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I4oGH/btrsaRWT2K5/Xuv0nKp5r1Nh4PIiIVHTN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I4oGH/btrsaRWT2K5/Xuv0nKp5r1Nh4PIiIVHTN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I4oGH/btrsaRWT2K5/Xuv0nKp5r1Nh4PIiIVHTN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI4oGH%2FbtrsaRWT2K5%2FXuv0nKp5r1Nh4PIiIVHTN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;416&quot; height=&quot;860&quot; data-filename=&quot;스크린샷 2022-02-01 오후 4.42.10.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Source-Editor&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# Source Editor&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- Code&amp;nbsp;completion은 이제 if case..에 대한 enum 인스턴스를 제안함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 액세스할&amp;nbsp;수&amp;nbsp;없는 symbol를&amp;nbsp;완성할&amp;nbsp;때 Code&amp;nbsp;completion은&amp;nbsp;더&amp;nbsp;이상&amp;nbsp;모듈을&amp;nbsp;자동으로&amp;nbsp;가져오지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# Source Editor &amp;gt;&amp;nbsp;Resolved Issues&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 프로젝트를&amp;nbsp;닫을&amp;nbsp;때&amp;nbsp;Xcode가&amp;nbsp;멈추는&amp;nbsp;문제를&amp;nbsp;수정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- import문이&amp;nbsp;많은&amp;nbsp;프로젝트에서&amp;nbsp;Xcode가&amp;nbsp;중단될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;문제 수정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 처음으로 code&amp;nbsp;completion을&amp;nbsp;표시할&amp;nbsp;때&amp;nbsp;Xcode가&amp;nbsp;중단될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;문제 수정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- generic&amp;nbsp;function의 optional&amp;nbsp;type으로&amp;nbsp;인해&amp;nbsp;들여쓰기&amp;nbsp;문제가&amp;nbsp;발생하는&amp;nbsp;문제 수정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 확장자가&amp;nbsp;없는&amp;nbsp;대용량&amp;nbsp;파일이&amp;nbsp;포함된&amp;nbsp;Swift&amp;nbsp;패키지를&amp;nbsp;열&amp;nbsp;때&amp;nbsp;Xcode가&amp;nbsp;중단되는&amp;nbsp;문제 수정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;#&amp;nbsp;Swift&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;릴리즈노트에 딱히 Swift 5.6기능이다~ 라고 나오진 않았지만, Proposal을 봤을 때 Swift 5.6들의 기능이 나와있네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 잠재적인 data&amp;nbsp;races를 나타내는&amp;nbsp;경고 생성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제&amp;nbsp;Swift는 non-Sendable&amp;nbsp;types이 actor 또는&amp;nbsp;task&amp;nbsp;boundaries를&amp;nbsp;넘어&amp;nbsp;전달될&amp;nbsp;때&amp;nbsp;&lt;b&gt;잠재적인&amp;nbsp;data&amp;nbsp;races를 나타내는&amp;nbsp;경고를&amp;nbsp;생성&lt;/b&gt;함&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643702146811&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyCounter {
  var value = 0
}

func f() -&amp;gt; MyCounter {
  let counter = MyCounter()
  Task {
    counter.value += 1  // warning: capture of non-Sendable type 'MyCounter'
  }
  return counter
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(Xcode 13.3 Beta 1로 해봤는데 Warning안뜸 ㅎ;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. &amp;nbsp;#unavailable 키워드 사용가능&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;새로운 &lt;b&gt;#unavailable&lt;/b&gt; 키워드를 사용하여 역가용성 조건을 작성할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643702237768&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if #unavailable(iOS 15.0) {
    // Old functionality
} else {
    // iOS 15 functionality 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. type&amp;nbsp;placeholders 포함 가능&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 type&amp;nbsp;expressions&amp;nbsp;&amp;nbsp;및 annotations에 type&amp;nbsp;placeholders를 포함할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;type&amp;nbsp;placeholders는 컴파일러가 일반적인 타입 유추 규칙에 따라 해당 위치에 대한 타입을 설정하도록 지시한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;type&amp;nbsp;placeholders를 사용하려면 타입 이름 대신 _(underscore)를 입력.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643702403370&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let zedd: _ = &quot;Zedd&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이게 가능해짐.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데 원래 변수명에는 _ 가 가능했던 부분이니까&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643703983770&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let _: _ = &quot;Zedd&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이것도 가능 ㅎ;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643702425738&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let dict: [_: String] = [0: &quot;zero&quot;, 1: &quot;one&quot;, 2: &quot;two&amp;rdquo;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런것도 가능.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 예제로 보면, 이제 컴파일러가 key type이 Int구나~를 유추할 수 있게됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;물론&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643703142114&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let dict: [_: _] = [0: &quot;zero&quot;, 1: &quot;one&quot;, 2: &quot;two&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이것도 당연히 가능&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;근데&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643703099014&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let dict = [0: &quot;zero&quot;, 1: &quot;one&quot;, 2: &quot;two&amp;rdquo;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이거랑 뭐가 다르지...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. 포인터 타입 불일치를 허용&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이제 Swift 컴파일러는 C언어에서 해당 포인터 타입을 alias로 허용하는 한 C에서 가져온 함수를 직접 호출 할 때 제한된 포인터 타입 불일치를 허용함.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;결과적으로&amp;nbsp;모든&amp;nbsp;Swift&amp;nbsp;Unsafe[Mutable]Pointer&amp;lt;T&amp;gt;&amp;nbsp;또는&amp;nbsp;Unsafe[Mutable]RawPointer는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[signed|unsigned]&amp;nbsp;char&amp;nbsp;*로&amp;nbsp;선언된&amp;nbsp;C&amp;nbsp;함수 argument에&amp;nbsp;전달할&amp;nbsp;수 있게된다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift&amp;nbsp;Unsafe[Mutable]Pointer&amp;lt;T&amp;gt;는&amp;nbsp;T와&amp;nbsp;부호만&amp;nbsp;다른&amp;nbsp;정수&amp;nbsp;유형을&amp;nbsp;사용하여&amp;nbsp;C&amp;nbsp;함수 argument에&amp;nbsp;전달할&amp;nbsp;수 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643702596285&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;long long decode_int64(const char *ptr_to_int64);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;또한, raw&amp;nbsp;pointer를 함수 argument로 직접 전달할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643702566470&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func decodeAsInt64(data: Data) -&amp;gt; Int64 {
    data.withUnsafeBytes { (bytes: UnsafeRawBufferPointer) in
        decode_int64(bytes.baseAddress!)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5. &quot;Self&amp;nbsp;requirements&quot;에 대한 참조가 nested&amp;nbsp;type의 부모에서 올바르게 감지&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;protocol&amp;nbsp;members의 type&amp;nbsp;signatures에서 Self 또는 소위 &quot;Self&amp;nbsp;requirements&quot;에 대한 참조가 nested&amp;nbsp;type의 부모에서 올바르게 감지됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;결과적으로 protocol에서 다음과 같은 protocol&amp;nbsp;members를 선언할 수 없음.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643702712785&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Outer&amp;lt;T&amp;gt; {
  struct Inner {}
}

protocol P {}
extension P {
  func method(arg: Outer&amp;lt;Self&amp;gt;.Inner) {}
}

func test(p: P) {
  // error: 'method' has a 'Self' requirement and cannot be used on a value of
  // protocol type (use a generic constraint instead).
  _ = p.method
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# Swift Package Manager&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. &amp;nbsp;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0303-swiftpm-extensible-build-tools.md&quot;&gt;SE-0303&lt;/a&gt;&lt;/span&gt;과 &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0325-swiftpm-additional-plugin-apis.md&quot;&gt;SE-0325&lt;/a&gt;&lt;/span&gt;에 정의된 build&amp;nbsp;tool&amp;nbsp;plugins을 지원.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이로써 소스코드 생성과 같이 빌드 작업중에 실행되어야 하는 도구를 지정할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0332-swiftpm-command-plugins.md&quot;&gt;SE-0332&lt;/a&gt;&lt;/span&gt;&amp;nbsp;에 정의된&amp;nbsp;command&amp;nbsp;plugins을 지원&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이로써 Package는 Package에 대한 custom&amp;nbsp;actions을 수행하기 위해 swift&amp;nbsp;package&amp;nbsp;command&amp;nbsp;line을 사용하여 호출할 수 있는 명령을 정의할 수 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이렇게 Xcode 13.3 Beta 릴리즈노트에 있는 New Feature들을 살펴봤는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;생략한것도 있으니.. 자세한 내용은&amp;nbsp;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://developer.apple.com/documentation/xcode-release-notes/xcode-13_3-release-notes&quot;&gt;릴리즈 노트&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;를 참고해주세요 ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# iOS 15.4&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;iOS 15.4 Beta도 나왔는데요. 살짝 보도록 하겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;iOS 15.4의 가장 큰 신기능은...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. Face ID With a Mask&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;face-id-add-glasses.jpg&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1961&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tEUxR/btrr0zbj9lN/ZMCQtg43FPdsf75KOGASmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tEUxR/btrr0zbj9lN/ZMCQtg43FPdsf75KOGASmk/img.jpg&quot; data-alt=&quot;https://www.macrumors.com/2022/01/27/face-id-mask-ios-15-4/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tEUxR/btrr0zbj9lN/ZMCQtg43FPdsf75KOGASmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtEUxR%2Fbtrr0zbj9lN%2FZMCQtg43FPdsf75KOGASmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1961&quot; data-filename=&quot;face-id-add-glasses.jpg&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1961&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.macrumors.com/2022/01/27/face-id-mask-ios-15-4/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 아이폰 12 이상 지원&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 왼쪽 사진 처럼 설정가서 켜야함. (얼굴을 재스캔한다고...^^...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 오른쪽 사진처럼 안경을 쓴 사람이면 Add Glasses도 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;참고 : &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://www.macrumors.com/2022/01/27/face-id-mask-ios-15-4/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.macrumors.com/2022/01/27/face-id-mask-ios-15-4/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. 120Hz 애니메이션&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;AS-IS&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;120Hz ProMotion이 적용된 아이폰 13이 출시된 후에 third-party 애니메이션이 60Hz로 제한되었었음. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(== 120Hz쓸 수 있는 디바이스인데 못씀;;;)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;사람들 : 왜 안되지?&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;Apple : Core Animation쪽에 버그가 있네ㅋ.,, 업데이트 할게~~~!!!&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;TO-BE ✅&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;iOS 15.4에서는 ProMotion을 지원하는 아이폰의 모든 애니메이션에 대해 앱이 자동으로 120Hz를 제공함.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-28 오후 6.10.01.png&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9X613/btrr2yvehMD/yl0DU5jkRrqZJCN43PvEh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9X613/btrr2yvehMD/yl0DU5jkRrqZJCN43PvEh1/img.png&quot; data-alt=&quot;https://twitter.com/ChristianSelig/status/1486847470223118337?s=20&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;t=HdfLmgAfozp3w8yURXWLlQ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9X613/btrr2yvehMD/yl0DU5jkRrqZJCN43PvEh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9X613%2Fbtrr2yvehMD%2Fyl0DU5jkRrqZJCN43PvEh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1174&quot; height=&quot;764&quot; data-filename=&quot;스크린샷 2022-01-28 오후 6.10.01.png&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://twitter.com/ChristianSelig/status/1486847470223118337?s=20&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;t=HdfLmgAfozp3w8yURXWLlQ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;참고 : &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://www.macrumors.com/2022/01/27/ios-15-4-apps-120-hz-promotion/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.macrumors.com/2022/01/27/ios-15-4-apps-120-hz-promotion/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;+ iOS 15.4에 추가된 새로운 이모지들&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;FKIugeAXMAUDDtx.jpeg&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JQ6ER/btrseQXqNJ4/8RXALBdfF9VZEbUp9giU7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JQ6ER/btrseQXqNJ4/8RXALBdfF9VZEbUp9giU7k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JQ6ER/btrseQXqNJ4/8RXALBdfF9VZEbUp9giU7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJQ6ER%2FbtrseQXqNJ4%2F8RXALBdfF9VZEbUp9giU7k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;1200&quot; data-filename=&quot;FKIugeAXMAUDDtx.jpeg&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;많이 쓰게될 이모티콘들이 보인다..  &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;+ 릴리즈노트에는 안나와있지만...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;제가 &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1335&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;Combine &amp;rarr; Swift Concurrency(async/await)로 바꾸기 (feat. 느낀점)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;에서 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. URLSession.shard.data가 iOS 15부터 사용가능한건 좀 ㅠ...&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여기가 async로 깔끔하게 안풀리면 끔찍한 혼종이 발생할 것 같다는 생각이 들었습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아직 해보진 않음...&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;br /&gt;라고 했었는데요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;s&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Xcode 13.3에서는 iOS 13부터 사용가능하도록 바뀌었네요&lt;/b&gt;&lt;/span&gt;  &lt;/span&gt;&lt;/s&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;‼️ Xcode 13.4.1 이상에서는 또 iOS 15부터 가능하네요...&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;‼️&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[Xcode 13.2.1]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Image_2022-02-01-17-40-46.png&quot; data-origin-width=&quot;2704&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn5i1Z/btrr4xrBLSz/B762ApFUtErQ0DXoDW9UEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn5i1Z/btrr4xrBLSz/B762ApFUtErQ0DXoDW9UEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn5i1Z/btrr4xrBLSz/B762ApFUtErQ0DXoDW9UEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn5i1Z%2Fbtrr4xrBLSz%2FB762ApFUtErQ0DXoDW9UEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2704&quot; height=&quot;656&quot; data-filename=&quot;KakaoTalk_Image_2022-02-01-17-40-46.png&quot; data-origin-width=&quot;2704&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;s&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;[Xcode 13.3 Beta 1]  &lt;/span&gt;&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-02-01 오후 5.40.21.png&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brheiO/btrseQ4cnJY/fSSDgKYAQ9X5ILjFx1LduK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brheiO/btrseQ4cnJY/fSSDgKYAQ9X5ILjFx1LduK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brheiO/btrseQ4cnJY/fSSDgKYAQ9X5ILjFx1LduK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrheiO%2FbtrseQ4cnJY%2FfSSDgKYAQ9X5ILjFx1LduK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2136&quot; height=&quot;1214&quot; data-filename=&quot;스크린샷 2022-02-01 오후 5.40.21.png&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000; background-color: #ffffff;&quot;&gt;[Xcode 13.4.1]&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-01 오후 11.07.23.png&quot; data-origin-width=&quot;2620&quot; data-origin-height=&quot;1094&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bck5IL/btrICZ6ynjf/Ix1UOrbuK3sG5lEr4uKzJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bck5IL/btrICZ6ynjf/Ix1UOrbuK3sG5lEr4uKzJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bck5IL/btrICZ6ynjf/Ix1UOrbuK3sG5lEr4uKzJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbck5IL%2FbtrICZ6ynjf%2FIx1UOrbuK3sG5lEr4uKzJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2620&quot; height=&quot;1094&quot; data-filename=&quot;스크린샷 2022-08-01 오후 11.07.23.png&quot; data-origin-width=&quot;2620&quot; data-origin-height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;뭐야 돌려줘요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;새해 복 많이 받으세요~~  &lt;/span&gt;&lt;/p&gt;</description>
      <category>Xcode</category>
      <category>Swift 5.6</category>
      <category>Xcode</category>
      <category>Xcode 13</category>
      <category>Xcode 13.3</category>
      <category>Xcode 13.3 Beta</category>
      <category>Xcode Beta</category>
      <category>Xcode 릴리즈노트</category>
      <category>엑스코드</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1337</guid>
      <comments>https://zeddios.tistory.com/1337#entry1337comment</comments>
      <pubDate>Tue, 1 Feb 2022 17:45:42 +0900</pubDate>
    </item>
    <item>
      <title>Combine &amp;rarr; Swift Concurrency(async/await)로 바꾸기 (feat. 느낀점)</title>
      <link>https://zeddios.tistory.com/1335</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오늘은!!!! 주말을 맞아 그동안 미루고 미뤄왔던 Combine -&amp;gt; async/await로 바꾸기...ㅋㅋ..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아주 간단한 앱이어서 호다닥 바꿔볼 수 있을 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;참고 : 이 앱은 Deployment Target이 15.0입니다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# 구조&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;API호출이 딱 하나 있는 아주 간단한 SwiftUI앱입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[API.swift]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/2cc720fcce2d50caf899be23280c08e4.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위와 같이 Combine을 사용해서 network request를 수행하고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[Service.swift]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/ffeeb3b46d7111b3d25954a8a292018e.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;service쪽에서 API에 있는 perfom 메소드를 수행합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[ViewModel.swift]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그래서 ViewModel쪽에서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/ee2514d11aa0b2ef121d5d5cd404f0d2.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 service의 request를 호출하여 응답을 @Published로 mark된 변수에 넣어줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;대충 진짜 뻔한 SwiftUI 앱인거 아시겠죠..!?!?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# Swift Concurrency&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;됐고...async 부터 달아본다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[API.swift]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643115003950&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AS-IS
func perform&amp;lt;T: Decodable&amp;gt;(method: HTTPMethod, url: String?) -&amp;gt; AnyPublisher&amp;lt;HTTPResponse&amp;lt;T&amp;gt;, Error&amp;gt; {

TO-BE ✅
func perform&amp;lt;T: Decodable&amp;gt;(method: HTTPMethod, url: String?) async throws -&amp;gt; HTTPResponse&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. &amp;nbsp;AnyPublisher 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. 메소드에 &lt;b&gt;async throws&lt;/b&gt; 추가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;리턴타입이 바뀌었으니 return부분도 수정되어야되겠죠?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643115120675&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AS-IS
return URLSession.shared.dataTaskPublisher(for: request)
    .tryMap { result -&amp;gt; HTTPResponse&amp;lt;T&amp;gt; in
        let value = try self.decoder.decode(T.self, from: result.data)
        return HTTPResponse(value: value, response: result.response)
    }
    .receive(on: DispatchQueue.main)
    .eraseToAnyPublisher()
    
    
TO-BE ✅
let (data, urlResponse) = try await URLSession.shared.data(from: url)
let response = try decoder.decode(T.self, from: data)
return HTTPResponse(value: response, response: urlResponse)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;dataTaskPublisher대신 data(from:) 이라는 async 메소드를 사용하도록 바꿨습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;당연히 await 과 함께 불려줘야겠죠!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그냥 동기 메소드처럼 리턴해주면 끝...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;⚠️ URLSession.shared.data는 iOS 15부터 사용가능 ㅋㅋ... **&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[Service.swift]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;service쪽에서 .perform(~~) 을 수행하던 곳이 있겠죠?&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/ffeeb3b46d7111b3d25954a8a292018e.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위 메소드도 수정이 필요할 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;역시나 일단 메소드 정의부에 async를 붙히고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643115402349&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AS-IS
func request() -&amp;gt; AnyPublisher&amp;lt;[SomeType], Error&amp;gt; {}

TO-BE ✅
func request() async throws -&amp;gt; [SomeType]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;return역시 수정해줍시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643115499797&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AS-IS
return API.shared.perform(method: .get, url: component?.string)
	.map(\.value)
	.eraseToAnyPublisher()
    
TO-BE ✅
return try await API.shared.perform(method: .get, url: component?.string).value&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;끝!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[ViewModel.swift]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이제 viewModel쪽에서 service.request().sink~~ 하던 부분이 있을텐데요.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/ee2514d11aa0b2ef121d5d5cd404f0d2.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;요기도 바뀌어야겠죠&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;Zedd : 응 일단 async 붙혀~~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;  : 하...그럼 View에서 viewModel.requestSomething하던 곳들 어떡하지...에러나는데..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643116384778&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SomeView()
    ...
    .onAppear(perform: { //   Invalid conversion from 'async' function of type '() async -&amp;gt; Void' to synchronous function type '() -&amp;gt; Void'
        await self.viewModel.requestSomething()
    })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(위 코드는 예제코드입니다..&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt; &lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1306&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;iOS 15에서 task modifier가 나왔으니&lt;/a&gt;&lt;/b&gt;&lt;/span&gt; 쓸 수 있다면 task를 쓰시는게...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이때 2가지 방법이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. ViewModel &amp;gt; 메소드 &amp;gt; &lt;b&gt;Task&lt;/b&gt;안에서 async메소드 호출하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. ViewModel &amp;gt; async 메소드로 바꾸고 호출하는 쪽이 Task안에서 호출하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# Task? (feat.&amp;nbsp;ViewModel &amp;gt; 메소드 &amp;gt; Task안에서 async메소드 호출하기)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Task가 뭔지 모르시는분들도 계실텐데요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아주아주 간단하게 말해서..non-concurrent한 메소드 안에 concurrent한 환경을 만들어주는 역할을 하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ViewModel.swift에 있는 requestSomething은 다음과 같이 non-concurrent 메소드인데요.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/Zedd0202/ee2514d11aa0b2ef121d5d5cd404f0d2.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;원래 async메소드를 호출하려면 requestSomething역시 concurrent 메소드가 되어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하지만 아래와같이&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643116815907&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Published var response: [SomeType] = []

func requestSomething()  {
    Task {
        self.response = try await self.service.request()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;Task가 non-concurrent한 메소드 안에 concurrent한 환경을 만들어주기 때문에 이렇게 호출할 수 있는 것이죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그리고 호출부에서도&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643116913424&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SomeView()
    ...
    .onAppear(perform: { 
        self.viewModel.requestSomething()
    })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;async메소드가 아니기 때문에 await 없이 그냥 호출해주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. ViewModel &amp;gt; 메소드 &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Task&lt;/b&gt;안에서 async메소드 호출하기 ✅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. ViewModel &amp;gt; async 메소드로 바꾸고 호출하는 쪽이 Task안에서 호출하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1번은 방금 봤으니 패스... 2번은 어떤건지 감이 오시나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# &lt;span style=&quot;color: #000000;&quot;&gt;ViewModel &amp;gt; async 메소드로 바꾸고 호출하는 쪽이 Task안에서 호출하기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1643117152133&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Published var response: [SomeType] = []

func requestSomething() async  {
    do {
        self.response = try await self.service.request()
    } catch {
        // some code
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ViewModel.swift 쪽 메소드를 async 메소드로 바꾸고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;requestSomething을 호출하는 호출부를 Task로 감싸주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643117265690&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SomeView()
    ...
    .onAppear(perform: {
     	Task {
            await self.viewModel.requestSomething()
         }
    })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그러면 onAppear같이 non-concurrent한 메소드 안에서 concurrent 환경이 만들어지는것이죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;⚠️ ---------- ⚠️&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;onAppear대신 iOS 15에서 나온 task modifier를 쓰면&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643117548778&quot; class=&quot;rust&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.task {
    await self.viewModel.requestSomething()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그냥 바로 이렇게 가능!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;참고 : &lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://zeddios.tistory.com/1306%20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;SwiftUI, iOS 15+ ) onAppear()대신 task()&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;⚠️ ----------&amp;nbsp;⚠️&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# 느낀점&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. Task만 있다면 Combine -&amp;gt; Swift Concurrency는 어렵지 않겠다..? 라는 생각이 들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이게 Combine이 아니라 RxSwift여도요!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;(근데 &lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://github.com/ReactiveX/RxSwift/blob/main/Documentation/SwiftConcurrency.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RxSwift도 Swift&amp;nbsp;Concurrency지원하게 업데이트&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; 됨)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. URLSession.shard.data가 iOS 15부터 사용가능한건 좀 ㅠ... &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;여기가 async로 깔끔하게 안풀리면 끔찍한 혼종이 발생할 것 같다는 생각이 들었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아직 해보진 않음...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;앱이 워낙 간단하다보니 딱히 트러블슈팅도 없었고....그래서 딱히 느낀점으로 쓸만한게 없네요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 아주 간단하게 Combine -&amp;gt; &amp;nbsp;Swift Concurrency를 사용하도록 바꿔봤는데&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;저도 잘 몰라서 틀린 부분이 있을지도 모르겠습니다 ㅎ (특히 Task...)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;Task는 공부를 제대로 한번 해봐야겠어요. iOS 13부터 사용가능하니..많이 쓰게 될 듯한ㅎㅎ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;틀린 부분이나 개선될 수 있는 부분들을 발견하셨다면 댓글 남겨주세요!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift/Concurrency</category>
      <category>async await</category>
      <category>Swift</category>
      <category>swift async</category>
      <category>Swift Concurrency</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1335</guid>
      <comments>https://zeddios.tistory.com/1335#entry1335comment</comments>
      <pubDate>Tue, 25 Jan 2022 23:02:35 +0900</pubDate>
    </item>
    <item>
      <title>Literal</title>
      <link>https://zeddios.tistory.com/1334</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;오늘은 Literal에 대해서 공부!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;얼마전에 Literal이 뭔지 아냐는 질문을 받았었는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;문자..? &amp;lt; 라고 대답했는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;컴퓨터 분야에서 이 Literal이 어떤 의미인지 정확히 몰랐던 것 같아서 정리해보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift를 예제로 들겠지만, 다른 프로그래밍언어에서도 똑같다고 생각하면 될 듯!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Literal&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #3cb09c;&quot;&gt;&lt;a style=&quot;color: #3cb09c;&quot; href=&quot;https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_nil-literal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Swift 공식문서&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;에서 다음과 같이 정의합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;A&amp;nbsp;literal&amp;nbsp;is&amp;nbsp;the&amp;nbsp;source&amp;nbsp;code&amp;nbsp;representation&amp;nbsp;of&amp;nbsp;a&amp;nbsp;value&amp;nbsp;of&amp;nbsp;a&amp;nbsp;type,&amp;nbsp;such&amp;nbsp;as&amp;nbsp;a&amp;nbsp;number&amp;nbsp;or&amp;nbsp;string.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;숫자 또는 문자열과 같은 타입 &lt;b&gt;값(value)&lt;/b&gt;의 소스 코드 표현&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;한마디로&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643199288932&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x = 42&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;에서 42를 Literal이라고 할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;우리가 42를 딱 봤을 때 어? Int네? 라고 생각하겠지만, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;literal은 자체적으로 타입을 가지고 있지 않습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그렇기에 Swift는 literal의 타입을 유추하려고 시도하게 됩니다. (type&amp;nbsp;inference)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;예를 들어,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642919669620&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x: Int8 = 42&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위와같은 코드에서 명시적인 타입 명시를 사용하여 42가 Int8임을 추론합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;하지만&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642919713418&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x = 42&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위와같이 적절한 타입 정보가 없으면 Swift 표준 라이브러리에 정의된 기본 Literal 타입 중 하나라고 추론하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;integer&amp;nbsp;literals -&amp;gt; Int&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;floating-point&amp;nbsp;literals -&amp;gt; Double&lt;br /&gt;string&amp;nbsp;literals -&amp;gt; String&lt;br /&gt;Boolean&amp;nbsp;literals -&amp;gt; &amp;nbsp;Bool&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;이런식으로 말이죠!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642919826730&quot; class=&quot;nix&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x = 42&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위 코드에서 Swift는 integer&amp;nbsp;literals이 들어왔기 때문에 Int로 추론하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;# ExpressibleBy...Literal&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;integer&amp;nbsp;literals -&amp;gt; Int&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;floating-point&amp;nbsp;literals -&amp;gt; Double&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;string&amp;nbsp;literals -&amp;gt; String&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Boolean&amp;nbsp;literals -&amp;gt; &amp;nbsp;Bool&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;위와 같이 Swift가 Literal을 보고 타입유추가 가능한 이유는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Int, Double, String, Bool과 같은 primitive&amp;nbsp;type들은&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;ExpressibleBy&lt;b&gt;Integer&lt;/b&gt;Literal, ExpressibleBy&lt;b&gt;String&lt;/b&gt;Literal..과 같은 프로토콜을 준수하고 있기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;예를들어,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642920509282&quot; class=&quot;julia&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x: Int8 = 42&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Int8은 ExpressibleBy&lt;b&gt;Integer&lt;/b&gt;Literal을 준수하고 있기 때문에 정수 Literal 42에 대한 타입으로 사용할 수 있는 것이죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 프로토콜들 덕분에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642920607188&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x: String = 42&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런것들이 컴파일에러를 일으키게 되는것이죠!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;# Custom literal&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;자 위에서 말했듯이..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;literal은 자체적으로 타입을 가지고 있지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;그래서 재밌는 일을 할 수 있게 되는데요..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642920941517&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extension Int: ExpressibleByStringLiteral {
    public init(stringLiteral value: String) {
        self = Int(value)!
    }
}

let x: Int = &quot;1&quot;

print(x is Int, x is String) // true, false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Int가 &lt;b&gt;ExpressibleByStringLiteral&lt;/b&gt;을 준수하도록 하고, 필수 이니셜라이저를 적절하게 구현해주면&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642920983451&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x: Int = &quot;1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이런것도 가능해집니다. :D&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;물론 위와 같이 하려면 반드시 &quot;&quot;안에 숫자가 들어가야겠죠?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift</category>
      <category>Literal</category>
      <category>리터럴</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1334</guid>
      <comments>https://zeddios.tistory.com/1334#entry1334comment</comments>
      <pubDate>Sun, 23 Jan 2022 16:08:00 +0900</pubDate>
    </item>
    <item>
      <title>추상화</title>
      <link>https://zeddios.tistory.com/1331</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하세요 :) Zedd입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오늘은 추상화에 대해서 공부해보려고 합니다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;# 추상화의 목적&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;추상화는 단지 하나의 개념일 뿐이고, 프로그램 세계에서 추상화는 다양한 방식으로 나타내질 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그래서 추상화에 대한 정의보다는 &lt;b&gt;목적&lt;/b&gt;을 보면 좋을 것 같아요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;✔️&amp;nbsp;추상화의 목적 == 복잡성을 이해/극복하기 쉬운 수준으로 단순화하는 것.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# 예시&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;계좌(Account)로 예를 들어볼게요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;[1. 계좌]&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;계좌의 특성은 엄~~청나게 많고 복잡할텐데요. 이 계좌를 프로그램 세계에서 표현하고 싶습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;그러기위해 우리가 가장 먼저 해야하는 일은&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1641716364200&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Account {}
struct Account {}
protocol Account {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이렇게 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;'타입'을 정의하는 것&lt;/b&gt;&lt;/span&gt;이죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그리고 현실세계 계좌의 모든 특징을 가져오지 않고, 불필요한 세부사항은 제거할거에요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;&lt;b&gt;계좌의 진짜진짜 중요한 부분만 강조&lt;/b&gt;하는것이죠!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;계좌의 대표적인 행동/속성은 잔액, 잔액조회, 입금, 출금같은 게 있겠네요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;✔️&amp;nbsp;추상화의 목적 == 복잡성을 이해/극복하기 쉬운 수준으로 단순화하는 것.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이렇게 타입을 정의함으로써 현실세계의 복잡한 개념을 프로그램 세계에서는 간단하게 표현할 수 있게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;범위가 상당히 크긴 하지만, 이것이 바로 추상화입니다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[2. 계좌의 종류]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;현실 세계의 계좌에는 종류가 엄청나게 많은데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;예를 들어 &lt;b&gt;종합매매계좌,&lt;b&gt;CMA,&lt;b&gt;중개형 ISA&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;과 같은 복잡한 개념을 프로그램 세계에서 표현하고 싶습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;종합매매계좌,CMA,중개형 ISA&amp;nbsp;&lt;b&gt;각각 타입을 만드는 것 역시 추상화&lt;/b&gt;라고 할 수 있는데요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;잘 보면, 전부 다 &lt;b&gt;'계좌'라는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;공통점&lt;/span&gt;&lt;/b&gt;이 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;즉, 종합매매계좌,CMA,중개형 ISA는 현실세계의 '계좌'라는 개념으로 추상화가 가능&lt;/b&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;딱&amp;nbsp;종합매매계좌,CMA,중개형 ISA를 봤을 때는 괜히&amp;nbsp;복잡해보이고 이해도 안됐었는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;추상화를 함으로써 본질이 드러나 훨씬&amp;nbsp;&lt;b&gt;단순&lt;/b&gt;해진 '&lt;b&gt;계좌&lt;/b&gt;'를 보고나면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;종합매매계좌,CMA,중개형 ISA를&amp;nbsp;오히려&amp;nbsp;더 잘 이해할 수 있게 됩니다. (&lt;s&gt;오히려 좋아&lt;/s&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;아 CMA, 중개형 ISA가 일단 '계좌'구나?.. &amp;lt; 이런식..&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;이것이 추상화의 장점이죠!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;프로그램 세계에서 가장 먼저 하게 되는 일은 역시&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1641717035482&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Account {}
struct Account {}
protocol Account {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;'Account'라는 타입을 만드는 것일거고, 더 나아가서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642314625414&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Account {

    var balance: Int

    func deposit() {} // 입금
    func withdraw() {} // 출금
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런 계좌의 공통적인 속성/특징을 정의 할 수 있습니다. (위 예제는 그냥 class에 정의해본거)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이 Account를&amp;nbsp;상속 또는 conform하는&amp;nbsp;종합매매계좌,&amp;nbsp;CMA, 중개형 ISA 타입을 만들게 될것입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;# 타입 정의 == 추상화&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위에서 언급했듯이, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;현실 세계의 개념을 프로그램 세계에서 표현하기 위해&lt;b&gt; 타입을 정의하는것 자체가 추상화&lt;/b&gt;인데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Swift를 예로 들자면, 타입을 정의하는 여러가지 메커니즘이 존재하는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;class, struct, enum, protocol이 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 중 어떤 방식으로 타입으로 정의하느냐?도 추상화에 포함되는 내용일것입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;단순히 &lt;b&gt;계좌 타입 하나만 만들고 싶다면&lt;/b&gt; class, struct 모두 계좌 타입을 만들기에 적절할 것 같은데요.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;(둘 중 뭘 선택하는지는 때에 따라 다르겠지만..그리고 &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;제가 생각하는 잔액조회 등등이 되는 계좌타입은 enum으로 표현하기 힘들 것 같아서 일단 제외하겠습니다. )&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이 계좌 타입으로 &lt;b&gt;하위개념을 표현하는데 사용하고 싶다면&lt;/b&gt; (종합매매계좌,&amp;nbsp;CMA, 중개형 ISA같이..)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;- 상속 / conform이 불가능한 &lt;b&gt;struct 제외&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;- 하위개념을 표현하는데 사용가능한 class, protocol 가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;class와 protocol만 남게되는데, 이 역시 둘 중 어떤 방법으로 타입을 정의할지는 상황에 따라 다르겠지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;1. 하나의 super class만 상속 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;2. struct(또는 enum)이 class를 상속할 수 없음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;과 같은 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;class의 한계 + 상속의 한계때문에 Swift에서는 주로 protocol로 타입을 만드는 것 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;(class, struct 모두 protocol을 conform만 하면 되니)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;lt;객체지향의 사실과 오해&amp;gt;를 읽으면서 책에 있는 내용들과 제 생각을 글로 써봤는데요!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이런걸 포함해서 글 쓰면서 생각을 정말 많이 한 것 같아요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;퇴고를 몇번이나 했는데도 제 생각이 잘 담긴지 잘 모르겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;요 글도 지인에게 피드백을 받았었는데, 다음과 같은 질문이 있었어요.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;타입을 정의하는게.. 그러니까 class, struct같은 concrete타입을 정의하는게 왜 추상화인지 잘 이해가 안가.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;내가 생각하는 추상화는 어떠한 개념을 추상적으로(세부사항이 없이) 만들기 위한 것인데...&lt;br /&gt;그리고 그런 추상화를 구체화한게 class, struct같은 concrete타입인데! 타입을 만드는게 왜 추상화인거야?&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 말에도 정말 1000% 공감을 합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;다만 저는 프로그래밍 세계 안에서 추상화를 활용한 기법에 집중했다기 보다.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;현실세계의 개념을 프로그래밍 세계에서 표현하기 위한 추상화에 집중했다고 봐주시면 좋을 것 같아요!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&quot;타입을 이용하여, 객체의 특성을 추상화한다.&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그리고&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;삼각형, 사각형은 도형으로 추상화 가능하다 / 토끼, 사자는 동물로 추상화가 가능하다..&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이런 예제보다는 뭔가 진짜 현실세계의 복잡한 개념을 예시로 들고싶었는데, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;계좌(Account)가 적절한 예시였을지 모르겠지만, 일단 제가 보기엔 적절했다...ㅎ;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;아무튼 이 글은 꼭꼭 많은 피드백을 받고싶어요!! 많은 댓글 부탁드립니다~~~~&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 (훌륭한) 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은&lt;br /&gt;추상화를 정확하게 다루는 능력이라는 것이 명확해진다.&lt;br /&gt;- 키스 데블린&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부</category>
      <category>추상화</category>
      <author>Zedd0202</author>
      <guid isPermaLink="true">https://zeddios.tistory.com/1331</guid>
      <comments>https://zeddios.tistory.com/1331#entry1331comment</comments>
      <pubDate>Mon, 10 Jan 2022 22:34:32 +0900</pubDate>
    </item>
  </channel>
</rss>