<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>balhyo_yunjisang.log</title>
        <link>https://velog.io/</link>
        <description>BalhyoHongsam</description>
        <lastBuildDate>Mon, 01 Dec 2025 01:22:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>balhyo_yunjisang.log</title>
            <url>https://velog.velcdn.com/images/balhyo_yunjisang/profile/b1a12f03-d4ea-4895-ad88-1ad88a08cf85/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. balhyo_yunjisang.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/balhyo_yunjisang" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[첫 연사를 하다 - 제1회 PyAI 심포지움]]></title>
            <link>https://velog.io/@balhyo_yunjisang/%EC%B2%AB-%EC%97%B0%EC%82%AC%EB%A5%BC-%ED%95%98%EB%8B%A4-%EC%A0%9C1%ED%9A%8C-PyAI-%EC%8B%AC%ED%8F%AC%EC%A7%80%EC%9B%80</link>
            <guid>https://velog.io/@balhyo_yunjisang/%EC%B2%AB-%EC%97%B0%EC%82%AC%EB%A5%BC-%ED%95%98%EB%8B%A4-%EC%A0%9C1%ED%9A%8C-PyAI-%EC%8B%AC%ED%8F%AC%EC%A7%80%EC%9B%80</guid>
            <pubDate>Mon, 01 Dec 2025 01:22:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/6bd36196-f886-4155-9406-0b1c6b4adc23/image.png" alt=""></p>
<p>신청했던 제 1회 PyAI 심포지움 연사로 좋은 기회가 되어 세션을 맡게 되었다.
MLOps 플랫폼을 개발하며 느꼈던 생각들과 경험들이 공유하고자 하였고, 
조금 더 유쾌하게 풀어보고자 하여 세션명부터 장난끼 가득하도록 지었다.</p>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/4fae162b-2cf3-4293-864a-d27793776458/image.png" alt=""></p>
<p>제목은 <strong>&quot;고등학생인 내가 MLOps라니 무리무리!! (무리가 아니었다?!)&quot;</strong> 
처음 하게 된 발표이기도 하고, 대단하신 분들도 많을 거 같아 내가 감히 발표를 할 수 있을지 많이 떨려 지원을 고민했지만 좋은 경험으로 삼고자 지원했다.</p>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/ddfd6a46-123d-4b8c-b7b5-e793b888b344/image.png" alt="">
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/ad0a78ab-db25-4fd3-bbf2-306dfdfc07f6/image.png" alt=""></p>
<p>발표한 내용을 짧게 소개하자면,
k8s 기반으로 FastAPI를 사용해서 개발한 MLOps 플랫폼 개발 경험 공유로,</p>
<ul>
<li>FastAPI + Pydantic 기반 Restful API를 설계하며 느낀 타입 안정성과 데이터 유효성</li>
<li>MLFlow로 k8s 내 학습 재현하기</li>
<li>PyTorch와 Tensorflow로 CNN부터 구현하기</li>
<li>LLMOps 파이프라인 구축하기</li>
</ul>
<p>총 4가지 주제를 전달하고자 하였다.</p>
<p>빠르게 Keynote로 발표 자료를 만들고, 대본을 짜는 데 총 하루밖에 안 걸렸다.
하지만 준비할 시간이 많지 않았고 대본도 다 못 외운 채로 발표를 시작하게 되어 땀이 줄줄 나는 걸 느낄 수 있었다.</p>
<p>그렇지만 많은 분들이 주의 깊게 들어주셨고, 운영진 분들도 열심히 잘 챙겨주셔서 좋은 기억으로 남았다.</p>
<p>특히 발표에 대한 질문을 해주시는 게 내 발표를 열심히 들어주신 거 같아 너무나도 감사했다.</p>
<p>뒷풀이로 치킨집으로 이동하여 운영진분들과 식사를 하였는데, 그곳에서도 즐거운 대화를 나눌 수 있었다.</p>
<p>좋은 경험이었고 더욱 성장하여 더 많은 자리에서 발표를 하고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[조건에 맞는 사용자 정보 조회하기]]></title>
            <link>https://velog.io/@balhyo_yunjisang/%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%A7%9E%EB%8A%94-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@balhyo_yunjisang/%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%A7%9E%EB%8A%94-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EB%B3%B4-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 03 Oct 2024 15:24:56 GMT</pubDate>
            <description><![CDATA[<h1 style="text-align:center">조건에 맞는 사용자 정보 조회하기
</h1>

<blockquote>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/164670">문제 링크</a>
난이도 : Lv. 3
카테고리 : String, Date</p>
</blockquote>
<p>중고 거래 게시물을 <code>3건 이상</code> 등록한 사용자의 <code>사용자 ID, 닉네임, 전체주소, 전화번호</code>를 조회하는 SQL문을 작성해야 한다. 
이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력하고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해야 하며 회원 ID를 기준으로 내림차순 정렬한다.</p>
<pre><code>SELECT 
U.USER_ID, U.NICKNAME, U.CITY || &#39; &#39; || U.STREET_ADDRESS1 || &#39; &#39; || U.STREET_ADDRESS2 as 전체주소,
REGEXP_REPLACE(U.TLNO, &#39;(.{3})(.+)(.{4})&#39;, &#39;\1-\2-\3&#39;) 전화번호 
FROM USED_GOODS_USER U,
(SELECT B.WRITER_ID FROM USED_GOODS_BOARD B GROUP BY B.WRITER_ID HAVING COUNT(B.WRITER_ID) &gt;= 3) NEW_B
WHERE U.USER_ID = NEW_B.WRITER_ID
ORDER BY U.USER_ID DESC</code></pre><p><code>REGEXP_REPLACE</code> 함수를 사용해 전화번호를 정규화하였다.
<code>Group By</code>와 <code>Having</code> 절을 사용해 <code>USED_GOODS_BOARD</code> 에서 <code>WRITER_ID</code>를 그룹화하여 <code>COUNT</code>한 컬럼의 값이 3 이상인 테이블을 SUBQUERY 로 조회하였고, 만들어진 테이블을 <code>USED_GOODS_USER</code> 테이블과 <code>JOIN</code>하고 <code>USER_ID</code> 기준으로 내림차순 정렬하였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[조건에 부합하는 중고거래 상태 조회하기]]></title>
            <link>https://velog.io/@balhyo_yunjisang/%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%B6%80%ED%95%A9%ED%95%98%EB%8A%94-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EC%83%81%ED%83%9C-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@balhyo_yunjisang/%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%B6%80%ED%95%A9%ED%95%98%EB%8A%94-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EC%83%81%ED%83%9C-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 02 Oct 2024 11:35:11 GMT</pubDate>
            <description><![CDATA[<h1 style="text-align:center;">조건에 부합하는 중고거래 상태 조회하기</h1>

<blockquote>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/164672">문제 링크</a>
난이도 : Lv. 2
카테고리 : String, Date</p>
</blockquote>
<p>해당 문제는 <code>중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태</code>를 조회하는 문제이다. 단,  <code>2022년 10월 5일</code> 에 작성된 게시글만 조회한다. </p>
<p>문제의 조건에 맞도록 DECODE 함수를 사용해 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력하고, 게시글 ID를 기준으로 내림차순 정렬하도록 쿼리를 작성했다.</p>
<pre><code>SELECT BOARD_ID, WRITER_ID, TITLE, PRICE, DECODE(STATUS,&#39;SALE&#39;,&#39;판매중&#39;,&#39;RESERVED&#39;,&#39;예약중&#39;,&#39;DONE&#39;,&#39;거래완료&#39;) STATUS FROM USED_GOODS_BOARD
WHERE TO_CHAR(CREATED_DATE, &#39;YYYY-MM-DD&#39;) LIKE &#39;2022-10-05&#39; ORDER BY BOARD_ID DESC</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[조건에 부합하는 중고거래 댓글 조회하기]]></title>
            <link>https://velog.io/@balhyo_yunjisang/%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%B6%80%ED%95%A9%ED%95%98%EB%8A%94-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EB%8C%93%EA%B8%80-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@balhyo_yunjisang/%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%B6%80%ED%95%A9%ED%95%98%EB%8A%94-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EB%8C%93%EA%B8%80-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 02 Oct 2024 11:26:15 GMT</pubDate>
            <description><![CDATA[<h1 style="text-align:center;">조건에 부합하는 중고거래 댓글 조회하기</h1>

<blockquote>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/164673">문제 링크</a>
난이도 : Lv. 1
카테고리 : SELECT</p>
</blockquote>
<p>해당 문제는 <code>22년 10월에 작성된 글</code>, <code>댓글 작성일 기준 오름차 정렬, 댓글 작성일이 같다면 제목 기준 오름차 정렬</code> 라는 조건을 만족하며 게시글 제목, <code>게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일</code>을 검색하는 문제이다.</p>
<p>TO_CHAR 을 통해 Date 형식을 Format 하였고, BOARD_ID 기준으로 Join 하여 Where 절에서
조건에 맞추어 쿼리를 작성하였다.</p>
<pre><code class="language-Oracle">SELECT B.TITLE TITLE, B.BOARD_ID BOARD_ID, R.REPLY_ID REPLY_ID, R.WRITER_ID WRITER_ID, R.CONTENTS CONTENTS, TO_CHAR(R.CREATED_DATE, &#39;YYYY-MM-DD&#39;) CREATED_DATE
FROM USED_GOODS_BOARD B, USED_GOODS_REPLY R
WHERE B.BOARD_ID = R.BOARD_ID and TO_CHAR(B.CREATED_DATE, &#39;YYYY-MM&#39;) LIKE &#39;2022-10%&#39; ORDER BY R.CREATED_DATE, B.TITLE</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[UI 테스트]]></title>
            <link>https://velog.io/@balhyo_yunjisang/UI-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@balhyo_yunjisang/UI-%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Mon, 19 Aug 2024 04:08:51 GMT</pubDate>
            <description><![CDATA[<h1 id="1-사용성-테스트-계획하기">1. 사용성 테스트 계획하기</h1>
<h2 id="사용성-테스트-계획하기">사용성 테스트 계획하기</h2>
<h3 id="사용자-인터페이스--user-interface--ui-">사용자 인터페이스 ( User Interface , UI )</h3>
<p><strong>사용자 인터페이스</strong> 는 <strong>사용자와 시스템 간의 상호작용이 원활하게 이뤄지도록 도와주는 장치나 소프트웨어</strong>를 의미한다</p>
<p>인터페이스의 종류</p>
<ul>
<li>하드웨어 인터페이스</li>
<li>소프트웨어 인터페이스</li>
<li>사용자 인터페이스</li>
</ul>
<h3 id="ui--user-interface---ux--user-experience-">UI ( User Interface ) / UX ( User Experience )</h3>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/30b59397-2776-426f-ba25-7ecc9b1ade5f/image.png" alt=""></p>
<p>UI : 사람들이 제품과 상호작용할 때 무엇을 사용하는가? ( 기술적인 것 )
UX : 사람들이 제품을 사용할 때 무엇을 느끼는가? ( 감성적인 것 )</p>
<h3 id="사용자-인터페이스의-세가지-분야">사용자 인터페이스의 세가지 분야</h3>
<ol>
<li>** 정보 제공과 전달 ** 을 위한 물리적 제어에 관한 분야</li>
<li>콘텐츠의 ** 상세적인 표현, 전체적인 구성 ** 에 관한 분야</li>
<li>모든 사용자가 ** 편리하고 간편하게 사용 ** 하도록 하는 기능에 관한 분야</li>
</ol>
<h3 id="사용자-인터페이스의-구분">사용자 인터페이스의 구분</h3>
<ul>
<li>CLI ( Command Line Interface ) : 명령과 출력이 텍스트 형태로 이뤄지는 인터페이스</li>
<li>GUI ( Graphical User Interface ) : 아이콘이나 메뉴를 마우스로 선택하여 작업을 수행하도록 하는 그래픽 환경의 인터페이스</li>
<li>NUI ( Natural User Interface ) : 사용자의 말이나 행동으로 기기를 조작하는 인터페이스</li>
<li>OUI ( Organic User Interface ) : 자연 그대로의 상태 특성을 반영한 장치 제어 인터페이스</li>
</ul>
<h4 id="사용자-인터페이스의-발전-과정">사용자 인터페이스의 발전 과정</h4>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/6f90fb36-b69a-4bbd-ab2a-5abdf14b1c70/image.png" alt=""></p>
<h4 id="cli-와-gui-비교">CLI 와 GUI 비교</h4>
<table>
<thead>
<tr>
<th>비교사항</th>
<th>CLI</th>
<th>GUI</th>
</tr>
</thead>
<tbody><tr>
<td>기본 사항</td>
<td>명령어를 통한 입력</td>
<td>창, 스크롤, 이미지 등을 통한 입력</td>
</tr>
<tr>
<td>사용 장비</td>
<td>키보드</td>
<td>마우스, 키보드</td>
</tr>
<tr>
<td>메모리 소비</td>
<td>낮음</td>
<td>높음</td>
</tr>
<tr>
<td>속도</td>
<td>빠름</td>
<td>느림</td>
</tr>
<tr>
<td>작업 수행 난이도</td>
<td>어려움</td>
<td>쉬움</td>
</tr>
</tbody></table>
<h3 id="사용자-인터페이스의-기본-원칙">사용자 인터페이스의 기본 원칙</h3>
<table>
<thead>
<tr>
<th>원칙</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td><strong>직관성</strong></td>
<td>누구나 ** 쉽게 이해하고 사용 ** 할 수 있어야 함</td>
</tr>
<tr>
<td><strong>유효성</strong></td>
<td>사용자의 ** 목적을 정확하고 완벽하게 달성 ** 해야 함</td>
</tr>
<tr>
<td><strong>학습성</strong></td>
<td>누구나 ** 쉽게 배우고 익힐 수 ** 있어야 함</td>
</tr>
<tr>
<td><strong>유연성</strong></td>
<td>사용자의 ** 요구사항을 최대한 수용하고 실수를 최소화 ** 해야 함</td>
</tr>
</tbody></table>
<h3 id="ui-테스트--사용성-테스트-usability-test-">UI 테스트 ( 사용성 테스트, Usability Test )</h3>
<blockquote>
<p>** 사용성 ** : 사용자와 컴퓨터 사이에 발생하는 어떠한 행위에 대하여 사용자가 쉽게 배우고 사용할 수 있으며, 향후 다시 사용하고 싶은 정도를 나타냄</p>
</blockquote>
<p>UI 테스트 : 시스템에 구현된 UI를 일반 사용자가 사용하면서 ** 문제점이나 개선점을 도출해내는 방식의 테스트 **</p>
<h4 id="사용성-테스트의-목적">사용성 테스트의 목적</h4>
<ul>
<li>제품의 완성도, 효율성 등을 확인하고, 향상시키기 위해 수행</li>
<li>요구사항의 반영 여부를 점검</li>
<li>새로운 요구사항을 소프트웨어 구현 과정에 반영</li>
</ul>
<h3 id="사용성-테스트-기법-선정">사용성 테스트 기법 선정</h3>
<h4 id="휴리스틱-평가--heuristic-evaluation-">휴리스틱 평가 ( Heuristic evaluation )</h4>
<ul>
<li>최소 3명 이상의 디자인 전문가가 ** 사전에 작성한 원칙에 따라 제품을 평가 ** 하는 기법</li>
<li>** 전문가의 능력 ** 에 따라 ** 평가 시간이나 수준 ** 이 달라짐</li>
<li>** UI 구현 정도에 관계없이 평가가 가능함 **</li>
</ul>
<h4 id="페이퍼-프로토타입--paper-prototype-">페이퍼 프로토타입 ( Paper Prototype )</h4>
<ul>
<li>종이나 ** 해당 서비스를 간단하게 만들어 실제 구현되는 경험을 표현** 하고, 이를 이용하여 테스트하는 평가 방법</li>
<li>프로토타입 작성 시 포함되어야 할 ** 중요사항을 체크리스트 ** 로 작성함</li>
<li>프로토타입의 가장 빠른 방법으로 ** 제품의 전반적인 컨셉과 흐름 ** 을 잘 보여줌</li>
</ul>
<h4 id="선호도--preference--평가">선호도 ( Preference ) 평가</h4>
<ul>
<li>&quot;A보다 B가 더 좋다&quot; 와 같은 선호도에 따른 영향을 주는 속성을 파악하여 예측하기 위한 기법</li>
</ul>
<h4 id="성능--performance--평가">성능 ( Performance ) 평가</h4>
<ul>
<li>개발의 마지막 단계에서 제품의 학습성, 효율성, 기억 용이성, 오류, 만족도에 대한 평가</li>
</ul>
<blockquote>
<ol>
<li>학습성 : 쉽게 학습할 수 있는가?</li>
<li>효율성 : 일단 학습하면 매번 신속하게 사용할 수 있는가?</li>
<li>기억용이성 : 사용한 기능을 능숙하게 다시 수행할 수 있는가?</li>
<li>오류 : 오류가 적고, 사용자가 상황을 쉽게 극복할 수 있는가?</li>
<li>만족도 : 사용하는 것이 즐겁고 만족스러운가?</li>
</ol>
</blockquote>
<h2 id="테스트-환경-구축">테스트 환경 구축</h2>
<h3 id="사용자-테스트-기법-선정하기-수행-절차">사용자 테스트 기법 선정하기 수행 절차</h3>
<p>1.** UI 테스트 인식 공유** : UI 테스트의 목적, 필요성, 중요성에 대해서 이해 관계자들 간 인식 공유
2. <strong>UI 테스트 내용 파악</strong> : 테스트 대상의 계획, 요구분석, 콘셉트 기획 등 단계별 세부내용 파악
3. <strong>UI 테스트 기법 이해</strong> : 다양한 UI 테스트 기법에 대한 조사 및 이해
4. <strong>UI 테스트 기법 선정</strong> : 구현된 UI를 테스트하기에 가장 적절한 기법을 선정</p>
<h3 id="테스트-환경-구축-수행-절차">테스트 환경 구축 수행 절차</h3>
<ol>
<li>** 테스트 목표 설정 **<ol>
<li>구현된 UI의 사용성 테스트의 주요 과제와 목표를 설정하고, 테스트 환경 구축의 필요성 및 중요성에 대해서 인식을 공유하고, 중요 테스트 항목을 정리</li>
</ol>
</li>
<li>** 테스트 항목 정의 **<ol>
<li>구현된 UI의 사용성 테스트에 대해서 일반적으로 검증해야 하는 주요 항목 검증과 테스트 환경 구축 시 고려해야 할 사항에 대해서 정리</li>
</ol>
</li>
<li>** 테스트 참여자 확보 **<ol>
<li>구현된 UI의 사용성 테스트에 참여할 테스트 참여자를 확보</li>
</ol>
</li>
<li>** 테스트 룸 설정 **<ol>
<li>사용성 테스트를 실시하기 위한 물품 준비할 때 고려해야 할 사항을 정리</li>
</ol>
</li>
<li>** 테스트 환경 설정 **<ol>
<li>사용성 테스트 실시 시 사용하는 서류, 장비 및 비품 등을 준비</li>
<li>UI 사용성 테스트를 위한 장비 및 비품 등을 준비하기 위해 체크 리스트를 작성</li>
</ol>
</li>
<li>** 테스트 인원 구성 **<ol>
<li>구현된 UI의 사용성 검증을 위한 사용성 테스트 진행 인원을 구성</li>
<li>사용성 테스트에 참여하여 테스트를 진행하는 인원 선정 기준, 운영 기준을 마련</li>
<li>테스트 진행자, 기록 담당자, 시간 기록 담당자, 비디오 녹화 담당자, 테스트 관찰자 선정</li>
</ol>
</li>
</ol>
<h3 id="사용성-테스트-절차">사용성 테스트 절차</h3>
<ol>
<li>계획과 준비<ul>
<li>테스트 목표의 설정</li>
<li>테스크의 작성</li>
<li>테스트 참여자 확보</li>
<li>테스트 장비/재료 준비</li>
<li>테스트 룸의 환경 설정</li>
</ul>
</li>
<li>테스트<ul>
<li>테스트 목적 설명</li>
<li>테스크 방법의 설정</li>
<li>테스트 ( 테스크 ) 실시</li>
<li>테스트 참여자 질문</li>
<li>설문조사 실시</li>
</ul>
</li>
<li>분석<ul>
<li>테스트 결과의 분석</li>
<li>개선 제안서의 제출</li>
</ul>
</li>
</ol>
<h3 id="사용성-테스트-계획서의-구성안">사용성 테스트 계획서의 구성안</h3>
<ol>
<li>사용성 테스트 개요<ul>
<li>사용성 테스트에 대한 개요에 대해서 작성함</li>
</ul>
</li>
<li>사용성 테스트 목적<ul>
<li>과제에 포함되어야 하는 주요 이슈를 정리하여 작성함</li>
</ul>
</li>
<li>사용자 프로파일<ul>
<li>어떠한 사용자를 사용성 테스트에 참여시킬지에 대해서 작성함</li>
</ul>
</li>
<li>사용성 테스트 디자인<ul>
<li>사용성 테스트를 어떻게 실시할 것인지에 대한 방법론을 작성함</li>
</ul>
</li>
<li>사용성 테스트 진행 순서<ul>
<li>오리엔테이션 =&gt; 배경 =&gt; 과제 시작 =&gt; 테스트 체험 설문조사 =&gt; 참가자 면담</li>
</ul>
</li>
<li>결과 요약<ul>
<li>어떻게 결과를 취합할 것인지, 어떠한 결과 데이터를 수집할 것인지 기술</li>
</ul>
</li>
<li>개선안 보고<ul>
<li>개선안을 무엇을 기초로 작성할 것인지, 어떠한 내용들을 포함할 것인지 기술</li>
</ul>
</li>
</ol>
<h4 id="사용성-테스트-계획서-주요-항목">사용성 테스트 계획서 주요 항목</h4>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/3d987579-83c2-44a5-a01b-54fc22952916/image.png" alt=""></p>
<h2 id="사용성-테스트-수행하기">사용성 테스트 수행하기</h2>
<h3 id="사용성-테스트-수행">사용성 테스트 수행</h3>
<h4 id="사용성-테스트-기법-선정-수행-절차">사용성 테스트 기법 선정 수행 절차</h4>
<ol>
<li><p>파일럿 테스트 실시
파일럿 테스트 수행 절차 마련
파일럿 테스트 통한, 실제 테스트 소요시간 예측
문제점 파악 및 유형별 정리, 이해 관계자 공유</p>
</li>
<li><p>사용자 프로필 정의
사용성 테스트 위한, 사용자 프로필의 기준 정의
사용성 테스트 참여 후보자 선정을 위한 인터뷰</p>
</li>
<li><p>사용성 테스트 환경 점검
사용성 테스트 진행 인력의 구성 점검
사용성 테스트에 필요한 장비 및 비품 점검
사용성 테스트에 참여자의 인텨뷰</p>
</li>
<li><p>사용성 테스트 설명
사용성 테스트의 취지, 목적에 대한 설명
사용성 테스트의 일생과 방법에 대한 설명</p>
</li>
<li><p>사용성 테스트 수행
테스트 과제의 순차적 실시
테스트 중 문제점 및 이슈사항 기록
테스트 참여자에 상세 내용 인터뷰
테스트 참여자의 질의응답
테스트 결과 보고 작성</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/89b615a2-b1f4-437c-8dd5-8548e7419c2d/image.png" alt=""></p>
<h3 id="평가-분석서-작성-및-이슈-도출">평가 분석서 작성 및 이슈 도출</h3>
<h4 id="사용성-평가-분석서">사용성 평가 분석서</h4>
<ul>
<li>사용성 테스트의 결과 데이터를 취합하고 분석하여 문서화한 것</li>
<li>분석된 데이터는 가이드 자료로 활용하거나, UI의 수정, 보완 등의 향후 적용 계획에 반영</li>
<li>사용성 평가 분석서로 인해 변경된 설계가 UI 테스트에 적용되어야 함</li>
<li>사용성 평가 분석서에 사용되는 분석 기법</li>
</ul>
<h4 id="사용성-평가-분석서에-사용되는-분석-기법">사용성 평가 분석서에 사용되는 분석 기법</h4>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/5d73570e-c044-4170-8e5c-949893295d8d/image.png" alt=""></p>
<h4 id="사용성-평가-분석서-작성하기-수행-절차">사용성 평가 분석서 작성하기 수행 절차</h4>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/bd8a5a49-b6da-4170-8ceb-29256d2f229f/image.png" alt=""></p>
<h2 id="테스트-결과-보고하기">테스트 결과 보고하기</h2>
<h3 id="ui-개선방안-및-수정계획-수립">UI 개선방안 및 수정계획 수립</h3>
<h4 id="테스트-결과-보고">테스트 결과 보고</h4>
<p>사용성 및 UI 테스트를 통해 도출된 결과에 대해 개선 방안을 마련하고 이를 토대로 수정 계획을 수립하여 수행한 후 작성된 결과 보고서를 관련 부서와 공유하기까지의 과정을 의미</p>
<h4 id="ui-개선-방안-수립하기-수행-절차">UI 개선 방안 수립하기 수행 절차</h4>
<ol>
<li><p>도출된 이슈사항의 이해
 도출된 이슈사항이 발생한 근본적인 원인에 대해서 파악하고, 관련 자료들을 확보하여 정리</p>
<ul>
<li>사용성 테스트를 수행하는 과정에서 도출된 이슈사항의 원인에 대해서 분석</li>
<li>이슈사항이 단기적으로 해결이 가능한 것인지 장기적인 시간이 소요되는 문제인지 파악하고 해결을 위한 방안을 수립</li>
</ul>
<p>도출된 이슈사항들 사이에 밀접한 연관성이 존재하는지에 대한 여부를 우선적으로 파악하여 정리</p>
</li>
<li><p>개선 방안 수립 준비
 UI 개선 방안을 수립하게 된 배경 및 목적에 대해서 정의</p>
<ul>
<li><p>수립 배경 : 사용성 테스트를 통해 도출된 사용자들의 UI 관련 이슈사항을 분석하여, 사용자에게 보다 나은 UI를 제공하기 위해</p>
</li>
<li><p>수립 목적 : 보완사항은 보완하고, 필요없는 사항은 삭제하고, 추가로 필요한 항목은 추가하는 등의 UI 수정 계획의 기반 자료로 활용하기 위해</p>
<p>UI 개선 방안 수립을 위해, 사내외의 UI 관련 전문성과 경험이 있는 인원을 구성</p>
</li>
</ul>
</li>
<li><p>개선 방안 수립</p>
</li>
<li><p>수정 계획 수립</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/fe669ecb-4f3a-41d1-964d-f1283550d3eb/image.png" alt=""></p>
<h3 id="ui-개선-결과-보고서-공유">UI 개선 결과 보고서 공유</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[애플리케이션 테스트 수행]]></title>
            <link>https://velog.io/@balhyo_yunjisang/%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%88%98%ED%96%89</link>
            <guid>https://velog.io/@balhyo_yunjisang/%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%88%98%ED%96%89</guid>
            <pubDate>Mon, 08 Jul 2024 00:38:02 GMT</pubDate>
            <description><![CDATA[<h2 id="애플리케이션-테스트-수행하기">애플리케이션 테스트 수행하기</h2>
<blockquote>
<ul>
<li><a href="#---------------">애플리케이션 테스트 수행하기</a></li>
</ul>
</blockquote>
<ul>
<li><a href="#------">테스트 수행</a><ul>
<li><a href="#-----------------">애플리케이션 테스트의 기본 원리</a></li>
<li><a href="#--------------">애플리케이션 테스트의 개념</a></li>
<li><a href="#-------">테스트의 개요</a><ul>
<li><a href="#------">단위 테스트</a></li>
<li><a href="#------">통합 테스트</a></li>
<li><a href="#-------">시스템 테스트</a></li>
<li><a href="#------">인수 테스트</a></li>
</ul>
</li>
<li><a href="#-----------------">테스트 기반에 따른 테스트 종류</a></li>
<li><a href="#----------">테스트 자동화 도구</a><ul>
<li><a href="#--">배경</a></li>
<li><a href="#-----------">테스트 자동화의 개념</a></li>
<li><a href="#----------">테스트 도구의 장점</a></li>
<li><a href="#----------">테스트 도구의 단점</a></li>
<li><a href="#-----------------">테스트 자동화 수행 시 고려사항</a></li>
<li><a href="#----------------">테스트 도구 평가방법 및 요소</a></li>
<li><a href="#-------------------">테스트 단계를 지원하는 도구의 종류</a></li>
<li><a href="#---------">테스트 수행 절차</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#-----">결함 관리</a><ul>
<li><a href="#------">결함의 정의</a></li>
<li><a href="#----------">결함 관리 프로세스</a><ul>
<li><a href="#1---------">1. 결함 관리 계획</a></li>
<li><a href="#2------">2. 결함 기록</a></li>
<li><a href="#3------">3. 결함 검토</a></li>
<li><a href="#4------">4. 결함 수정</a></li>
<li><a href="#5-------">5. 결함 재확인</a></li>
<li><a href="#6-------------------">6. 결함 상태 추적 및 모니터링 활동</a></li>
<li><a href="#7------------------">7. 최종 결함 분석 및 보고서 작성</a></li>
</ul>
</li>
<li><a href="#-----------">결함의 상태 및 추적</a><ul>
<li><a href="#1--------open-">1. 결함 등록 (Open)</a></li>
<li><a href="#2--------reviewed-">2. 결함 검토 (Reviewed)</a></li>
<li><a href="#3--------assigned-">3. 결함 할당 (Assigned)</a></li>
<li><a href="#4--------resolved-">4. 결함 수정 (Resolved)</a></li>
<li><a href="#5-----------deferred-">5. 결함 조치 보류 (Deferred)</a><ul>
<li><a href="#6---------closed-">6.  결함 종료 (Closed)</a></li>
<li><a href="#7--------clarified-">7. 결함 해제 (Clarified)</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#-----">결함 분류</a><ul>
<li><a href="#------">시스템 결함</a><ul>
<li><a href="#-----------">비정상적인 종료/중단</a></li>
<li><a href="#--------">응답 시간 지연</a></li>
<li><a href="#---------">데이터베이스 에러</a></li>
</ul>
</li>
<li><a href="#-----">기능 결함</a><ul>
<li><a href="#------------">요구사항 미반영/불일치</a></li>
<li><a href="#--------------">부정확한 비즈니스 프로세스</a></li>
<li><a href="#-------">스크립트 에러</a></li>
<li><a href="#-------------">타 시스템 연동 시 오류</a></li>
</ul>
</li>
<li><a href="#gui---">GUI 결함</a><ul>
<li><a href="#--------ui-----">응용 프로그램 UI 비일관성</a></li>
<li><a href="#-----------">부정확한 커서/메시지</a></li>
<li><a href="#-------------">데이터 타입의 표시 오류</a></li>
</ul>
</li>
<li><a href="#-----">문서 결함</a></li>
</ul>
</li>
<li><a href="#------">결함 심각도</a><ul>
<li><a href="#high">High</a></li>
<li><a href="#medium">Medium</a></li>
<li><a href="#low">Low</a></li>
</ul>
</li>
<li><a href="#-------------------">결함에 대한 원인과 개선 방안 도출</a><ul>
<li><a href="#1----------------------">1. 발생한 결함에 대하여 결함 원인을 분석</a></li>
<li><a href="#2----------------------">2. 분석한 원인을 근거로 개선 방안을 도출</a></li>
</ul>
</li>
<li><a href="#--------------">애플리케이션 결함 조치하기</a></li>
</ul>
</li>
<li><a href="#----------">조치 우선순위 결정</a><ul>
<li><a href="#------------">소프트웨어 테스트 기법</a><ul>
<li><a href="#---------">단위 테스트 기법</a></li>
<li><a href="#---------">통합 테스트 기법</a><ul>
<li><a href="#1----------">1. 테스트 설계 기법</a></li>
<li><a href="#2----------">2. 테스트 설계 방법</a></li>
</ul>
</li>
<li><a href="#----------">시스템 테스트 기법</a><ul>
<li><a href="#----------">부하 및 성능테스트</a></li>
<li><a href="#---------">장애 복구 테스트</a></li>
<li><a href="#------">보안 테스트</a></li>
</ul>
</li>
<li><a href="#---------">인수 테스트 기법</a></li>
</ul>
</li>
<li><a href="#---------">결함 관리의 이해</a><ul>
<li><a href="#--------">결함 관련 용어</a><ul>
<li><a href="#---------">결함의 판단 기준</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#--------">결함 조치 관리</a><ul>
<li><a href="#-------------">프로그램 코드 검토 기법</a><ul>
<li><a href="#-------------software-inspection-------">소프트웨어 인스펙션 ( Software Inspection ) 의 개요</a></li>
<li><a href="#--------------------">코드 인스펙션의 프로세스와 수행 내용</a></li>
<li><a href="#-------------">인스펙션과 워크스루 비교</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#-------------">형상 관리 및 구성 요소</a><ul>
<li><a href="#---------------">소프트웨어 형상 관리의 정의</a></li>
<li><a href="#----------------">기준선과 소프트웨어 형상 항목</a><ul>
<li><a href="#---">기준선</a></li>
<li><a href="#--------------sci--">소프트웨어 형상 항목 ( SCI )</a></li>
</ul>
</li>
<li><a href="#------------">형상 관리의 주요 활동</a><ul>
<li><a href="#--------">형상 관리 기능</a></li>
<li><a href="#-----">형상 식별</a></li>
<li><a href="#-----">버전 관리</a></li>
<li><a href="#----------------">변경 통제에 대한 업무별 활동</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="테스트-수행">테스트 수행</h3>
<h4 id="애플리케이션-테스트의-기본-원리">애플리케이션 테스트의 기본 원리</h4>
<ol>
<li><p><strong>완벽</strong>한 테스트 <strong>불가능</strong></p>
</li>
<li><p><strong>결함 집중 ( 파레토 법칙 )</strong>: 애플리케이션의 20% 에 <strong>전체 결함의 80%</strong> 가 집중되어 있다.</p>
</li>
<li><p><strong>살충제 패러독스</strong> : <strong>동일한 테스트케이스로 동일한 테스트를 반복</strong>하면 더 이상 <strong>결함이 반복되지 않는 현상</strong></p>
</li>
<li><p><strong>테스팅 정황 의존</strong> : 소프트웨어의 특징, 테스트 환경, 테스터의 역랑 등의 정황에 따라 테스트 결과가 달라질 수 있다.</p>
</li>
<li><p><strong>오류-부재의 궤변</strong> : 소프트웨어의 결함을 모두 제거해도 <strong>사용자의 요구 사항</strong>을 만족시킬 수 없으면 소프트웨어의 품질이 높다고 할 수 없다.</p>
</li>
<li><p>테스트와 위험은 <strong>반비례</strong>한다.</p>
</li>
<li><p>테스트의 <strong>점진적 확대</strong></p>
</li>
<li><p>테스트의 <strong>별도 팀 수행</strong></p>
</li>
</ol>
<hr>
<h4 id="애플리케이션-테스트의-개념">애플리케이션 테스트의 개념</h4>
<ul>
<li><strong>Validation</strong> : <strong>사용자 입장</strong> 에서 개발한 소프트웨어가 <strong>고객의 요구사항에 맞게 구현되었는지를 확인</strong>하는 것</li>
<li><strong>Verification</strong> : <strong>개발자 입장</strong>에서 개발한 <strong>소프트웨어 명세서에 맞게 만들어졌는지 점검</strong>하는 것</li>
</ul>
<hr>
<h4 id="테스트의-개요">테스트의 개요</h4>
<p>테스트 과정에 필요한 역할은 <strong>소프트웨어 아키텍트</strong> 와 <strong>테스트 매니저</strong> 이다.</p>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/a02c6abe-b5eb-47b7-a932-b6c39aad1d1b/image.png" alt="소프트웨어 생명 주기의 V-모델"></p>
<h5 id="단위-테스트">단위 테스트</h5>
<p>컴포넌트 또는 모듈 테스트, 개발자가 개발 과정 중 수행
테스트 가능한 단위로 <strong>작게 분리된 소프트웨어 내에서 결함을 찾고 기능을 점검</strong>하는 행동
구조적 테스트, 기능성 테스트, 리소스 관련 테스트, 강건성 테스트 등 특정 비기능성 테스트 포함
<strong>컴포넌트 명세, 소프트웨어 상세 설계, 데이터 모델 명세 등을 이용</strong>하여 테스트</p>
<table>
<thead>
<tr>
<th align="center">테스트 방법</th>
<th align="center">테스트 내용</th>
<th align="center">테스트 목적</th>
</tr>
</thead>
<tbody><tr>
<td align="center">구조 기반</td>
<td align="center">프로그램 내부 구조 및 복잡도를 검증하는 화이트박스 테스트</td>
<td align="center">제어흐름, 조건 결정</td>
</tr>
<tr>
<td align="center">명세 기반</td>
<td align="center">목적 및 실행 코드 기반의 실행을 통한 블랙박스 테스트</td>
<td align="center">동등분할, 경계값 분석</td>
</tr>
</tbody></table>
<h5 id="통합-테스트">통합 테스트</h5>
<p><strong>모듈 사이의 인터페이스, 통합된 컴포넌트 간의 상호작용</strong>을 테스트, 하나의 프로세스가 완성된 경우 부분적으로 통합 테스트 수행
컴포넌트 간 <strong>인터페이스 테스트</strong>를 하고 <strong>운영체제, 파일 시스템, 하드웨어 또는 시스템 간 인터페이스와 같은 각각 다른 부분과 상호 연동</strong>이 정상적으로 작동하는지 여부를 테스트</p>
<ul>
<li><strong>빅뱅 방식 ( Big Bang )</strong> : <strong>모듈을 한 번에 결합하여 수행</strong>, 소규모 프로그램이나 프로그램의 일부를 테스트하는데 적합하다.</li>
<li><strong>상향 방식 ( Bottom up )</strong> : 시스템 모듈의 <strong>계층 구조의 하위 모델부터 시작하여 상향 모듈로 통합</strong>하는 방법, 각각의 기능이 <strong>정밀하게 수행되는지 테스트할 때 적합하다</strong>. <strong>드라이버</strong>가 필요</li>
<li><strong>하향 방식 ( Top down )</strong> : 상위 모듈부터 시작하여 <strong>점차 하위 모듈 방향으로 통합</strong>하는 방법, 모델 간의 <strong>인터페이스와 시스템의 동작이 정상적으로 동작되는지 빠르게 파악할 때 적합</strong>하다. <strong>스텁</strong>이 필요</li>
<li><strong>샌드위치 방식</strong> : 상향식과 하향식의 장점을 이용하는 방식, 대규모 프로젝트에 적합, 병렬 테스트가 가능하고 시간이 절약, <strong>스텁과 드라이버 모두 필요</strong></li>
<li>Central, Collaboration, 레이어 통합 등</li>
</ul>
<blockquote>
<p><strong>스텁 ( Stub )</strong> : 테스트 중인 모듈이 호출하는 다른 모듈을 일시적으로 대체하는 모듈
<strong>드라이버 ( Driver )</strong> : 모듈이나 시스템을 제어하거나 호출하는 모듈을 대체하는 모듈</p>
</blockquote>
<h5 id="시스템-테스트">시스템 테스트</h5>
<p>통합된 단위 시스템의 기능이 시스템적으로 정상적으로 수행되는지 테스트, 성능 테스트 및 장애 테스트 포함
시스템을 <strong>완벽하게 검사하기 위한 목적 또는 성능 목표를 가지고 테스트</strong>한다.
<strong>실제의 사용자 환경과 유사</strong>하게 시스템 성능, 관련된 고객의 기능, 비기능적인 요구 사항 등이 완벽하게 수행되는지 테스트</p>
<table>
<thead>
<tr>
<th align="center">테스트 방법</th>
<th align="center">테스트 내용</th>
</tr>
</thead>
<tbody><tr>
<td align="center">기능적 요구사항</td>
<td align="center">요구사항 명세서, 비즈니스 절차, 유스케이스 등 명세서 기반의 블랙박스 테스트</td>
</tr>
<tr>
<td align="center">비기능적 요구사항</td>
<td align="center">성능 테스트, 회복 테스트, 보안 테스트, 내부 시스템의 메뉴 구조, 웹페이지의 네비게이션 등의 구조적 요소에 대한 화이트박스 테스트</td>
</tr>
<tr>
<td align="center">##### 인수 테스트</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">최종 사용자와 업무의 이해관계자 등이 수행하는 테스트</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">시스템의 일부 또는 특정한 비기능적 특성에 대해 인수테스트를 통해 확인</td>
<td align="center"></td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th align="center">테스트 종류</th>
<th align="center">테스트 내용</th>
</tr>
</thead>
<tbody><tr>
<td align="center">사용자 인수 테스트</td>
<td align="center">비즈니스 사용자가 시스템 사용의 적절성 여부를 확인</td>
</tr>
<tr>
<td align="center">운영상의 인수 테스트</td>
<td align="center">시스템 관리자가 시스템 인수 시 수행하는 테스트 활동으로 백업/복원 시스템, 재난 복구, 사용자 관리, 정기 점검 등을 확인</td>
</tr>
<tr>
<td align="center">계약 인수 테스트</td>
<td align="center">계약 상의 인수/점검 조건을 준수하는지 여부를 확인</td>
</tr>
<tr>
<td align="center">규정 인수 테스트</td>
<td align="center">정부 지침, 법규, 규정 등 규정에 맞게 개발하였는지 확인</td>
</tr>
<tr>
<td align="center">알파 테스트</td>
<td align="center">개발하는 조직 내 잠재 고객에 의해 테스트 수행</td>
</tr>
<tr>
<td align="center">베타 테스트</td>
<td align="center">실제 환경에서 고객에 의해 테스트 수행</td>
</tr>
</tbody></table>
<hr>
<h4 id="테스트-기반에-따른-테스트-종류">테스트 기반에 따른 테스트 종류</h4>
<table>
<thead>
<tr>
<th align="center">테스트 종류</th>
<th align="center">테스트 내용</th>
<th align="center">세부 기법</th>
</tr>
</thead>
<tbody><tr>
<td align="center">구조기반</td>
<td align="center">소프트웨어 내부의 논리 흐름에 따른 테스트 케이스 작성 및 결함 발견 활동</td>
<td align="center">구문 기반, 결정 기반, 조건 기반, 조건결정 기반, 변경 조건 기반, 멀티 조건 기반 커버리지</td>
</tr>
<tr>
<td align="center">명세기반</td>
<td align="center">사용자의 요구사항 분석서에 주어진 명세를 빠뜨리지 않고 테스트 케이스화</td>
<td align="center">동등 분할, 경계값 분석, 결정 테이블, 상태 전이 테스팅, 유스케이스 테스팅</td>
</tr>
<tr>
<td align="center">경험기반</td>
<td align="center">유사 소프트웨어나 기술에서의 테스터의 경험, 직관, 기술, 능력을 바탕으로 하는 테스트 기법</td>
<td align="center">탐색적 테스팅, 리스크 기반 테스팅</td>
</tr>
</tbody></table>
<hr>
<h4 id="테스트-자동화-도구">테스트 자동화 도구</h4>
<h5 id="배경">배경</h5>
<p>테스트의 정확성을 유지하면서 시간과 비용을 줄일 수 있는 자동화 도구가 매우 중요</p>
<h5 id="테스트-자동화의-개념">테스트 자동화의 개념</h5>
<p>사람이 하던 <strong>반복적인 테스트 절차</strong>를 자동화 도구를 활용하여 준비, 구현, 수행, 분석 등을 스크립트 형태로 구현함으로써, <strong>시간과 인력 투입의 부담을 최소화</strong>하면서 운영 중인 시스템의 모니터링 또는 UI가 없는 서비스의 경우 <strong>정밀한 테스트</strong>가 가능하도록 하는 것</p>
<h5 id="테스트-도구의-장점">테스트 도구의 장점</h5>
<ol>
<li><p>테스트 인력과 시간을 최소화</p>
</li>
<li><p>향상된 요구사항 정의, 성능 및 스트레스 테스트, 품질 측정을 최적화</p>
</li>
<li><p>빌드확인, 회귀, 다중 플랫폼 호환성, 소프트웨어 구성, 기본 테스트의 향상된 테스트 품질을 보장</p>
<h5 id="테스트-도구의-단점">테스트 도구의 단점</h5>
</li>
<li><p>도입 후 테스트 도구 전문가를 양성 또는 고용이 필요, 초기 프로세스 적용에 대한 시간, 비용, 노력에 대한 추가 투자가 필요</p>
</li>
<li><p>비공개 상용 소프트웨어의 경우 고가이며, 인력과 교육에 대한 유지관리 비용이 높음</p>
<h5 id="테스트-자동화-수행-시-고려사항">테스트 자동화 수행 시 고려사항</h5>
</li>
<li><p>테스트 절차를 고려하여 재사용 및 측정이 불가능한 테스트 프로그램은 제외</p>
</li>
<li><p>설계기준을 고려하여 반복적인 빌드에서 스크립트 재사용성이 가능해야 한다.</p>
</li>
<li><p>도구의 한계성으로 모든 수동 테스트 과정을 자동화할 수 있는 도구는 없다. 따라서 용도에 맞는 적절한 도구 사용이 필요하다.</p>
</li>
<li><p>도구 환경 설정과 도구 습득 기간을 고려하여 프로젝트 지연을 방지해야 한다.</p>
</li>
<li><p>테스트 엔지니어의 적절한 투입 시기와 계획을 프로젝트 초기에 수립해야 한다.</p>
<h5 id="테스트-도구-평가방법-및-요소">테스트 도구 평가방법 및 요소</h5>
</li>
<li><p>테스트 도구 평가방법
테스트 도구가 지원하는 모든 사항에 대해 종류별로 나열하고 기록해야 한다.
또한, 테스트에 해당하는 요소에 대한 목표 또는 평균값을 설정하고 설정된 기준 으로 평가한다. 비용을 최소화하기 위해 필수적인 몇 가지 요소만을 고려해야 할 경우 최소한의 요구사항을 만족하는 도구를 선정</p>
</li>
<li><p>테스트 도구 평가요소
테스트 도구의 사용 편의성, 다중 사용자 접속, 결함 추적, 도구 기능성, 보고 능력, 성능 및 스트레스 테스트, 버전 제어, 테스트 계획과 관리, 가격, 테스트 도구 제조사의 지원 능력 등의 객관적이고 수치화되는 항목을 이용하여 평가</p>
</li>
</ol>
<h5 id="테스트-단계를-지원하는-도구의-종류">테스트 단계를 지원하는 도구의 종류</h5>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/27449b27-9c6a-43d9-aa28-b5c0d7f6abbb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/8a17865a-a64c-434d-9bbb-13c9ff89630b/image.png" alt=""></p>
<blockquote>
<p>간트차트 : 프로젝트 일정관리를 위한 바(bar)형태의 도구</p>
</blockquote>
<h5 id="테스트-수행-절차">테스트 수행 절차</h5>
<p style="font-size: 20px">1. 테스트 계획서 확인</p> 
<ol>
  <li>테스트 <strong>목적과 범위</strong> 확인.
        <p>테스트 목적은 <strong>정보시스템 개발 중에 프로그램 기능의 정확성 및 완전성을 검증</strong>하고, <strong>예외 상황 처리의 적절성, UI 및 개발 표준 준수 여부를 확인하여 시스템 품질을 확보</strong>하기 위함</p>
    <p>테스트 전략 문서:  정렬(Align)된 테스트의 목적이 상세하게 기술되어 있다. 테스트 전략 문서가 없는 경우에는 프로젝트의 품질 목표 가운데 테스트를 통해 달성 여부를 평가할 수 있는 항목을 기술하고, 그 외에 사용자 요구사항에 대한 테스트를 통해 특별히 요구되는 목적을 확인한다.</p>
  </li>
  <li> 테스트 <strong>실행 계획을 확인</strong>
    <p>시작 기준과 종료 기준을 확인한다<br>테스트 수행 절차를 확인한다</p>
        <img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/4da5d5ec-26a0-425a-a929-a9b925866582/image.png">
      </li>
    <li>
      <strong>테스트 케이스</strong>를 확인
  <p>테스트 시나리오를 확인하고, 테스트 케이스를 확인<p>
</li>
    <li>
  <p>테스트 케이스 데이터를 확인</p>
</li>
    <li>
          <p>테스트 환경을 확인</p>
    </li>
    </ol>
 <p style="font-size: 20px"> 2. 기능 단위 테스트 수행</p>
  <ol>
  <li>
    <p>서버모듈, 화면 모듈, 데이터입출력, 인터페이스 등의 연계를 통해 업무별 기능을 정의한다.</p>
    <ol style="list-style-type: lower-roman">
      <li><strong>서버 모듈</strong> 정의 : 화면 모듈과 인터페이스에서 받은 데이터를 이용하여 업무 처리를 수행한다</li>
      <li><strong>화면 모듈</strong> 정의 : 화면 설계서와 사용자의 요구사항에 따라 화면에서 등록, 수정, 삭제, 조회된 내용 확인</li>
      <li><strong>데이터 입출력</strong> 정의 : 화면 모듈, 인터페이스, 서버 모듈에서 전달받은 데이터를 가공 및 저장 등</li>
      <li><strong>인터페이스</strong> : 타 시스템 인터페이스에 따른 데이터 및 엔티티 변환의 정확성 확인</li>
    </ol>
  </li>
  <li>
    기능 단위 테스트를 통합하여 테스트 항목을 정의
    <img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/12a15732-0b2b-4a14-9bb2-20e459be68c4/image.png">
    <img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/22977242-ea11-49f7-9aa9-f151a41e7030/image.png
              ">
  </li>
  <li>단위테스트 수행
    <ol style="list-style-type: lower-roman">
      <li>테스트 환경 관련 사항 준비</li>
      <li>입출력 확인</li>
      <li>산술식 또는 단순 계산 결과 확인</li>
      <li>연동 시스템 확인</li>
      <li>배치처리와 인터페이스 확인</li>
      <li>인쇄 및 보고서 확인</li>
    </ol>
  </li>
  <li>통합테스트 수행
    <ol style="list-style-type: lower-roman">
      <li>통합 테스트 환경 구성</li>
      <li>테스트 실행 및 결과 기록</li>
      <li>통합 테스트 종료 여부 평가</li>
    </ol>
  </li>
  <li>
    성능 테스트 수행
    <ol style="list-style-type: lower-roman">
      <li>성능 테스트 계획서 확인</li>
      <li>성능 테스트 수행 후 결과 보고서 작성</li>
    </ol>
  </li>
</ol>

<hr>
<h3 id="결함-관리">결함 관리</h3>
<h4 id="결함의-정의">결함의 정의</h4>
<ol>
<li>프로그램과 명세서의 차이, 업무 내용 불일치</li>
<li>기대 결과와 실제 관찰 결과 간의 차이</li>
<li>시스템이 사용자가 기대하는 타당한 기대치를 만족시키지 못할 때 변경이 필요한 모든 것</li>
</ol>
<h4 id="결함-관리-프로세스">결함 관리 프로세스</h4>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/174b1ff8-9a74-45a0-a6cb-76ad1e31d77c/image.png" alt=""></p>
<h5 id="1-결함-관리-계획">1. 결함 관리 계획</h5>
<p>전체 프로세스에서 결함관리에 대한 일정, 인력, 업무 프로세스를 확보하여 계획을 수립한다</p>
<h5 id="2-결함-기록">2. 결함 기록</h5>
<p>테스터는 발견된 결함에 대한 정보를 결함관리 DB에 기록한다.</p>
<h5 id="3-결함-검토">3. 결함 검토</h5>
<p>등록된 결함에 있어서 주요 내용을 검토하고 결함을 수정할 개발자에게 전달한다.</p>
<h5 id="4-결함-수정">4. 결함 수정</h5>
<p>개발자는 할당된 결함의 프로그램을 수정한다.</p>
<h5 id="5-결함-재확인">5. 결함 재확인</h5>
<p>테스터는 개발자가 수정한 내용을 확인하고 다시 테스트를 수행한다.</p>
<h5 id="6-결함-상태-추적-및-모니터링-활동">6. 결함 상태 추적 및 모니터링 활동</h5>
<p>결함관리 팀장은 결함관리 데이터베이스를 이용하여 대시보드 또는 게시판 형태의 서비스를 제공한다.</p>
<h5 id="7-최종-결함-분석-및-보고서-작성">7. 최종 결함 분석 및 보고서 작성</h5>
<p>발견된 결함에 대한 내용과 이해관계자들의 의견이 반영된 보고서를 작성하고 결함 관리를 종료한다.</p>
<h4 id="결함의-상태-및-추적">결함의 상태 및 추적</h4>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/4a896fb9-0f96-49fe-8361-88aa293cc68d/image.png" alt=""></p>
<h5 id="1-결함-등록-open">1. 결함 등록 (Open)</h5>
<p>테스터와 QA(품질관리) 담당자에 의해 결함이 처음 발견되어 등록되었지만, 아직 분석이 되지 않은 상태</p>
<h5 id="2-결함-검토-reviewed">2. 결함 검토 (Reviewed)</h5>
<p>등록된 결함을 담당 모듈 개발자, 테스터, 프로그램 리더, 품질 관리(QA) 담당자와 검토하는 상태</p>
<h5 id="3-결함-할당-assigned">3. 결함 할당 (Assigned)</h5>
<p>결함의 영향 분석 및 수정을 위해 개발자와 문제 해결 담당자에게 할당된 상태</p>
<h5 id="4-결함-수정-resolved">4. 결함 수정 (Resolved)</h5>
<p>개발자에 의해 결함의 수정이 완료된 상태</p>
<h5 id="5-결함-조치-보류-deferred">5. 결함 조치 보류 (Deferred)</h5>
<p>수정이 필요한 결함이지만 현재 수정이 불가능해서 연기된 상태,
우선순위, 일정 등을 고려하여 재오픈을 준비하는 상태</p>
<h6 id="6--결함-종료-closed">6.  결함 종료 (Closed)</h6>
<p>발견된 결함이 해결되고 테스터와 품질관리(QA) 담당자에 의해 종료 승인을 한 상태</p>
<h6 id="7-결함-해제-clarified">7. 결함 해제 (Clarified)</h6>
<p>테스터, 프로그램 리더, 품질관리(QA) 담당자가 결함을 검토한 결과, 결함이 아니라고 판명된 경우</p>
<h4 id="결함-분류">결함 분류</h4>
<h5 id="시스템-결함">시스템 결함</h5>
<p>비정상적인 종료/중단, 응답시간 지연, 데이터베이스 에러 등 주로 애플리케이션 환경과 데이터베잇 처리에서 발생하는 결함</p>
<h6 id="비정상적인-종료중단">비정상적인 종료/중단</h6>
<p>특정 기능 실행 시 응용 프로그램의 작동 정지, 종료, 시스템 다운이 되는 경우</p>
<h6 id="응답-시간-지연">응답 시간 지연</h6>
<p>응용 프로그램 작동 후 조회 또는 보고서 출력 시 지연되는 경우와 메모리 부족, 하드웨어와 소프트웨어의 비일관성으로 발생되는 경우</p>
<h6 id="데이터베이스-에러">데이터베이스 에러</h6>
<p>응용 프로그램 작동 후 사용자 데이터의 등록, 수정, 삭제, 조회가 정상적으로 작동하는 않은 경우</p>
<h5 id="기능-결함">기능 결함</h5>
<p>사용자의 요구사항 미반영/불일치, 부정확한 비즈니스 프로세스, 스크립트 에러, 타 시스템 연동 시 오류 등 기획, 설계, 업무 시나리오 단계에서 발생된 결함</p>
<h6 id="요구사항-미반영불일치">요구사항 미반영/불일치</h6>
<p>요구사항에 명시된 기능이 응용 프로그램에 구현되지 않은 경우와, 다르게 구현되어 작동하는 경우</p>
<h6 id="부정확한-비즈니스-프로세스">부정확한 비즈니스 프로세스</h6>
<p>기능 자체는 수행되나 내부 프로세스 로직의 문제로 부정확한 결과를 내는 경우</p>
<h6 id="스크립트-에러">스크립트 에러</h6>
<p>특정 기능 실행 시 웹 브라우저에서 스크립트 오류가 발생하는 경우</p>
<h6 id="타-시스템-연동-시-오류">타 시스템 연동 시 오류</h6>
<p>기존 시스템과의 연동을 통해 데이터를 주고받는 과정에서 오류가 발생하는 경우</p>
<h5 id="gui-결함">GUI 결함</h5>
<p>응용 프로그램의 UI 비일관성, 부정확한 커서/메시지, 데이터 타입의 표시 오류 등으로 사용자 화면 설계에서 발생된 결함</p>
<h6 id="응용-프로그램-ui-비일관성">응용 프로그램 UI 비일관성</h6>
<p>프로젝트에서 정의한 UI 표준과 상이하게 구현된 경우</p>
<h6 id="부정확한-커서메시지">부정확한 커서/메시지</h6>
<p>커서의 위치가 입력 대상의 첫 번재 필드에 위치해 있지 않거나, 탭 시퀀스가 순차적으로 동작하지 않는 경우, 각 기능에서 제공하는 메시지 내용이 부정확한 내용을 보여주는 경우</p>
<h6 id="데이터-타입의-표시-오류">데이터 타입의 표시 오류</h6>
<p>입력 필드에 지정된 형식과 다르기 입력해도 저장이 되는 경우와 입력 필드에 유효하지 않은 데이터를 입력했을 때 오류가 나는 경우</p>
<h5 id="문서-결함">문서 결함</h5>
<p>사용자의 온라인/오프라인 매뉴얼의 불일치, 요구사항 분석서와 기능 요구사항의 불일치로 인한 불완전한 상태의 문서의 경우</p>
<h4 id="결함-심각도">결함 심각도</h4>
<h5 id="high">High</h5>
<p>시스템이 중단되어 더 이상 프로세스를 진행할 수 없게 만드는 결함</p>
<ul>
<li>시스템 핵심 요구사항 미구현</li>
<li>시스템 다운</li>
<li>장시간 시스템 응답 지연</li>
<li>시스템 복구 후 데이터 왜곡</li>
</ul>
<h5 id="medium">Medium</h5>
<p>시스템의 흐름에 영향을 미치는 결함</p>
<ul>
<li>부정확한 기능</li>
<li>부정확한 업무 프로세스</li>
<li>데이터 필드 형식의 오류</li>
<li>데이터베이스 에러</li>
<li>보안 관련 오류</li>
</ul>
<h5 id="low">Low</h5>
<p>시스템의 흐름에는 영향을 미치지 않는 결함이나 상황에 맞지 않는 용도와 화면 구성 결함</p>
<ul>
<li>부정확한 GUI 및 메시지</li>
<li>에러 시 메시지 미출력</li>
<li>화면 상의 문법 / 철자 오류</li>
</ul>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/8dcbbb82-8601-44df-9ebd-845cbe1a6343/image.png" alt=""></p>
<hr>
<h4 id="결함에-대한-원인과-개선-방안-도출">결함에 대한 원인과 개선 방안 도출</h4>
<p>테스트 수행 시 발견된 결함에 대한 원인을 유형별로 통합하고 분류
분류된 결함에 대해 <strong>통계적 분석 기법을 적용하여 분석하고 개선 방안을 도출</strong></p>
<h5 id="1-발생한-결함에-대하여-결함-원인을-분석">1. 발생한 결함에 대하여 결함 원인을 분석</h5>
<ol>
<li>테스트 종류 후 결함 데이터 통합</li>
<li>통합된 결함 데이터를 분석하여 유사한 결함 상태로 정리</li>
<li>프로젝트 영역별로 결함 원인을 정의
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/989aed3d-bff5-4663-9c52-4334651d700c/image.png" alt=""></li>
</ol>
<ol start="4">
<li>결함 종류를 식별하기 위한 원인 분석 도구 사용</li>
</ol>
<blockquote>
<p>파레토 다이어그램
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/6bc06cf5-b585-418a-bac3-b6b1f3904bed/image.png" alt=""></p>
</blockquote>
<p>1) 결함의 모든 요소를 목록으로 작성한다.
2) 결함과 관련된 요소들을 측정한다.
3) 결함 수가 가장 높은 순에서 낮은 순으로 작성한다.
4) 결함 항목에 대한 백분율을 계산한다.
5) 자료 값을 이용하여 각 범주를 나타내는 막대를 그린다. 
6) 누적 백분율을 파레토 차트에 표시한다.</p>
<blockquote>
<p>피시본 다이어그램
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/74abc506-9371-433f-bb1a-5bace3adf8d6/image.png" alt=""></p>
</blockquote>
<p>1) 결함의 주요 원인을 확인한다.
2) 결함의 잠재적 원인을 팀원들과 브레인스토밍한다.
3) 결함의 범주를 나누고 항목에 따라 잠재적 원인을 추가한다.
4) 팀원들과 질문을 계속하여 내용을 검증하고, 추가적인 내용을 더 제시하도록 한다.
5) 결함 항목을 검토하고 항목 중에서 가장 가능성이 높은 원인을 팀원들과 브레인스토밍 등의 방법으로 도출하여 작성한다.</p>
<ol start="5">
<li>원인 분석 보고서 작성
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/a0ac6d54-0a03-46e8-9ae4-964a751b7229/image.png" alt=""><h5 id="2-분석한-원인을-근거로-개선-방안을-도출">2. 분석한 원인을 근거로 개선 방안을 도출</h5>
</li>
<li>프로젝트 진행에 영향을 주는 항목에 대해 결함 예방 조치 계획을 수립</li>
<li>결함 예방 조치 수립
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/00a6eda6-7538-4e83-af61-0889ab054085/image.png" alt=""></li>
<li>모든 항목이 종결될 때까지 추적 관리를 수행
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/ec03ea85-abee-47c9-ae0a-b8164e77e46a/image.png" alt=""></li>
<li>QA의 검토를 거쳐 제시된 의견을 전사 품질 관리 조직에게 전달</li>
</ol>
<hr>
<h2 id="애플리케이션-결함-조치하기">애플리케이션 결함 조치하기</h2>
<h3 id="조치-우선순위-결정">조치 우선순위 결정</h3>
<h4 id="소프트웨어-테스트-기법">소프트웨어 테스트 기법</h4>
<h5 id="단위-테스트-기법">단위 테스트 기법</h5>
<ol>
<li>JUnit을 활용한 테스트<blockquote>
<p>Java 환경이라면 대부분 JUnit이라는 단위 테스트 프레임워크를 통해 단위 테스트를 할 수 있어야 한다.</p>
</blockquote>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/c6b4aa3b-f1d9-4923-b3cb-a380a43bf302/image.png" alt=""></p>
<ol start="2">
<li>Mock 테스트</li>
</ol>
<ul>
<li>단위 테스트 시 Mock 객체를 사용하여 테스트하는 기법</li>
<li>특정 기능 또는 모듈에 대한 응답 결과를 미리 정의해놓고 테스트</li>
<li>특정 모듈이나 기능이 완벽히 개발 완료되지 않은 상태에서도 진행 가능</li>
<li>테스트 더블 : 테스트 전용 객체, 테스트를 위해 실제 객체를 대신해서 사용되는 용어
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/90455357-d704-465e-9731-402204720f88/image.png" alt=""><h5 id="통합-테스트-기법">통합 테스트 기법</h5>
주요 목적 : 전체 시스템이 통합 완료될 때까지 단위 시스템 간의 연계성 및 기능 요구사항들을 확인하고, 하드웨어와 소프트웨어 구성 요소 간의 상호 작용을 테스트하는 것</li>
</ul>
<h6 id="1-테스트-설계-기법">1. 테스트 설계 기법</h6>
<p><strong>테스트 설계</strong> : 개발된 소프트웨어나 시스템의 요구사항, 요구사항 명세서, 업무 구조, 시스템 구조 등을 기반으로 <strong>소프트웨어의 어떤 부분을 어떻게 접근하여 테스트할지</strong>에 대한 테스트 상황과 방법을 파악하는 것
<strong>테스트 구현</strong> : 테스트 설계를 체계적으로 구체화시켜 <strong>테스트 케이스를 도출하고 작성</strong>하는 것
<strong>테스트 설계 방법</strong> : <strong>테스트 상황과 방법을 구체화시키기 위한 수단 및 도구</strong></p>
<h6 id="2-테스트-설계-방법">2. 테스트 설계 방법</h6>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/dbc29586-d3c2-415f-a1e9-c342b896ed94/image.png" alt="">
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/05ecf6ec-d201-4b46-81f8-a0c6675d0e77/image.png" alt=""></p>
<h5 id="시스템-테스트-기법">시스템 테스트 기법</h5>
<h6 id="부하-및-성능테스트">부하 및 성능테스트</h6>
<p>동시접속으로 시스템에 많은 요청이 발생될 때 어떻게 가동되는지 확인하는 테스트</p>
<ul>
<li>동시 이용자 수 : TPS * 호출간격(응답시간(Sec)) * 대기시간(Sec)</li>
<li>동시 단말 이용자 : PC 앞에 앉아서 시스템을 이용하는 이용자</li>
<li>액티브 이용자 : 동시에 같은 서비스나 업무를 실행하고 나서 응답을 기다리고 있는 이용자</li>
<li>처리량 : 단위 시간 당 처리하는 건수, 단위는 tps, tpm, tph 를 사용하고, 관점에 따라 두 가지 유형이 있으며 요청을 받는 입장에서 단위 시간 단 요청 건수와 단위 시간당 처리 건수로 구분되어 표현한다.</li>
<li>대기 시간 : 응답을 받은 직후부터 다음 명령 또는 호출할 때까지 사용자가 대기하는 시간</li>
</ul>
<h6 id="장애-복구-테스트">장애 복구 테스트</h6>
<h6 id="보안-테스트">보안 테스트</h6>
<h5 id="인수-테스트-기법">인수 테스트 기법</h5>
<p>최종 사용자가 요구한 기능이 제대로 반영되었는지, 인수 조건에 만족하는지를 테스트하는 기법</p>
<h4 id="결함-관리의-이해">결함 관리의 이해</h4>
<h5 id="결함-관련-용어">결함 관련 용어</h5>
<ul>
<li><p>에러 ( Error ) : 소프트웨어 개발 또는 유지 보수 수행 중에 발생한 부정호가한 결과, 개발자의 실수로 발생한 오타, 개발 명세서의 잘못된 이해, 서브루틴의 기능 오해 등</p>
</li>
<li><p>오류 ( Fault ) : 프로그램 코드 상에 존재하는 것, 비정상적인 프로그램과 정상적인 프로그램 버전 간의 차이로 인하여 발생한다.</p>
</li>
<li><p>실패 ( Failure ) : 정상적인 프로그램과 비정상적인 프로그램의 실행 결과의 차이를 의미, 프로그램 실행 중에 프로그램 실제 실행 결과를 개발 명세서에 정의된 예상 결과와 비교함으로써 발견한다.</p>
</li>
<li><p>결합 ( Defect ) : 버그, 에러, 오류, 실패, 프로그램 실행에 대한 문제점, 프로그램 개선 사항 등의 전체를 포괄하는 용어</p>
<h6 id="결함의-판단-기준">결함의 판단 기준</h6>
</li>
<li><p>기능 명세서에 가능하다고 명시된 동작을 수행하지 않는 경우</p>
</li>
<li><p>기능 명세서에 불가능하다고 명시된 동작을 수행하는 경우</p>
</li>
<li><p>기능 명세서에 명시되어 있지 않은 동작을 수행하는 경우 </p>
</li>
<li><p>기능 명세서에 명시되어 있지 않지만 수행해야 할 동작을 수행하지 않는 경우</p>
</li>
<li><p>테스터의 시각에서 볼 때 문제가 있다고 판단되는 경우</p>
<h3 id="결함-조치-관리">결함 조치 관리</h3>
<h4 id="프로그램-코드-검토-기법">프로그램 코드 검토 기법</h4>
<h5 id="소프트웨어-인스펙션--software-inspection--의-개요">소프트웨어 인스펙션 ( Software Inspection ) 의 개요</h5>
<blockquote>
<p>코드 인스펙션 ( Code Inspection ) 외에도 설계 및 설계 산출물까지 포괄하여 소프트웨어 인스펙션으로 부르기도 한다.</p>
</blockquote>
</li>
</ul>
<p>코드 인스펙션은 매우 효과적인 테스트 방법으로서 어떠한 다른 테스트 방법으로 대체할 수 없다. 상당히 시간이 필요한 작업이며, 통계에 따르면 인스펙션을 적절히 잘 수행하면 포함된 에러의 90%까지 찾아낼 수 있다.</p>
<h5 id="코드-인스펙션의-프로세스와-수행-내용">코드 인스펙션의 프로세스와 수행 내용</h5>
<p>(1) 코드 인스펙션 프로세스
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/2e350f3c-f24a-4e6e-ba03-097b4543a166/image.png" alt=""></p>
<p>(2) 코드 인스펙션 테스크별 수행 내용
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/a05bf7a4-b124-49c2-9266-a77b79fcbbf3/image.png" alt="">
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/3827c282-494f-41d7-825e-a4f449f77586/image.png" alt=""></p>
<h5 id="인스펙션과-워크스루-비교">인스펙션과 워크스루 비교</h5>
<table>
<thead>
<tr>
<th align="center">구분</th>
<th align="center">인스펙션</th>
<th>워크스루</th>
</tr>
</thead>
<tbody><tr>
<td align="center">목적</td>
<td align="center">결함 파악 및 제거</td>
<td>산출물 평가 및 개선</td>
</tr>
<tr>
<td align="center">수행 조건</td>
<td align="center">완성도가 기준 이상일 때</td>
<td>팀이나 관리자의 필요 시</td>
</tr>
<tr>
<td align="center">결함 수정 여부</td>
<td align="center">모든 결함은 제거되어야 함</td>
<td>저자 결정</td>
</tr>
<tr>
<td align="center">변경 사항 검증</td>
<td align="center">진행자가 재작업 결과 확인</td>
<td>저자 결정</td>
</tr>
<tr>
<td align="center">검토자 인원</td>
<td align="center">3 ~ 6명</td>
<td>2 ~ 7 명</td>
</tr>
<tr>
<td align="center">참여자</td>
<td align="center">동료</td>
<td>기술 전문가 및 동료</td>
</tr>
<tr>
<td align="center">검토 인도자</td>
<td align="center">교육받은 진행자</td>
<td>저자</td>
</tr>
<tr>
<td align="center">검토 준비 여부</td>
<td align="center">체크리스트를 이용한 검토</td>
<td>일반적으로 검토 준비하지 않음</td>
</tr>
<tr>
<td align="center">검토 분량</td>
<td align="center">상대적으로 적음</td>
<td>상대적으로 적음</td>
</tr>
<tr>
<td align="center">검토 속도</td>
<td align="center">상대적으로 느림</td>
<td>빠름</td>
</tr>
<tr>
<td align="center">발표자</td>
<td align="center">산출물에 의존도가 높은 사람</td>
<td>저자</td>
</tr>
<tr>
<td align="center">지표 수집 여부</td>
<td align="center">모든 검토자들이 기록함</td>
<td>하지 않음</td>
</tr>
<tr>
<td align="center">보고서</td>
<td align="center">결함 리스트 및 측정 지표</td>
<td>워크스루 보고서</td>
</tr>
<tr>
<td align="center">데이터 측정 여부</td>
<td align="center">필수</td>
<td>권장사항</td>
</tr>
<tr>
<td align="center">체크리스트 사용 여부</td>
<td align="center">사용함</td>
<td>사용하지 않음</td>
</tr>
</tbody></table>
<h3 id="형상-관리-및-구성-요소">형상 관리 및 구성 요소</h3>
<h4 id="소프트웨어-형상-관리의-정의">소프트웨어 형상 관리의 정의</h4>
<ol>
<li>소프트웨어 프로세스의 모든 출력물 정보</li>
<li>컴퓨터 프로그램, 컴퓨터 프로그램 설명 문서, 데이터 등</li>
<li>소프트웨어 프로세스 전반에 걸쳐 소프트웨어 형상의 변경 요인에 대해 소프트웨어 형상을 보호하는 활동</li>
</ol>
<table>
<thead>
<tr>
<th align="center">소프트웨어 형상 관리</th>
<th align="center">소프트웨어 지원</th>
</tr>
</thead>
<tbody><tr>
<td align="center">소프트웨어 엔지니어링 프로젝트 게시에서 소프트웨어 소멸 시점까지의 활동</td>
<td align="center">소프트웨어가 고객에게 인도되고 운영되는 시점에 발생하는 소프트웨어 엔지니어링 활동</td>
</tr>
</tbody></table>
<h4 id="기준선과-소프트웨어-형상-항목">기준선과 소프트웨어 형상 항목</h4>
<h5 id="기준선">기준선</h5>
<p>변경을 통제하게 도와주는 기준선은 정식으로 검토 및 합의된 명세서나 제품 개발의 바탕으로서, 정식의 변경 통제 절차를 통해서만 변경 가능하다</p>
<h5 id="소프트웨어-형상-항목--sci-">소프트웨어 형상 항목 ( SCI )</h5>
<p>소프트웨어 형상과 개발 도구의 합성으로서,  SCI는 개발 단계별로 기준선으로 기준으로 형상 항목을 관리한다.</p>
<h4 id="형상-관리의-주요-활동">형상 관리의 주요 활동</h4>
<h5 id="형상-관리-기능">형상 관리 기능</h5>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/fd6dad78-9a5c-49a1-8b14-bf011e4d32de/image.png" alt=""></p>
<h5 id="형상-식별">형상 식별</h5>
<p>소프트웨어 형상 항목에 대해 식별하고 고유한 이름을 부여하는 활동
<img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/b68320ba-19df-4d99-8ce3-fd7c81988754/image.png" alt=""></p>
<h5 id="버전-관리">버전 관리</h5>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/dba6128b-f6c0-4e59-9cc2-c97764c9f1d5/image.png" alt=""></p>
<h5 id="변경-통제에-대한-업무별-활동">변경 통제에 대한 업무별 활동</h5>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/3ebc9d34-9796-4dcf-bf05-ef2eb2b78310/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[브라우저 렌더링 원리]]></title>
            <link>https://velog.io/@balhyo_yunjisang/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@balhyo_yunjisang/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Sun, 21 Jan 2024 16:32:11 GMT</pubDate>
            <description><![CDATA[<p>웹 브라우저는 인터넷 상에서 웹 페이지를 검색하고 표시해주는 소프트웨어다.
브라우저는 HTML, CSS, JavaScript 등의 웹 기술을 이용하여 웹 페이지를 렌더링하고, 사용자와 상호작용을 가능하게 한다.</p>
<h1 id="💻-브라우저의-구성-요소">💻 브라우저의 구성 요소</h1>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/6fd14c4a-a298-4a2d-bf4b-3a3db13e70db/image.png" alt="브라우저 구성 요소"></p>
<ol>
<li>사용자 인터페이스 ( User Interface )<ul>
<li>사용자 인터페이스는 브라우저에서 웹 페이지를 검색하고 표시하는데 필요한 모든 요소를 포함한다.</li>
<li>대표적인 예로는 url 표시줄, 북마크, 즐겨찾기 등이 있다. 뒤로/앞으로 가기 버튼</li>
</ul>
</li>
</ol>
<ol start="2">
<li>브라우저 엔진 ( Browser Engine )<ul>
<li>브라우저 엔진은 렌더링 엔진과 사용자 인터페이스 사이의 상호작용을 처리한다.    </li>
</ul>
</li>
</ol>
<ol start="3">
<li>렌더링 엔진 ( Rendering Engine )<ul>
<li>랜더링 엔진은 HTML, CSS 코드를 해석하고, 페이지를 렌더링하여 화면에 표시한다.</li>
<li>대표적인 렌더링 엔진으로는 Gecko ( 파이어 폭스 ), Webkit ( 사파리 ), Blink ( 크롬, 엣지 ) 등이 있다.</li>
</ul>
</li>
</ol>
<ol start="4">
<li>통신 ( Networking )<ul>
<li>통신은 HTTP 요청 등을 통해 인터넷에서 리소스를 가져오는데 사용된다.</li>
<li>대표적인 통신 모듈로는 XMLHttpRequest, fetch 등이 있다.</li>
</ul>
</li>
</ol>
<ol start="5">
<li>UI 백엔드 ( UI Backend )<ul>
<li>콤보 박스와 창 같은 기본적인 장치를 그린다. </li>
<li>플랫폼에서 명시하지 않은 일반적인 인터페이스로, OS 사용자 인터페이스 체계를 사용한다.</li>
</ul>
</li>
</ol>
<ol start="6">
<li>자바스크립트 해석기 ( JavaScript Interpreter )<ul>
<li>자바스크립트 해석기는 자바스크립트 코드를 해석하고 실행하는데 사용된다. </li>
</ul>
</li>
</ol>
<ol start="7">
<li>데이터 저장소 ( Data Storage )<ul>
<li>데이터 저장소는 브라우저 내부에 데이터를 저장하거나 웹 사이트와 상호작용할 때 사용된다.</li>
<li>로컬 스토리지 타입과 쿠키 타입으로 나눌 수 있다.</li>
</ul>
</li>
</ol>
<hr>
<h1 id="💻-브라우저-렌더링-과정">💻 브라우저 렌더링 과정</h1>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/17cc2fbe-7965-401c-ae78-8980b636275d/image.png" alt=""></p>
<p>렌더링 엔진이 HTML, CSS, JavaScript로 렌더링할 때 <strong>CRP</strong> (Critical Rendering Path, 중요 렌더링 경로 ) 프로세스를 사용하며 다음 단계들로 이루어진다.</p>
<ol>
<li><p>HTML을 파싱 후, <strong>DOM 트리</strong>를 구축한다.</p>
</li>
<li><p>CSS를 파싱 후, <strong>CSSOM 트리</strong>를 구축한다.</p>
</li>
<li><p>JavaScript를 실행한다.</p>
<ul>
<li>HTML 중간에 스크립트가 있다면 HTML 파싱이 중단된다.</li>
</ul>
</li>
<li><p>DOM과 CSSOM을 조합하여 <strong>렌더트리</strong>를 구축한다.</p>
<ul>
<li><code>display:none</code> 속성과 같이 화면에서 보이지 않고 공간을 차지하지 않는 것을 렌더트리로 구축되지 않는다.</li>
</ul>
</li>
<li><p>뷰포트 기반으로 렌더트리의 각 노드가 가지는 정확한 위치와 크기를 계산한다. ( Layout 단계 )</p>
</li>
<li><p>계산한 위치 / 크기를 기반으로 화면에 그린다. ( Paint 단계 )</p>
</li>
</ol>
<hr>
<h3 id="📕-용어-정리">📕 용어 정리</h3>
<ol>
<li><p>CRP : 브라우저가 HTML, CSS, JavaScript를 화면에 픽셀로 변화하는 일련의 단계를 말한다. CRP는 DOM, CSSOM, 렌더 트리와 레이아웃을 포함한다.</p>
</li>
<li><p>DOM ( Document Object Model ) : 웹 페이지를 이루는 태그들을 자바스크립트가 이용할 수 있게끔 브라우저가 트리 구조로 만든 객체 모델</p>
</li>
<li><p>CSSOM ( CSS Object Model ) : CSS 내용을 파싱하여 자료를 구조화한 것</p>
</li>
<li><p>렌더트리 ( Render Tree ) : CSSOM과 DOM 트리의 결합으로 만들어진 트리, 웹 페이지에 나타낼 각 요소들의 위치 ( Layout, 레이아웃 )을 계산하는데 사용되고 픽셀을 화면에 렌더링하는 페인트 ( Paint ) 프로세스를 위해 존재한다.</p>
</li>
<li><p>Layout 단계 : 뷰포트 내에서 노드의 정확한 위치와 크기를 게산하는 단계. Reflow라고도 부름</p>
</li>
<li><p>Paint 단계 : 렌더링 트리의 각 노드를 화면의 실제 픽셀로 변환하는 마지막 단계. 페인팅 혹은 래스터화라고 부름</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[px, em, rem, %, vw, vh의 차이점은 무엇일까]]></title>
            <link>https://velog.io/@balhyo_yunjisang/px-em-rem-vw-vh%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</link>
            <guid>https://velog.io/@balhyo_yunjisang/px-em-rem-vw-vh%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</guid>
            <pubDate>Sun, 21 Jan 2024 16:03:47 GMT</pubDate>
            <description><![CDATA[<p>반응형 웹을 만들다보면 넓이와 높이, 단위에 대한 고민은 필수적으로 하게된다.
반응형을 고려하지 않을 땐 px를 사용했지만 반응형 웹 페이지를 개발하고자 한다면 em, rem 단위를 사용하는 것이 좋다는 것을 프론트엔드 개발자라면 당연히 알고 있을 것이다.</p>
<p>그렇다면 px, em, rem, %, vw, vh는 어떤 차이가 있을까?</p>
<hr>
<h1 id="📏-px--pixel-">📏 px ( pixel )</h1>
<p>px은 <strong>절대값</strong>을 사용하는 단위이다. 고정된 물리적 크기에 해당한다.</p>
<p>상대적인 단위가 아니므로 화면의 크기나 해상도에 관계없이 크기가 일정하게 유지된다.</p>
<p>화면의 크기나 해상도에 관계없이 동일한 크기를 유지해야 하는 요소에는 px를 사용할 수 있다. </p>
<h3 id="⚠️-px-사용의-문제점">⚠️ px 사용의 문제점</h3>
<p>모든 브라우저는 사용자가 font-size 설정이 가능하다. 따로 font-size를 지정하지 않은 경우에는 일반적으로 16px로 표시되는데 개발자가 만약 font-size를 px로 고정하면, 사용자가 브라우저 설정에서 font-size를 변경하려고 해도 개발자가 정해둔 font-size에서 변경이 되지 않는다.</p>
<hr>
<h1 id="📐-em">📐 em</h1>
<p>em은 해당 단위가 사용되고 있는 요소의 font-size를 기준으로 px로 바뀌어 화면에 표시된다.
같은 엘리먼트에 설정된 포트 크기 값이 없을 경우에는 상위 요소의 폰트 사이즈가 기준이 된다.</p>
<pre><code class="language-CSS">html {
    font-size: 16px;
}

div {
    font-size: 20px;
    width: 10em;   /* 200px */
}</code></pre>
<h3 id="✏️-중첩인-경우">✏️ 중첩인 경우</h3>
<pre><code class="language-HTML">&lt;style&gt;
  .container {
    font-size: 14px;
  }

  .container.title {
    font-size: 2em; // 28px
  }

  .container.subtitle {
    font-size: 1.5em; // 21px
  }

  .container.subtitle.leading {
    font-size: 0.5em; 
  }
&lt;/style&gt;  

&lt;body&gt;
  &lt;div class=&quot;container&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;subtitle&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;  
&lt;/body&gt;</code></pre>
<p>leading의 글꼴의 크기는 container &gt; subtitle 안에 있기 때문에, 14 x 1.5 x 0.5 = 10.5px이 된다</p>
<h3 id="✏️-넓이--width-와-높이--height-속성의-값은">✏️ 넓이 ( width )와 높이 ( height )속성의 값은?</h3>
<pre><code>&lt;style&gt;
  .container {
    font-size: 14px;
  }

  .container.title {
    font-size: 2em; // 28px
  }

  .container.subtitle {
    font-size: 1.5em; // 21px
  }

  .container.subtitle.leading {
    font-size: 0.5em; // 10.5px
    width: 0.3em;
    height: 0.4em;
  }
&lt;/style&gt;  

&lt;body&gt;
  &lt;div class=&quot;container&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;subtitle&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;  
&lt;/body&gt;</code></pre><p>width는 10.5 x 0.3 = 3.15px
height는 10.5 x 0.4 = 4.2px</p>
<hr>
<h1 id="📐-rem">📐 rem</h1>
<p>최상위 엘리먼트에서 지정된 font-size의 값을 기준으로 변환된다.
HTML에서 최상위 요소는 html 태그이므로 rem의 경우, html 요소의 font-size 속성값이 기준이 된다.
별도의 font-size를 설정하지 않았을 경우에는 각 브라우저에서 기본적으로 설정된 값을 상속받는다.</p>
<pre><code>html {
  font-size: 16px;
}

div {
  font-size: 20px;
  width: 10rem; /* 160px */
}</code></pre><h3 id="✏️-넓이--width-와-높이--height-속성의-값은-1">✏️ 넓이 ( width )와 높이 ( height )속성의 값은?</h3>
<pre><code>&lt;style&gt;
  .container {
    font-size: 14px;
  }

  .container.title {
    font-size: 2rem; // 28px
  }

  .container.subtitle {
    font-size: 1.5rem; // 21px
  }

  .container.subtitle.leading {
    font-size: 0.5rem; // 7px
    width: 0.3rem;
    height: 0.4rem;
  }
&lt;/style&gt;  

&lt;body&gt;
  &lt;div class=&quot;container&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;subtitle&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;  
&lt;/body&gt;</code></pre><p>width는 14 x 0.3 = 4.2px
height는 14 x 0.4 = 5.6px</p>
<blockquote>
<p>많은 CSS 가이드들이 em을 사용해야만 하는 타당한 이유가 없는 경우라면 가급적 rem을 우선적으로 쓰도록 권고한다. 
em의 경우 실제 몇 px로 변환될지에 영향을 주는 변수가 많아지기 때문에 em을 사용해서 스타일된 요소의 경우 재사용이 어렵고 유지보수가 힘들어지는 경향이 있기 때문이다.
하지만 rem과 em도 용도에 맞게 적절히 혼용해서 사용할 수 있다. 어느 페이지에서든 고정된 사이즈를 사용해야 한다면 rem을, 부모 요소에 따라 유동적으로 변해야 하는 곳에는 em을 사용할 수 있다.</p>
</blockquote>
<hr>
<h1 id="📐-">📐 %</h1>
<p><strong>상위 요소의 크기</strong>를 기반으로 하는 상대적인 측정 단위. 
상위 요소의 너비가 500px이고 하위 요소의 너비가 50%로 지정된 경우 하위 요소의 너비는 250 픽셀이 된다.</p>
<hr>
<h1 id="📐-vw--viewport-width---vh--viewport-height-">📐 VW ( Viewport Width ) &amp; VH ( Viewport Height )</h1>
<p>VW와 VH는 각각 웹 페이지의 보이는 부분 (뷰포트) 의 너비와 높이를 기준으로 하는 상대적인 측정 단위로 1VW는 뷰포트 너비의 1%, 1VH는 뷰포트 높이의 1%에 해당한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Hello World 응답하기 - 스프링부트 기초]]></title>
            <link>https://velog.io/@balhyo_yunjisang/Hello-World-%EC%9D%91%EB%8B%B5%ED%95%98%EA%B8%B0-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@balhyo_yunjisang/Hello-World-%EC%9D%91%EB%8B%B5%ED%95%98%EA%B8%B0-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Sun, 19 Nov 2023 10:05:31 GMT</pubDate>
            <description><![CDATA[<h1 id="첫-기능-만들기">첫 기능 만들기</h1>
<h3 id="restcontroller">@RestController</h3>
<p>Spring Framework 4 버전부터 사용가능한 어노테이션</p>
<p>@Controller에 @ResponseBody가 결합된 어노테이션</p>
<p>컨트롤러 클래스 하위 메소드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON 등을 전송할 수 있음.</p>
<p>View를 거치지 않고 HTTP ResponseBody에 직접 Return 값을 보내게 됨.</p>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/94349770-f236-4eb8-a084-ff8285a52659/image.png" alt=""></p>
<blockquote>
<p>Annotation ( 어노테이션, @ ) 이란 코드 사이에 주석처럼 쓰이며 특별한 기능을 수행하도록 하는 기술이다. 
즉, 프로그램에게 추가적인 정보를 제공하는 메타데이터라고 할 수 있다.</p>
</blockquote>
<h3 id="requestmapping">@RequestMapping</h3>
<p>MVC의 핸들러 매핑 ( Handler Mapping ) 을 위해서 DefaultAnnotationHandlerMapping을 사용.</p>
<blockquote>
<p>특정 uri로 요청을 보내면 Controller에서 어떠한 방식으로 처리할지 정의를 한다.
이때 들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 것이 @RequestMapping이다.</p>
</blockquote>
<p>DefaultAnnotationHandlerMapping 매핑 정보로 @RequestMapping 어노테이션을 활용.</p>
<p>클래스와 메소드의 RequestMapping을 통해 URL을 매핑하여 경로를 설정하여 해당 메소드에서 처리</p>
<ul>
<li>value : url 설정</li>
<li>method : GET, POST, DELETE, PUT, PATCH 등</li>
</ul>
<pre><code class="language-JAVA">@RequestMapping(value = &quot;/hello&quot;, method = RequestMethod.GET)</code></pre>
<p>/hello 라는 url로 GET, POST, PUT, DELETE를 만들기 위해선 아래와 같이 작성한다.</p>
<pre><code class="language-JAVA">@RestController
public class HelloController {

    @RequestMapping(value = &quot;/hello&quot;, method = RequestMethod.GET)
    public String helloGet(...) {
        ...
    }

    @RequestMapping(value = &quot;/hello&quot;, method = RequestMethod.POST)
    public String helloPost(...) {
        ...
    }

    @RequestMapping(value = &quot;/hello&quot;, method = RequestMethod.PUT)
    public String helloPut(...) {
        ...
    }

    @RequestMapping(value = &quot;/hello&quot;, method = RequestMethod.DELETE)
    public String helloDelete(...) {
        ...
    }
}</code></pre>
<p>스프링 4.3버전부터 메소드를 지정하는 방식보다 간단하게 사용할 수 있는 어노테이션을 사용할 수 있음.</p>
<ul>
<li>@GetMapping</li>
<li>@PostMapping</li>
<li>@DeleteMapping</li>
<li>@PutMapping</li>
<li>@PatchMapping</li>
</ul>
<pre><code class="language-@RestController">@RequestMapping(value = &quot;/hello&quot;)
public class HelloController {

    @GetMapping()
    public String helloGet(...) {
        ...
    }

    @PostMapping()
    public String helloPost(...) {
        ...
    }

    @PutMapping()
    public String helloPut(...) {
        ...
    }

    @DeleteMapping()
    public String helloDelete(...) {
        ...
    }
}</code></pre>
<p>공통 url은 class에 @RequestMapping으로 설정을 해주고 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping으로 간단하게 생략이 가능해졌다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MVC 패턴 - 스프링부트 기초]]></title>
            <link>https://velog.io/@balhyo_yunjisang/MVC-%ED%8C%A8%ED%84%B4-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@balhyo_yunjisang/MVC-%ED%8C%A8%ED%84%B4-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Sun, 19 Nov 2023 09:40:12 GMT</pubDate>
            <description><![CDATA[<h1 id="mvc">MVC</h1>
<h3 id="mvc-패턴">MVC 패턴</h3>
<p>디자인 패턴 중 하나인 MVC 패턴은 Model, View, Controller의 줄임말로 어플리케이션을 구성할 때 그 구성요소를 세가지 역할로 구분한 패턴이다.</p>
<p>사용자 인터페이스로부터 비즈니스 로직을 분리하여 서로 영향 없이 쉽게 고칠 수 있는 설계가 가능하다.</p>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/a0fcd441-594e-4c60-9973-63921f3c9245/image.png" alt=""></p>
<h3 id="컨트롤러--controller-">컨트롤러 ( Controller )</h3>
<p>모델 ( Model )과 뷰 ( View ) 사이의 브릿지 역할을 수행</p>
<p>앱의 사용자로부터 입력에 대한 응답으로 모델 및 뷰를 업데이트하는 로직을 포함한다.</p>
<p>사용자의 요청은 모두 컨트롤러를 통해 진행되어야 한다.</p>
<p>컨트롤러에 들어온 요청은 어떻게 처리할지 결정하여 모델로 요청을 전달함.</p>
<blockquote>
<p>Ex) 쇼핑몰에서 상품을 검색하면 그 키워드를 컨트롤러가 받아 모델과 뷰에 적절하게 입력을 처리하여 전달함.</p>
</blockquote>
<h3 id="모델--model-">모델 ( Model )</h3>
<p>데이터를 처리하는 영역</p>
<p>데이터베이스와 연동을 위한 DAO ( Data Access Object )와 데이터의 구조를 표현하는 DO ( Data Object )로 구성됨.</p>
<blockquote>
<p>Ex) 검색을 위한 키워드가 넘어오면 데이터베이스에서 관련된 상품의 데이터를 받아 뷰에 전달</p>
</blockquote>
<h3 id="뷰--view-">뷰 ( View )</h3>
<p>데이터를 보여주는 화면 자체의 영역</p>
<p>사용자 인터페이스 ( UI ) 요소들이 포함되며, 데이터를 각 요소에 배치함.</p>
<p>뷰에서는 별도의 데이터를 보관하지 않음.</p>
<blockquote>
<p>Ex) 검색 결과를 보여주기 위해 모델에서 결과 상품 리스트 데이터를 받음.   </p>
</blockquote>
<h3 id="mvc-패턴의-특징">MVC 패턴의 특징</h3>
<p>어플리케이션의 역할을 세 구간으로 나누어 설계함으로써 서로 간의 의존성이 낮아짐.</p>
<p>각 영역이 독립적으로 구성되어 개발자 간 분업 및 협업이 원할해짐</p>
<p>한 영역을 업데이트하더라도 다른 곳에 영향을 주지 않음.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[pom.xml 설정하기 - 스프링부트 기초]]></title>
            <link>https://velog.io/@balhyo_yunjisang/pom.xml-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@balhyo_yunjisang/pom.xml-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Fri, 17 Nov 2023 11:19:43 GMT</pubDate>
            <description><![CDATA[<h3 id="pomxml">pom.xml</h3>
<p>Maven 프로젝트를 생성하면 루트 디렉토리에 생성되는 파일</p>
<p>Project Object Model 정보를 담고 있음</p>
<p>주요 설정 정보</p>
<ul>
<li><p>프로젝트 정보 : 프로젝트의 이름, 개발자 목록, 라이센스 등</p>
</li>
<li><p>빌드 설정 정보 : 소스, 리소스, 라이플 사이클 등 실행할 플러그인 등</p>
</li>
<li><p>POM 연관 정보 : 의존 프로젝트 ( 모듈 ), 상위 프로젝트, 하위 모듈 등</p>
</li>
</ul>
<h3 id="프로젝트-기본-정보">프로젝트 기본 정보</h3>
<p>pom 파일에서 프로젝트의 정보와 관련된 태그는 아래와 같음</p>
<ol>
<li><p><code>&lt;name&gt;</code> : 프로젝트명</p>
</li>
<li><p><code>&lt;url&gt;</code> : 프로젝트 사이트 url</p>
</li>
<li><p><code>&lt;description&gt;</code> : 프로젝트에 대한 간단한 설명</p>
</li>
<li><p><code>&lt;organization&gt;</code> : 프로젝트를 관리하는 단체 설명</p>
</li>
</ol>
<h3 id="프로젝트-연관-정보">프로젝트 연관 정보</h3>
<p>pom 파일에서 프로젝트의 정보와 관련된 태그는 아래와 같음.</p>
<ol>
<li><p><code>&lt;groupId&gt;</code> : 프로젝트의 그룹 ID 설정</p>
</li>
<li><p><code>&lt;artifactId&gt;</code> : 프로젝트 아티팩트 ID 설정</p>
</li>
<li><p><code>&lt;version&gt;</code> : 프로젝트의 버전</p>
</li>
<li><p><code>&lt;packaging&gt;</code> : 패키징 타입 설정</p>
<ul>
<li>jar : 자바 프로젝트 압축 파일</li>
<li>war : 웹 어플리케이션을 위한 압축 파일</li>
</ul>
</li>
</ol>
<h3 id="프로젝트-의존-설정">프로젝트 의존 설정</h3>
<p>프로젝트에서 사용하는 라이브러리에 대한 의존성 설정과 관련된 태그는 아래와 같음.</p>
<ol>
<li><p><code>&lt;dependencies&gt;</code> : 라이브러리 의존성 정보를 가지고 있는 dependency 태그를 묶은 태그</p>
</li>
<li><p><code>&lt;dependency&gt;</code> : 라이브러리의 정보를 담는 태그</p>
</li>
<li><p><code>&lt;groupId&gt;</code> : 의존성 라이브러리의 그룹 ID</p>
</li>
<li><p><code>&lt;artifactId&gt;</code> : 의존성 라이브러리의 아티팩트 ID</p>
</li>
<li><p><code>&lt;version&gt;</code> : 의존성 라이브러리의 버전</p>
</li>
<li><p><code>&lt;scope&gt;</code> : 해당 라이브러리의 이용 범위를 지정</p>
<ul>
<li><p>compile ( detault ) : 아무것도 지정되지 않았을 때의 설정값, 모든 클래스 경로에서 사용할 수 있음.</p>
</li>
<li><p>provided : compile과 유사하지만 JDK 혹은 Container가 런타임 시에만 제공, 컴파일 혹은 테스트 경로에서만 사용, 배포 시에는 빠짐</p>
</li>
<li><p>runtime : 컴파일 시에는 사용하지 않고, 실행 상황에서만 사용됨, 컴파일 클래스 경로에서는 존재하지 않음</p>
</li>
<li><p>test : 테스트 상황에서만 사용되는 라이브러리를 의미, 종속된 다른 프로젝트에 영향을 미치지 않음. 실 가동상황에서는 필요없는 라이브러리를 사용할 경우에 설정</p>
</li>
<li><p>system : provided와 유사하지만 저장소에서 관리되지 않고 직접 관리하는 JAR를 추가, systemPath를 추가 작성해야 함.</p>
</li>
</ul>
</li>
<li><p><code>&lt;optional&gt;</code> : 다른 프로젝트에서 이 프로젝트를 의존성 설정을 할 경우 사용할지 결정</p>
</li>
</ol>
<h3 id="자주-사용하는-라이브러리-설명">자주 사용하는 라이브러리 설명</h3>
<ol>
<li><p>Spring Boot Stater Parent : 프로젝트에서 사용하는 다양한 라이브러리 간의 버전 충돌 문제가 발생할 수 있는 것을 방지, 의존성 조합 간 충돌 문제가 없는 검증된 버전 정보 조합을 제공</p>
</li>
<li><p>Spring Boot Stater Web : Spring MVC를 사용한 REST 서비스를 개발하는데 사용</p>
</li>
<li><p>Spring Boot Stater Test : JUnit, Hamcrest, Mockito를 포함한 스프링 어플리케이션의 테스트 기능을 제공</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[API 완벽하게 정리]]></title>
            <link>https://velog.io/@balhyo_yunjisang/API-%EC%99%84%EB%B2%BD%ED%95%98%EA%B2%8C-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@balhyo_yunjisang/API-%EC%99%84%EB%B2%BD%ED%95%98%EA%B2%8C-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 17 Nov 2023 02:10:30 GMT</pubDate>
            <description><![CDATA[<h1 id="api">API</h1>
<hr>
<p>Application Programming Interface의 줄임말</p>
<p>응용 프로그램에서 사용할 수 있도록 다른 응용 프로그램에서 제어할 수 있게 만든 인터페이스를 뜻함.</p>
<p>API를 사용하면 내부 구현 로직을 알지 못해도 정의되어 있는 기능을 쉽게 사용할 수 있음.</p>
<blockquote>
<p>여기에서 인터페이스(Interface)는 어떤 장치 간 정보를 교환하기 위한 수단이나 방법을 의미함. Ex) 마우스, 키보드, 터치패드 등</p>
</blockquote>
<h3 id="api의-역할">API의 역할</h3>
<ul>
<li><p>서버와 데이터베이스에 대한 출입구 역할</p>
</li>
<li><p>애플리케이션과 기기가 원할하게 통신 가능하도록 한다.</p>
</li>
<li><p>모든 접속을 표준화한다.</p>
</li>
</ul>
<h3 id="api의-유형">API의 유형</h3>
<ul>
<li><p>private API : 내부 API, 회사 개발자가 자체 제품과 서비스를 개선하기 위해 내부적으로 발행합니다. 따라서 제 3자에게 노출되지 않는다.</p>
</li>
<li><p>partner API : 기업이 데이터 공유에 동의하는 특정인들만 사용할 수 있다. 비즈니스 관계에서 사용되는 편이며, 종종 파트너 회사 간에 소프트웨어를 통합하기 위해 사용된다.</p>
</li>
<li><p>public API : 개방형 API로, 모두에게 공개된다. 누구나 제한 없이 API를 사용할 수 있는 게 특징 </p>
</li>
</ul>
<h1 id="rest">REST</h1>
<hr>
<p>Representational State Transfer의 줄임말</p>
<p>자원 ( 데이터 )의 이름으로 구분하여 해당 자원의 상태를 교환하는 것을 의미한다.</p>
<p>REST는 서버와 클라이언트의 통신 방법 중 하나로 아키텍쳐에 가깝다.</p>
<p>HTTP URI(Uniform Resource Identifier)를 통해 자원을 명시하고 HTTP Method를 통해 자원을 교환한다.</p>
<blockquote>
<p>HTTP Method : Create, Read, Update, Delete ( CRUD )</p>
</blockquote>
<h3 id="rest의-특징--규칙-">REST의 특징 ( 규칙 )</h3>
<ul>
<li><p>Server - Client 구조 : 자원이 있는 쪽이 <em>Server</em>, 요청하는 쪽이 _Client_이며 _Client_와 _Server_는 <strong>독립적으로 분리</strong>되어 있어야 한다.</p>
</li>
<li><p>Stateless : 요청 간에 클라이언트 정보가 서버에 저장되지 않는다. 서버는 각각의 요청을 완전히 다른 요청으로 <strong>별개</strong>의 것으로 인식하고 처리한다.</p>
</li>
<li><p>Cacheable : _HTTP 프로토콜_을 그대로 사용하기 때문에 HTTP의 특징인 캐시 기능을 적용, <strong>대량의 요청을 효율적</strong>으로 처리하기 위해 캐시를 사용한다.</p>
</li>
<li><p>계층화 ( Layered System ) : 클라이언트는 <strong>서버의 구성과 상관없이 REST API 서버로 요청</strong>, 서버는 _다중 계층_으로 구성될 수 있음. ( 로드밸런싱, 보안 요소, 캐시 등)</p>
</li>
<li><p>Code on Demand ( Optional ) : 요청을 받으면 서버에서 클라이언트로 코드 또는 스크립트(로직)을 전달하여 클라이언트 기능을 확장 ( Javascript 개념 쪽에서 자주 사용 )</p>
</li>
<li><p>인터페이스 일관성 ( Uniform Interface ) : 자원이 표준 형식으로 전송되기 위해 구성 요소간 통합 인터페이스를 제공, HTTP 프로토콜을 따르는 모든 플랫폼에서 사용 가능하게끔 설계한다.</p>
</li>
</ul>
<h3 id="rest의-장점">REST의 장점</h3>
<ul>
<li><p>HTTP 표준 프로토콜을 사용하는 모든 플랫폼에서 호환 가능</p>
</li>
<li><p>서버와 클라이언트의 역할을 명확하게 분리</p>
</li>
<li><p>여러 서비스 설계에서 생길 수 있는 문제 최소화</p>
</li>
</ul>
<h2 id="rest-api">REST API</h2>
<p>REST 아키텍쳐를 따르는 API를 뜻함. 
일반적으로 REST 아키텍쳐를 구현하는 웹 서비스를 RESTful하다고 한다.</p>
<h3 id="rest-api의-특징">REST API의 특징</h3>
<ul>
<li><p>REST 기반으로 시스템을 분산하여 확장성과 재사용성을 높임</p>
</li>
<li><p>HTTP 표준을 따르고 있어 여러 프로그래밍 언어를 구현 가능하다.</p>
</li>
</ul>
<h3 id="rest-api-설계-규칙">REST API 설계 규칙</h3>
<ul>
<li><p>웹 기반의 REST API를 설계할 경우에는 URI를 통하여 자원을 표현해야 함</p>
</li>
<li><p>자원에 대한 조작은 HTTP Method ( CRUD )를 통하여 표현해야 함
: URI에 행위가 들어가면 안됨, HEADER를 통해 CRUD를 표현하여 동작을 요청해야 함</p>
</li>
<li><p>메세지를 통한 자원 리소스 조작 
: HEADER를 통한 content-type을 지정하여 데이터를 전달, 대표적인 형식으론 HTML, XML, JSON, TEXT가 있음</p>
</li>
<li><p>URI에는 소문자를 사용</p>
</li>
<li><p>Resource의 이름이나 URI가 길어질 경우 하이픈(-)을 통해 처리</p>
</li>
<li><p>언더바(_)는 사용하지 않음</p>
</li>
<li><p>파일 확장자를 표현하지 않음</p>
</li>
</ul>
<h1 id="soap">SOAP</h1>
<hr>
<p>Simple Object Access Protocol의 줄임말</p>
<p><strong>그 자체로 프로토콜</strong>이며 보안이나 메세지 전송 등에 있어 <strong>엄격한 규약</strong>을 가짐.</p>
<p><strong>성공/반복 실행 로직</strong>이 규정되어 있기 때문에 SOAP API를 통해서 통신할 때 처음부터 끝까지 <strong>신뢰성</strong>을 제공한다.</p>
<p>SOAP 표준에는 ACID 준수에 관한 사항이 있다. 
ACID를 준수하기 때문에 데이터의 변형을 줄여주고, 데이터베이스와의 상호작용에 대해서 사전에 정확하게 정하기 때문에 데이터의 무결성을 지켜줌. </p>
<blockquote>
<p>ACID( 원자성, 일관성, 고립성, 지속성 )는 데이터 일관성을 위한 다른 방식들보다도 더 보수적이기 때문에, 금융 정보 등의 민감한 데이터를 주고받을 때 일반적으로 많이 사용된다.</p>
</blockquote>
<ul>
<li>데이터 포맷으로 오직 XML만 사용한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/balhyo_yunjisang/post/f1c33393-583d-4c25-a126-8424e5b7b55b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] Go - expected 'package', found 'EOF']]></title>
            <link>https://velog.io/@balhyo_yunjisang/Error-Go-expected-package-found-EOF</link>
            <guid>https://velog.io/@balhyo_yunjisang/Error-Go-expected-package-found-EOF</guid>
            <pubDate>Fri, 28 Jul 2023 18:23:39 GMT</pubDate>
            <description><![CDATA[<pre><code>expected &#39;package&#39;, found &#39;EOF&#39;</code></pre><p>ctrl + s (저장)을 하면 해결된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[가독성을 개선하는 방법]]></title>
            <link>https://velog.io/@balhyo_yunjisang/%EA%B0%80%EB%8F%85%EC%84%B1%EC%9D%84-%EA%B0%9C%EC%84%A0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%9D%BD%EA%B8%B0-%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EA%B0%80-%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EB%8B%A4-%EB%A5%BC-%EC%9D%BD%EA%B3%A0</link>
            <guid>https://velog.io/@balhyo_yunjisang/%EA%B0%80%EB%8F%85%EC%84%B1%EC%9D%84-%EA%B0%9C%EC%84%A0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%9D%BD%EA%B8%B0-%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EA%B0%80-%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EB%8B%A4-%EB%A5%BC-%EC%9D%BD%EA%B3%A0</guid>
            <pubDate>Fri, 28 Jul 2023 18:11:43 GMT</pubDate>
            <description><![CDATA[<h3 id="1-코드는-이해하기-쉬워야-한다">1. 코드는 이해하기 쉬워야 한다.</h3>
<ul>
<li>코드는 다른 사람이 그것을 이해하는데 들이는 시간을 최소화하는 방식으로 작성되어야 한다.</li>
<li>적은 분량으로 코드를 작성하는 것보다 이해를 위한 시간을 최소화하는 것이 중요하다.</li>
</ul>
<hr>
<h3 id="2-이름에-정보를-담아내기">2. 이름에 정보를 담아내기</h3>
<blockquote>
<ol>
<li><a href="####1.-%ED%8A%B9%EC%A0%95%ED%95%9C-%EB%8B%A8%EC%96%B4-%EA%B3%A0%EB%A5%B4%EA%B8%B0">특정한 단어 고르기</a></li>
<li><a href="####2.-%EB%B3%B4%ED%8E%B8%EC%A0%81%EC%9D%B8-%EC%9D%B4%EB%A6%84-%ED%94%BC%ED%95%98%EA%B8%B0">보편적인 이름 피하기</a></li>
<li><a href="####3.-%EA%B5%AC%EC%B2%B4%EC%A0%81%EC%9D%B8-%EC%9D%B4%EB%A6%84-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0">구체적인 이름 사용하기</a></li>
<li><a href="####4.-%EC%9D%B4%EB%A6%84%EC%97%90-%EC%B6%94%EA%B0%80%EC%A0%81%EC%9D%B8-%EC%A0%95%EB%B3%B4-%EB%B6%99%EC%9D%B4%EA%B8%B0">이름에 추가적인 정보 붙이기</a></li>
<li><a href="####5.-%EC%9D%B4%EB%A6%84%EC%9D%98-%EA%B8%B8%EC%9D%B4-%EA%B2%B0%EC%A0%95%ED%95%98%EA%B8%B0">이름의 길이 결정하기</a></li>
<li><a href="####6.-%EC%B6%94%EA%B0%80%EC%A0%81%EC%9D%B8-%EC%A0%95%EB%B3%B4%EB%A5%BC-%EB%8B%B4%EC%9D%84-%EC%88%98-%EC%9E%88%EB%8A%94-%EC%9D%B4%EB%A6%84-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0">추가적인 정보를 담을 수 있는 이름 구성하기</a></li>
</ol>
</blockquote>
<p>####1. 특정한 단어 고르기</p>
<p>get, size, stop 등은 지나치게 보편적인 단어이므로 사용하지 않는다.
get보단 fetch 혹은 download, size보단 height, number of nodes 등이 더 의미있는 이름일 것이다.</p>
<p>####2. 보편적인 이름 피하기</p>
<p>tmp, retval 같은 이름보단 개체의 값이나 목적을 정확하게 설명하는 이름을 골라야 한다.
좋은 이름은 변수의 목적이나 담고 있는 값을 설명해주어야 한다. 이러한 이름은 변수의 목적을 직접적으로 나타내므로 나중에 버그를 잡는 데 도움이 될 수 있다.</p>
<p><code>tmp라는 이름은 대상이 짧게 임시적으로만 존재하고, 임시전 존재 자체가 변수의 가장 중요한 용도일 때에 한해서 사용해야 한다.</code></p>
<p>####3. 구체적인 이름 사용하기</p>
<p>변수나 함수 혹은 다름 요소에 이름을 붙일 때 추상적인 방식이 아니라 구체적인 방식으로 묘사하라. 이름을 선택하는 이유가 모호하고 간접적이라면 좋은 이름이라 볼 수 없다.</p>
<p>####4. 이름에 추가적인 정보 붙이기</p>
<p>변수나 함수의 이름은 작은 설명문이다. 따라서 사용자가 반드시 알아야 하는 변수와 관련한 중요한 정보를 추가적인 <code>단어</code>로 만들어서 이름에 붙이는 게 좋다.</p>
<p>####5. 이름의 길이 결정하기
좁은 범위에서의 이름은 짧을 수록 좋으나 사용 범위가 넓으면 긴 이름이 좋다. </p>
<p>####6. 추가적인 정보를 담을 수 있는 이름 구성하기
밑줄과 대시, 대문자를 잘 활용하면 이름에 더 많은 정보를 담을 수 있다.</p>
<p>예를 들어 클래스 멤버 변수는 로컬 변수와 구분하기 위해 뒤에 &#39;_&#39;를 붙일 수 있다.</p>
<hr>
<h3 id="3-오해할-수-없는-이름들">3. 오해할 수 없는 이름들</h3>
<p>본인이 지은 이름을 다른 사람들이 다른 의미로 해석할 수 있는지 철저하게 확인해야 한다.</p>
<ul>
<li><p>한계를 설정하는 이름을 가장 명확하게 만드는 방법은 제한받는 대상의 이름 앞에 max나 min을 붙이는 것이다.</p>
</li>
<li><p>경계를 포함하는 범위엔 first와 last를 사용하라.</p>
</li>
<li><p>경계를 포함하고/ 배제하는 범위에는 begin과 end를 사용하라.</p>
</li>
<li><p>불리언 변수에 이름을 붙일 때는 is, has, can, should 와 같은 단어를 사용하고, 부정적인 용어는 피하는 것이 좋다.</p>
</li>
<li><p>대개 get으로 시작되는 이름의 메소드는 가벼운 접근자로서 단순히 내부 멤버를 반환한다고 관행적으로 생각한다. 이처럼 특정 관행에 어긋나는 방식으로 이름을 짓는 것보다 일반적인 의미를 갖도록 하는 것이 좋다.</p>
</li>
</ul>
<hr>
<h3 id="4-미학">4. 미학</h3>
<ul>
<li><p>일관성 있는 레이아웃을 사용하라.</p>
<ul>
<li><p>서로 연관된 코드는 하나의 블록으로 묶어라.</p>
</li>
<li><p>비슷한 코드는 서로 비슷해 보이게 만들어라.</p>
</li>
</ul>
</li>
<li><p>코드 곳곳을 &#39;열&#39;로 만들어서 줄을 맞추면 코드를 한 눈에 훑어보기 편하다.</p>
</li>
<li><p>코드의 한 곳에서 A, B, C가 순서대로 언급되고 있으면 다른 곳에서 또한 그 순서를 지켜라.</p>
</li>
<li><p>빈 줄을 이용하여 커다란 블록을 논리적인 &#39;문단&#39;으로 나누어라</p>
</li>
<li><p>코드를 ‘보기 예쁘게&#39; 만드는 작업은 표면적인 개선 이상의 결과를 가져온다 (코드의 구조 자체를 개선시킨다)</p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>