<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>soyun_jo.log</title>
        <link>https://velog.io/</link>
        <description>생각 10,000 많은 infp 🤔💭</description>
        <lastBuildDate>Sun, 10 Jul 2022 13:50:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>soyun_jo.log</title>
            <url>https://velog.velcdn.com/images/soyun_jo/profile/91d58393-906d-47b2-b98e-2c6b188904c1/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. soyun_jo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/soyun_jo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Flutter] Instagram🤳 프로필 레이아웃 그리기 ]]></title>
            <link>https://velog.io/@soyun_jo/Flutter-Instagram-%ED%94%84%EB%A1%9C%ED%95%84-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EA%B7%B8%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@soyun_jo/Flutter-Instagram-%ED%94%84%EB%A1%9C%ED%95%84-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EA%B7%B8%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Sun, 10 Jul 2022 13:50:57 GMT</pubDate>
            <description><![CDATA[<h1 id="🌎-instagram-프로필-레이아웃-그리기">🌎 Instagram 프로필 레이아웃 그리기</h1>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/ee61a82e-4bee-4e09-a7f5-6c5d84d97c11/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/e68cad98-b565-4196-8e1f-e829a684b136/image.png" alt=""></p>
<p>우선 위와 같은 화면을 그리기 위해서 Scaffold 내에서 두가지로 나눈다. </p>
<ol>
<li>AppBar</li>
<li>Body</li>
</ol>
<p>그리고 Body - Column 내에서 크게 네가지 영역으로 나누었다.</p>
<ol>
<li>프로필 영역</li>
<li>Text 영역</li>
<li>버튼 영역</li>
<li>Tab 영역
<br><br></li>
</ol>
<h2 id="📍-app-bar">📍 App Bar</h2>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/eeb0bc97-8553-41ce-afee-fd9475b82160/image.png" alt=""></p>
<pre><code class="language-dart">appBar: AppBar(
        backgroundColor: Colors.white,
        title: Text(widget.title, style: TextStyle(color: Colors.black)),
        leading: IconButton(icon: Icon(Icons.arrow_back_ios, color: Colors.blue), onPressed: () {}),
        actions: [
          IconButton(onPressed: () {}, icon: Icon(Icons.menu, color: Colors.blue))
        ],
      ),</code></pre>
<p><br><br></p>
<h2 id="📍-프로필-영역">📍 프로필 영역</h2>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/b8381abb-2629-47f5-b76f-deac6f348fd2/image.png" alt=""></p>
<pre><code class="language-dart">Expanded(child: Row(
            children: [
              Expanded(child: CircleAvatar(
                radius: 70,
                backgroundImage: AssetImage(&quot;images/img1.jpeg&quot;),
              ),flex: 1,),
              Expanded(
                child: SizedBox(
                  height: 100,
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      Text(_name, style : TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
                      Text(_job, style : TextStyle(fontSize: 18)),
                      Text(_detail, style : TextStyle(fontSize: 15)),
                    ],
                  ),
                ),
                flex: 1,
              )
            ],
          ),
            flex: 2,
          ),</code></pre>
<p><br><br></p>
<h2 id="📍-post-likes-shares-영역">📍 Post, Likes, Shares 영역</h2>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/0ffb9e99-fa6a-4b29-8242-aa46ebe6d4fb/image.png" alt=""></p>
<pre><code class="language-dart">Expanded(
            child: Row(
              children: [
                Expanded(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text(&quot;50&quot;),
                      Text(&quot;Posts&quot;)
                    ],
                  ),
                ),
                Container(height: 50, width: 2, color: Colors.grey),
                Expanded(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text(&quot;10&quot;),
                      Text(&quot;Likes&quot;)
                    ],
                  ),
                ),
                Container(height: 50, width: 2, color: Colors.grey),
                Expanded(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text(&quot;3&quot;),
                      Text(&quot;Shares&quot;)
                    ],
                  ),
                )
              ],
            ),
            flex: 1,
          ),</code></pre>
<p><br><br></p>
<h2 id="📍-버튼-영역">📍 버튼 영역</h2>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/2803201a-42d3-47a0-ae23-784ed8770cbc/image.png" alt=""></p>
<pre><code class="language-dart">Expanded(
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                InkWell(
                  child: Container(
                    height: 50,
                    width: 180,
                    child: Text(&quot;Follow&quot;,
                    style: Theme.of(context).textTheme.caption?.copyWith(
                      color: Colors.white,
                      fontWeight: FontWeight.w500
                    ),),
                    padding: EdgeInsets.all(10),
                    alignment: Alignment.center,
                    decoration: BoxDecoration(
                      color: Colors.blueAccent,
                      borderRadius: BorderRadius.circular(10),
                    ),
                  ),
                  onTap: () {},
                ),
                InkWell(
                  child: Container(
                    height: 50,
                    width: 180,
                    child: Text(&quot;Message&quot;,
                      style: Theme.of(context).textTheme.caption?.copyWith(
                          color: Colors.black,
                          fontWeight: FontWeight.w500
                      ),),
                    padding: EdgeInsets.all(10),
                    alignment: Alignment.center,
                    decoration: BoxDecoration(
                      color: Colors.white,
                      border: Border.all(),
                      borderRadius: BorderRadius.circular(10),
                    ),
                  ),
                  onTap: () {},
                ),
              ],
            ),
            flex: 1,
          ),</code></pre>
<p><br><br></p>
<h2 id="📍-tab-영역">📍 Tab 영역</h2>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/6a832634-ed1f-4f02-b4e1-081ca973c407/image.png" alt=""></p>
<p>오래걸렸던 부분.. Tab영역!
Tabbar와 TabBarView를 각각 Expanded로 묶어 DefaultTabController로 감싸주었다. </p>
<pre><code class="language-dart">Expanded(child: DefaultTabController(
                length: 2,
                initialIndex: 0,
                child: Column(
                  children: &lt;Widget&gt; [
                    Expanded(child: TabBar())
                    Expanded(child: TabBarView())
                    ...
</code></pre>
<p>요런식으로!
<br></p>
<h3 id="👉🏼-tabbar">👉🏼 TabBar</h3>
<pre><code class="language-dart">Expanded(
                      child: TabBar(
                        tabs: &lt;Widget&gt; [
                          new Tab(
                            icon: const Icon(Icons.directions_car, color: Colors.black),
                          ),
                          new Tab(
                            icon: const Icon(Icons.train, color: Colors.black),
                          )
                        ]
                      ),flex: 1,
                    ),</code></pre>
<br>

<h3 id="👉🏼-tabbarview">👉🏼 TabBarView</h3>
<pre><code class="language-dart">Expanded(
                      child: TabBarView(
                        children: &lt;Widget&gt;[
                          new Container(
                            child: GridView.count(
                              padding: const EdgeInsets.all(20),
                              crossAxisSpacing: 10,
                              mainAxisSpacing: 10,
                              crossAxisCount: 3,
                              children: &lt;Widget&gt; [
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                              ],
                            ),
                          ),
                          new Container(
                            child: GridView.count(
                              padding: const EdgeInsets.all(20),
                              crossAxisSpacing: 10,
                              mainAxisSpacing: 10,
                              crossAxisCount: 3,
                              children: &lt;Widget&gt; [
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                              ],
                            ),
                          )
                        ]
                      ),flex: 5,
                    )</code></pre>
<p><br><br></p>
<p><strong>그리고 전체 코드 🥁 🎷 🎻 🎸</strong></p>
<pre><code class="language-dart">import &#39;package:flutter/material.dart&#39;;
import &#39;package:flutter/src/material/colors.dart&#39;;

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: &#39;Flutter Demo&#39;,
      theme: ThemeData(
        primaryColor: Colors.black
      ),
      home: const MyHomePage(title: &#39;Profile&#39;),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State&lt;MyHomePage&gt; createState() =&gt; _MyHomePageState();
}

class _MyHomePageState extends State&lt;MyHomePage&gt; {

  String _name = &quot;Soyun Jo&quot;;
  String _job = &quot;Engineer&quot;;
  String _detail = &quot;Flutter Developing&quot;;


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Colors.white,
        title: Text(widget.title, style: TextStyle(color: Colors.black)),
        leading: IconButton(icon: Icon(Icons.arrow_back_ios, color: Colors.blue), onPressed: () {}),
        actions: [
          IconButton(onPressed: () {}, icon: Icon(Icons.menu, color: Colors.blue))
        ],
      ),
      body:
      Column(
        children: [
          Expanded(child: Row(
            children: [
              Expanded(child: CircleAvatar(
                radius: 70,
                backgroundImage: AssetImage(&quot;images/img1.jpeg&quot;),
              ),flex: 1,),
              Expanded(
                child: SizedBox(
                  height: 100,
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      Text(_name, style : TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
                      Text(_job, style : TextStyle(fontSize: 18)),
                      Text(_detail, style : TextStyle(fontSize: 15)),
                    ],
                  ),
                ),
                flex: 1,
              )
            ],
          ), flex: 2,
          ),
          Expanded(
            child: Row(
              children: [
                Expanded(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text(&quot;50&quot;),
                      Text(&quot;Posts&quot;)
                    ],
                  ),
                ),
                Container(height: 50, width: 2, color: Colors.grey),
                Expanded(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text(&quot;10&quot;),
                      Text(&quot;Likes&quot;)
                    ],
                  ),
                ),
                Container(height: 50, width: 2, color: Colors.grey),
                Expanded(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text(&quot;3&quot;),
                      Text(&quot;Shares&quot;)
                    ],
                  ),
                )
              ],
            ),
            flex: 1,
          ),
          Expanded(
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                InkWell(
                  child: Container(
                    height: 50,
                    width: 180,
                    child: Text(&quot;Follow&quot;,
                    style: Theme.of(context).textTheme.caption?.copyWith(
                      color: Colors.white,
                      fontWeight: FontWeight.w500
                    ),),
                    padding: EdgeInsets.all(10),
                    alignment: Alignment.center,
                    decoration: BoxDecoration(
                      color: Colors.blueAccent,
                      borderRadius: BorderRadius.circular(10),
                    ),
                  ),
                  onTap: () {},
                ),
                InkWell(
                  child: Container(
                    height: 50,
                    width: 180,
                    child: Text(&quot;Message&quot;,
                      style: Theme.of(context).textTheme.caption?.copyWith(
                          color: Colors.black,
                          fontWeight: FontWeight.w500
                      ),),
                    padding: EdgeInsets.all(10),
                    alignment: Alignment.center,
                    decoration: BoxDecoration(
                      color: Colors.white,
                      border: Border.all(),
                      borderRadius: BorderRadius.circular(10),
                    ),
                  ),
                  onTap: () {},
                ),
              ],
            ),
            flex: 1,
          ),
          Expanded(
              child: DefaultTabController(
                length: 2,
                initialIndex: 0,
                child: Column(
                  children: &lt;Widget&gt; [
                    Expanded(
                      child: TabBar(
                        tabs: &lt;Widget&gt; [
                          new Tab(
                            icon: const Icon(Icons.directions_car, color: Colors.black),
                          ),
                          new Tab(
                            icon: const Icon(Icons.train, color: Colors.black),
                          )
                        ]
                      ),flex: 1,
                    ),
                    Expanded(
                      child: TabBarView(
                        children: &lt;Widget&gt;[
                          new Container(
                            child: GridView.count(
                              padding: const EdgeInsets.all(20),
                              crossAxisSpacing: 10,
                              mainAxisSpacing: 10,
                              crossAxisCount: 3,
                              children: &lt;Widget&gt; [
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                              ],
                            ),
                          ),
                          new Container(
                            child: GridView.count(
                              padding: const EdgeInsets.all(20),
                              crossAxisSpacing: 10,
                              mainAxisSpacing: 10,
                              crossAxisCount: 3,
                              children: &lt;Widget&gt; [
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                                Expanded(
                                  child: Ink.image(image: AssetImage(&quot;images/img1.jpeg&quot;)),
                                ),
                              ],
                            ),
                          )
                        ]
                      ),flex: 5,
                    )
                  ],
                ),
              ),
              flex: 5,
          ),
        ],
      )
    );
  }
}

</code></pre>
<p>아직은 Flutter로 화면을 그린지 얼마 되지 않아
가독성 있는 코드를 작성하기 보다는
우선 장황하더라도 하드코딩 + 빠르게 화면 그리기에 중점을 두고 있다.</p>
<p>화면을 다 그린 와중에도 오류가....ㅎ 넘쳐버려</p>
<br>
후에, 보다 더 복잡한 그림을 제대로 그리게 된다면, 재사용성, 가독성 있는 코드를 짜는 방법도 점차 익혀 나가야겠다.
😭
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter] 🧮 Calculator 레이아웃 그리기 ver.1 ]]></title>
            <link>https://velog.io/@soyun_jo/Flutter-Calculator-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EA%B7%B8%EB%A6%AC%EA%B8%B0-ver.1</link>
            <guid>https://velog.io/@soyun_jo/Flutter-Calculator-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EA%B7%B8%EB%A6%AC%EA%B8%B0-ver.1</guid>
            <pubDate>Thu, 30 Jun 2022 14:26:58 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/soyun_jo/post/fff392cf-3c65-4c04-bd73-b173caa3f036/image.png" alt=""></p>
<h1 id="🌎-calculator-레이아웃-구성">🌎 Calculator 레이아웃 구성</h1>
<blockquote>
<p>화면 레이아웃 구성 : <strong>상단바, 디스플레이Textbox, 키패드</strong> </p>
</blockquote>
<p>이거 왜 시리즈에 저장이 안되냐..</p>
<h2 id="📍-상단바">📍 상단바</h2>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/61f8a3ab-f2e6-452b-8ac5-8806fa9a983e/image.png" alt=""></p>
<pre><code class="language-dart">Expanded(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Text(&quot;     Calculator&quot;, textAlign: TextAlign.center, style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      IconButton(onPressed: () {}, icon: Icon(Icons.close_fullscreen)),
                      IconButton(onPressed: () {}, icon: Icon(Icons.check_box_outline_blank)),
                      IconButton(onPressed: () {}, icon: Icon(Icons.close))
                    ],
                  )
                ],
              ),flex: 1,
          ),</code></pre>
<h2 id="📍-display">📍 Display</h2>
<pre><code class="language-dart">Expanded(
              child:
              Center(
                child: Container(
                  alignment: Alignment.bottomRight,
                  height: 100,
                  width: 300,
                  child:
                  Text(
                    &#39;$_state&#39;,
                    textAlign: TextAlign.right,
                    style: TextStyle(
                      color: Colors.black,
                      fontSize: 50,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
              ),flex: 3,
          ),</code></pre>
<h2 id="📍-키패드">📍 키패드</h2>
<pre><code class="language-dart"></code></pre>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/6f5eb35a-443f-4731-84b6-ee232ff19e83/image.png" alt="">
맥북에서 제공하는 Calculator app 계산기 레이아웃을 참고하여 계산기 레이아웃을 그려보려고 한다.</p>
<p>기능 넣기는 다음주에~!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Appium] App 테스트 자동화 환경 구축 🚜]]></title>
            <link>https://velog.io/@soyun_jo/Appium-App-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%8F%99%ED%99%94-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95</link>
            <guid>https://velog.io/@soyun_jo/Appium-App-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%8F%99%ED%99%94-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95</guid>
            <pubDate>Tue, 14 Jun 2022 12:01:25 GMT</pubDate>
            <description><![CDATA[<h1 id="🏔-appium-앱-테스트-자동화-환경-구축하기">🏔 Appium 앱 테스트 자동화 환경 구축하기</h1>
<h2 id="🌲-appium-이란">🌲 Appium 이란?</h2>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/6fea7548-37bb-44a5-9020-dc3023df5d82/image.png" alt=""></p>
<blockquote>
<p>Appium 이란 🌍 <br> - Appium 이란 Mobile App UI 테스트 자동화를 위해 Server와 Client 연결 및 자동화 라이브러리를 제공하는 프레임워크이다.</p>
</blockquote>
<h3 id="🌱-appium-server의-역할">🌱 Appium Server의 역할</h3>
<p>1️⃣  클라이언트로부터 연결을 수신받아 세션을 시작한다.</p>
<p>2️⃣ 지시받은 행위(세션)를 수행시켜준다.</p>
<p>3️⃣ 수행 후 결과를 알려준다.</p>
<p>앱피움에 대해 간단하게 알아보았으니,자동화 개발 환경을 구축해보자. </p>
<br>




<hr>
<h2 id="🌲-자동화-환경-세팅">🌲 자동화 환경 세팅</h2>
<p>📌  개발환경 - MacOS Intel chip</p>
<h3 id="🌱-jdk-설치-및-환경변수-설정">🌱 JDK 설치 및 환경변수 설정</h3>
<p>우선 안드로이드 스튜디오를 설치하기 전, Oracle 페이지에서 JAVA를 설치해야한다. </p>
<p>링크의 🔗 <a href="https://www.oracle.com/java/technologies/downloads/#java8-mac">홈페이지</a>에서 Mac OS용 알맞은 JDK 버전을 설치하고</p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/c8fe696f-73a1-4681-8450-429ed8a6302c/image.png" alt=""></p>
<p>설치 경로를 확인해준 후, 아래와 같이 Terminal에서 환경변수 설정을 통해 java home 경로를 추가해준다.</p>
<pre><code class="language-bash">% vi ~/.zshrc

export JAVA_HOME=/Library/JAVA/JavaVirtualMachines/[jdk file 설치 version]/Contents/Home     //JDK 설치 경로
export PATH=${PATH}:$JAVA_HOME/bin
</code></pre>
<p>저장 후, source로 적용 &gt; 제대로 적용되었는지 echo로 불러 확인한다.</p>
<pre><code class="language-bash">% source ~/.zshrc
% echo $JAVA_HOME
/Library/JAVA/JavaVirtual&lt;achines/jdk-17.0.1.jdk/Contents/Home</code></pre>
<br>
---
### 🌱 Android SDK 설치 및 환경변수 설정 | Emulator 설정 | Real Device 연결

<h4 id="1-android-studio-설치">1) Android Studio 설치</h4>
<p>다음 순서는 Android SDK 설치이다. </p>
<blockquote>
<p>Android SDK는 Emulator 실행 뿐만 아니라, Real Android Device 연결 및 디버깅, 어플리케이션 설치, 시스템 로그 출력, shell 접속 등의 기능을 위해 사용된다.</p>
</blockquote>
<p>🔗 <a href="https://developer.android.com/studio/index.html">Android Studio 홈페이지</a>에서 Android Studio를 설치해주면 된다.</p>
<p>그리고 위처럼, 설치 경로를 확인한 후 환경변수 설정을 통해 다음과 같이 경로 추가~</p>
<pre><code class="language-bash">%vi ~/.zshrc

export ANDROID_HOME=/Users/soyunjo/Library/Android/sdk  //안드로이드 스튜디오 설치 경로
export PATH=${PATH}:$ANDROID_HOME/platform-tools
export PATH=${PATH}:$ANDROID_HOME/tools
export PATH=${PATH}:$ANDROID_HOME/emulator
export PATH=${PATH}:$ANDROID_HOME/build-tools/32.0.0</code></pre>
<p>&amp; 위와 동일하게 source 적용 &gt; echo로 경로 설정이 잘 되었는지 확인해본다! 
<br></p>
<h4 id="2-1-emulator-실행">2-1) Emulator 실행</h4>
<p>어플리케이션 실행을 위해 Emulator를 실행해보자.</p>
<p>Android Studio를 실행한 후</p>
<p><em><strong>SDK Manager &gt; Appearance&amp;Behavior &gt; Android SDK</strong></em> 에서 실행하고자 하는 버전 플랫폼을 다운받는다.</p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/b0dcac90-94d2-43eb-829f-a1450fb37448/image.png" alt="">
<img src="https://velog.velcdn.com/images/soyun_jo/post/d4266e74-19b6-4b4e-97f8-5ff826cf59ca/image.png" alt=""></p>
<p>AVD Manager &gt; Creat Virtual Device를 통해 실행하고자 하는 디바이스를 선택하여 에뮬레이터를 생성한다.
<img src="https://velog.velcdn.com/images/soyun_jo/post/83eea746-8950-47bd-8017-50d8244dccca/image.png" alt="">
<img src="https://velog.velcdn.com/images/soyun_jo/post/8d4380a9-0152-4d1e-a656-22b06d8e8cc0/image.png" alt=""></p>
<p>이렇게 Virtual Device가 생성되고, Terminal에서도 아래와 같이 Emulator list를 확인할 수 있다. 
<img src="https://velog.velcdn.com/images/soyun_jo/post/ffd68e9b-d5ed-4ca8-9354-5d0e1cf72c83/image.png" alt=""></p>
<p>Android Virtual Device Manager 창에서 <code>Actions</code> 버튼을 누르게되면 Emulator를 통해 Virtual Device가 실행된다.</p>
<p>(또는, Terminal에서 아래 명령어를 통해 실행할 수도 있다.)
<img src="https://velog.velcdn.com/images/soyun_jo/post/bf13c664-09ab-4d15-810c-29d9dfd3adef/image.png" alt="">
<img src="https://velog.velcdn.com/images/soyun_jo/post/d5372345-f56f-4d60-b0e9-f3c82f7a03b5/image.png" alt=""></p>
<p>이후 위와 같이 Emulator가 실행되었다면, adb devices 명령어를 통해 현재 실행 중인 (연결되어 있는) Android Device 목록이 출력되는지 확인하면 끝!</p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/a89d05a6-c9fc-413d-bfa3-80ca8ed39703/image.png" alt=""></p>
<h4 id="2-2-real-device-연결">2-2) Real Device 연결</h4>
<p>Real Device를 연결하기에 앞서, 디바이스에서 설정해 주어야 하는 것이 몇가지 있다. </p>
<blockquote>
<p>Device 설정에서 &gt;
📍 USB 연결 설정은 PTP(Picture Transfer Protocol)로 선택
📍개발자 모드 활성화
📍UBS 디버깅 활성화</p>
</blockquote>
<br>

<p>해당 설정을 완료한 후, USB로 Device를 연결하고 Terminal에서 현재 실행중인 Android Device 목록을 확인하게 된다면, 정상 연결이 된 것!</p>
<h4 id="3-appium--appium-inspector-설치">3) Appium + Appium Inspector 설치</h4>
<p>이제, 가장 중요한 Appium 설치 순서가 왔다!</p>
<p><a href="https://appium.io/">🔗 Appium 설치 페이지</a></p>
<p>해당 페이지에서 Appium을 설치하고, 아래 명령어들을 통해 Set up을 실행한다.</p>
<blockquote>
<p>Appium Server는 클라이언트로부터 HTTP를 통해 JSON 객체 형식으로 연결을 받아 세션을 생성하고 Node.js로 작성되기 때문에, 아래와 같이 Node를 설치해주어야 한다. </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/f0fbff67-3888-42ab-9a23-64bc5bc7fff8/image.png" alt=""></p>
<p>set up process를 거치고, Appium-doctor를 설치해 Appium Test 진행 조건에 부합하는지 확인해본다!</p>
<pre><code class="language-bash">% npm install -g appium-doctor</code></pre>
<p>여기서 Warning 메시지가 나온다면, 해당 메시지에 따라 필수 프로그램을 설치하거나 수정해주면 된다.</p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/1726ed6b-8da8-4671-85e4-cb32c1c112de/image.png" alt=""></p>
<p>위처럼 appium 실행 환경이 제대로 구축이 되었다면, pass~</p>
<p>Appium 실행 모습</p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/71a72c79-e0e4-4616-8df7-e1c27fa61040/image.png" alt=""></p>
<p>다음으로, Appium Inspector를 설치해본다. </p>
<p>이전 버전에서는 Appium 자체에 Inspector가 포함되어 있었지만,</p>
<p>현재 버전에서는 별도로 받아주어야 하기 때문에 홈페이지에서 appium-inspector.dmg 파일을 별도로 받아 설치한다. <img src="https://velog.velcdn.com/images/soyun_jo/post/a8e6231e-0632-4994-8a2b-7ca6ce544541/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/443c9eee-7890-412d-9099-1ccf7877fc1c/image.png" alt="">
Appium Inspector 실행해보면 끝~~</p>
<p>이로써 Appium Test 자동화 환경 구축 완료~~ 👻</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Appium] Hybrid App 에서 Appview ↔️ Webview 모드 전환하는 방법]]></title>
            <link>https://velog.io/@soyun_jo/Appium-Hybrid-App-%EC%97%90%EC%84%9C-Appview-Webview-%EB%AA%A8%EB%93%9C-%EC%A0%84%ED%99%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@soyun_jo/Appium-Hybrid-App-%EC%97%90%EC%84%9C-Appview-Webview-%EB%AA%A8%EB%93%9C-%EC%A0%84%ED%99%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 13 Jun 2022 15:33:20 GMT</pubDate>
            <description><![CDATA[<p><strong>Hybrid application</strong> 은 개발 영역에 따라 <code>Appview</code> 와 <code>Webview</code> 로 나뉘어 있다. </p>
<p>그래서 App Test Automation을 진행할 때, 
영역에 따라 각각 Native / Webview에 맞춘 Script를 작성한다면 
영역에 따라 Test 세션 속도를 좀 더 빠르게 할 수도 있다.</p>
<hr>
<br>

<h1 id="👉🏼-context-switch-를-통해-webview로-자동화-전환하기">👉🏼 <strong><code>Context switch</code></strong> 를 통해 Webview로 자동화 전환하기</h1>
<p>우선 <code>driver.context</code> 를 통해 
현재 노출되는 화면에서의 view <strong><em>contexts</em></strong> 리스트를 리턴받는다. 
<br></p>
<p>예를 들어 
현재 노출되는 영역이 <strong>Native</strong> 영역으로만 구성되어 있다면 </p>
<p>context의 id list 값은 다음과 같다.</p>
<pre><code class="language-python">context = driver.contexts

&gt;&gt; context = [&#39;NATIVE_APP&#39;]
</code></pre>
<br>

<p>또한, 현재 노출되는 영역이 <strong>Native + Webview</strong> 으로 구성되어 있다면</p>
<pre><code class="language-python">context == driver.contexts

&gt;&gt; context = [&#39;NATIVE_APP&#39;, &#39;WEBVIEW_1&#39;]</code></pre>
<p>이런식으로 값이 리턴될 것이다. 
<br></p>
<p>Webview context를 사용하게 되면, Selenium commands를 사용할 수 있다는 이점이 있다. </p>
<p>get(&quot;<a href="http://some.url.com&quot;)%EC%99%80">http://some.url.com&quot;)와</a> 같은..~ </p>
<p>해당 값을 받으면 session을 진행하는 영역에 따라 context를 수행해주면 된다!</p>
<pre><code class="language-python">appview = driver.contexts[0]
webview = driver.contexts[1]

# webview로 session변환
driver.switch_to.context(webview)

# web session 진행 ~~
driver.find_element(By.XPATH, &quot;//button[contains(text(), &#39;장바구니&#39;)]&quot;).click

# 다시 appview로 컴백!
driver.switch_to.context(appview)

#app session 진행 ~~
driver.find_element(AppiumBy.ID, &#39;ID placeholder&#39;).sendkeys(ID)
driver.quit()

</code></pre>
<br>






<p>그리고 Webview context에서 session을 시작할 때, 자동으로 webview context 전환해 주는 setting이 따로 있다고 하는데 </p>
<p><strong><span style="color: Orange">Desired capabilitiy</span></strong> 중 <code>autoWebview</code> == <code>true</code> 값으로 setting 해놓으면 가능하다고 한다.</p>
<p>자세한건  🔗 <a href="https://appium.io/docs/en/writing-running-appium/web/hybrid/">Appium documentation</a> 참고 ❗️</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter] 기본 Counter 앱에 decrement, reset 기능 추가하기 ➕ 🆎]]></title>
            <link>https://velog.io/@soyun_jo/Flutter-%EA%B8%B0%EB%B3%B8-Counter-%EC%95%B1%EC%97%90-decrement-reset-%EA%B8%B0%EB%8A%A5-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@soyun_jo/Flutter-%EA%B8%B0%EB%B3%B8-Counter-%EC%95%B1%EC%97%90-decrement-reset-%EA%B8%B0%EB%8A%A5-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 13 Jun 2022 14:47:23 GMT</pubDate>
            <description><![CDATA[<p>Flutter Project를 처음 시작하게 되면, 
기본으로 세팅되어져 있는 앱이 있다. 그게 Counter 앱인데, </p>
<p>숫자, Increment 기능만 있는 화면이 그려져 있다.</p>
<p> 요 기능에 Decrement, reset 버튼을 삽입해보려고 한다.
 <br></p>
<h1 id="🌎-counter-기능-완성하기">🌎 Counter 기능 완성하기</h1>
<p> &lt;결과 화면&gt;
  <img src="https://velog.velcdn.com/images/soyun_jo/post/b4955751-9e8c-4edb-a382-32d3049bc456/image.png" alt=""></p>
<p>  ✔️ <code>Increment btn</code> &gt; click : 숫자 + 1
  ✔️ <code>Decrement btn</code> &gt; click : 숫자 - 1
  ✔️ <code>Reset btn</code> &gt; click : 숫자 =&gt; 0
  <br></p>
<hr>
<h2 id="📍decrement-reset-함수-추가해주기">📍Decrement, Reset 함수 추가해주기</h2>
<pre><code class="language-dart"> int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
</code></pre>
 <br>

<p> 내장되어 있는 void 함수는 increment 만 존재한다..!</p>
<p> 그래서 아래와 같이 Decrement, Reset 함수도 차례로 추가해준다.
 <br></p>
<pre><code class="language-dart">   void _decrementCounter() {
    setState(() {
      _counter--;
    });
  }

  void _resetCounter(){
    setState(() {
      _counter = 0;
    });
  }
</code></pre>
<p> 그리고 본래 있던 increment <code>floatingActionButton</code> 을 &gt; refresh button 으로 바꾸어주고, </p>
<p> decrement, increment <code>RaisedButton</code> 을 아래에 추가해준다.
 <br></p>
<pre><code class="language-dart">   @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            const Text(
              &#39;You have pushed the button this many times:&#39;,
            ),
            Text(
              &#39;$_counter&#39;,
              style: Theme.of(context).textTheme.headline4,
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                RaisedButton(
                  onPressed: _decrementCounter,
                  child: Text(&quot;decrement&quot;),),
                RaisedButton(
                  onPressed: _incrementCounter,
                  child: Text(&quot;Increment&quot;),),
            ],)
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _resetCounter,
        tooltip: &#39;Reset Counter&#39;,
        child: Icon(Icons.refresh)
      ),
    );
  }</code></pre>
<p> 위와 같이 작성하면,, 
 아래와 같은 화면 완성 ~~ 🥁</p>
<p> <img src="https://velog.velcdn.com/images/soyun_jo/post/b4955751-9e8c-4edb-a382-32d3049bc456/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter] Column, Row 버튼 위젯 삽입하기 ]]></title>
            <link>https://velog.io/@soyun_jo/Flutter-Column-Row-%EB%B2%84%ED%8A%BC-%EC%9C%84%EC%A0%AF-%EC%82%BD%EC%9E%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@soyun_jo/Flutter-Column-Row-%EB%B2%84%ED%8A%BC-%EC%9C%84%EC%A0%AF-%EC%82%BD%EC%9E%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 13 Jun 2022 10:59:16 GMT</pubDate>
            <description><![CDATA[<p>오늘은 화면 내에 간단한 버튼을 구성해보는 과제를 기록하려고 한다.</p>
<p>앱 화면 내에 행과 열을 나누고, 그 안에 버튼으로 레이아웃을 구성할것이다. </p>
<p>내가 만들고자 했던 결과는! </p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/0e3991ca-aa9b-4c8c-aff0-50940a27e45e/image.png" alt=""></p>
<p>👏</p>
<p>매우 간단해보이지만, 첫 코드 작성이엇기에
아예 처음 세팅되어 있는 카운터 예제 구조도 이해 못한 나로서는 살짝 어려웠다..</p>
<hr>
<h1 id="🌎-위젯으로-화면-그리기">🌎 위젯으로 화면 그리기</h1>
<p>우선, 행렬을 나누는 레이아웃 버튼을 구성하기 위해서는
아주 많은 방법들이 있지만. 
body를 column으로 나누어 준 후, 해당 column에서 row를 구성해주는 방법을 사용했다. </p>
<p>플러터 문서에서 소개하는 가장 기본적인 위젯 목록은 다음과 같다.</p>
<ul>
<li>Container</li>
<li>Column, Row</li>
<li>Image</li>
<li>Text</li>
<li>Icon</li>
<li>RaisedButton</li>
<li>Scaffold</li>
<li>AppBar</li>
</ul>
<p>Scaffold는 flutter의 도화지(?) 와 같은 가장 베이스로 깔리는 화면이라고 한다.
이 위젯들 중에서, Scaffold내에 AppBar, Column, Row를 사용할 것이다.</p>
<br>

<h2 id="📍column--textbutton-children-구성하기">📍Column : TextButton Children 구성하기</h2>
<p>우선 4개의 column을 만들고, 6개의 버튼과 ads 버튼을 위한 하나의 넓고 얇은 버튼을 만들려고 한다.
그러기 위해서는 우선 4개의 column을 만들어야겠지?</p>
<pre><code class="language-dart">@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(children: [
        Expanded(child: child),
        Expanded(child: child),
        Expanded(child: child),
        Expanded(child: child)
      ],
      )
    );
  }</code></pre>
<p>가득 찬 row를 만들고 싶어서 우선 expended 위젯을 추가해주었다. 
이후 expended 내의 child로 TextButton을 넣어준다.</p>
<pre><code class="language-dart">@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(children: [
        Expanded(child: Expanded(
          child: TextButton(
            onPressed: () {},
            child: const Center(child: Text(&quot;button1&quot;))))),
        Expanded(child: Expanded(
            child: TextButton(
                onPressed: () {},
                child: const Center(child: Text(&quot;button1&quot;))))),
        Expanded(child: Expanded(
            child: TextButton(
                onPressed: () {},
                child: const Center(child: Text(&quot;button1&quot;))))),
        Expanded(child: Expanded(
            child: TextButton(
                onPressed: () {},
                child: const Center(child: Text(&quot;button1&quot;)))))
      ],
      )
    );
  }</code></pre>
<p>이까지 하고, Run 시켜주면 다음과 같이 같은 너비의 column 4개가 그려진다.! 
<img src="https://velog.velcdn.com/images/soyun_jo/post/010af150-ffa5-4438-bcc5-3562af3efcbc/image.png" alt="">
<br></p>
<h2 id="📍row-위젯-삽입하기">📍Row 위젯 삽입하기</h2>
<pre><code class="language-dart">@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(children: [
        Expanded(child: Row(children: [
          Expanded(child: TextButton(
            onPressed: () {},
            child: const Center(child: Text(&quot;Button1&quot;)))),
          Expanded(child: TextButton(
            onPressed: () {},
            child: const Center(child: Text(&quot;Button2&quot;))))]
        )),
        Expanded(child: Row(children: [
          Expanded(child: TextButton(
            onPressed: () {},
            child: const Center(child: Text(&quot;Button3&quot;)))),
          Expanded(child: TextButton(
            onPressed: () {},
            child: const Center(child: Text(&quot;Button4&quot;))))]
        )),
        Expanded(child: Row(children: [
          Expanded(child: TextButton(
            onPressed: () {},
            child: const Center(child: Text(&quot;Button5&quot;)))),
          Expanded(child: TextButton(
            onPressed: () {},
            child: const Center(child: Text(&quot;Button6&quot;))))]
        )),
        Expanded(child: Expanded(child: TextButton(
          onPressed: () {},
          child: const Center(child: Text(&quot;ads&quot;))
        )))]
      )
    );
  }</code></pre>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/c0f8ba46-e4bc-4dde-bd3f-f8be8f7d9b59/image.png" alt="">
<br></p>
<h2 id="📍column-button-너비비율-지정하기">📍Column button 너비/비율 지정하기</h2>
<p>마지막 column의 textbutton은 얇게 ad 자리로 설정하고 싶으니까, 
3:3:3:1의 비율로 설정하기 위해 flex를 사용하여 column expended 안에 다음과 같이 설정해준다.</p>
<pre><code class="language-dart">@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        children: [
          Expanded(
            child: Row(children: [
              Expanded(child: TextButton(
                  onPressed: () {},
                  child: const Center(
                      child: Text(&quot;Button&quot;)))),
              Expanded(child: TextButton(
                  onPressed: (){},
                  child: const Center(
                      child: Text(&quot;Button&quot;))))
            ]),
            flex: 3,
          ),
          Expanded(
            child: Row(children: [
              Expanded(child: TextButton(
                  onPressed: () {},
                  child: const Center(
                      child: Text(&quot;Button&quot;)))),
              Expanded(child: TextButton(
                  onPressed: (){},
                  child: const Center(
                      child: Text(&quot;Button&quot;))))
            ]),
            flex: 3,
          ),
          Expanded(
            child: Row(children: [
              Expanded(child: TextButton(
                  onPressed: () {},
                  child: const Center(
                      child: Text(&quot;Button&quot;)))),
              Expanded(child: TextButton(
                  onPressed: (){},
                  child: const Center(
                      child: Text(&quot;Button&quot;))))
            ]),
            flex: 3,
          ),
          Expanded(
            child: TextButton(
                onPressed: () {},
                child: const Center(
                    child: Text(&quot;Ads&quot;))),
            flex: 1,
          )
        ],
      )
    );
  }</code></pre>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/34bb2224-0906-4d19-99e5-d0d44987a850/image.png" alt=""></p>
<hr>
<p>이상 완성 <del>~</del></p>
<p>막상 해보니까 레이아웃 구성하는게, 재밌기도 했다. 근데 이제 동작 구현하고.. 함수가 들어가게 되면 얼마나 어려워질까 ..? ㅎㅎ</p>
<p>그리고, 백번 책보고 이론 확인하고 dart 문법 보고 하는 것 보다
이런식으로 한번 그림을 그려보는게 확실히 이해에 도움이 된다는 걸 알게 되었다..! </p>
<p>멘땅에 해딩 짱..! ⚽️</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter] 플러터 시작하기🌿. Download and setting]]></title>
            <link>https://velog.io/@soyun_jo/Flutter-%ED%94%8C%EB%9F%AC%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0.-download-and-setting</link>
            <guid>https://velog.io/@soyun_jo/Flutter-%ED%94%8C%EB%9F%AC%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0.-download-and-setting</guid>
            <pubDate>Sat, 28 May 2022 14:09:51 GMT</pubDate>
            <description><![CDATA[<hr>
<p><code>첫번째 포스팅</code> 으로,
ios, android 크로스 플랫폼 앱개발 플랫폼인 flutter 개발환경 구축에 대해 작성하려 한다.</p>
<p>참고로 나으 개발 환경 is  👉 <code>MacOS intel chip</code>
<br><br></p>
<h1 id="🌏-개발-환경-구축-시작-🌏">🌏 개발 환경 구축 시작 🌏</h1>
<p>Flutter 개발 환경 구축을 위해서는</p>
<blockquote>
</blockquote>
<ul>
<li>Flutter SDK 설치</li>
<li>Android Studio 설치</li>
<li>환경 변수 설치</li>
<li>flutter doctor 실행</li>
</ul>
<p>요것만 호다닥 진행하면 끝. </p>
<hr>
<h2 id="📍첫번째-flutter-sdk-설치">📍첫번째, Flutter SDK 설치</h2>
<p>쉽다. </p>
<p>바로 여기.click 👉 <a href="https://docs.flutter.dev/get-started/install">https://docs.flutter.dev/get-started/install</a></p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/c0709d0c-8e99-4e0a-9d3b-35e51aee9926/image.png" alt="">
들어가면, 다음 화면이 나온다. 
플러터를 다운받으려면 이렇게 저렇게 어쩌구 설정을 해야해~라고 설명해주는 페이지가 나온다.</p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/9c4b7484-13c1-43f4-902b-0eaf8e8ae561/image.png" alt=""></p>
<p>응 그냥 내려가서
<img src="https://velog.velcdn.com/images/soyun_jo/post/93a009d3-275d-4ea5-b2dd-5483ccd9f784/image.png" alt="">
Get the Flutter SDK &gt; intel chip 버전 flutter_macos_version-stable.zip 다운로드.
<br>
받으면 다운로드 폴더안에 Flutter.zip 파일이 생기는데, 
풀고 싶은 곳에 풀어주면 된다.</p>
<p>나같은 경우
<code>User &gt; soyunjo</code>  폴더에 풀어놓음.
<br><br></p>
<hr>
<h2 id="📍두번째-android-studio-설chi하기">📍두번째, Android Studio 설chi하기</h2>
<p>다음언 Android Studio 설치
이것두 쉽다.
바로 여기.click 👉 <a href="https://developer.android.com/studio">https://developer.android.com/studio</a>
<img src="https://velog.velcdn.com/images/soyun_jo/post/3e1969c8-1440-43b3-bf98-e2a03aff9303/image.png" alt="">
이용약관 정독해주구~ Intel chip 찾아서 <code>click</code> 앤드 <code>Download.</code>
<img src="https://velog.velcdn.com/images/soyun_jo/post/bbe545d3-ea1c-4fac-9536-eca9a4ad1e06/image.png" alt=""></p>
<br>
다운로드를 모두 마치게 되면, 아래 팝업창이 뜨게 되는데
안드로이드 스튜디오에서도 Flutter를 사용하려면 Flutter 패키지를 받아주어야 하기 때문에

<p>해당 화면에서 좌측 <code>Plugins</code> 를 클릭해준다.</p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/f3c54ac8-185d-4989-a97b-3d83e7d16e3c/image.png" alt=""></p>
<p>Flutter 검색 후, <code>Install</code> 완료! </p>
<p>이외에도 다양한 코드 색 테마 플러그인이나, 다양한 플러그인들이 많아서,
이거 찾아보고 세팅하는 것도 제법 쏠쏠할 것 같다. </p>
<p>다음,
<img src="https://velog.velcdn.com/images/soyun_jo/post/392964bf-6e09-41c3-88da-d25a3d24e01e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/d27e2451-a952-4c1d-a1a5-d9b6116558bf/image.png" alt=""></p>
<p>Android SDK Command-line Tools 선택 &gt; <code>Apply</code> &gt; <code>OK</code>
<img src="https://velog.velcdn.com/images/soyun_jo/post/c15c7eed-d7a9-4967-b83d-47efb5b86dd6/image.png" alt=""></p>
<p>이렇게 두번째 Step도 완료! 
<br><br></p>
<hr>
<h2 id="📍세번째-환경변수-설정하기">📍세번째, 환경변수 설정하기</h2>
<p>다음다음~
shell 에서의 간편한(?) flutter 명령어 사용을 위해 환경변수를 설정해준다.</p>
<p>참고로 zsh 기준❗️
<br></p>
<pre><code>vi ~/.zshrc</code></pre><p>텍스트 편집기를 통해서 환경변수를 편집
<br></p>
<p>텍스트가 추ㅏ라라라 뜨면, <code>i</code> 를 통해 <span style="color: yellow">편집모드</span>로 바꾸고 
<br></p>
<p>flutter를 설치해준 <span style="color: red">경로</span>❗️를 입력한다. <span style="color: orange">(아까 flutter 압출 풀어 준 경로.)</span></p>
<pre><code>export PATH=&quot;$PATH:$HOME/flutter/bin&quot;</code></pre><p>그리고 환경 변수 편집이 모두 끝났으면 
<code>:wq</code> 를 입력해서 저장하기.
<br></p>
<pre><code>source ~/.zshrc</code></pre><p>source 명령어로 한번 적용시켜주기.</p>
<p><br><br></p>
<p>이제 거의 끝났다. doctor를 통해 검증받을 시간. 
(개발에 필요한거 다~ 설치되었나..)</p>
<pre><code>flutter doctor</code></pre><p><img src="https://velog.velcdn.com/images/soyun_jo/post/cdac1931-c523-4430-ade3-e47b3e605318/image.png" alt="">
✔️ flutter 깔렸고.
✔️ android tool 깔렸고,
✔️ Xcode (ios 같이 할거면 설치해주면 됨. from <code>Appstore</code> )
✔️ Chrome 깔아주어야하구요
✔️ ...등등 입니다.
<br></p>
<blockquote>
<p><code>No issues found!</code>
 라고 나왔다면. flutter 개발환경 세팅 완료 🌻</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Mac OS] Emoji 단축키. 🧣🧤👜🌂]]></title>
            <link>https://velog.io/@soyun_jo/Mac-OS-Emoji-%EB%8B%A8%EC%B6%95%ED%82%A4</link>
            <guid>https://velog.io/@soyun_jo/Mac-OS-Emoji-%EB%8B%A8%EC%B6%95%ED%82%A4</guid>
            <pubDate>Sat, 28 May 2022 13:06:01 GMT</pubDate>
            <description><![CDATA[<p>보통 아이폰으로 이모지를 사용했지.
맥북으로는 번거로와서 ios이모지를 사용한적이 없었다.</p>
<p>하지만, 맥북 프로 터치바를 사용하고 난 후, 살짝 이모지 사용 욕심😏이 생겼달까/ 
<br><br>
근데 이 얇디 얇은 터치바로 
언즤 다 넘기고 찾고 앉아있어..! </p>
<p>그래서 이모지를 순식간에 찾을 수 있는 단축키를 가지고왔다.
<br>
it&#39;s 바로</p>
<blockquote>
<p> 👉 <code>control</code> + <code>command</code> + <code>spacebar</code></p>
</blockquote>
<p>조고만 이모지 목록이 뜨게 된다.
<img src="https://velog.velcdn.com/images/soyun_jo/post/70c782a2-b54d-4609-bfb1-516b958d7cb1/image.png" alt="">
미소 짓는 눈으로 키스하는 얼굴 ㅋㅋㅋㅋㅋㅋㅋㅋ??
(뿌듯해하는 얼굴인줄 알고 막날렸는데.. 키스하는 얼굴이었어..? 🫠 이런...)</p>
<p><br><br>
검색 기능도 되어서 
터치바를 휘휘 돌리는 것 보다는 훨씬 편한 듯 하다.
<img src="https://velog.velcdn.com/images/soyun_jo/post/add8a194-f0e7-44fd-bffa-96b4c2019bc1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/ed66df15-778f-4f75-aabf-60acd8fee623/image.png" alt=""></p>
<p>영어로 하면 더 정확하게 나올 것 같아서
해봤는데, 맥북은 영어로 이모지 검색이 안된다. </p>
<p>🤔 요상하네</p>
<p><br><br></p>
<p>무튼 Emoji 단축키 사용 방법 끗!! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mac OS에서 백틱(`)👌 입력하기.  마크다운 필수템]]></title>
            <link>https://velog.io/@soyun_jo/Mac-OS%EC%97%90%EC%84%9C-%EB%B0%B1%ED%8B%B1-%EC%9E%85%EB%A0%A5%ED%95%98%EA%B8%B0.-%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-%ED%95%84%EC%88%98%ED%85%9C</link>
            <guid>https://velog.io/@soyun_jo/Mac-OS%EC%97%90%EC%84%9C-%EB%B0%B1%ED%8B%B1-%EC%9E%85%EB%A0%A5%ED%95%98%EA%B8%B0.-%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-%ED%95%84%EC%88%98%ED%85%9C</guid>
            <pubDate>Sat, 28 May 2022 12:30:55 GMT</pubDate>
            <description><![CDATA[<p>마크다운을 사용하기 시작하면서,
또는 슬랙을 사용할 때, <code>인라인 코드</code> 로 강조를 표시하곤 하는데,</p>
<p>단축키 백틱(`)으로 해당 기능을 사용할 수 있다고 한다.
<br><br></p>
<blockquote>
</blockquote>
<p>하지만 어디있음?</p>
<p>맥북에는 그 어디에도 백틱이 표시된 키보드가 없는걸..? 🥲
<br><br>
했는데, </p>
<p><img src="https://velog.velcdn.com/images/soyun_jo/post/ee2e4161-6d52-40ab-a5c1-47084878c1a6/image.png" alt=""></p>
<p>응, 바로 이거래..<br><br></p>
<hr>
<p>백틱을 사용하는 방법은 두가지가 있다. </p>
<h4 id="🔑-첫번째-방법">🔑 첫번째 방법..</h4>
<blockquote>
<p> 👉 한영키 <span style="color: red">한글</span>이  <code>ON</code>되어 있을 때❕</p>
</blockquote>
<ul>
<li><code>option + ₩</code> 을 누른다.</li>
</ul>
<p><br><br></p>
<h4 id="🔑-두번째-방법">🔑 두번째 방법</h4>
<blockquote>
<p>👉 한영키 <span style="color: green">영어</span>가 <code>ON</code> 되어 있을 때❗️</p>
</blockquote>
<ul>
<li><code>₩</code> 을 누른다.</li>
</ul>
<p><br><br>
이렇게 간단한건데 몰랐구나. 🫠</p>
<p>이제라도 알았으니 정말 편하겠어 ㅎ후</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 공부 블로그 🤟]]></title>
            <link>https://velog.io/@soyun_jo/%EA%B0%9C%EB%B0%9C-%EA%B3%B5%EB%B6%80-%EB%B8%94%EB%A1%9C%EA%B7%B8</link>
            <guid>https://velog.io/@soyun_jo/%EA%B0%9C%EB%B0%9C-%EA%B3%B5%EB%B6%80-%EB%B8%94%EB%A1%9C%EA%B7%B8</guid>
            <pubDate>Sat, 28 May 2022 11:24:36 GMT</pubDate>
            <description><![CDATA[<p>이제 시작하는 조금은 늦은 공부 기록장.
하루에 한번 이상은 아주 작게나마 공부한 것들을 기록해보려고 한다.</p>
<p>취미로 시작해 점차 영역을 넓혀가 
내가 원하는 걸 만들고 이뤄내고 싶다 🔥</p>
<p>기록하자 꼬옥.</p>
]]></description>
        </item>
    </channel>
</rss>