<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ssorry_choi.log</title>
        <link>https://velog.io/</link>
        <description>Hello Universe!</description>
        <lastBuildDate>Thu, 23 Apr 2026 11:19:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ssorry_choi.log</title>
            <url>https://images.velog.io/images/ssorry_choi/profile/e714a76d-bf87-4bf5-ae73-f15bf1d7fa5d/IMG_8316.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ssorry_choi.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ssorry_choi" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[TIL-004]내일배움캠프4일차]]></title>
            <link>https://velog.io/@ssorry_choi/TIL-004%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EC%BA%A0%ED%94%844%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ssorry_choi/TIL-004%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EC%BA%A0%ED%94%844%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 23 Apr 2026 11:19:36 GMT</pubDate>
            <description><![CDATA[<h1 id="오늘-배운-것을-한-줄로-요약">[오늘 배운 것을 한 줄로 요약]</h1>
<blockquote>
<p>한 줄 핵심 요약 — 이 글을 다 읽으면 무엇을 얻어갈 수 있는지 적어주세요.</p>
</blockquote>
<hr>
<h2 id="🗓️-날짜--카테고리">🗓️ 날짜 &amp; 카테고리</h2>
<ul>
<li><strong>날짜</strong>: 2026-04-23</li>
<li><strong>카테고리</strong>: <code>#일기</code></li>
<li><strong>한 줄 배경</strong>: 매니저님과 수강 철회에 대하여... 면담..</li>
</ul>
<hr>
<h2 id="🧠-오늘-배운-것">🧠 오늘 배운 것</h2>
<h3 id="마인드-셋">마인드 셋</h3>
<p>이번주부터 9to21로 교육을 받고 있는데,,, 체력적으로나 멘탈적으로 9시에 출결을 찍는게 스트레스 였음.. 그래서 매니저님을 오늘 오전에 찾아가 면담 신청을했다.
수강 철회하고 싶다. 말씀드렸더니</p>
<blockquote>
<p>왜 철회를 하고싶은지.
원래 이걸 알고 들어왔을텐데, 무엇이 철회라는 생각에 이르게 했는지.</p>
</blockquote>
<p>같이 본질적인 질문을 해주셨다. 
사실 나는 그로스/퍼포먼스 마케터 쪽에 관심이 있었고, 그곳에 강점이 있다고 생각해서 신청을 하게 된 것이었다. 근데 콘텐츠 마케팅 과정이라고 홍보를 해서 그런지 이 곳에는 콘텐츠 마케터를 희망하는 친구들이 많은 것 같았다. 그래서 멋쟁이사자처럼에서 그로스 마케터 과정이 있길래 이래저래 알아봤는데, 사실 교육의 질은 비슷할것 같았고, 나에게는 교육기간과 하루에 할당하는 시간이 매력적으로 느껴졌다. 그래서 이래저래 알아보고 철회를 하려고 했던것이었다. </p>
<p>근데 매니저님과 얘기를 끝내고 혼자 좀 생각을 해보니까, 마케터 JD를 이전에 조사한적이 있었는데, 사실 요구조건에 이것저것이 많이 쓰여져 있었다. 결론은 모든걸 할 줄 아는 마케터를 구하는 듯 했다. 그래서 1000시간이 길긴 하지만, 그래도 여기서 이것저것 다 해보는 것이 도움이 많이 될 것 같았다는 생각이 들었다. </p>
<p>철회하지 않고, 여기서 100일만 죽었다 생각하고 해봐야겠다. ㅈㅅ...사실 존나 짧은 기간임. 그리고 생각해보면 80% 출석률만 넘기면 되는데, 그럼 20일의 휴가가 있는거임ㅋ 해보자.</p>
<h3 id="내가-맡은-광고-리라이팅">내가 맡은 광고 리라이팅</h3>
<p><img src="https://velog.velcdn.com/images/ssorry_choi/post/0f19ac00-899c-4ba3-aebf-87ced4d9d093/image.png" alt=""></p>
<p>지금 생각해보면 어려운 동영상광고를 선택한것 같기도한데,,, 그냥 일단 해보자,,ㅎ.ㅎFlow라는 프로그램을 써서 해봄..!</p>
<p>토큰이 아까워서 깔짝 해보기만했다,,,ㅎㅎ </p>
<hr>
<h2 id="💬-오늘의-한-마디">💬 오늘의 한 마디</h2>
<p>다시 초심잡고 열심히 해보자 -!! 아자아자아자</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL-003]내일배움캠프3일차]]></title>
            <link>https://velog.io/@ssorry_choi/TIL-003%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EC%BA%A0%ED%94%843%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ssorry_choi/TIL-003%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EC%BA%A0%ED%94%843%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 22 Apr 2026 10:11:08 GMT</pubDate>
            <description><![CDATA[<h2 id="🗓️-날짜--카테고리">🗓️ 날짜 &amp; 카테고리</h2>
<ul>
<li><strong>날짜</strong>: 2026-04-22</li>
<li><strong>카테고리</strong>: 온보딩</li>
<li><strong>한 줄 배경</strong>: 오늘 어떤 상황에서 이걸 배우게 됐는지 (ex. 광고 세팅 중에 / 아티클 읽다가 / 미팅 중에)</li>
</ul>
<hr>
<p>☑️ 오늘 할 일
✔️ 커리어스터디 2시간
✔️ 이번주 금요일에 발표할 표지,제목 정하기
✔️ 5기 전체 스크럼
✔️ 아티클 스터디
✔️ 혜령,현전 튜터님들 커리어세션</p>
<hr>
<h2 id="🧠-오늘-배운-것">🧠 오늘 배운 것</h2>
<h3 id="핵심-개념-or-발견">핵심 개념 or 발견</h3>
<p>오늘,,, 너무 피곤,,</p>
<ul>
<li><a href="https://claude.ai/chat/%EB%A7%81%ED%81%AC">자료 제목</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL-002]내일배움캠프2일차]]></title>
            <link>https://velog.io/@ssorry_choi/TIL-002%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EC%BA%A0%ED%94%842%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ssorry_choi/TIL-002%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EC%BA%A0%ED%94%842%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 21 Apr 2026 15:00:07 GMT</pubDate>
            <description><![CDATA[<p>🗓️ 날짜 &amp; 카테고리</p>
<ul>
<li>날짜: 2026-04-21</li>
<li>카테고리: <code>#온보딩</code></li>
</ul>
<p>☑️ 오늘 할 일
✔️ 커리어스터디 2시간
✔️ VOD수강 2시간
✔️ 커리어세션 2시간</p>
<h3 id="커리어스터디-1">커리어스터디 1.</h3>
<h4 id="step1-끌린직무-1번-더-보기-1000-1100">STEP1. 끌린직무 1번 더 보기. (10:00-11:00)</h4>
<p>어제 <strong><em>wanted</em></strong>에서 찾아봤는데, 경력직 쪽을 찾아봐서 좀 더 어렵게 느껴졌던것 같다.. 그래서 오늘은 _<strong>잡코리아</strong>_에서 신입도 지원가능한 마케터 직종을 찾아보기로했다!</p>
<ul>
<li>마스터마인딩그룹
<img src="https://velog.velcdn.com/images/ssorry_choi/post/c5f96cb5-594b-4d61-935a-35e99506e774/image.png" alt=""><blockquote>
<p>이 직무가 만드는 <strong>결과물</strong>은? (캠페인? 콘텐츠? 광고 성과? 데이터?)
=&gt; 콘텐츠 마케팅 채녈 운영자
이 직무의 <strong>하루</strong>는 어떤 모습일까? (회의? 데이터 분석? 콘텐츠 제작?)
=&gt; 데이터 분석 및 콘텐츠 제작
⚠ 아니 뭐 다 할거 같긴하네,,</p>
</blockquote>
</li>
</ul>
<ul>
<li><p>애드이피션시[경력직]
<img src="https://velog.velcdn.com/images/ssorry_choi/post/9d09429b-4585-4a98-8fe9-38c8d8b0ea22/image.png" alt=""></p>
<blockquote>
<p>이 직무가 만드는 <strong>결과물</strong>은? (캠페인? 콘텐츠? 광고 성과? 데이터?)
=&gt; 분석, 앱 마케팅, 운영
이 직무의 <strong>하루</strong>는 어떤 모습일까? (회의? 데이터 분석? 콘텐츠 제작?)
=&gt; 광고캠페인 기획, VOC 분석, 데이터 분석</p>
</blockquote>
</li>
<li><p>메가스터디[인턴]
<img src="https://velog.velcdn.com/images/ssorry_choi/post/08c2e0b7-39ef-4b4e-9860-32dffd2643f3/image.png" alt=""></p>
<blockquote>
<p>이 직무가 만드는 <strong>결과물</strong>은? (캠페인? 콘텐츠? 광고 성과? 데이터?)
=&gt; 디지털 광고 운영, 콘텐츠 기획
이 직무의 <strong>하루</strong>는 어떤 모습일까? (회의? 데이터 분석? 콘텐츠 제작?)
=&gt; 회의, 제작, 기획</p>
</blockquote>
</li>
</ul>
<ul>
<li><p>현대렌탈케어 [경력]
<img src="https://velog.velcdn.com/images/ssorry_choi/post/5a83a665-c090-4e47-bf0e-21e0a552cfb1/image.png" alt=""></p>
<blockquote>
<p>이 직무가 만드는 <strong>결과물</strong>은? (캠페인? 콘텐츠? 광고 성과? 데이터?)
=&gt; 콘텐츠, 캠페인
이 직무의 <strong>하루</strong>는 어떤 모습일까? (회의? 데이터 분석? 콘텐츠 제작?)
=&gt; 성과분석, 콘텐츠기획, 실행</p>
</blockquote>
</li>
<li><p>하이버
<img src="https://velog.velcdn.com/images/ssorry_choi/post/539a2d64-4e9e-4b1c-a30d-fae109430d74/image.png" alt=""></p>
<blockquote>
<p>이 직무가 만드는 <strong>결과물</strong>은? (캠페인? 콘텐츠? 광고 성과? 데이터?)
=&gt; 광고 성과, 캠페인
이 직무의 <strong>하루</strong>는 어떤 모습일까? (회의? 데이터 분석? 콘텐츠 제작?)
=&gt; 데이터 분석</p>
</blockquote>
</li>
</ul>
<h4 id="step2-광고-분석">STEP2. 광고 분석</h4>
<p>내가 고른 광고는 내가 타겟팅이 됐던 좋은 광고를 선정했다. 
<a href="https://www.youtube.com/watch?v=nHMhV2vXJC8">썹픽 주문 가이드 광고</a></p>
<ol>
<li><p><strong>내가 고른 광고를 차분히 다시 봅니다.</strong></p>
<ul>
<li>영상이면 한 번은 소리를 끄고 봐보세요</li>
</ul>
</li>
<li><p>아래 <strong>3가지 질문</strong>에 답을 적어봅니다. (애매해도 OK, 추측이어도 OK)</p>
<ul>
<li><p><strong>누구에게?</strong> (타겟) — 어떤 사람을 떠올리며 만들어졌을까?
 → 주문을 어려워 하는 사람들
→ 주문을 매번 똑같이 하는 사람들
→ 따로 주문사항이 없는 사람들
→ 할머니/할아버지들</p>
</li>
<li><p><strong>무엇을?</strong> (메시지) — 전하려는 핵심 한 줄은?
→ <em><strong>주문을 간단히 할 수 있다.</strong></em></p>
</li>
<li><p><strong>어떻게?</strong> (채널·포맷) — 어디서 봤고, 어떤 형식이었지?
→ <em><strong>찾아보다가 알게됨,,</strong></em></p>
</li>
</ul>
</li>
<li><p><strong>&quot;내가 느낀 점&quot;을 솔직하게 쓴다.</strong> 
완전 후킹돼서 한번 더 가볼 것 같다. 기존에는 &quot;다 넣어주세요&quot; 라고 말해야하는 방식이었는데, 베스트 조합으로 넣어주실 것 같아 비교해보고 싶은 마음이 들것 같다.</p>
</li>
</ol>
<p>🧠 오늘 배운 것
핵심 개념 or 발견</p>
<blockquote>
<p>💡 <strong>일은 부업이고 나를 알아가는것이 본업이다</strong>
_출처: 강튜터님 커리어섹션 강의 중... _</p>
</blockquote>
<p>🔄 기존에 알고 있던 것과 비교
기존에 알던 것: - </p>
<p>💫 알게된 것: </p>
<h3 id="마케터의-사고법">마케터의 사고법</h3>
<ul>
<li>‘나’ 중심에서 ‘고객’ 중심으로</li>
<li>‘현상’이 아닌 ‘본질’ 질문하기</li>
<li>‘숫자’를 ‘스토리’로 읽기</li>
<li>‘점’이 아닌 ‘선’으로 연결하기</li>
<li>‘완벽’보다 ‘최적’찾기</li>
</ul>
<p>💬 오늘의 한 마디
오늘 히주님이랑 얘기하다가 새로 유행하는 노래에 대해 알게됐다 ㅋ 한로로X싸이 뭐 그런건데, 암튼 웃긴다 ㅋ 중독성도 있다. 그래서 오늘 취준로그에 bgm으로 올림ㅋ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL-001]내일배움캠프1일차]]></title>
            <link>https://velog.io/@ssorry_choi/TIL-001-%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EC%BA%A0%ED%94%841%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ssorry_choi/TIL-001-%EB%82%B4%EC%9D%BC%EB%B0%B0%EC%9B%80%EC%BA%A0%ED%94%841%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 20 Apr 2026 11:35:15 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘-할일">오늘 할일</h3>
<p>✅ 마케터 JD 훑기
✅ 팀과 친해지기
✅ 광고 후보 선정</p>
<h2 id="1-마케터-jd-훑기">1. 마케터 JD 훑기</h2>
<p>내가 관심있는 마케터의 종류</p>
<ul>
<li>글로벌 인플루언서 마케팅</li>
<li>콘텐츠 마케터</li>
<li>퍼포먼스</li>
<li>그로스</li>
</ul>
<h3 id="글로벌-인플루언서-마케팅">글로벌 인플루언서 마케팅</h3>
<blockquote>
<p>유어유니콘(크런틴)
<a href="https://www.wanted.co.kr/wd/353192">https://www.wanted.co.kr/wd/353192</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/8423e14f-fc6d-4f82-8f19-6c423fd8925f/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>부스터스
<a href="https://www.wanted.co.kr/wd/355680">https://www.wanted.co.kr/wd/355680</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/ae07e39f-7e81-4cba-8aac-0e8a9ef0c78a/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>소울블렌드(인턴)
<a href="https://www.wanted.co.kr/wd/352857">https://www.wanted.co.kr/wd/352857</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/38a97437-da5d-49c5-a274-58b63274096b/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>데이바이미(잇더핏)
<a href="https://www.wanted.co.kr/wd/346490">https://www.wanted.co.kr/wd/346490</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/44563a58-47e3-46b8-ba0b-7ccde4ee35e4/image.png" alt=""></p>
</blockquote>
<h3 id="콘텐츠-마케터">콘텐츠 마케터</h3>
<blockquote>
<p>지바이크(GCOO)
<a href="https://www.wanted.co.kr/wd/355200">https://www.wanted.co.kr/wd/355200</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/48905828-4989-4e63-8111-4ebcbe991b39/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>베스트미(패션/뷰티)
<a href="https://www.wanted.co.kr/wd/334309">https://www.wanted.co.kr/wd/334309</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/f3c3ae9d-3339-4e26-98ae-496a76936368/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>클래스101
<a href="https://www.wanted.co.kr/wd/354052">https://www.wanted.co.kr/wd/354052</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/4d35344e-d8c9-4934-8c33-315f2f7b7f95/image.png" alt=""></p>
</blockquote>
<h3 id="퍼포먼스-마케터">퍼포먼스 마케터</h3>
<blockquote>
<p>자리컴퍼니(자리톡)
<a href="https://www.wanted.co.kr/wd/320452">https://www.wanted.co.kr/wd/320452</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/df8de71a-abd8-441f-8bbf-10ffc96d83ba/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>미스터픽(첫차)
<a href="https://www.wanted.co.kr/wd/341140">https://www.wanted.co.kr/wd/341140</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/caa30501-a19b-4188-b7a9-2d3e8907bf35/image.png" alt=""></p>
</blockquote>
<h3 id="그로스-마케터">그로스 마케터</h3>
<blockquote>
<p>팀스파르타
<a href="https://www.wanted.co.kr/wd/353242">https://www.wanted.co.kr/wd/353242</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/22a8a0f0-fe03-46b8-9d63-904affb8d343/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>퍼스트클래스
<a href="https://www.wanted.co.kr/wd/339210">https://www.wanted.co.kr/wd/339210</a>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/42afbcf5-66b1-42f9-9c9b-8d78becb0972/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>🌈 정리</p>
</blockquote>
<h3 id="인플루언서-마케터">인플루언서 마케터</h3>
<p>-&gt; 광고콘텐츠 기획 및 제작, SNS체널운영, 인플루언서 발굴 및 컨택
콘텐츠 마케터</p>
<h3 id="콘텐츠-마케터-1">콘텐츠 마케터</h3>
<p>-&gt; 영상 편집 툴 활용 역량, 콘텐츠로 유의미한 성과</p>
<h3 id="퍼포먼스-마케터-1">퍼포먼스 마케터</h3>
<p>-&gt; AARRR의 유저 플로우에 대해 통합적으로 사고할 수 있는 사람, SQL활용 가능자, 데이터 기반 사고에 익숙한 자, 데이터 기반의 가설 수립 및 의사결정 가능자</p>
<h3 id="그로스-마케터-1">그로스 마케터</h3>
<p>-&gt; 가설과 데이터 기반으로 핵심문제를 정의하고 최적의 해결책 도출 가능자, Meta, Google, 검색광고 등 광고 캠페인을 직접 운영해본자, Amplitude, GA4 제품분석을 실무에 활용해본 자</p>
<h2 id="팀과-친해지기">팀과 친해지기</h2>
<p>-&gt; 팀 이름: 마블리 👶</p>
<h2 id="광고-후보-선정">광고 후보 선정</h2>
<ul>
<li>나에게 공감갔던 광고
<a href="https://www.youtube.com/watch?v=-DVWxu3HxFE">서브웨이 광고</a></li>
<li>거슬렸던 광고
<img src="https://velog.velcdn.com/images/ssorry_choi/post/ceff2ebd-fd30-43f0-b2dc-085aa6b4e00e/image.png" alt=""></li>
</ul>
<p>“봄 피부, 무너지기 전에 잡으세요”</p>
<p>⇒”봄이 오기 전, 피부부터 새로고침”</p>
<ul>
<li>이유: 불안감 자극 방식에서 긍정적,능동적 행동 느낌으로 단어 변경</li>
</ul>
<p>“백설기케어”</p>
<p>⇒ “속부터 채워주는 깊은 보습 케어”</p>
<ul>
<li>이유: 처음보는 사람은 백설기 케어가 뭔지 모름;;;</li>
</ul>
<h3 id="오늘-vod-강의">오늘 VOD 강의</h3>
<p>1-1 마케팅의 본질 과제</p>
<h4 id="✏️-여러분이-생각한-마케팅은-무엇인가요">✏️ 여러분이 생각한 마케팅은 ‘무엇’인가요?</h4>
<blockquote>
<p>내가 생각하는 마케팅은 <code>프로포즈</code>이다. 그 이유는 <code>소비자의 마음을 사기</code>때문이다.</p>
</blockquote>
<h4 id="✏️-마케터의-포장지-입히기-심폐소생술">✏️ 마케터의 포장지 입히기 (심폐소생술)</h4>
<ul>
<li>아이템 : 할머니가 신으시던 보라색 슬리퍼</li>
<li>상황 : 재고가 1,000개 쌓여있습니다. 이 슬리퍼를 트렌드에 민감한 성수동 20대 ‘패션 피플’들에게 팔아야 합니다. 어떻게 포장할 수 있을까요?</li>
</ul>
<blockquote>
<p>마케터의 포장 : 신혼부부 화장실 청소 필수템, No.5 </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL-004]Toss광고분석]]></title>
            <link>https://velog.io/@ssorry_choi/TIL-004Toss%EA%B4%91%EA%B3%A0%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@ssorry_choi/TIL-004Toss%EA%B4%91%EA%B3%A0%EB%B6%84%EC%84%9D</guid>
            <pubDate>Mon, 13 Apr 2026 08:58:13 GMT</pubDate>
            <description><![CDATA[<p>오늘은 사전캠프 마지막주 월요일,,, 이번주도 화이팅..!
Toss의 FacePay 서비스를 광고한 영상을 보고 해당 내용을 분석하는 시간이었다.</p>
<p>🚀 &quot;결제의 새 얼굴&quot; - 토스 FacePay가 던지는 메시지</p>
<ol>
<li>타겟팅: 결제를 하는 모든 사람들(현금,카드,애플/삼성페이)</li>
<li>핵심 메시지: &quot;얼굴로 결제할게요&quot;  </li>
<li>강점 분석: </li>
</ol>
<ul>
<li>애플/삼성페이: 디바이스를 주머니에서 꺼내야 하는 단점</li>
<li>카드결제: 카드를 가지고 다녀야 하는 귀찮음</li>
<li>현금: 당장 사야할 물건의 현금이 없으면 구매 불가</li>
<li>위 모든 문제점을 &quot;얼굴&quot;로 해결 가능.</li>
<li>얼굴은 항상 지니고 있기 떄문에 따로 챙길 필요가 없다는 편리함 강조.</li>
</ul>
<ol start="4">
<li>강력한 행동 유도 (CTA):</li>
</ol>
<ul>
<li>얼굴로 결제</li>
<li>결제의 미래</li>
</ul>
<ol start="5">
<li>이 광고의 설득력 + 추가점</li>
</ol>
<ul>
<li>보안</li>
<li>얼굴인식의 정확도</li>
<li>불안감</li>
</ul>
<blockquote>
<p>💡 마치며
나는 이 광고에 추가점으로 <code>안정성</code>을 뽑았지만, 다른 팀원분은 <code>편리함</code>을 얘기하셨다. 내 입장: 토스는 금융 플랫폼이기 때문에 안정성을 추가점으로 뽑았다.
히주님 입장: &quot;안정성&quot;은 불안한 사람들에게 사용을 설득하지만, &quot;편리함&quot;은 모든 사람에게 사용할 이유를 더해준다.</p>
</blockquote>
<p>이 말에 설득당해 편리함을 더 강조하면 좋겠다고 했다 ^^</p>
<p><a href="https://www.youtube.com/watch?v=YPPWBVNbh6o&amp;start=0">https://www.youtube.com/watch?v=YPPWBVNbh6o&amp;start=0</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL-003]사전캠프]]></title>
            <link>https://velog.io/@ssorry_choi/TIL-003%EC%82%AC%EC%A0%84%EC%BA%A0%ED%94%84</link>
            <guid>https://velog.io/@ssorry_choi/TIL-003%EC%82%AC%EC%A0%84%EC%BA%A0%ED%94%84</guid>
            <pubDate>Wed, 08 Apr 2026 09:03:36 GMT</pubDate>
            <description><![CDATA[<h1 id="용어정리집">용어정리집</h1>
<h3 id="온라인-광고-용어-정의">온라인 광고 용어 정의</h3>
<h4 id="증분-대비-비용-지표--cost">증분 대비 비용 지표 = Cost</h4>
<blockquote>
<p>💡 CPI (Cost Per Install): 설치 당 비용
 ✅ <code>비용 / 설치 수</code></p>
</blockquote>
<blockquote>
<p>💡 CPM (Cost Per Mile): 노출 당 비용
✅ <code>(비용 / 노출 수) * 1000</code></p>
</blockquote>
<blockquote>
<p>💡 CPE (Cost Per Engagement): 상호작용 당 비용
✅ <code>(비용 / 상호작용(좋아요,공유,댓글 등))</code></p>
</blockquote>
<blockquote>
<p>💡 CPC (Cost Per Click): 클릭 당 비용
✅ <code>비용 / 클릭 수</code></p>
</blockquote>
<blockquote>
<p>💡 CPA (Cost Per Action): 전환 당 비용
✅ <code>비용 / 전환 수</code></p>
</blockquote>
<blockquote>
<p>💡 CAC (Cost Acquisition Cost): 고객 획득 비용, 객단가
✅ <code>비용 / 고객 수</code></p>
</blockquote>
<h4 id="증분-대비-비율-지표--rate">증분 대비 비율 지표 = Rate</h4>
<blockquote>
<p>💡 CTR (Click Through Rate): 클릭률
✅ <code>클릭 수 / 노출 수 * 100</code></p>
</blockquote>
<blockquote>
<p>💡 CR 또는 CVR(Conversion Rate): 전환률
✅ <code>전환 수 / 클릭 수 * 100</code></p>
</blockquote>
<h4 id="증분-대비-수익-지표--return">증분 대비 수익 지표 = Return</h4>
<blockquote>
<p>💡 ROI (Return On Investment): 투자 수익률
✅ <code>순이익 / 투자비용</code></p>
</blockquote>
<blockquote>
<p>💡 ROAS(Return On Ad Spend): 투자대비 광고 수익
✅ <code>광고 수익 / 광고 비용</code></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[STEP-1-1]마케팅 개론(마케팅)]]></title>
            <link>https://velog.io/@ssorry_choi/STEP-1%EB%A7%88%EC%BC%80%ED%8C%85-%EA%B0%9C%EB%A1%A0</link>
            <guid>https://velog.io/@ssorry_choi/STEP-1%EB%A7%88%EC%BC%80%ED%8C%85-%EA%B0%9C%EB%A1%A0</guid>
            <pubDate>Mon, 06 Apr 2026 08:44:40 GMT</pubDate>
            <description><![CDATA[<h2 id="마케팅-관리론">마케팅 관리론</h2>
<p>출처: <a href="https://jbro.tistory.com/entry/mm1#google_vignette">링크</a>
마케팅이란 무엇인가?</p>
<blockquote>
<p>마케팅은 고객들, 협력자들, 그리고 더 나아가 사회 전반에게 가치 있는 것을 만들고, 알리며, 전달하고, 교환하기 위한 활동과 일련의 제도 및 과정들이다.</p>
</blockquote>
<p>마케팅을 논할 때 공통적으로 포함시키는 키워드:</p>
<h3 id="1-소비자의-필요와-욕구">1. 소비자의 필요와 욕구</h3>
<p><code>필요</code>: 기본적인 만족의 결핍을 느끼고 있는 상태
<code>욕구</code>: 필요를 만족시킬 수 있는 구체적인 제품이나 서비스에 대한 바람
특정 제품이나 서비스에 대한 욕구가 구매의사와 능력이 뒷받침될때 이것을 <code>수요</code> 라고 말한다.</p>
<h3 id="2-소비자의-만족과-가치">2. 소비자의 만족과 가치</h3>
<p><code>가치</code>: 가격을 고려한 대안의 고객만족 수준
소비자는 최종적으로 그들의 필요와 욕구를 충족시키기 위해 가치가 가장 큰 제품이나 서비스를 선택하게 된다.</p>
<h3 id="3-교환">3. 교환</h3>
<p><code>교환</code>: 소비자가 가치 있는 제품이나 서비스를 대가를 지불하고 획득하는 행위</p>
<h3 id="4-시장">4. 시장</h3>
<p><code>시장</code>: 어떤 제품이나 서비스의 실제 또는 잠재적 구매자들의 집합</p>
<blockquote>
<p>💡 마케팅이란?
기업이 서비자에게 제품이나 서비스를 팔아 해치우기 위해 하는 모든 활동이다.</p>
</blockquote>
<h2 id="마케팅이란-무엇인가">마케팅이란 무엇인가?</h2>
<p>출처: <a href="https://www.startupn.kr/news/articleView.html?idxno=34174">링크</a></p>
<p><img src="https://velog.velcdn.com/images/ssorry_choi/post/ca35d70b-2460-41c2-9733-be48b49913b8/image.png" alt=""></p>
<p>실제로 이와 같은 사건을 겪었다. 전 회사에서 flutter 모바일 개발자로 있었을 당시, 사장님 왈;</p>
<blockquote>
<p><em>&quot;<del>좋은 소프트웨어가 곧 마케팅이다</del>&quot;</em> </p>
</blockquote>
<p>라고 하셨었다. 그래서 회사가 위기에 빠졌고, 나는 실업자가 됐다.... 그 당시엔 개발자 였으므로, 섹시하고 달콤한 말 이었던 것 같았다... 좋은 소프트웨어를 만드는 것이 곧 마케팅이었으니... 개발자입장에서는 매력적인 말이었다. 그러나 멍청한 소리였다.</p>
<p>마케팅은 제품이나 서비스를 소비자에게 판매하기 위한 필요한 전략과 실행 활동의 집합이다.</p>
<h3 id="마케팅의-요소">마케팅의 요소</h3>
<h4 id="1-시장조사market-research">1. 시장조사(Market Research)</h4>
<ul>
<li>마케팅의 출발점. <h4 id="2-고객-세분화">2. 고객 세분화</h4>
</li>
<li>소비자들을 특정 기준에 따라 그룹으로 나누는 과정<h4 id="3-타깃-마케팅">3. 타깃 마케팅</h4>
</li>
<li>특정 그룹 고객을 선택하여 그들에게 맞춤형 마케팅 메시지를 전달하는 것<h4 id="4-마케팅-믹스">4. 마케팅 믹스</h4>
</li>
<li>제품,가격,홍보,유통 등의 요소들을 종합적으로 고려해 마케팅 전략을 수립하는 것<h4 id="5-브랜딩">5. 브랜딩</h4>
</li>
<li>제품이나 서비스에 대한 인식과 이미지를 형성하는 과정</li>
</ul>
<h2 id="마케팅이란---다양한-정의-마케팅과-브랜딩의-차이-마케팅의-필요성">마케팅이란? - 다양한 정의, 마케팅과 브랜딩의 차이, 마케팅의 필요성</h2>
<p>출처: <a href="https://abcfact.tistory.com/entry/%EB%A7%88%EC%BC%80%ED%8C%85%EC%9D%B4%EB%9E%80-%EB%8B%A4%EC%96%91%ED%95%9C-%EC%A0%95%EC%9D%98-%EB%B8%8C%EB%9E%9C%EB%93%9C%EC%99%80%EC%9D%98-%EC%B0%A8%EC%9D%B4-%ED%95%84%EC%9A%94%EC%84%B1">링크</a></p>
<p>마케팅이란?
제품 또는 서비스를 판매하거나 브랜드 인식을 높이기 위해 수행되는 모든 활동.</p>
<p>마케팅의 목적?
고객과 상호 작용하여 그들의 요구를 충족시키고 만족시키는 것.</p>
<h4 id="마케팅과-브랜딩의-차이와-공통점">마케팅과 브랜딩의 차이와 공통점</h4>
<blockquote>
<p>공통점: 둘 다 제품이나 서비스를 고객에게 판매하기 위한 전략적 활동, 소비자와의 관계를 중시한다.</p>
</blockquote>
<blockquote>
<p>차이점: 
<code>마케팅</code> -&gt; 제품이나 서비스에 대한 고객의 인식이나 평가에 큰 영향을 미치는 이름,로고,디자인,명성 등의 인지적인 층면을 강조.
<code>브랜딩</code> -&gt; 제품이나 서비스와 관련된 모든 면에서 고객의 인식과 인지적인 가치를 형성</p>
</blockquote>
<h3 id="대표적인-마케팅-전략">대표적인 마케팅 전략</h3>
<h4 id="1-타깃-마케팅">1. 타깃 마케팅</h4>
<h4 id="2-콘텐츠-마케팅">2. 콘텐츠 마케팅</h4>
<h4 id="3-소셜미디어-마케팅">3. 소셜미디어 마케팅</h4>
<h4 id="4-인플루언서-마케팅">4. 인플루언서 마케팅</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL-002]사전캠프]]></title>
            <link>https://velog.io/@ssorry_choi/TIL-002%EC%82%AC%EC%A0%84%EC%BA%A0%ED%94%84</link>
            <guid>https://velog.io/@ssorry_choi/TIL-002%EC%82%AC%EC%A0%84%EC%BA%A0%ED%94%84</guid>
            <pubDate>Mon, 06 Apr 2026 07:53:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/ssorry_choi/post/7e7ec84b-b590-43e6-b250-224d4789193e/image.png" alt="">
<img src="https://velog.velcdn.com/images/ssorry_choi/post/319a8439-9d7d-4474-8723-7bb5b71a9814/image.png" alt=""></p>
<h3 id="1-트렌드-서핑-밈meme의-바다에서-살아남기">1. 트렌드 서핑: 밈(Meme)의 바다에서 살아남기</h3>
<p>광고의 생명은 &#39;공감&#39;과 &#39;재미&#39;라고 생각합니다. 요즘 유행하는 밈들을 리서치하며 팀원들과 머리를 맞댔습니다.</p>
<p>배운 점: 밈은 유통기한이 짧다. 하지만 적절한 타이밍에 사용하면 폭발적인 유입을 만들어낸다.</p>
<p>느낀 점: 단순히 웃긴 걸 찾는 게 아니라, 우리 캠프의 &#39;강점&#39;과 밈의 &#39;맥락&#39;을 연결하는 과정이 마치 알고리즘 최적화 작업 같았습니다.</p>
<h3 id="2-팀장님과의-각기각자기획">2. 팀장님과의 각기(각자기획)</h3>
<p>저희 팀은 총 4명인데 2분은 개인사정으로 참석이 어려워 팀장님과 둘이 캔바에서 각자 기획한 것을 결과물로 뽑아내는 작업을 진행했습니다.</p>
<p>결과: 팀 분위기가 좋으니 결과물도 만족스럽게 뽑혔습니다. 역시 &#39;사람&#39;이 가장 큰 자산이라는 걸 다시 한번 깨달았습니다.</p>
<h3 id="3-오늘의-뼈아픈-깨달음-설명이-필요하면-끝이다">3. 오늘의 뼈아픈 깨달음: &quot;설명이 필요하면 끝이다&quot;</h3>
<p>기획안을 만들며 가장 경계했던 문장이 있습니다.</p>
<p>&quot;설명이 필요한 유머는 실패한 유머다.&quot;</p>
<p>기획자가 &quot;이거 이런 의미예요!&quot;라고 설명하는 순간, 그 광고는 대중의 마음에서 로그아웃(Logout)됩니다.</p>
<p>마케터의 숙명: 내가 아는 재미가 아니라, 타겟이 바로 이해하는 재미를 찾아야 한다는 것.</p>
<p>직관적인 UI/UX가 중요한 것처럼, 메시지도 한눈에 들어와야 한다는 소중한 교훈을 얻었습니다.</p>
<blockquote>
<p>아티클정리
<a href="https://velog.io/@ssorry_choi/STEP-1%EB%A7%88%EC%BC%80%ED%8C%85-%EA%B0%9C%EB%A1%A0">https://velog.io/@ssorry_choi/STEP-1%EB%A7%88%EC%BC%80%ED%8C%85-%EA%B0%9C%EB%A1%A0</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL-001]사전캠프]]></title>
            <link>https://velog.io/@ssorry_choi/TIL-001%EC%82%AC%EC%A0%84%EC%BA%A0%ED%94%84-sycp5p06</link>
            <guid>https://velog.io/@ssorry_choi/TIL-001%EC%82%AC%EC%A0%84%EC%BA%A0%ED%94%84-sycp5p06</guid>
            <pubDate>Fri, 03 Apr 2026 09:07:16 GMT</pubDate>
            <description><![CDATA[<p>📅 2026년 4월 3일 (금)</p>
<blockquote>
<p>&quot;수요일의 합격자, 금요일에 드디어 등판하다!&quot;</p>
</blockquote>
<ol>
<li><p>🏃‍♂️ 지난 48시간의 요약: &quot;의리와 설렘 사이&quot;
사실 저는 이번 주 수요일, 내일배움캠프 최종 합격했습니다! (자축 🎉)
하지만 바로 합류하지 못했던 사정이 있었는데요.  우선 내일배움카드를 새로 발급받아야 했고, 전 회사에서 &quot;도와달라&quot;는 간절한 SOS가 왔고, 개발자로서의 의리를 저버릴 수 없어 수요일과 목요일은 전 직장의 이슈를 해결하며 보냈습니다.
2일간의 &#39;원격 의리&#39;를 마치고 드디어 오늘, 금요일에 제대로 된 첫 발을 뗐습니다!</p>
</li>
<li><p>🤝 9조와의 첫 대면: &quot;늦게 온 만큼 더 뜨겁게&quot;
오늘 드디어 제가 소속된 9조 팀원분들과 처음 인사를 나눴습니다.
수, 목요일에 자리를 비웠던 터라 혹시나 흐름을 놓쳤을까 걱정했는데, 다들 따뜻하게 맞아주셔서 정말 감사했습니다.</p>
</li>
</ol>
<blockquote>
<p>😊 첫인상: 열정 넘치는 9조! 다들 학습 의지가 대단해서 좋은 자극을 받았습니다.
🎯나의 다짐: 이틀 늦게 합류한 만큼, 더 열심히 팀에 기여하는 &#39;에이스&#39;가 되겠습니다.</p>
</blockquote>
<ol start="3">
<li>📝 TIL
<img src="https://velog.velcdn.com/images/ssorry_choi/post/9b693186-bf5d-4017-8e5e-fba6ec1c50eb/image.png" alt="">
오늘은 내일배움캠프 브랜드 배너 만들기 기획을 했습니다. 2인 1조가 되어 재밌는 아이디어를 내면서 기획을 해봤습니다. 처음으로 누끼 따서 그림도 그려봤어요호호,,항상 주변에 그림 잘 그리는 친구들이 있었어서 개발자였던 저는 그림 그릴 일이 없었지만,,이제는 제가 그려서 남들을 이해시키는 역할도 해야겠죠,,,호호 열심히할게-!</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[다사다난 제이콥 23.03호]]></title>
            <link>https://velog.io/@ssorry_choi/%EB%8B%A4%EC%82%AC%EB%8B%A4%EB%82%9C-%EC%A0%9C%EC%9D%B4%EC%BD%A5-23.03%ED%98%B8</link>
            <guid>https://velog.io/@ssorry_choi/%EB%8B%A4%EC%82%AC%EB%8B%A4%EB%82%9C-%EC%A0%9C%EC%9D%B4%EC%BD%A5-23.03%ED%98%B8</guid>
            <pubDate>Sat, 08 Apr 2023 11:39:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h4 id="3월-목표">3월 목표</h4>
</blockquote>
<ul>
<li>새로 입사한 디자이너랑 팀웤 잘 다지기</li>
<li>F45 시작했는데 꾸준히 잘 다니기</li>
<li>살 뺴기</li>
</ul>
<pre><code>3월에도 목표 잘 지켰다! F45 5일 내내 가면서 땀 싸고오고,, 살도 2kg정도 빠졌다.</code></pre><h3 id="openapi-generator-dart-dio">openapi-generator dart-dio</h3>
<p>이번달에는 <a href="https://openapi-generator.tech/docs/generators/dart-dio">openapi-generator</a> 로 바꾸는 작업을 한달동안 진행했다. http통신하는 부분을 Flutter 에서 <code>Dio</code> 라는 패키지를 사용하고 있었기 떄문에, openapi-generator에서 <code>dart-dio</code> generator를 사용해서 진행했다.</p>
<p>Config Options에서 보면 serializationLibrary에서 default가 built_value로 되어있는데, 나에겐 <del>어려웠다</del> 익숙하지 않았다. 그래서 처음에 고생을 좀 많이 했던것 같다. 
<img src="https://velog.velcdn.com/images/ssorry_choi/post/9dd88b36-e49d-4ec5-b88c-433ac765b920/image.png" alt=""></p>
<p><code>built_value</code>로 하다보니 단점이 있었다. <code>ModelClass</code>에서 컴파일 에러가 아닌 런타임 에러가 발생한다는 것이다. <code>built_value</code> 는 null체크가 안되기 때문에, 테스트를 더 빡시게 해야하는 단점이 있다. </p>
<p>그래서 <code>json_serializable</code>로 바꿔봤는데, 이것도 문제가 있었다. enum 으로 적용된 것들이 엔드포인트 호출할때, value값으로 바뀌어야 하는데 아직 베타버전이라 value로 바꿔주는 코드가 없어서 enum 문자 그대로 파라미터로 들어가기 때문에 엔드포인트 호출이 아예 되지 않는 문제점이 있어서 현재로서는 사용할 수가 없다.</p>
<p><img src="https://velog.velcdn.com/images/ssorry_choi/post/f2d778d7-7c18-4fe3-b600-56c4af030a0e/image.png" alt=""></p>
<p>나중에 <code>json_serializable</code>이 정식으로 배포가 된다면 바꿔야 될 것 같다. null데이터가 생기는 순간, 회색화면이 떠버리기 때문,,,ㅎ</p>
<blockquote>
<p>4월목표</p>
</blockquote>
<ul>
<li>식단관리 꾸준히 하기(feat.닭가슴살)</li>
<li>flutter 개념 공부한것들 노션에 정리하기</li>
<li>flutter 강의 완강하기</li>
<li>prompt engineering 공부하기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[GithubActions-android 편]]></title>
            <link>https://velog.io/@ssorry_choi/GithubActions-android-%ED%8E%B8</link>
            <guid>https://velog.io/@ssorry_choi/GithubActions-android-%ED%8E%B8</guid>
            <pubDate>Sun, 05 Mar 2023 13:20:28 GMT</pubDate>
            <description><![CDATA[<h2 id="flutter-로-개발한-android앱의-github-actions-cicd">Flutter 로 개발한 android앱의 Github Actions CI/CD</h2>
<p>우선, 프로젝트 root에 <code>.github</code> 폴더를 만들고 <code>.github/workflows</code> 폴더를 생성한다. 그 안에 <code>deploy_android.yaml</code> 파일을 생성해준다.
<code>yaml</code> 파일의 특성중 하나는 들여쓰기가 곧 문법인 셈으로, 들여쓰기를 잘해야한다. </p>
<h3 id="deploy_androidyaml-파일이-실행될-이름을-지어준다required">deploy_android.yaml 파일이 실행될 이름을 지어준다.(required)</h3>
<pre><code>name: 🌈 Develop Android Deploy 
on: 
  pull_request: 
    branches: [develop]    # develop 브랜치에 pull_request를 할때마다 실행하겠다는 의미</code></pre><p><strong>결과화면</strong>
<img src="https://velog.velcdn.com/images/ssorry_choi/post/d0740bb0-4071-479c-9060-6373a270cbb9/image.png" alt=""></p>
<h3 id="jobs-작성requiredoptional">jobs 작성(required/optional)</h3>
<p>environment를 설정한는건 optional, ubuntu를 돌리는건 required.</p>
<pre><code>jobs:
  deploy_android:
    name: DEV EXPERT 💙 ANDROID DEPLOY 🚀
    environment: dev
    runs-on: ubuntu-latest
    steps:</code></pre><p>여기서 environment를 dev로 했는데, 이렇게 한 이유는 githubActions의 secrets key 의 변수명을 똑같이 하고 값만 dev/prod 다르게 하기 위함이다. 이렇게 함으로써 장점은 코드에서 변수명을 하나만 작성함으로써 코드가 좀 더 간결해진다는 장점이 있다. 이를 세팅하기 위해선 github.com 에서 <code>{{해당 프로젝트}}/settings/Environments</code>에서 세팅할 수 있다. 
<img src="https://velog.velcdn.com/images/ssorry_choi/post/96e1d367-f934-46b3-8bca-f7657b709b17/image.png" alt=""></p>
<p>githubActions.secrets에서 보면 아래 이미지처럼 변수 이름은 같지만 environment에 따라서 값이 달라지는 걸 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/ssorry_choi/post/dc33a492-56a9-4fc0-80db-2382e7df1423/image.png" alt=""></p>
<h3 id="build를-위한-작업required">build를 위한 작업(required)</h3>
<pre><code>        - name: Checkout
          uses: actions/checkout@v3

        - name: Setup Java ☕️
          uses: actions/setup-java@v1
          with:
            java-version: 15.x 

        - name: Clone Flutter repository with version 3.7.1 🐤
          uses: subosito/flutter-action@v2
          with:
            flutter-version: &#39;3.7.1&#39;
            channel: stable
        - run: flutter doctor -v    </code></pre><ul>
<li><a href="https://github.com/marketplace/actions/checkout">actions/checkout</a>
<code>$GITHUB_WORKSPACE</code> 아래있는 해당 레파지토리의 접근할 수 있도록 하는 라이브러리</li>
<li><a href="https://github.com/marketplace/actions/setup-java-jdk">actions/setup-java</a>
java를 설치하는 라이브러리. android를 빌드하기 위한 기본 설정이다.</li>
<li><a href="https://github.com/marketplace/actions/flutter-action">subosito/flutter-actions</a>
flutter sdk를 설치하는 라이브러리. <em>subosito</em>는 해당 라이브러리를 배포한 사람의 id이다.</li>
</ul>
<h3 id="env파일을-생성한다optional">.env파일을 생성한다.(optional)</h3>
<pre><code>        - name: Create .env File
          uses: iamsauravsharma/create-dotenv@v1.2.2
          with:
            env-prefix: &#39;envkey_&#39;
            file-name: &#39;.env&#39;
            directory: &#39;/home/runner/work/{{YOUR_PROJECT_NAME}}/{{YOUR_PROJECT_NAME}}/&#39;
          env:
            IS_SERVER: true
            envkey_AMPLITUDE_API_KEY: ${{secrets.AMPLITUDE_API_KEY}} 
</code></pre><ul>
<li><a href="https://github.com/marketplace/actions/create-dotenv">iamsauravsharma/create-dotenv</a>
<code>.env</code> 파일을 해당 flutter 프로젝트의 root에 생성하는 라이브러리</li>
</ul>
<h3 id="android-key-endode">Android key endode</h3>
<pre><code>        - name: Download Android keystore
          id: android_keystore_dev
          uses: timheuer/base64-to-file@v1.2
          with:
            fileName: keystore-dev.jks
            fileDir: &#39;/home/runner/work/{{YOUR_PROJECT_NAME}}/{{YOUR_PROJECT_NAME}}/android&#39;
            encodedString: ${{ secrets.ANDROID_KEYSTORE_JKS }} </code></pre><p><code>keystore-dev.jks</code> 파일을 BASE64로 인코딩해서 githubActions.secrets에 저장한다.
해당 인코딩 명령어는 terminal에서 <code>openssl base64 -in ./keystore.jks</code>를 입력한다.</p>
<ul>
<li><a href="https://github.com/marketplace/actions/base64-to-file">timheuer/base64-to-file</a>
base64로 encode 된것을 파일로 decode 하는 라이브러리</li>
</ul>
<h3 id="key-devproperties-생성">key-dev.properties 생성</h3>
<pre><code>        - name: Create key-dev.properties
          run: |
            echo &quot;storeFile=${{ steps.android_keystore_dev.outputs.filePath }}&quot; &gt; android/keystore-dev.properties
            echo &quot;storePassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }}&quot; &gt;&gt; android/keystore-dev.properties
            echo &quot;keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }}&quot; &gt;&gt; android/keystore-dev.properties
            echo &quot;keyAlias=${{ secrets.ANDROID_KEY_ALIAS }}&quot; &gt;&gt; android/keystore-dev.properties</code></pre><p>ubuntu에서 command를 활용해 keystore-dev.properties를 만들어준다.</p>
<h3 id="build-application">Build Application</h3>
<pre><code>        - name: Build application 🥕
          run: |
            cd /home/runner/work/sprint-expert-mobile-application/sprint-expert-mobile-application/
            flutter clean
            flutter pub get
            flutter packages pub run build_runner build --delete-conflicting-outputs
            flutter build appbundle --flavor dev -t lib/main_dev.dart</code></pre><h3 id="sign-aabandroid-app-bundle">Sign AAB(Android App Bundle)</h3>
<pre><code>        - name: ✅ Sign AAB 
          id: sign
          uses: r0adkll/sign-android-release@v1
          with:
            releaseDirectory: build/app/outputs/bundle/devRelease
            signingKeyBase64: ${{ secrets.ANDROID_KEYSTORE_JKS }}
            alias: ${{ secrets.ANDROID_KEY_ALIAS }}
            keyStorePassword: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
            keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }}</code></pre><ul>
<li><a href="https://github.com/marketplace/actions/sign-android-release">r0adkll/sign-android-release</a>
배포를 위해 aab파일로 sign하는 라이브러리</li>
</ul>
<h3 id="upload-aabandroid-app-bundle">Upload AAB(Android App Bundle)</h3>
<pre><code>        - name: ✅ Upload AAB
          id: uploadArtifact
          uses: actions/upload-artifact@v3
          with:
            name: app-dev-release.aab
            path: build/app/outputs/bundle/devRelease/app-dev-release.aab
            retention-days: 5</code></pre><ul>
<li><a href="https://github.com/marketplace/actions/upload-a-build-artifact">actions/upload-artifact</a>
aab파일을 업로드 하는 라이브러리. 아래처럼 githubActions에 들어가보면 aab파일이 업로드되어 있다.
<img src="https://velog.velcdn.com/images/ssorry_choi/post/38654996-14ec-46fd-86c9-8034e7376829/image.png" alt=""></li>
</ul>
<h3 id="upload-google-play">Upload Google Play</h3>
<pre><code>        - name: Deploy to Play Store (INTERNAL) 🚀
          uses: r0adkll/upload-google-play@v1
          with:
            serviceAccountJsonPlainText: ${{ secrets.ANDROID_SERVICE_ACCOUNT_JSON }}
            packageName: ${{secrets.AOS_PACKAGE_NAME}}
            releaseFiles: build/app/outputs/bundle/devRelease/app-dev-release.aab
            track: internal
            status: draft</code></pre><ul>
<li><a href="https://github.com/marketplace/actions/upload-android-release-to-play-store">r0adkll/upload-google-play</a>
Google Play콘솔에 업로드하는데, 내부테스트 &gt; 초안작성 식으로 업로드 한다. 
track 과 status를 정해야한다.</li>
</ul>
<p>이렇게하면 Android CI/CD 완성이다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[다사다난 제이콥 23.02호]]></title>
            <link>https://velog.io/@ssorry_choi/%EB%8B%A4%EC%82%AC%EB%8B%A4%EB%82%9C-%EC%A0%9C%EC%9D%B4%EC%BD%A5-23.02%ED%98%B8</link>
            <guid>https://velog.io/@ssorry_choi/%EB%8B%A4%EC%82%AC%EB%8B%A4%EB%82%9C-%EC%A0%9C%EC%9D%B4%EC%BD%A5-23.02%ED%98%B8</guid>
            <pubDate>Fri, 03 Mar 2023 16:46:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>2월 목표</strong>
재활 열심히하기</p>
</blockquote>
<p><code>2월 목표 잘 지킨것 같다. 재활도 아침마다 진짜 열심히 했다. 2월말부터 F45를 시작했다. 이정도로 운동 할 수 있는것도 재활을 잘 했기 때문이라 생각한다. 어쨌든 컨디션, 건강 관리도 실력이다..!</code></p>
<h3 id="인증서버-분기처리">인증서버 분기처리</h3>
<p>2월에 있었던 다사다난한 일 중 가장 큰 일은 <strong>인증서버를 분기처리 한 것</strong> 이다. backend 작업이 많았지만 그래도 frontend에도 바뀌는 것들이 있었고, 적용되는 것들이 있어서 테스트도 좀 빡셌고, 적용을 하면서 헷갈리는 것들도 많았다.</p>
<p>분기처리를 하면서 더 좋아진 점은 원래 <code>googleLogin/appleLogin</code> 부분이 하나여서 불편함이 있었다. 앱은 2개인데 backend에서 login을 받는 부분이 하나이기 때문에 씹히는(?), 겹치는(?) 그니까 세션이 계속 남아있는 이슈가 있었다. 이 부분이 깔끔하게 해결이 되었다.</p>
<h3 id="github-actions-으로-cicd-적용">Github Actions 으로 CI/CD 적용</h3>
<p>2월 마지막주에는 github actions으로 CI/CD를 적용했다. 이걸 하게된 계기는 앱이 하나 더 생기면서 배포하는 일도 잦아질것이기 때문이다. 그리고 예전에 github actions로 배포를 했었는데 그때당시엔 어떻게하는지 잘 이해도 안된 상황에서 붙이기에 급급했지만 지금은 그래도 어느정도 시간도 있었고 해서 다시한번 해봐야겠다는 생각으로 붙이게 되었다. 다음 포스팅에서 안드로이드와 ios 부분 정리를 해봐야겠다.</p>
<blockquote>
<p><strong><em>3월 목표</em></strong></p>
</blockquote>
<ul>
<li>새로 입사한 디자이너랑 팀웤 잘 다지기</li>
<li>F45 시작했는데 꾸준히 잘 다니기</li>
<li>살 뺴기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[다사다난 제이콥 23.01호]]></title>
            <link>https://velog.io/@ssorry_choi/%EB%8B%A4%EC%82%AC%EB%8B%A4%EB%82%9C-%EC%A0%9C%EC%9D%B4%EC%BD%A5-23.01%ED%98%B8</link>
            <guid>https://velog.io/@ssorry_choi/%EB%8B%A4%EC%82%AC%EB%8B%A4%EB%82%9C-%EC%A0%9C%EC%9D%B4%EC%BD%A5-23.01%ED%98%B8</guid>
            <pubDate>Sat, 11 Feb 2023 09:02:07 GMT</pubDate>
            <description><![CDATA[<p>2023년 새해가 밝았다. 올해는 떡상할 수 있길..!</p>
<h3 id="widgetbook">Widgetbook</h3>
<p><a href="https://www.widgetbook.io/">Widgetbook</a>이란, flutter의 Storybook버전이라고 할 수 있다. 디자인 시스템을 디자이너와 논의할 수 있는 창구이다. 
개발자가 개발한 UI를 보면서 디자이너가 피드백을 더 줄 수 있다. 그런데 모바일쪽은 디바이스마다 크기가 다르기 때문에 피드백을 주기가 좀 더 까다로울 수 있다. 그리고 디버깅을 하면서 피드백을 해줄 수 있는 환경이 아니기 때문에, 웹으로(?) 각자의 모니터에서 볼 수 있는 것이 필요하다. 그래서 디자인 해준것을 각 컴포넌트로 잘게 쪼개서 개발하는 것이 중요하다. 
새로 만든 expertApp에서 widgetbook을 적용해보았고 배포까지 했다.</p>
<p>🎨 <a href="https://sprint-app-dev.web.app/#/">ExpertApp Widgetbook</a> </p>
<p>Widgetbook Cloud를 쓰면 디자이너랑 직접 배포한 사이트에서 커뮤니케이션도 할 수 있다길래 WidgetBook 대표랑 미팅을 신청해뒀는데, 지금 계속 밀리고 있다. 1월에 바로 트라이얼 신청하면 무료로 2주 쓰게해준댔는데... 2월로 미팅이 미뤄짐...ㅋ</p>
<h3 id="23년-01월에-추가한-새로운-기능">23년 01월에 추가한 새로운 기능</h3>
<ul>
<li>영양제 등록 로직 수정</li>
<li>대시보드에서 당/나트륨 총량 추가</li>
<li>엑스퍼트앱이랑 연동해서 프로그램,피드백,서베이 조회할 수 있도록 추가</li>
<li>엑스퍼트앱 베타테스트 시작</li>
</ul>
<blockquote>
<h3 id="2월-목표">2월 목표</h3>
</blockquote>
<ol>
<li>재활 열심히하기 </li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[다사다난 제이콥 22.09월호]]></title>
            <link>https://velog.io/@ssorry_choi/%EB%8B%A4%EC%82%AC%EB%8B%A4%EB%82%9C-%EC%A0%9C%EC%9D%B4%EC%BD%A5-9%EC%9B%94%ED%98%B8</link>
            <guid>https://velog.io/@ssorry_choi/%EB%8B%A4%EC%82%AC%EB%8B%A4%EB%82%9C-%EC%A0%9C%EC%9D%B4%EC%BD%A5-9%EC%9B%94%ED%98%B8</guid>
            <pubDate>Wed, 05 Oct 2022 16:22:50 GMT</pubDate>
            <description><![CDATA[<p>다사다난 제이콥 시작.
개발을 하면서 느낀점들을 회고처럼 적어보고자 한다.</p>
<h3 id="google-fitness">Google Fitness</h3>
<p>헬스케어 앱 특성상 <code>Google Fitness</code>, <code>Apple Health</code> 앱 연동은 필수인 것 같다.
처음 기능을 추가할땐, Apple이 심사 및 기능붙이는게 더 빡셀 줄 알았는데 <code>Google Fitness</code> 에서 더 허덕였다.  </p>
<h4 id="과정">과정</h4>
<ol>
<li><code>Google Fitness</code> 를 연동하기 위해선 우선 GCP(<code>Google Play Console Developer</code> Project)에서 <code>Fitness API</code>를 연결해야 한다. </li>
<li><code>OAuth 동의화면</code> 을 인증해야한다. 이 과정이 4-6주가 걸린다고 나와있는데 더 걸렸던것 같다.
(이게 이메일로 연락이 오는데, 이메일을 항상 잘 확인해야한다...! )</li>
<li>OAuth 동의화면 을 심사 맡길때 Youtube에 데모영상도 올려야 한다.ㅋ</li>
<li>사용자 인증정보를 등록하는 과정에서 OAuth2.0 클라이언트 ID를 추가해주어야 한다.
-&gt; 여기서 계속 얼탔었는데,,, Debug모드에서는 잘만되던게, 출시해놓은 버전에서는 안되는 것,,,후,,,
-&gt; 클라이언트ID를 추가할때 package_name과 SHA-1인증서 지문을 입력해야되는데, SHA-1인증서를 터미널에서 나온 SHA-1인증서 값을 추가했던것,,, 그래서 내 맥북에서는 잘만됐던것..!
-&gt; <code>GooglePlayConsole &gt; 설정 &gt; 앱무결성</code> 여기서 확인할 수 있고 여기에 있는 SHA-1을 등록해야 한다..!!</li>
</ol>
<h3 id="앱-이전">앱 이전</h3>
<p>앱 구독으로 수익을 창출하고 있다. 그런데 앱을 출시한지 1달쯤(?) 되던날 갑자기 android에서 인앱결제가 안된다는 VOC가 날아왔다. 그래서 찾아보니, 법인으로 등록했어야 하는 <code>결제 프로필</code>을 개인사업자로 등록 해놨던것...!</p>
<p>이를 해결하기 위해 참고했던 링크이다.
<a href="https://gall.dcinside.com/mgallery/board/view/?id=game_dev&amp;no=90711">앱 이전 관련 링크</a>
내가 우려했던 점은 별점,리뷰,package_name 이 날아가거나 달라지진 않을지에 대한 우려가 컸다. 하지만 앱 이전을 해도 아무것도 변한것은 없었다..! (휴,,,다행!)</p>
<h3 id="22년-09월에-추가한-새로운-기능">22년 09월에 추가한 새로운 기능</h3>
<ul>
<li>매니저 평가하기 기능</li>
<li>Localization 반영</li>
<li>Image Share 기능</li>
<li>오류신고 부분에서 Tag 추가</li>
</ul>
<blockquote>
<h4 id="10월-목표">10월 목표</h4>
</blockquote>
<ol>
<li><code>바바라 민토 논리의 기술</code> 1독</li>
<li>주 3회 이상 운동하기</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter SDK Upgrade Error]]></title>
            <link>https://velog.io/@ssorry_choi/Flutter-SDK-Upgrade-Error</link>
            <guid>https://velog.io/@ssorry_choi/Flutter-SDK-Upgrade-Error</guid>
            <pubDate>Fri, 10 Jun 2022 10:00:20 GMT</pubDate>
            <description><![CDATA[<p>Flutter 3.0 시대를 맞아, <code>2.10.0</code>에서 개발하던 Flutter SDK 버전을 <code>3.0.1</code>로 올렸다.</p>
<p>올린뒤 빌드 하자 나타나는 에러메세지들,,,</p>
<p>에러메세지를 보면 <code>flutter</code> SDK의 path에 <code>.pub-cache</code> 쪽에서 발생하는 에러임을 발견할 수 있다.</p>
<p>아래 에러를 포함해 Xcode&#39;s output에는 <code>.pub-cache</code>에 관련된 에러가 발생함을 알 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/ssorry_choi/post/de2c5e16-63c4-4dd0-bc40-262daf24949e/image.png" alt=""></p>
<h3 id="해결방법">해결방법</h3>
<p><code>flutter pub cache clean</code> 
-&gt; 이 명령어는 flutter sdk에 남아있는 라이브러리들의 cache를 지워주는 명령어다.</p>
<p>위 명령어 입력하고 
<code>flutter pub get</code> 한 뒤 다시 빌드하니까 잘됨!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[GithubActions Error] ios Deploy]]></title>
            <link>https://velog.io/@ssorry_choi/GithubActions-Error-ios-Deploy</link>
            <guid>https://velog.io/@ssorry_choi/GithubActions-Error-ios-Deploy</guid>
            <pubDate>Wed, 11 May 2022 13:37:59 GMT</pubDate>
            <description><![CDATA[<p>오늘 아침까지만 해도 배포가 잘 됐었는데,,,
저녁에 하니까 갑자기 <strong><em>cocoapods.org</em></strong> 에 접근할 수 없다며,,, 403에러를 내버렸다,,,</p>
<pre><code>    &lt;!--[if gte IE 10]&gt;&lt;!--&gt;
    &lt;script&gt;
      if (!navigator.cookieEnabled) {
        window.addEventListener(&#39;DOMContentLoaded&#39;, function () {
          var cookieEl = document.getElementById(&#39;cookie-alert&#39;);
          cookieEl.style.display = &#39;block&#39;;
        })
      }
    &lt;/script&gt;
    &lt;!--&lt;![endif]--&gt;


    &lt;/head&gt;
    &lt;body&gt;
      &lt;div id=&quot;cf-wrapper&quot;&gt;
        &lt;div class=&quot;cf-alert cf-alert-error cf-cookie-error&quot; id=&quot;cookie-alert&quot; data-translate=&quot;enable_cookies&quot;&gt;Please enable cookies.&lt;/div&gt;
        &lt;div id=&quot;cf-error-details&quot; class=&quot;cf-error-details-wrapper&quot;&gt;
          &lt;div class=&quot;cf-wrapper cf-header cf-error-overview&quot;&gt;
            &lt;h1 data-translate=&quot;block_headline&quot;&gt;Sorry, you have been blocked&lt;/h1&gt;
            &lt;h2 class=&quot;cf-subheadline&quot;&gt;&lt;span data-translate=&quot;unable_to_access&quot;&gt;You are unable to access&lt;/span&gt; cocoapods.org&lt;/h2&gt;
          &lt;/div&gt;&lt;!-- /.header --&gt;

          &lt;div class=&quot;cf-section cf-highlight&quot;&gt;
            &lt;div class=&quot;cf-wrapper&quot;&gt;
              &lt;div class=&quot;cf-screenshot-container cf-screenshot-full&quot;&gt;

                  &lt;span class=&quot;cf-no-screenshot error&quot;&gt;&lt;/span&gt;

              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;&lt;!-- /.captcha-container --&gt;

          &lt;div class=&quot;cf-section cf-wrapper&quot;&gt;
            &lt;div class=&quot;cf-columns two&quot;&gt;
              &lt;div class=&quot;cf-column&quot;&gt;
                &lt;h2 data-translate=&quot;blocked_why_headline&quot;&gt;Why have I been blocked?&lt;/h2&gt;

                &lt;p data-translate=&quot;blocked_why_detail&quot;&gt;This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.&lt;/p&gt;
              &lt;/div&gt;

              &lt;div class=&quot;cf-column&quot;&gt;
                &lt;h2 data-translate=&quot;blocked_resolve_headline&quot;&gt;What can I do to resolve this?&lt;/h2&gt;

                &lt;p data-translate=&quot;blocked_resolve_detail&quot;&gt;You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.&lt;/p&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;&lt;!-- /.section --&gt;

          &lt;div class=&quot;cf-error-footer cf-wrapper w-240 lg:w-full py-10 sm:py-4 sm:px-8 mx-auto text-center sm:text-left border-solid border-0 border-t border-gray-300&quot;&gt;
      &lt;p class=&quot;text-13&quot;&gt;
        &lt;span class=&quot;cf-footer-item sm:block sm:mb-1&quot;&gt;Cloudflare Ray ID: &lt;strong class=&quot;font-semibold&quot;&gt;709b2d329b0c826f&lt;/strong&gt;&lt;/span&gt;
        &lt;span class=&quot;cf-footer-separator sm:hidden&quot;&gt;&amp;bull;&lt;/span&gt;
        &lt;span class=&quot;cf-footer-item sm:block sm:mb-1&quot;&gt;&lt;span&gt;Your IP&lt;/span&gt;: 13.105.49.65&lt;/span&gt;
        &lt;span class=&quot;cf-footer-separator sm:hidden&quot;&gt;&amp;bull;&lt;/span&gt;
        &lt;span class=&quot;cf-footer-item sm:block sm:mb-1&quot;&gt;&lt;span&gt;Performance &amp;amp; security by&lt;/span&gt; &lt;a rel=&quot;noopener noreferrer&quot; href=&quot;https://www.cloudflare.com/5xx-error-landing&quot; id=&quot;brand_link&quot; target=&quot;_blank&quot;&gt;Cloudflare&lt;/a&gt;&lt;/span&gt;

      &lt;/p&gt;
    &lt;/div&gt;&lt;!-- /.error-footer --&gt;</code></pre><p>해결방법은 podfile에 다음 라인을 추가하는 것이다.</p>
<blockquote>
<p>platform :ios, &#39;11.0&#39;
source &#39;<a href="https://github.com/CocoaPods/Specs.git&#39;">https://github.com/CocoaPods/Specs.git&#39;</a> // 여기부분 추가!
use_frameworks!</p>
</blockquote>
<p><a href="https://stackoverflow.com/questions/60884826/unable-to-add-a-source-with-url-https-cdn-cocoapods-org-named-trunk">링크</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[const VS final ]]></title>
            <link>https://velog.io/@ssorry_choi/const-VS-final</link>
            <guid>https://velog.io/@ssorry_choi/const-VS-final</guid>
            <pubDate>Wed, 02 Mar 2022 14:36:58 GMT</pubDate>
            <description><![CDATA[<p><code>const</code> vs <code>final</code></p>
<blockquote>
<p><code>const</code> : compileTime 에서, 생성이 된다. </p>
</blockquote>
<ul>
<li>complie될때 생성이 되므로, 리소스를 아낄 수 있다.</li>
<li>앱이 실행된 이후에 값 변경이 불가능 하다.</li>
</ul>
<blockquote>
<p><code>final</code> : RunningTime 에서 생성이 된다.</p>
</blockquote>
<ul>
<li>앱이 실행된 이후에 값 변경이 가능하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dart Textfield 정규식]]></title>
            <link>https://velog.io/@ssorry_choi/Dart-Textfield-%EC%A0%95%EA%B7%9C%EC%8B%9D</link>
            <guid>https://velog.io/@ssorry_choi/Dart-Textfield-%EC%A0%95%EA%B7%9C%EC%8B%9D</guid>
            <pubDate>Sun, 11 Jul 2021 12:37:55 GMT</pubDate>
            <description><![CDATA[<p>Flutter의 <code>TextField</code>위젯에서 입력을 받다보면, 정규식을 이용해야 할 때가 온다.</p>
<pre><code>TextField(
  inputFormatters: [
    FilteringTextInputFormatter.deny(RegExp(r&#39;[/\\]&#39;)),
  ],
)</code></pre><p>검색을 하다보면, 늘 그렇듯이 내가 원하는 입맛에 딱 맞는 코드는 안나오는게 국룰.
이 글을 보는 독자들도 딱 입맛에 맞는 것은 아니겠지만, 최대한 큰 틀에서 설명 해보고자 한다.</p>
<p>우선 <code>TextField</code> 위젯 안에는 <code>inputFormatters</code>라는 파라미터가 있다.</p>
<pre><code>final List&lt;TextInputFormatter&gt;? inputFormatters;
</code></pre><p><code>TextInputFormatter</code> 는 abstract 클래스로 구성되어있다.</p>
<pre><code>abstract class TextInputFormatter {
  /// Called when text is being typed or cut/copy/pasted in the [EditableText].
  ///
  /// You can override the resulting text based on the previous text value and
  /// the incoming new text value.
  ///
  /// When formatters are chained, `oldValue` reflects the initial value of
  /// [TextEditingValue] at the beginning of the chain.
  TextEditingValue formatEditUpdate(
    TextEditingValue oldValue,
    TextEditingValue newValue,
  );
</code></pre><p>그래서 ㅇㅉㄹㄱ,,,
그러니까, TextInputFormatter를 참조하는 <code>FilteringTextInputFormatter</code> 클래스가 있다.</p>
<pre><code>FilteringTextInputFormatter(
    this.filterPattern, {
    required this.allow,
    this.replacementString = &#39;&#39;,
  }) : assert(filterPattern != null),
       assert(allow != null),
       assert(replacementString != null);</code></pre><p>따라서, <code>FilteringTextInputFormatter</code>를 사용하면 된다.</p>
<h3 id="✏️-ex-숫자만-입력가능하게">✏️ Ex. 숫자만 입력가능하게</h3>
<blockquote>
<ul>
<li>FilteringTextInputFormatter.digitsOnly</li>
</ul>
</blockquote>
<ul>
<li>FilteringTextInputFormatter.allow(RegExp(r&#39;[0-9]&#39;))</li>
</ul>
<p>Full Code</p>
<pre><code>TextFormField(
          keyboardType: TextInputType.number,
          inputFormatters: [
            FilteringTextInputFormatter.digitsOnly
          ],
        ),

또는
TextFormField(
          keyboardType: TextInputType.number,
          inputFormatters: [
            FilteringTextInputFormatter.allow(RegExp(r&#39;[0-9]&#39;))
          ],
        ),</code></pre><p>이런식으로 사용할 수 있다.</p>
<h3 id="내가-적용하고자-했던것">내가 적용하고자 했던것.</h3>
<h4 id="✏️-1-4자리의-숫자1000단위까지만">✏️ 1. 4자리의 숫자(1000단위까지만)</h4>
<pre><code>final inputFormatter = FilteringTextInputFormatter.allow(RegExp(r&#39;^[1-9]{1}.{0,5}&#39;));</code></pre><h4 id="✏️-2-1000단위-부터는-separator-붙이기">✏️ 2. 1000단위 부터는 ,(separator) 붙이기.</h4>
<pre><code>class UnitInputFormatter extends TextInputFormatter {
  UnitInputFormatter(this.unit);
  final Unit unit;
  static const separator = &#39;,&#39;;
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    String oldValueText = oldValue.text.replaceAll(separator, &#39;&#39;);
    String newValueText = newValue.text.replaceAll(separator, &#39;&#39;);

    if (newValue.selection.baseOffset == 0) {
      return newValue;
    }
    if (oldValue.text.endsWith(separator) &amp;&amp;
        oldValue.text.length == newValue.text.length + 1) {
      newValueText = newValueText.substring(0, newValueText.length - 1);
    }

    // Only process if the old value and new value are different
    if (oldValueText != newValueText) {
      int selectionIndex =
          newValue.text.length - newValue.selection.extentOffset;
      final chars = newValueText.split(&#39;&#39;);

      String newString = &#39;&#39;;
      for (int i = chars.length - 1; i &gt;= 0; i--) {
        if ((chars.length - 1 - i) % 3 == 0 &amp;&amp; i != chars.length - 1)
          newString = separator + newString;
        newString = chars[i] + newString;
      }

      return TextEditingValue(
        text: newString.toString() + unit.enumToString(),
        selection: TextSelection.collapsed(
          offset: newString.length - selectionIndex,
        ),
      );
    }</code></pre><p>1번 변수를 만들고, 2번 클래스를 만든 뒤,inputFormattes에 추가해줌.</p>
<pre><code>TextField(
    inputFormatters: [
                  calorieInputFormatter,
                  CalorieUnitInputFormatter(Unit.kcal),
                 ]
              ),</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Dart] 싱글톤 패턴]]></title>
            <link>https://velog.io/@ssorry_choi/Dart-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@ssorry_choi/Dart-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Tue, 13 Apr 2021 16:41:54 GMT</pubDate>
            <description><![CDATA[<h3 id="factory-constructor-in-dart-docs-링크">Factory Constructor in Dart Docs <a href="https://dart.dev/guides/language/language-tour#factory-constructors">[링크]</a></h3>
<blockquote>
<p>Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class. For example, a factory constructor might return an instance from a cache, or it might return an instance of a subtype. Another use case for factory constructors is initializing a final variable using logic that can’t be handled in the initializer list.</p>
</blockquote>
<blockquote>
<p>-&gt; factory키워드는 클래스의 새로운 인스턴스를 항상 생성하지 않는 생성자를 실행할 때 사용하세요. 예를들면, factory 생성자는 캐시에서 인스턴스를 반환하거나, subtype의 인스턴스를 반환할 수 있습니다. factory 생성자의 다른 사용법은 initializer 리스트에서 처리할 수 없는 로직을 사용하여 final 변수를 초기화 하는 것입니다.</p>
</blockquote>
<h3 id="singleton-pattern--링크">Singleton Pattern  <a href="https://scottt2.github.io/design-patterns-in-dart/singleton/">[링크]</a></h3>
<blockquote>
<p>In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one “single” instance. This is useful when exactly one object is needed to coordinate actions across the system. The term comes from the mathematical concept of a singleton.</p>
</blockquote>
<blockquote>
<p>-&gt; Software Engineering에서, 싱글톤 패턴은 클래스의 인스턴스화를 하나의 &quot;단일&quot; 인스턴스로 제한하는 소프트웨어 디자인 패턴입니다. 시스템 전체에서 작업을 조정하는데 정확히 하나의 object가 필요할 때 유용합니다. 이 용어는 싱글톤의 수학적 컨셉에서 비롯됩니다.</p>
</blockquote>
<h3 id="singleton-클래스-형식">Singleton 클래스 형식</h3>
<pre><code>class Singleton{
  static final Singleton _instance = Singleton._internal();

  factory Singleton(){
    return _instance;
  }

  Singleton._internal(){ // 클래스가 최초 생성될 때, 1회 발생
    // 초기화 코드  
  }
}</code></pre><h3 id="singleton-example">Singleton Example</h3>
<pre><code>class Me{
  static final Me _instance = Me._internal();
  static final String _name = &quot;ssorry_choi&quot;;

  factory Me(){
    return _instance;
  }

  static String get name =&gt; _name;

  Me._internal(){ // 클래스가 최초 생성될 때, 1회 발생
    // 초기화 코드  
  }
}

void main() {
  var jacob = Me();
  var choi = Me();

  if(jacob == choi){
    print(&#39;Same Person!&#39;);
  }else{
    print(&#39;Different Person!&#39;);
  }
}
</code></pre><blockquote>
<p>result : &#39;Same Person!&#39;</p>
</blockquote>
<h3 id="singleton-vs-class">Singleton vs Class</h3>
<pre><code>class Singleton{
  static final Singleton _instance = Singleton._internal();
  int count=0;

  factory Singleton(){
    return _instance;
  }

  Singleton._internal(){
    //초기화 코드
    print(&#39;Created Singleton Class!&#39;);
    count = 0;
  }
}

class Normal{
  int count=0;
  Normal(){
    // 초기화 코드
    print(&#39;Created Normal Class!&#39;);
    count = 0;
  }
}

void main() {
  var normalOne = Normal(); //첫번째 일반 클래스 생성
  var normalTwo = Normal(); //두번째 일반 클래스 생성

  var singleOne = Singleton(); //첫번째 싱글톤 클래스 생성
  var singleTwo = Singleton(); //두번쨰 싱글톤 클래스 생성, But 이미 클래스가 생성되었기 때문에
                               //인스턴스만 넘겨주며, 초기화 코드가 실행되지 않는다.

  print(&#39;singleton One: ${singleOne.count}, Two : ${singleTwo.count}&#39;);
  print(&#39;normal One : ${normalOne.count}, Two : ${normalTwo.count}&#39;);

  //각 클래스의 count 값 1씩 증가
  normalOne.count++;
  normalTwo.count++;

  singleOne.count++;
  singleTwo.count++;


  print(&#39;\n\n===각 클래스 count값 1씩 증가 후===\n\n&#39;);
  print(&#39;singleton One: ${singleOne.count}, Two : ${singleTwo.count}&#39;);
  print(&#39;normal One : ${normalOne.count}, Two : ${normalTwo.count}&#39;);

}</code></pre><blockquote>
<p>Created Normal Class! 
Created Normal Class!
Created Singleton Class!</p>
</blockquote>
<p>singleton One: 0, Two : 0
normal One : 0, Two : 0</p>
<blockquote>
</blockquote>
<p>===각 클래스 count값 1씩 증가 후===</p>
<blockquote>
</blockquote>
<p>singleton One: 2, Two : 2
normal One : 1, Two : 1</p>
<p>일반 클래스는 2번 생성됐지만, Singleton 클래스는 한번만 초기화 코드가 돌아간 것을 볼 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter] SnackBar Scaffold error]]></title>
            <link>https://velog.io/@ssorry_choi/Flutter-SnackBar</link>
            <guid>https://velog.io/@ssorry_choi/Flutter-SnackBar</guid>
            <pubDate>Wed, 07 Apr 2021 15:19:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Unhandled Exception: Scaffold.of() called with a context that does not contain a Scaffold.</p>
</blockquote>
<pre><code>No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of(). This usually happens when the context provided is from the same StatefulWidget as that whose build function actually creates the Scaffold widget being sought.
There are several ways to avoid this problem. The simplest is to use a Builder to get a context that is &quot;under&quot; the Scaffold. For an example of this, please see the documentation for Scaffold.of():
  https://api.flutter.dev/flutter/material/Scaffold/of.html
A more efficient solution is to split your build function into several widgets. This introduces a new context from which you can obtain the Scaffold. In this solution, you would have an outer widget that creates the Scaffold populated by instances of your new inner widgets, and then in these inner widgets you would use Scaffold.of().
A less elegant but more expedient solutio&lt;…&gt;</code></pre><p>이 에러가 발생한 이유는, 해당 context가 scaffold가 있는 context가 아니라는 이슈이다.</p>
<p>따라서 globalKey값으로 scaffold의 context를 전달해줌으로써 해결이 가능하다.</p>
<h3 id="☠️-에러-발생한-코드">☠️ 에러 발생한 코드</h3>
<pre><code>...
@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(child:Text(&#39;Scaffold Error&#39;)),
      floatActionButton: FloatActionButton(
        onTap: _showSanckBar,
      ),
    );
...
 void _showSnackBar() {
    SnackBar snackBar = SnackBar(
      content: Text(&#39;Scaffold Error!!&#39;),
      action: SnackBarAction(
        label: &#39;OK&#39;,
        onPressed: () {
          Scaffold.of(context).hideCurrentSnackBar();
        },
      ),
    );
    Scaffold.of(context).showSnackBar(snackBar);
  }</code></pre><h3 id="✅-해결방법">✅ 해결방법</h3>
<pre><code>...
GlobalKey&lt;ScaffoldState&gt; _key = GlobalKey&lt;ScaffoldState&gt;();

@override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _key,
      body: Container(child:Text(&#39;Scaffold Error solved&#39;)),
      floatActionButton: FloatActionButton(
        onTap: _showSanckBar,
      ),
    );
...
void _showSnackBar() {
    SnackBar snackBar = SnackBar(
      content: Text(&#39;Scaffold Error solved!!&#39;),
      action: SnackBarAction(
        label: &#39;OK&#39;,
        onPressed: () {
          _key.currentState.hideCurrentSnackBar();
        },
      ),
    );
    _key.currentState.showSnackBar(snackBar);
  }</code></pre><p>GlobalKey값을 가지고 해결할 수 있다!</p>
]]></description>
        </item>
    </channel>
</rss>