<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lyg.log</title>
        <link>https://velog.io/</link>
        <description>개발자</description>
        <lastBuildDate>Wed, 31 May 2023 06:52:47 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>lyg.log</title>
            <url>https://images.velog.io/images/android_z/profile/7842a0d0-bc67-4827-8e28-c04bc78c9af2/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. lyg.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/android_z" rel="self" type="application/rss+xml"/>
        <item>
            <link>https://velog.io/@android_z/p79tcz65</link>
            <guid>https://velog.io/@android_z/p79tcz65</guid>
            <pubDate>Wed, 31 May 2023 06:52:47 GMT</pubDate>
            <description><![CDATA[<ol>
<li>화면의 특정 영역에서 동적으로 열리고, 닫히는 사용자 인터페이스.
통상적으로, &quot;안드로이드 레이아웃&quot;이라고 하면, 화면의 전체 또는 일부에 자신의 영역을 확보한 다음, 정해진 규칙에 따라 자식(Children) 뷰 위젯들을 배치하는 역할을 하는 요소를 말합니다. </li>
</ol>
<p>한 방향으로 뷰(View) 위젯을 나열하는데 사용되는 [리니어레이아웃(LinearLayout)], 뷰(View) 위젯 간 상대적 위치에 따라 자식(Children)들을 정렬하는 [렐러티브레이아웃(RelativeLayout)], 액자 형태로 뷰(View) 위젯을 바꿔가면서 표시하기 위한 [프레임레이아웃(FrameLayout)], 그리고 표 형태의 레이아웃을 구성할 때 사용하는 [테이블레이아웃(TableLayout)] 등, 여러 종류의 레이아웃들이 바로 그런 역할을 수행합니다.</p>
<p>그런데 앞에서 살펴본 요소들처럼 고정 영역에 레이아웃이 표시되는 형태가 아니라, 사용자의 액션에 따라 화면의 일부분이 나타나거나 사라지게 만드려면 어떻게 해야 할까요? 마치 책상에서 &quot;서랍&quot;이 열리고 닫히는 것처럼, 평소에는 화면의 한 쪽에 숨겨져 있다가, 사용자가 화면을 스와이프하거나 메뉴 버튼을 선택하면 화면에 표시되는 형태 말이죠.</p>
<p><img src="https://velog.velcdn.com/images/android_z/post/9d14e560-f924-40b9-925f-26b739840c6d/image.png" alt=""></p>
<p>DrawerLayout 동작</p>
<p>물론, 여러 레이아웃 중 하나를 사용하여 화면을 구성한 다음, 사용자 입력 이벤트 핸들러를 작성하여, 레이아웃의 visibility를 조절하는 방법을 선택할 수 있을 것입니다. 거기에 더해 레이아웃이 나타나고 사라지는 과정의 애니메이션 효과까지 구현해주면 더 좋겠죠.</p>
<p>하지만 개발자가 하나하나 모두 구현해야 하는 수고를 들이지 않아도 &quot;서랍&quot;처럼 화면이 열리고 닫히는 기능을 수행할 수 있게 만들어 주는 레이아웃이 있습니다. 바로 DrawerLayout입니다.</p>
<ol start="2">
<li>안드로이드 DrawerLayout
DrawerLayout의 &quot;Drawer&quot;는 사전적으로 &quot;서랍&quot;을 의미하는 단어입니다.</li>
</ol>
<p>Drawer의 사전적 의미</p>
<p>Drawer라는 단어가 뜻하는 &quot;서랍&quot;이 열리고 닫히는 것처럼, DrawerLayout은 &quot;평소에는 화면의 한쪽에 숨겨져 있다가 사용자가 액션을 취하면 화면에 나타나는 기능을 만들 수 있게 해주는 레이아웃&quot;입니다.</p>
<p><img src="https://velog.velcdn.com/images/android_z/post/0e6be0e8-6422-4890-9853-6a8376d33497/image.png" alt=""></p>
<p>DrawerLayout 클래스</p>
<p>하지만 DrawerLayout에 대한 설명을 보고, DrawerLayout 자체가 화면에 나타나거나 사라지는 동작을 수행하는 것으로 오해하면 안됩니다. DrawerLayout에 추가된 자식(Children)이 DrawerLayout의 영역 안에서 &quot;Drawer(서랍)&quot;와 같은 동작을 수행하도록 만들어주는 것이죠.</p>
<p>그리고 DrawerLayout에 추가된 모든 자식(Children)들이 Drawer로 동작하는 것이 아니라는 사실에도 주의해야 합니다. 자식(Children)들 중 layout_gravity 속성 값을 가지지 않은 자식(Child)은 기본적으로 표시되는 주화면으로 취급되고, layout_gravity 속성 값을 가진 자식(Child)만이 Drawer로써 동작하는 것이죠. 또한 Drawer가 어느 방향에서 열릴지는 layout_gravity에 지정된 값(left or right)에 의해 결정됩니다.</p>
<p>음, 글로 설명한 내용만으로는 쉽게 이해가 되지 않죠? 하지만 넘 머리 아파하지 마세요. 아래에서 좀 더 자세한 설명과 예제를 통해 DrawerLayout을 어떻게 사용하는지 완벽히 이해하실 수 있을 것입니다.</p>
<p>그럼, 지금부터 DrawerLayout의 사용 방법 및 동작, 그리고 제약 사항들에 대해 알아보겠습니다.</p>
<p>2.1 DrawerLayout의 기본 레이아웃 구성.
DrawerLayout을 사용하여 화면이 열리고 닫히는 기능을 구현하기 위해서는 DrawerLayout에 최소 두 개의 자식(Children)이 추가되어야 합니다. 하나는 Drawer 역할을 수행할 화면이고, 다른 하나는 Drawer가 닫혀있는 상태에서 표시될 주화면입니다.
<img src="https://velog.velcdn.com/images/android_z/post/022d28fe-d4e9-45b0-bb44-c69bdc5a626e/image.png" alt=""></p>
<p>DrawerLayout의 화면 구성</p>
<p>어떤 화면이 Drawer로 사용될 것인지는, 레이아웃 리소스 XML에 기록된 순서와 layout_gravity 속성의 유무로 결정됩니다. 즉, DrawerLayout의 첫 번째 자식(Child)이 주 화면으로 표시되고, 그 아래 layout_gravity 속성을 가지는 자식(Child)이 Drawer로 사용됩니다.
<img src="https://velog.velcdn.com/images/android_z/post/62c31615-2271-4893-b070-bf4bbe87ba2a/image.png" alt=""></p>
<p>DrawerLayout의 기본 레이아웃</p>
<p>DrawerLayout에서 Drawer가 어느 방향에서 열리고 닫힐지는 layout_gravity에 지정된 값에 의해 결정되며, 가로 방향에 대해서만 지정할 수 있습니다. 즉, left(start) 또는 right(end) 값만 사용할 수 있습니다.
<img src="https://velog.velcdn.com/images/android_z/post/34174339-a276-4053-a1fa-ce15cc6b4b4b/image.png" alt=""></p>
<p>DrawerLayout layout_gravity 지정</p>
<p>DrawerLayout에 하나의 Drawer만 사용하는게 일반적이긴 하지만, 그렇다고 반드시 하나의 Drawer만 사용할 수 있는 것은 아닙니다. 정확히 말하면, 각 방향에 하나씩의 Drawer를 지정할 수 있죠. 그러므로 (실제로 잘 쓰이진 않지만) 아래와 같은 경우도 가능한 것입니다.
<img src="https://velog.velcdn.com/images/android_z/post/58e7b2d1-57b0-4f42-bce7-d34c096f8c1c/image.png" alt=""></p>
<p>DrawerLayout layout_gravity left and right</p>
<p>2.2 DrawerLayout에서 Drawer의 크기
DrawerLayout의 Drawer는 layout_gravity 값에 따라 왼쪽 또는 오른쪽 방향으로 열리고 닫히기 때문에, Drawer의 너비는 DrawerLayout보다 작은 고정(fixed) 값으로, Drawer의 높이는 DrawerLayout의 높이와 같은 값으로 지정하는 게 일반적입니다.
<img src="https://velog.velcdn.com/images/android_z/post/044fa748-5271-492b-989b-e122d3fc0d92/image.png" alt=""></p>
<p>DrawerLayout layout_width and layout_height</p>
<p>그리고 Drawer가 아닌 주화면은 DrawerLayout 전체 영역에 표시됩니다. 그래서 DrawerLayout 주화면으로 사용되는 자식(Children)은 지정된 layout_width, layout_height 값과 관계없이, match_parent로 동작합니다.</p>
<p>2.3 DrawerLayout 기본 동작.
최초 DrawerLayout이 화면에 표시될 때는, Drawer 화면이 표시되지 않습니다. 주화면, 즉, Drawer가 아닌 자식(Child)의 화면만 표시되죠. 이 때 left에 위치한 Drawer가 열리게 만들기 위해서는 화면 왼쪽 가장자리에서 시작하여 오른쪽 방향으로 쓸어넘기는 스와이프(Swipe) 동작을 수행하면 됩니다. right에 위치한 Drawer는 오른쪽 가장자리에서 시작하여 왼쪽 방향으로 스와이프(Swipe)하면 됩니다. 그리고 Drawer를 닫으려면 열기 방향의 반대로 스와이프(Swipe) 동작을 수행하거나, DrawerLayout 상의 Drawer 외 영역을 클릭하면 됩니다.
<img src="https://velog.velcdn.com/images/android_z/post/647198ba-a84e-4e36-98e2-12fd35577b29/image.png" alt=""></p>
<p>DrawerLayout에서 Drawer 열기 및 닫기</p>
<p>하지만 누군가에게는 스와이프(Swipe) 동작이 어렵게 느껴질 수도 있고, 현재 화면에서 Drawer를 사용할 수 있다는 것을 모를 수도 있습니다. 이 때, 스와이프(Swipe)가 아닌 버튼 클릭 등을 통해 Drawer가 표시되게 만들 수 있는데, DrawerLayout에서 제공하는 함수를 통해 Drawer를 열거나 닫을 수 있습니다.</p>
<p>2.4 코드를 통해 Drawer 열기 및 닫기.
DrawerLayout의 Drawer 화면이 기본적으로 스와이프(Swipe) 동작에 의해 열리지만, DrawerLayout에서 제공되는 함수를 호출하면 외부 버튼 또는 메뉴를 통해 열리거나 닫히게 만들 수 있습니다. Drawer 열기 및 닫기, 즉, openDrawer() 함수와 closeDrawer() 함수를 사용하면 자바 코드에서 Drawer를 열고 닫는 게 가능합니다.</p>
<p>아래 표는 파라미터의 종류 및 갯수에 따라 구분된 openDrawer() 함수를 나타낸 것입니다.</p>
<p>closeDrawer() 함수의 종류는 아래와 같습니다.</p>
<p><img src="https://velog.velcdn.com/images/android_z/post/4dc089e1-8239-4fcf-b772-e401f50c437d/image.png" alt=""></p>
<p>openDrawer() 및 closeDrawer() 함수를 사용하여 Drawer를 열고 닫는 예제 코드는 아래와 같습니다.</p>
<pre><code>// left에 지정된 Drawer 열기.
drawer.openDrawer(Gravity.LEFT) ;

// left에 지정된 Drawer 닫기.
drawer.closeDrawer(Gravity.LEFT) ;</code></pre><p>2.5 Drawer 잠그기(Lock).
앞서 DrawerLayout의 동작에 대해 설명했듯이, DrawerLayout에서 Drawer를 열기 위해서는 Drawer가 닫혀있는 방향의 테두리에서 스와이프(Swipe) 액션을 수행하면 됩니다. 그런데 어떤 경우에는, 스와이프(Swipe)에 의해 Drawer가 열리고 닫히는 것을 막아야 하는 경우도 있습니다. 예를 들어 메뉴로 동작하는 Drawer가 열린 상태로 고정되거나, 현재 컨텐츠 화면에서 Drawer가 표시될 필요가 없는 경우가 바로 그런 경우죠.</p>
<p>이렇게 Drawer를 열린 상태로 고정 또는 닫힌 상태로 고정시키는 것을 Drawer 잠그기(Lock)라고 하는데, DrawerLayout의 setDrawerLockMode() 함수를 통해 Drawer 잠그기(Lock) 기능을 활성화 또는 비활성화 할 수 있습니다.</p>
<pre><code>void setDrawerLockMode(int lockMode) ;</code></pre><p>setDrawerLockMode() 함수의 파라미터인 lockMode에는 아래의 값 중 하나를 지정할 수 있습니다.</p>
<p>lockMode    Hex 값    설명
LOCK_MODE_UNLOCKED    0x00000000    잠그기(Lock) 기능 비활성화. 스와이프(Swipe)에 의해 열리고 닫힘.
LOCK_MODE_LOCKED_CLOSED    0x00000001    Drawer가 닫힌 채로 잠김(Locked). 만약 Drawer가 열려 있는 상태였다면 자동으로 닫힘.
LOCK_MODE_LOCKED_OPEN.    0x00000002    Drawer가 열린 채로 잠김(Locked). 만약 Drawer가 닫혀 있는 상태였다면 자동으로 열림.</p>
<p>참고로, setDrawerLockMode() 함수에 의해 Drawer가 잠김(Locked) 상태가 되면 스와이프(Swipe)에 의한 열기 또는 닫기는 불가능해지지만, openDrawer() 함수 또는 closeDrawer() 함수에 의한 열기 또는 닫기는 여전히 가능합니다.</p>
<ol start="3">
<li>DrawerLayout 사용하기
그럼 이제부터, 예제를 통해 DrawerLayout의 사용법에 대해 살펴보겠습니다.</li>
</ol>
<p>DrawerLayout 사용 예제는 아래 그림과 같은 레이아웃으로 구성됩니다.</p>
<p>DrawerLayout 예제 레이아웃</p>
<p>3.1 MainActivity 레이아웃 작성하기.
앞서 설계한 화면 레이아웃에 따라 MainActivity의 레이아웃 리소스 XML 파일을 작성합니다.</p>
<p>[STEP-1] &quot;activity_main.xml&quot; - MainActivity 레이아웃 리소스 XML 파일
<?xml version="1.0" encoding="utf-8"?>
&lt;android.support.constraint.ConstraintLayout xmlns:android=&quot;<a href="http://schemas.android.com/apk/res/android&quot;">http://schemas.android.com/apk/res/android&quot;</a>
    xmlns:app=&quot;<a href="http://schemas.android.com/apk/res-auto&quot;">http://schemas.android.com/apk/res-auto&quot;</a>
    xmlns:tools=&quot;<a href="http://schemas.android.com/tools&quot;">http://schemas.android.com/tools&quot;</a>
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    app:layout_behavior=&quot;@string/appbar_scrolling_view_behavior&quot;
    tools:context=&quot;com.recipes4dev.examples.drawerlayoutexample.MainActivity&quot;
    tools:showIn=&quot;@layout/activity_main&quot;&gt;</p>
<pre><code>&lt;Button
    android:layout_width=&quot;wrap_content&quot;
    android:layout_height=&quot;wrap_content&quot;
    app:layout_constraintLeft_toLeftOf=&quot;parent&quot;
    app:layout_constraintTop_toTopOf=&quot;parent&quot;
    android:text=&quot;Open&quot;
    android:id=&quot;@+id/open&quot; /&gt;

&lt;Button
    android:layout_width=&quot;wrap_content&quot;
    android:layout_height=&quot;wrap_content&quot;
    app:layout_constraintLeft_toRightOf=&quot;@id/open&quot;
    android:text=&quot;Close&quot;
    android:id=&quot;@+id/close&quot; /&gt;

&lt;CheckBox
    android:layout_width=&quot;wrap_content&quot;
    android:layout_height=&quot;wrap_content&quot;
    app:layout_constraintLeft_toRightOf=&quot;@id/close&quot;
    app:layout_constraintBaseline_toBaselineOf=&quot;@id/close&quot;
    android:text=&quot;Lock&quot;
    android:id=&quot;@+id/lock&quot; /&gt;

&lt;android.support.v4.widget.DrawerLayout
    android:layout_width=&quot;0dp&quot;
    android:layout_height=&quot;0dp&quot;
    app:layout_constraintLeft_toLeftOf=&quot;parent&quot;
    app:layout_constraintTop_toBottomOf=&quot;@id/open&quot;
    app:layout_constraintRight_toRightOf=&quot;parent&quot;
    app:layout_constraintBottom_toBottomOf=&quot;parent&quot;
    android:id=&quot;@+id/drawer&quot;&gt;

    &lt;TextView
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:gravity=&quot;center&quot;
        android:textSize=&quot;48sp&quot;
        android:text=&quot;CONTENTS&quot;
        android:background=&quot;#00BCD4&quot;/&gt;

    &lt;TextView
        android:layout_width=&quot;400dp&quot;
        android:layout_height=&quot;match_parent&quot;
        android:gravity=&quot;center&quot;
        android:textSize=&quot;48sp&quot;
        android:text=&quot;DRAWER&quot;
        android:background=&quot;#009688&quot;
        android:layout_gravity=&quot;left&quot; /&gt;
&lt;/android.support.v4.widget.DrawerLayout&gt;</code></pre><p>&lt;/android.support.constraint.ConstraintLayout&gt;
3.2 &quot;Open&quot; 버튼 클릭 이벤트 처리.
&quot;Open&quot; 버튼이 클릭되면, Drawer를 여는 코드를 작성합니다.</p>
<p>[STEP-2] &quot;MainActivity.java&quot; - onCreate() 함수에서 &quot;Open&quot; 버튼 클릭 이벤트 작성
public class MainActivity extends AppCompatActivity {</p>
<pre><code>@Override
protected void onCreate(Bundle savedInstanceState) {
    // 코드 계속 ...

    Button buttonOpen = (Button) findViewById(R.id.open) ;
    buttonOpen.setOnClickListener(new Button.OnClickListener() {
        @Override
        public void onClick(View v) {
            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer) ;
            if (!drawer.isDrawerOpen(Gravity.LEFT)) {
                drawer.openDrawer(Gravity.LEFT) ;
            }
        }
    });

    // ... 코드 계속
}</code></pre><p>}
3.3 &quot;Close&quot; 버튼 클릭 이벤트 처리.
&quot;Close&quot; 버튼이 클릭되면, 열려 있는 Drawer를 닫는 코드를 작성합니다.</p>
<p>[STEP-3] &quot;MainActivity.java&quot; - onCreate() 함수에서 &quot;Close&quot; 버튼 클릭 이벤트 작성
public class MainActivity extends AppCompatActivity {</p>
<pre><code>@Override
protected void onCreate(Bundle savedInstanceState) {

    // 코드 계속 ...

    Button buttonClose = (Button) findViewById(R.id.close) ;
    buttonClose.setOnClickListener(new Button.OnClickListener() {
        @Override
        public void onClick(View v) {
            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer) ;
            if (drawer.isDrawerOpen(Gravity.LEFT)) {
                drawer.closeDrawer(Gravity.LEFT) ;
            }
        }
    });

    // ... 코드 계속
}</code></pre><p>}
3.4 &quot;Lock&quot; 체크박스 클릭 이벤트 처리.
&quot;Lock&quot; 체크박스가 클릭되면, Drawer를 잠그는 코드를 작성합니다.</p>
<p>[STEP-4] &quot;MainActivity.java&quot; - onCreate() 함수에서 &quot;Lock&quot; 체크박스 클릭 이벤트 작성
public class MainActivity extends AppCompatActivity {</p>
<pre><code>@Override
protected void onCreate(Bundle savedInstanceState) {

    // 코드 계속 ...

    CheckBox checkboxLock = (CheckBox) findViewById(R.id.lock) ;
    checkboxLock.setOnClickListener(new CheckBox.OnClickListener() {
        @Override
        public void onClick(View v) {
            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer) ;
            if (((CheckBox)v).isChecked()) {
                if (drawer.isDrawerOpen(Gravity.LEFT)) {
                    drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
                } else {
                    drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
                }
            } else {
                drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            }
        }
    });
}</code></pre><p>}
4. 실행 화면
예제 코드를 작성하고 실행하면, 아래 그림과 같은 화면이 표시됩니다.</p>
<p>DrawerLayout 예제 실행 화면</p>
<p>화면의 왼쪽 가장자리에서 오른쪽으로 스와이프(Swipe)하면 Drawer 화면이 열리고, 반대 방향으로 스와이프(Swipe)하거나 Drawer 외 공간을 클릭하면 Drawer가 닫히는 것을 확인할 수 있습니다.</p>
<p>DrawerLayout에서 스와이프로 Drawer 열기 및 닫기</p>
<p>그리고 화면 위의 &quot;Open&quot;, &quot;Close&quot; 버튼을 클릭하면 Drawer가 열리고 닫히는 것을 확인할 수 있습니다.</p>
<p>DrawerLayout에서 버튼으로 Drawer 열기 및 닫기</p>
<p>마지막으로 &quot;Lock&quot; 체크박스를 체크한 상태에서는, 화면을 스와이프(Swipe)해도 Drawer가 열리거나, 닫히지 않은 것을 확인할 수 있습니다. 대신, &quot;Open&quot;, &quot;Close&quot; 버튼을 클릭하는 경우, Drawer는 정상적으로 동작합니다.</p>
<p>아래 동영상을 통해, DrawerLayout 예제의 전체적인 동작 과정을 확인할 수 있습니다.</p>
<ol start="5">
<li>DrawerLayout 사용 시 주의 사항</li>
<li>1 Drawer로 동작하는 자식(Child)의 layout_gravity는 left(start) 또는 right(end)만 지정 가능.
DrawerLayout에서 Drawer가 위치하는 방향은 왼쪽 또는 오른쪽만 지정 가능합니다. 즉, Drawer의 layout_gravity 속성에 지정할 수 있는 값은 &quot;left&quot;(또는 &quot;start&quot;)나 &quot;right&quot;(또는 &quot;end&quot;)만 사용할 수 있는 것이죠. 만약 layout_gravity 값을 &quot;top&quot; 또는 &quot;bottom&quot;을 사용하면 아래와 같은 에러가 발생합니다.</li>
</ol>
<p>java.lang.IllegalStateException: Child android.support.v7.widget.AppCompatTextView{d880155 V.ED..... ......ID 0,0-0,0} at index 2 does not have a valid layout_gravity - must be Gravity.LEFT, Gravity.RIGHT or Gravity.NO_GRAVITY
5.2 layout_gravity 속성 값이 동일한 자식(Child)을 추가할 수 없음.
보통 DrawerLayout에 하나의 Drawer를 만들지만, 오직 하나의 Drawer만 사용할 수 있는 것은 아닙니다. 정확히 말하면, layout_gravity에 지정되는 방향 별로 하나의 Drawer만 지정할 수 있죠. 그래서 만약 layout_gravity 속성 값이 동일한 Drawer가 둘 이상 있으면 에러가 발생합니다.</p>
<pre><code>&lt;android.support.v4.widget.DrawerLayout ...&gt;
    &lt;TextView ...
        android:text=&quot;CONTENTS&quot; /&gt;
    &lt;TextView ...
        android:text=&quot;DRAWER 1&quot;
        android:layout_gravity=&quot;left&quot; /&gt;
    &lt;TextView ...
        android:text=&quot;DRAWER 2&quot;
        android:layout_gravity=&quot;left&quot; /&gt;
&lt;/android.support.v4.widget.DrawerLayout&gt;</code></pre><p>java.lang.IllegalStateException: Child drawer has absolute gravity LEFT but this DrawerLayout already has a drawer view along that edge
5.3 Drawer가 존재하지 않는 방향의 layout_gravity를 여는 경우는 에러 발생.
앞서 &quot;2.4 코드를 통해 Drawer 열기 및 닫기.&quot; 에서, DrawerLayout의 Drawer를 열고 닫을 때, openDrawer()와 closeDrawer() 함수를 사용하는 방법에 대해 설명하였습니다. 그리고 openDrawer()와 closeDrawer() 함수의 파라미터로 gravity가 사용되는 것을 확인했었죠.</p>
<p>그런데 만약, Drawer가 존재하지 않는 방향에 대해, openDrawer() 함수를 사용하여 Drawer 열기를 시도하면 어떻게 될까요?</p>
<pre><code>&lt;android.support.v4.widget.DrawerLayout ...&gt;
    &lt;TextView ...
        android:text=&quot;CONTENTS&quot; /&gt;
    &lt;TextView ...
        android:text=&quot;DRAWER 1&quot;
        android:layout_gravity=&quot;left&quot; /&gt;
&lt;/android.support.v4.widget.DrawerLayout&gt;
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer) ;
drawer.openDrawer(Gravity.RIGHT) ;</code></pre><p>그럼, 아래와 같은 에러가 발생합니다.</p>
<p>java.lang.IllegalArgumentException: No drawer view found with gravity RIGHT</p>
<p>출처 : <a href="https://recipes4dev.tistory.com/139">https://recipes4dev.tistory.com/139</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[공부]]></title>
            <link>https://velog.io/@android_z/%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@android_z/%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Sun, 21 May 2023 08:33:48 GMT</pubDate>
            <description><![CDATA[<p>정보관리기술사</p>
<ul>
<li>기출문제 
1 교 시</li>
</ul>
<ol>
<li>정규분포 특징</li>
<li>메타휴리스틱스(Metaheuristics) </li>
<li>Race Condition</li>
<li>SNN(Spiking Neural Network)</li>
<li>빅데이터 분석도구를 선택하는 원칙 </li>
<li>소프트웨어 품질인증</li>
<li>CAP이론의한계와PACELC(PartitionAvailabilityConsistencyElseLatencyConsistency)이론 </li>
<li>의사결정나무의 지니 지수(Gini Index)와 엔트로피 지수(Entropy Index)</li>
<li>임베디드 소프트웨어 테스트(Embedded Software Test) </li>
<li>스레싱(Thrashing)</li>
<li>빅 엔디언(Big Endian)과 리틀 엔디언(Little Endian) </li>
<li>네트워크 스캐닝(Network Scanning)</li>
<li>파일 슬랙(File Slack)</li>
</ol>
<p>   2 교 시</p>
<ol>
<li>소프트웨어 비용 산정 방법에 대하여 설명하고, 각각의 장·단점을 비교하시오.</li>
<li>포스트 코로나 시대의 지속가능 경영전략으로 ESG(Environmental, Social and Governance) 경영이 각광받고 있다. ESG경영에서 정보기술(IT)의 역할에 대하여 설명하시오.</li>
<li>최근 경제협력개발기구(OECD)에서 2023년부터 부과하기로 합의한 디지털세의 내용과 의미 및 전망에 대하여 설명하시오.</li>
<li>다음 주사위게임 유스케이스(Usecase)에 대하여 작성하시오.</li>
</ol>
<p>1) 개념적 객체 모델(Conceptual Object Model) 2) 시퀀스 다이어그램(Sequence Diagram)
3) 클래스 다이어그램(Class Diagram)
5. 퍼블릭 블록체인(Public Blockchain), 프라이빗 블록체인(Private Blockchain), 하이브리드 블록체인(Hybrid Blockchain)을 비교 설명하시오.
6. 빅데이터 플랫폼 아키텍처 설계를 위한 다음 주제에 대하여 설명하시오. 1) 빅데이터 플랫폼 인프라 구조 설계
2) 빅데이터 데이터 구조 분석 3) 빅데이터 입출력 구조 설계</p>
<p>   3 교 시</p>
<ol>
<li>공공기관의 데이터베이스 표준화지침에서 정의하는 테이블 정의서에 기록될 항목과 항목의 작성 지침에 대하여 설명하시오.</li>
<li>전자정부 웹사이트 UI/UX 설계기준 7가지와 웹접근성, 웹호환성, 웹개방성, 웹최적화에 대해 각각 설명하시오.</li>
<li>최근 SW가 대부분 산업에 적용되면서 소프트웨어 안전이 중요하게 여겨지고 있다. 「소프트웨어 안전진단 가이드(공통분야)」에 따른 소프트웨어 안전성 진단 항목 중 기능동작 정확성 진단의 단계별 절차 및 주요 활동 내용을 설명하시오.</li>
<li>앙상블(Ensemble) 모형의 Bagging과 Boosting 알고리즘을 설명하시오.</li>
<li>소프트웨어 구조의 평가 및 개선을 위한 소프트웨어 아키텍처 분석 방법에 대하여 다음 내용을 설명하시오.
1) 소프트웨어 아키텍처 분석의 필요성
2) 소프트웨어 아키텍처 정방향 분석과 역방향 분석 개념
3) 소프트웨어 아키텍처 평가 기법 중 ATAM(Architecture Trade-off Analysis Method)</li>
<li>디지털 뉴딜‘데이터 댐’의 핵심인 인공지능 학습용 빅데이터 구축사업의 성공적 추진을 위한 정책과 데이터 품질에 대한 관심도가 높아지고 있다. 다음의 내용을 설명하시오.
1) 인공지능 학습용 데이터의 특성
2) 데이터 획득·정제 방법과 기준
3) 데이터 라벨링(Data Labeling) 및 어노테이션(Annotation) 방식</li>
</ol>
<p>   4 교 시</p>
<ol>
<li>메타버스(Metaverse)는 현실과 가상을 혼합하는 기술이다. 메타버스로 구현된 세계 에는 편리한 면도 있지만 보안적, 사회적으로 많은 문제가 내포되어 있다. 다음과 같은 측면으로 설명하시오.
1) 메타버스의 특징
2) 정보시스템 측면의 메타버스의 보안 위협 3) 메타버스에서 발생할 수 있는 사회적 문제점 4) 안전한 메타버스를 위한 방안</li>
<li>Real Time Scheduling이 갖는 문제 중 우선순위 역전(Priority Inversion)이 있다. Task1, Task2, Task3 순으로 우선순위가 낮다고 할 때 우선순위 역전을 사례기반 으로 설명하고, 우선순위 역전을 해결하기 위한 2가지 기법에 대하여 설명하시오. (단. P, V연산을 사용한다.)</li>
<li>미라이 봇넷(Mirai Botnet)에 대하여 설명하시오. 
1) 미라이 봇넷의 개념
2) IoT 서비스 생애주기별 보안위협 및 해결 방안
3) IoT 공통보안 7대 원칙</li>
<li>VPN(Virtual Private Network)과 Tor에 대하여 설명하시오.</li>
<li>RSA(Rivest-Shamir-Adleman)알고리즘과 DSA(Digital Signature Algorithm)를 비교 하여 설명하시오.</li>
<li>디지털 포렌식(Digital Forensic)의 증거수집기술 중 하나인 파일 카빙(FC :File Carving)에 대하여 설명하시오.
1) 파일 카빙에 대한 개념
2) 파일 카빙의 4종류기법의 특징</li>
</ol>
<p>공인중개사</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GET -> POST]]></title>
            <link>https://velog.io/@android_z/GET-POST</link>
            <guid>https://velog.io/@android_z/GET-POST</guid>
            <pubDate>Wed, 10 May 2023 01:14:03 GMT</pubDate>
            <description><![CDATA[<p><a href="https://nakja.tistory.com/104">https://nakja.tistory.com/104</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Design Pattern]]></title>
            <link>https://velog.io/@android_z/Design-Pattern</link>
            <guid>https://velog.io/@android_z/Design-Pattern</guid>
            <pubDate>Fri, 31 Mar 2023 08:37:13 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>JAVA Design Pattern 복습</p>
</li>
<li><p>Strategy Pattern</p>
<blockquote>
<p>여러 알고리즘을 하나의 추삭적인 접근점(Interface)을 만들어 접근점에서 서로 교환 가능(Deligate)하도록 하는 패턴
<img src="https://velog.velcdn.com/images/android_z/post/66432466-1912-469b-9e1c-889f455a9440/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<pre><code class="language-java">public class main {
    public static void main(String[] args) {
        GameCharacter character = new GameCharacter();
        character.attack();

        character.setWeapon(new Knife());
        character.attack();

        character.setWeapon(new Sword());
        character.attack();
    }
}</code></pre>
<ul>
<li>참고
<a href="https://catsbi.oopy.io/344dbe7b-9774-48fc-9c95-b554e9c1c4bc">https://catsbi.oopy.io/344dbe7b-9774-48fc-9c95-b554e9c1c4bc</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[typescript ]]></title>
            <link>https://velog.io/@android_z/typescript</link>
            <guid>https://velog.io/@android_z/typescript</guid>
            <pubDate>Sun, 18 Dec 2022 06:33:39 GMT</pubDate>
            <description><![CDATA[<p><a href="https://github.com/type-challenges/type-challenges/blob/main/questions/00004-easy-pick/README.md">https://github.com/type-challenges/type-challenges/blob/main/questions/00004-easy-pick/README.md</a></p>
<p>eslint 
규약 만들기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SpringBoot]]></title>
            <link>https://velog.io/@android_z/SpringBoot</link>
            <guid>https://velog.io/@android_z/SpringBoot</guid>
            <pubDate>Sun, 11 Dec 2022 04:28:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/android_z/post/8c675cc4-af1e-4a35-9c95-84577c50ff7b/image.jpg" alt=""></p>
<ul>
<li>Flow<blockquote>
<p><img src="https://velog.velcdn.com/images/android_z/post/b87514a5-c7b6-42e1-8363-00c43fc1660c/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<ul>
<li>Autowiring 동작 과정은?<blockquote>
<p>스프링 서버가 올라갈 때 애플리케이션 컨텍스트가 @Bean이나 @Service, @Controller 등 어노테이션을 이용하여 등록한 스프링 빈을 생성하고, @Autowired 어노테이션이 붙은 위치 또는 생성자, 수정자를 통해 주입한다.</p>
</blockquote>
</li>
</ul>
<ul>
<li><p>DI와 IoC의 차이는?</p>
<blockquote>
<p>DI는 의존관계를 어떻게 가질 것인가에 대한 문제고, IoC는 누가 소프트웨어의 제어권을 갖고 있느냐의 문제다. IoC 컨테이너가 빈을 생성할 때 빈들간의 의존관계를 DI를 통해 해결한다.</p>
</blockquote>
</li>
<li><p><em>DI는 IoC 사용을 필수로 요구하지 않는다는 점을 주의해야 한다.*</em></p>
</li>
<li><p>DI 종류</p>
<blockquote>
<p>1) Constructor
<img src="https://velog.velcdn.com/images/android_z/post/925eb00c-9aa0-4235-a5ae-7d8cafe14e68/image.png" alt="">
2) Field
<img src="https://velog.velcdn.com/images/android_z/post/e3f1f765-991e-474f-bb50-de7a6e3c5137/image.png" alt="">
3) Setter
<img src="https://velog.velcdn.com/images/android_z/post/5bd45047-5d1b-495b-976b-d83494ab3807/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<ul>
<li><p>JPA</p>
<blockquote>
<p>Java 프로그래밍에서 영구적으로 데이터를 저장하기 위해서 필요한 Interface</p>
</blockquote>
</li>
<li><p><em>J*</em>ava <strong>P</strong>ersistence <strong>A</strong>plication Programming Interface</p>
</li>
<li><p>Persistence Context</p>
<blockquote>
<p>Context : 대상의 모든 정보
DB와 동기화된 Java Object Type을 가지며 영속성을 보장해주는 Context</p>
</blockquote>
</li>
<li><p>ORM</p>
<blockquote>
<p>기존 Table을 참고하는 Mapping이 아닌, Java Object를 참고하는 Table 생성</p>
</blockquote>
</li>
<li><p><em>O*</em>bject <strong>R</strong>elational <strong>M</strong>apping
OOP 관점에서 모델링을 가능하게 해주는 기술 (상속, 컴포지션, 연관관계 고려)</p>
</li>
</ul>
<ul>
<li><p>Servlet</p>
<blockquote>
<ul>
<li>Client의 요청에 동적으로 작동</li>
<li>Java Thread를 이용해 동작</li>
<li>HTML 변경 시 재컴파일 필요</li>
<li>Java 코드에 HTML이 들어가있음</li>
<li>HTML을 사용해서 요청에 응답</li>
</ul>
</blockquote>
</li>
<li><p>Servlet Container</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/android_z/post/c35a3a74-d14d-4e4b-a7e4-a0f2f580434b/image.png" alt="">
서블릿 컨테이너 의 가장 중요한 기능은 요청을 올바른 서블릿에 전달해서 처리되도록하고, JVM이 해당 요청을 처리 한 후에는 생성된 결과를 올바른 장소에 동적으로 반환 해주는 것이다.</p>
<ul>
<li>웹 서버와의 통신 지원</li>
<li>Servlet Life Cycle 관리</li>
<li>멀티쓰레드 지원 및 관리</li>
<li>선언적인 보안 관리</li>
</ul>
</blockquote>
</li>
<li><p>Web.xml</p>
<blockquote>
<ul>
<li>ServletContext의 초기 파라미터</li>
<li>Session의 유효시간 설정</li>
<li>Servlet/JSP에 대한 정의</li>
<li>Servlet/JSP 매핑</li>
<li>Mime Type(Multipurpose Internet Mail Extensions) 매핑</li>
</ul>
</blockquote>
</li>
<li><blockquote>
<p>ASCII 표준만으로 지원 못하는 파일에 대한 인코딩 지원</p>
<ul>
<li>Welcome File list</li>
<li>Error Pages 처리</li>
<li>리스너/필터 설정</li>
<li>보안</li>
</ul>
</blockquote>
</li>
</ul>
<p>[참고]</p>
<ul>
<li><a href="https://steady-coding.tistory.com/600">https://steady-coding.tistory.com/600</a></li>
<li><a href="https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC">https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</a></li>
<li><a href="https://getinthere.tistory.com/?page=3">https://getinthere.tistory.com/?page=3</a></li>
<li><a href="https://linkeverything.github.io/springboot/dependency-injection/">https://linkeverything.github.io/springboot/dependency-injection/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTPS]]></title>
            <link>https://velog.io/@android_z/SSL</link>
            <guid>https://velog.io/@android_z/SSL</guid>
            <pubDate>Mon, 15 Aug 2022 06:30:35 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>SSL 인증서 기능</p>
<blockquote>
<p>1) 클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장한다.
2) SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.</p>
</blockquote>
</li>
<li><p>SSL 인증서 내용</p>
<blockquote>
<p>1) 서비스의 정보 (인증서를 발급한 CA, 서비스의 도메인 등등)
2) 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)</p>
</blockquote>
</li>
<li><p>SSL 인증서 방식</p>
<blockquote>
<p>1) 공개키
2) 대칭키</p>
</blockquote>
</li>
<li><p>SSL 적용을 위한 인증서 발급**
=&gt; CA, RA 민간 기업의 인증서 구입
=&gt; 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지를 보장하는 역할</p>
<blockquote>
<ul>
<li>CA/RA 기업 점유율</li>
</ul>
</blockquote>
<p>  1) Symantec (VeriSign, Thawte, Geotrust) with 42.9% market share
  2) Comodo with 26%
  3) GoDaddy with 14%
  4) GlobalSign with 7.7%</p>
</li>
<li><p>SSL 인증서 내용</p>
<blockquote>
<p>1) 서비스의 정보 (인증서를 발급한 CA, 서비스의 도메인 등등)
2) 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)</p>
</blockquote>
</li>
<li><p>SSL 통신 절차</p>
<blockquote>
<ol>
<li>handshake</li>
</ol>
<ul>
<li>1) Client Hello<pre><code>-&gt; 보유 암호화 방식 정보 전송, 랜덤 데이터 전송&lt;br&gt;</code></pre>2) Server Hello</li>
<li><blockquote>
<p>합의 암호화 방식 정보 응답, 인증서 정보(서버 공개키), 랜덤 데이터 정보<br></p>
<pre><code> 3) Client Check</code></pre></blockquote>
</li>
</ul>
</blockquote>
</li>
<li><blockquote>
<p>서버에서 전송한 인증서에 대한 복호화 진행<br>
   4) pre master secret -&gt; master secret -&gt; session key</p>
<pre><code>   4-1) client : 랜덤 데이터 조합 (서버 공개키로 암호화)
   4-2) server : 랜덤 데이터 복호화(서버 비공개키로 복호화)&lt;br&gt;
5) handshake 종료</code></pre></blockquote>
<blockquote>
<ol start="2">
<li>session</li>
</ol>
<ul>
<li>client, server : session key 값으로 수신 데이터 암복호화</li>
</ul>
</blockquote>
<blockquote>
<ol start="3">
<li>session 종료</li>
</ol>
<ul>
<li>session key 폐기</li>
</ul>
</blockquote>
</li>
<li><p>CA 인증서 발급 시 얻는 파일</p>
<blockquote>
<ul>
<li>ssl.key                  : 서버쪽 비공개키</li>
<li>ssl.crt                  : 디지털 인증서</li>
<li>ca.pem                   : ROOT CA 인증서</li>
<li>sub.class1.server.ca.pem : 중계자 인증서</li>
</ul>
</blockquote>
</li>
<li><p>CA 인증서 적용</p>
<blockquote>
<p>1) SSL 모듈 활성화
2) 발급받은 CA 인증서 파일 경로 지정
3) vitualhost(도메인 서비스) 기능 설정 및 활성화 (https 설정 적용)</p>
</blockquote>
</li>
</ul>
<p><a href="https://opentutorials.org/course/228/4894">https://opentutorials.org/course/228/4894</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Dev]Android Subscription]]></title>
            <link>https://velog.io/@android_z/Android-Subscription</link>
            <guid>https://velog.io/@android_z/Android-Subscription</guid>
            <pubDate>Sun, 20 Mar 2022 02:34:25 GMT</pubDate>
            <description><![CDATA[<p><a href="https://developer.android.com/google/play/billing/subscriptions?hl=ko">https://developer.android.com/google/play/billing/subscriptions?hl=ko</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OTT 정책]]></title>
            <link>https://velog.io/@android_z/OTT-%EC%A0%95%EC%B1%85</link>
            <guid>https://velog.io/@android_z/OTT-%EC%A0%95%EC%B1%85</guid>
            <pubDate>Sun, 20 Mar 2022 02:24:43 GMT</pubDate>
            <description><![CDATA[<ul>
<li>넷플릭스</li>
<li><em>다른 사람 대신 넷플릭스 계정을 어떻게 만드나요?*</em>
<a href="https://help.netflix.com/ko/node/2083">https://help.netflix.com/ko/node/2083</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[INFO]Google Play Commission]]></title>
            <link>https://velog.io/@android_z/Google-Play</link>
            <guid>https://velog.io/@android_z/Google-Play</guid>
            <pubDate>Sun, 20 Mar 2022 02:20:06 GMT</pubDate>
            <description><![CDATA[<p>Google Play 결제 시스템 또는 추가 결제 시스템(아래에 정의됨)을 통해 판매되는 앱 및 인앱 상품에는 결제 정책에 따라 서비스 수수료가 부과됩니다.</p>
<p>2022년 1월 1일부터 적용되는 서비스 수수료 정보:</p>
<p>15% 서비스 수수료 등급에 등록된 개발자에게 부과되는 서비스 수수료는 다음과 같습니다.
매년 첫 100만 달러(USD)의 수익: 15% 
매년 100만 달러(미화)를 초과하는 수익: 30%
15% 서비스 수수료 등급에 등록되지 않은 개발자에게 부과되는 서비스 수수료는 30%입니다.
정기 결제 이용자가 구매하여 <strong>자동 갱신되는 정기 결제 제품의 서비스 수수료는 15%</strong>입니다.
2021년 12월 18일부터 대한민국 이용자와의 거래에 Google Play 결제 시스템 외에 개발자 제공 인앱 결제 시스템을 제공하는 개발자의 경우, 결제 정책 및 관련 서비스 약관(&#39;추가 결제 시스템&#39;)에 따라 추가 결제 시스템을 사용한 거래에는 Google Play의 결제 시스템을 통한 거래에 적용되는 서비스 수수료에서 4% 인하된 서비스 수수료가 적용됩니다</p>
<p><a href="https://support.google.com/googleplay/android-developer/answer/112622?hl=ko">https://support.google.com/googleplay/android-developer/answer/112622?hl=ko</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[INFO]OTT]]></title>
            <link>https://velog.io/@android_z/OTT</link>
            <guid>https://velog.io/@android_z/OTT</guid>
            <pubDate>Sat, 19 Mar 2022 07:36:36 GMT</pubDate>
            <description><![CDATA[<p>[종류]</p>
<ul>
<li><p>넷플릭스 NETFLIX </p>
</li>
<li><blockquote>
<p>2억2000만명,15.49$, 국내 MAU 1097만 명
<del>-&gt; 프로필 추가, 월 2.99달러</del></p>
</blockquote>
</li>
<li><p>디즈니+ DISNEY+ </p>
</li>
<li><blockquote>
<p>, 7.99$</p>
</blockquote>
</li>
<li><p>HBO Max </p>
</li>
<li><blockquote>
<p>,14.99$</p>
</blockquote>
</li>
<li><p>웨이브 WAVVE </p>
</li>
<li><blockquote>
<p>, , 국내 MAU 286만 명</p>
</blockquote>
</li>
<li><p>아마존 프라임 비디오 PRIME VIDEO </p>
</li>
<li><p>애플TV+ APPLE TV+ </p>
</li>
<li><p>시즌 SEEZN </p>
</li>
<li><p>티빙 TVING </p>
</li>
<li><blockquote>
<p>, , 국내 MAU 257만 명</p>
</blockquote>
</li>
<li><p>왓챠 WATCHA </p>
</li>
<li><p>쿠팡플레이 COUPANG PLAY </p>
</li>
<li><p>무비 MUBI </p>
</li>
</ul>
<p>[국내 점유율]
<img src="https://images.velog.io/images/android_z/post/7bcded38-b8b0-4a60-800f-04c4253de7de/image.png" alt=""></p>
<p>[미국 점유율]
<img src="https://images.velog.io/images/android_z/post/b042d9ad-f7ce-49a1-9faf-ed509acd45b7/image.png" alt=""></p>
<p>[참조]
미국 점유율
<a href="https://www.edaily.co.kr/news/read?newsId=01400566632264960&amp;mediaCodeNo=257">https://www.edaily.co.kr/news/read?newsId=01400566632264960&amp;mediaCodeNo=257</a></p>
<p>종류
<a href="https://www.wkorea.com/2021/12/03/ott%EC%9D%98-%EB%82%9C-%EC%86%8D%EC%97%90/">https://www.wkorea.com/2021/12/03/ott%EC%9D%98-%EB%82%9C-%EC%86%8D%EC%97%90/</a></p>
<p>구독자수
<a href="https://www.edaily.co.kr/news/read?newsId=01400566632264960&amp;mediaCodeNo=257">https://www.edaily.co.kr/news/read?newsId=01400566632264960&amp;mediaCodeNo=257</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DB]]></title>
            <link>https://velog.io/@android_z/DB</link>
            <guid>https://velog.io/@android_z/DB</guid>
            <pubDate>Sun, 30 Jan 2022 02:57:14 GMT</pubDate>
            <description><![CDATA[<p>Index</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DOM]]></title>
            <link>https://velog.io/@android_z/DOM</link>
            <guid>https://velog.io/@android_z/DOM</guid>
            <pubDate>Sat, 07 Aug 2021 06:30:34 GMT</pubDate>
            <description><![CDATA[<p>Document Object Model</p>
<blockquote>
<p>HTML, XML 문서의 프로그래밍 interface </p>
</blockquote>
<blockquote>
<p>API (web or XML page) = DOM + JS (scripting language)</p>
</blockquote>
<blockquote>
<p>웹 페이지를 수정하거나 생성하는데 사용되는 모든 property, method, event 들은 objects 로 구성된다. </p>
</blockquote>
<blockquote>
<p>문서(document) 와 문서의 요소(element) 에 접근하기 위해 DOM 이 사용되었다. </p>
</blockquote>
<p><strong>구성</strong>  </p>
<p>1) Object
  window, document, element</p>
<p>2) Interface
document.getElementById(id)
document.getElementsByTagName (en-US)(name)
document.createElement(name)
parentNode.appendChild (en-US)(node)
element.innerHTML (en-US)
element.style (en-US).left
element.setAttribute (en-US)
element.getAttribute
element.addEventListener (en-US)
window.content (en-US)
window.onload (en-US)
window.dump (en-US)
window.scrollTo (en-US)</p>
<p><strong>Object Type</strong>
<img src="https://images.velog.io/images/android_z/post/8b2b175a-de9b-46f0-ae21-91d0389f70b7/image.png" alt=""></p>
<p><a href="https://developer.mozilla.org/ko/docs/Web/API/Document_Object_Model/Introduction">https://developer.mozilla.org/ko/docs/Web/API/Document_Object_Model/Introduction</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[카드 업무]]></title>
            <link>https://velog.io/@android_z/%EC%B9%B4%EB%93%9C-%EC%97%85%EB%AC%B4</link>
            <guid>https://velog.io/@android_z/%EC%B9%B4%EB%93%9C-%EC%97%85%EB%AC%B4</guid>
            <pubDate>Sat, 07 Aug 2021 05:20:41 GMT</pubDate>
            <description><![CDATA[<p>모집 </p>
<p>심사</p>
<p>발급</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vue 활용]]></title>
            <link>https://velog.io/@android_z/Vue-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@android_z/Vue-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Sat, 07 Aug 2021 05:13:54 GMT</pubDate>
            <description><![CDATA[<p>공식
<a href="https://kr.vuejs.org/v2/api/">https://kr.vuejs.org/v2/api/</a>
<a href="https://kr.vuejs.org/v2/style-guide/">https://kr.vuejs.org/v2/style-guide/</a></p>
<p>강의</p>
<ol>
<li><a href="https://vueschool.io/?friend=vuejs&amp;utm_source=Vuejs.org&amp;utm_medium=Link&amp;utm_content=Navbar%20Dropdown">https://vueschool.io/?friend=vuejs&amp;utm_source=Vuejs.org&amp;utm_medium=Link&amp;utm_content=Navbar%20Dropdown</a></li>
<li><a href="https://www.vuemastery.com/courses/">https://www.vuemastery.com/courses/</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vue Infinite Loading]]></title>
            <link>https://velog.io/@android_z/Vue-Infinite-Loading</link>
            <guid>https://velog.io/@android_z/Vue-Infinite-Loading</guid>
            <pubDate>Sat, 31 Jul 2021 02:20:54 GMT</pubDate>
            <description><![CDATA[<p><a href="https://cntechsystems.tistory.com/58">https://cntechsystems.tistory.com/58</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[css]]></title>
            <link>https://velog.io/@android_z/css</link>
            <guid>https://velog.io/@android_z/css</guid>
            <pubDate>Tue, 27 Jul 2021 09:25:31 GMT</pubDate>
            <description><![CDATA[<p><a href="https://studiomeal.com/archives/197">https://studiomeal.com/archives/197</a></p>
<p>block
<img src="https://images.velog.io/images/android_z/post/2697fc41-7a03-4199-96ff-d8b582f10602/image.png" alt=""></p>
<p>flex
abc</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Thread]]></title>
            <link>https://velog.io/@android_z/Thread</link>
            <guid>https://velog.io/@android_z/Thread</guid>
            <pubDate>Thu, 15 Jul 2021 10:19:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/android_z/post/0e36bcb4-904a-4134-9538-079725f10160/image.png" alt=""></p>
<p>정상
<img src="https://images.velog.io/images/android_z/post/e244e825-7aa1-483f-9e1f-b11783df781b/image.png" alt=""></p>
<p>데드락
<img src="https://images.velog.io/images/android_z/post/fec6327c-541e-4b24-8f53-f6b2f1d357e9/image.png" alt=""></p>
<p><a href="https://d2.naver.com/helloworld/10963">https://d2.naver.com/helloworld/10963</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TCP Keelalive]]></title>
            <link>https://velog.io/@android_z/TCP-Keelalive</link>
            <guid>https://velog.io/@android_z/TCP-Keelalive</guid>
            <pubDate>Thu, 08 Jul 2021 04:48:05 GMT</pubDate>
            <description><![CDATA[<p><a href="https://jihooyim1.gitbooks.io/linuxbasic/content/contents/08.html">https://jihooyim1.gitbooks.io/linuxbasic/content/contents/08.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[LoadRunner]]></title>
            <link>https://velog.io/@android_z/LoadRunner</link>
            <guid>https://velog.io/@android_z/LoadRunner</guid>
            <pubDate>Sat, 03 Jul 2021 03:33:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/android_z/post/e6648568-7182-4cfc-87b6-2bbbe3d9d094/Screenshot_20210703-123259_Chrome.png" alt=""></p>
<p><a href="https://helloblog.net/hp-loadrunner-testing/">https://helloblog.net/hp-loadrunner-testing/</a></p>
]]></description>
        </item>
    </channel>
</rss>