<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Encapsulation on Kelly Dev</title><link>https://kelly-chui.github.io/tags/encapsulation/</link><description>Recent content in Encapsulation on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 10 Feb 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/encapsulation/index.xml" rel="self" type="application/rss+xml"/><item><title>SniffMEET. 세션 갱신과 정보 접근을 SessionManager에 캡슐화하기</title><link>https://kelly-chui.github.io/posts/sniffmeet-dev-log-supabase-session-manager-encapsulation/</link><pubDate>Mon, 10 Feb 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/sniffmeet-dev-log-supabase-session-manager-encapsulation/</guid><description>&lt;h2 id="sessionmanager-사용성-개선"&gt;SessionManager 사용성 개선&lt;/h2&gt;
&lt;h3 id="세션을-갱신하는-방법"&gt;세션을 갱신하는 방법&lt;/h3&gt;
&lt;p&gt;Supabase 서버와의 통신이 필요할 때, 우선 세션의 유효성을 검증해야 한다.&lt;/p&gt;
&lt;p&gt;기존 방식에선 직접 AuthManager의 싱글톤 객체에서 세션을 갱신하는 작업을 했지만&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AuthManager와 SessionManager의 역할 명확하게 분리&lt;/li&gt;
&lt;li&gt;AuthManager의 싱글톤 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;와 같은 변화점이 있었고, 기존 AuthManager가 담당하던 세션 갱신, 복원 작업이 SessionManager로 옮겨졌다. SessionManager의 싱글톤 객체에서 세션의 유효성을 체크하는 컴퓨티드 프로퍼티의 부울리언 값을 체크하여 세션을 갱신하는 메소드를 호출하는 방식을 사용했다:&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;SessionManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isExpired&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;await&lt;/span&gt; &lt;span class="n"&gt;SessionManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;refreshSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;이 방식은 SessionManager의 싱글톤 객체 호출이 두 번 일어나고, &lt;code&gt;refreshSession&lt;/code&gt;이라는 메소드를 직접 노출해서, SessionManager가 세션을 갱신하는 방법을 직접 노출하는 문제가 있다.&lt;/p&gt;</description></item><item><title>SniffMEET. 세션 저장 메소드를 공개해도 괜찮을까?</title><link>https://kelly-chui.github.io/posts/sniffmeet-dev-log-session-save-api/</link><pubDate>Mon, 10 Feb 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/sniffmeet-dev-log-session-save-api/</guid><description>&lt;h2 id="세션-저장하기"&gt;세션 저장하기&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;AuthManager&lt;/code&gt;와 &lt;code&gt;SessionManager&lt;/code&gt;의 역할을 분리하고 나니, 세션을 받아오는 쪽과 저장하는 쪽이 서로 달라지는 문제가 발생했다.&lt;/p&gt;
&lt;p&gt;(AuthManager가 세션도 관리하던)기존 구조에서는 &lt;code&gt;saveSession(for:)&lt;/code&gt;가 외부에 노출되어 있지 않았는데, 역할이 옮겨진 뒤에는 AuthManager에서 받아온 세션을 SessionManager로 전달해야 했다.&lt;/p&gt;
&lt;h3 id="고민한-점"&gt;고민한 점&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;saveSession(for:)&lt;/code&gt;는 사실상 &lt;code&gt;AuthManager&lt;/code&gt;가 세션을 받아온 상황에서만 필요한 메소드다.&lt;/p&gt;
&lt;p&gt;그런데 이 메소드를 공개하면 캡슐화가 약해진다는 생각을 했고, 다시 AuthManager로 돌리면 SessionManager가 맡아야 할 책임을 되돌리는 것이 되었다.&lt;/p&gt;
&lt;p&gt;따라서 몇 가지 방법을 떠올려 봤다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(최종 선택) &lt;code&gt;saveSession(for:)&lt;/code&gt;를 공개한다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;saveSession(for:)&lt;/code&gt;를 &lt;code&gt;AuthManager&lt;/code&gt;로 다시 옮긴다&lt;/li&gt;
&lt;li&gt;같은 로직을 &lt;code&gt;AuthManager&lt;/code&gt;와 &lt;code&gt;SessionManager&lt;/code&gt;에 각각 작성한다&lt;/li&gt;
&lt;li&gt;세션이 갱신됐다는 이벤트를 따로 전달할 수 있는 통신 레이어를 만든다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;처음에 가장 괜찮아 보였던 건 세션 갱신 이벤트를 따로 전달하는 방식이었다.&lt;/p&gt;</description></item></channel></rss>