<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>april.log</title>
        <link>https://velog.io/</link>
        <description>🚀  내가 보려고 쓰는 기술블로그</description>
        <lastBuildDate>Fri, 09 May 2025 23:49:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>april.log</title>
            <url>https://images.velog.io/images/april_5/profile/edd24339-288f-4ca0-bcaf-4957694109fd/april.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. april.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/april_5" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[9. SQL의 활용 (3)]]></title>
            <link>https://velog.io/@april_5/9.-SQL%EC%9D%98-%ED%99%9C%EC%9A%A9-3</link>
            <guid>https://velog.io/@april_5/9.-SQL%EC%9D%98-%ED%99%9C%EC%9A%A9-3</guid>
            <pubDate>Fri, 09 May 2025 23:49:35 GMT</pubDate>
            <description><![CDATA[<h2 id="1-트랜잭션의-개념과-특징">1. 트랜잭션의 개념과 특징 </h2>
<h3 id="1-트랜잭션의-개념과-특징-1">(1) 트랜잭션의 개념과 특징</h3>
<ul>
<li>트랜잭션(Transaction)의 개념 <ul>
<li>데이터베이스의 무결성을 보장하며 요청된 작업을 완료하기 위하여, 한번에 수행되어야 할 일련의 Read와 Write연산을 정의한 논리적 작업 단위</li>
<li>분할할 수 없는 최소단위, All or Nothing </li>
</ul>
</li>
<li>트랜잭션의 특징<ul>
<li>원자성(Atomicity)<ul>
<li>All or Nothing, 완전히 완료되지 않았을 경우 수행되기 전과 같아야 함</li>
</ul>
</li>
<li>일관성(Consistency)<ul>
<li>실행이 성공적으로 완료되면 데이터베이스는 모순 없이 일관성이 보존된 상태</li>
</ul>
</li>
<li>고립성(Isolation)<ul>
<li>트랜잭션의 부분적 실행결과를 다른 트랜잭션이 접근할 수 없음 </li>
</ul>
</li>
<li>지속성(Durability)<ul>
<li>완료된 트랜잭션의 결과는 영구적으로 데이터베이스에 저장 </li>
</ul>
</li>
</ul>
</li>
<li>트랜잭션 상태 다이어그램 구성 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/f36964d1-fa47-4b0a-ad5a-d37167fdf30f/image.png" alt=""></p>
<table>
<thead>
<tr>
<th>상태</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>실행(Active)</td>
<td>트랜잭션 실행 시작 혹은 실행 중인 상태</td>
</tr>
<tr>
<td>부분 완료(Partially Committed)</td>
<td>트랜잭션의 마지막 명령을 실행한 후의 상태</td>
</tr>
<tr>
<td>실패(Failed)</td>
<td>트랜잭션을 더 이상 정상적으로 실행할 수 없음을 발견한 상태</td>
</tr>
<tr>
<td>철회(Aborted)</td>
<td>트랜잭션이 실패하여 취소되어 시작 전 상태로 환원된 상태(ROLLBACK)   <br />* 참고:: SAVEPOINT: 롤백 기준점을 설정할 수 있음</td>
</tr>
<tr>
<td>완료(Committed)</td>
<td>트랜잭션이 성공적으로 완료된 상태 (COMMIT)</td>
</tr>
</tbody></table>
<p><br /><br /></p>
<h2 id="2-tcl-transaction-control-language-구문과-활용">2. TCL (Transaction Control Language) 구문과 활용</h2>
<h3 id="1-tcl-구문의-종류와-특징">(1) TCL 구문의 종류와 특징</h3>
<table>
<thead>
<tr>
<th>기능</th>
<th>Oracle</th>
<th>MariaDB</th>
</tr>
</thead>
<tbody><tr>
<td>트랜잭션 시작</td>
<td>DML 시 자동으로 시작 <br />또는 SET TRANSACTION</td>
<td>DML 시 자동으로 시작 <br />또는 START TRANSACTION   (Autocommit=1 이어도 트랜잭션 유지)</td>
</tr>
<tr>
<td>커밋(COMMIT)</td>
<td>명시적 커밋, DDL 시 암묵적 커밋 지원</td>
<td>명시적 커밋, DDL 시 암묵적 커밋 지원</td>
</tr>
<tr>
<td>롤백(ROLLBACK)</td>
<td>전체 롤백 <br />또는 SAVEPOINT로 부분 롤백 가능</td>
<td>전체 롤백 <br />또는 SAVEPOINT로 부분 롤백 가능</td>
</tr>
<tr>
<td>SAVEPOINT</td>
<td>지원</td>
<td>지원</td>
</tr>
<tr>
<td>AUTOCOMMIT</td>
<td>기본적으로 비활성화   <br />SET AUTOCOMMIT ON/OFF (오라클 전용, 도구에서 설정)</td>
<td>기본적으로 활성화 <br />SET autocommit=1/0</td>
</tr>
</tbody></table>
<p><br /><br /></p>
<h2 id="3-저장-프로시저-stored-procedure의-특징과-활용">3. 저장 프로시저 (Stored Procedure)의 특징과 활용</h2>
<h3 id="1-저장-프로시저의-개념과-특징">(1) 저장 프로시저의 개념과 특징</h3>
<ul>
<li>저장 프로시저(Stored Procedure)의 개념<ul>
<li>저장 프로시저(Stored Procedure) <ul>
<li>데이터베이스에 저장된 SQL 명령어와 로직을 그룹화한 서브루틴, 이름을 이용하여 호출하여 사용</li>
</ul>
</li>
<li>장점<ul>
<li>코드 재사용</li>
<li>성능 최적화</li>
<li>보안성 향상</li>
<li>일관성 유지</li>
</ul>
</li>
</ul>
</li>
<li>오라클 저장 프로시저의 특징<ul>
<li>구조 <ul>
<li>선언부(Declarative)<ul>
<li>변수와 상수를 선언 </li>
</ul>
</li>
<li>실행부(Executable)<ul>
<li>SQL 명령어와 로직 실행</li>
</ul>
</li>
<li>예외 처리부(Exception Handling) <ul>
<li>오류 발생 시 처리 로직 포함</li>
</ul>
</li>
</ul>
</li>
<li>특징<ul>
<li>PL/SQL 기반</li>
<li>입력 매개변수(IN), 출력 매개변수(OUT), 입력/출력 매개변수(IN OUT) 지원<ul>
<li>별도의 반환 값 없음</li>
</ul>
</li>
<li>트랜잭션 관리 기능 내장 (COMMIT, ROLLBACK 등)</li>
<li>데이터 사전(Data Dictionary)에 저장<ul>
<li>여러 사용자와 애플리케이션에서 재사용 가능</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>MariaDB 저장 프로시저의 특징<ul>
<li>구조<ul>
<li>구분자(DELIMITER) 변경</li>
<li>CREATE PROCEDURE를 사용하여 정의</li>
<li>BEGIN ~ END 블록 사용</li>
<li>매개변수 유형 : IN(입력), OUT(출력), INOUT(입출력) 지원</li>
</ul>
</li>
<li>특징<ul>
<li>SQL 표준을 준수하며 간단한 문법으로 작성 가능</li>
<li>트랜잭션 관리 가능<ul>
<li>START TRANSACTION, COMMIT, ROLLBACK 등</li>
</ul>
</li>
<li>커서(Cursor)를 사용하여 여러 행 데이터를 처리할 수 있음</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[8. SQL의 활용 (2)]]></title>
            <link>https://velog.io/@april_5/8.-SQL%EC%9D%98-%ED%99%9C%EC%9A%A9-2</link>
            <guid>https://velog.io/@april_5/8.-SQL%EC%9D%98-%ED%99%9C%EC%9A%A9-2</guid>
            <pubDate>Sun, 04 May 2025 01:47:27 GMT</pubDate>
            <description><![CDATA[<h2 id="1-집합-연산자-그룹-함수-윈도우-함수">1. 집합 연산자, 그룹 함수, 윈도우 함수</h2>
<h3 id="1-집합-연산자의-개념과-종류">(1) 집합 연산자의 개념과 종류</h3>
<ul>
<li>집합 연산자의 개념과 특징<ul>
<li>집합 연산자<ul>
<li>두 개 이상의 &#39;테이블에 대한 쿼리 결과&#39;를 하나로 결합하여 원하는 결과를 만드는 연산</li>
<li>JOIN을 사용하지 않고 연관된 데이터를 조회할 수 있음</li>
</ul>
</li>
<li>쿼리 결과의 열 개수와 데이터 타입이 같아야 함</li>
<li>ORDER BY는 전체 결과에 대해 마지막에 한 번만 사용 가능</li>
</ul>
</li>
<li>주요 집합 연산자의 종류 </li>
</ul>
<table>
<thead>
<tr>
<th>종류</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>UNION</td>
<td>- 쿼리 결과의 합집합 (<strong>중복 제거</strong>)</td>
</tr>
<tr>
<td>UNION ALL</td>
<td>- 쿼리 결과의 합집합 (<strong>중복 허용</strong>)   `SELECT * FROM user_t UNION ALL SELECT * from student_t;`</td>
</tr>
<tr>
<td>INTERSECT</td>
<td>- 쿼리 결과의 교집합 (<strong>중복 제거</strong>)</td>
</tr>
<tr>
<td>MINUS (또는 EXCEPT)</td>
<td>- 첫번째 쿼리 결과에서 두번째 쿼리 결과를 제외한 차집합 (<strong>중복 제거</strong>)   `SELECT * FROM user_t MINUS SELECT * from student_t;`</td>
</tr>
</tbody></table>
<br />

<h3 id="2-그룹-함수의-개념과-종류">(2) 그룹 함수의 개념과 종류</h3>
<ul>
<li>그룹 함수의 개념과 특징<ul>
<li>그룹 함수<ul>
<li>테이블의 여러 행(Row)을 하나의 그룹으로 묶어 집계(Aggregation) 결과를 반환하는 함수</li>
</ul>
</li>
<li>주로 GROUP BY 절과 함께 사용, 특정 기준으로 데이터를 그룹화 한 후 원하는 정보 추출</li>
<li>GROUP BY 사용시 SELECT 절에는 그룹화 기준 컬럼과 집계 함수만 사용 가능</li>
<li>HAVING 절을 사용하여 그룹화된 결과에 조건을 적용할 수 있음</li>
</ul>
</li>
<li>그룹 함수의 종류 (NULL과 중복 데이터 처리에 주의 필요)<ul>
<li>집계 함수 <code>COUNT(\*), COUNT(column), COUNT(DISTINCT column)</code><ul>
<li>COUNT</li>
<li>SUM</li>
<li>AVG</li>
<li>MAX</li>
<li>MIN 등</li>
</ul>
</li>
<li>총계 합수<ul>
<li>ROLLUP</li>
<li>CUBE</li>
<li>GROUPING SETS</li>
<li>GROUPING 등</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>그룹 함수의 종류별 특징- <span style="background:#ffd700"><strong>ROLLUP</strong></span> <ul>
<li>GROUP BY로 묶인 컬럼의 소계(Subtotal)를계층적으로 계산</li>
<li>GROUP BY 칼럼의 순서가 변경되면 결과도 변경</li>
<li>Grouping Column의 개수가 N이면 N+1 Level의 소계가 생성됨</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/f30c0a7a-4459-47b2-9b3b-87fe7c390c8d/image.png" alt=""></p>
<ul>
<li>그룹 함수의 종류별 특징- <span style="background:#ffd700"><strong>CUBE</strong></span><ul>
<li>결합 가능한 모든 조합에 대한 다차원 집계 생성</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/950c785d-c7a5-4261-a037-0b8e363f3809/image.png" alt=""></p>
<ul>
<li>그룹 함수의 종류별 특징- <span style="background:#ffd700"><strong>GROUPING SETS</strong></span><ul>
<li>특정 항목 (원하는 부분)의 소계를 계산, 인수의 순서가 바꾸어도 동일한 결과</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/aa893efd-cd15-4a48-9c3d-5c6836a596de/image.png" alt=""></p>
<ul>
<li>그룹 함수의 종류별 특징- <span style="background:#ffd700"><strong>GROUPING</strong></span><ul>
<li>소계 여부에 따라 1, 0 혹은 원하는 문자열을 표시할 수 있음 </li>
<li>참고<ul>
<li>ROLLUP, CUBE, GROUPING SETS와 함께 쓰임</li>
<li>결과값에 따라 CASE 혹은 DECODE를 이용하여 표시할 문자열 선택</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/ea373cf0-99d6-48fb-8767-1338d947044e/image.png" alt=""></p>
<br />

<h3 id="3-윈도우-함수의-개념과-종류">(3) 윈도우 함수의 개념과 종류</h3>
<ul>
<li>윈도우 함수 (Window Function)의 개념과 특징<ul>
<li>윈도우 함수 (Window Function)<ul>
<li>특정 범위(윈도우, Window) 내에서 각 행에 대해 연산을 수행하는 SQL 함수<ul>
<li>그룹 함수와 다르게 전체 데이터를 그룹화하지 않고도 개별 행을 유지한 상태에서 계산할 수 있음</li>
<li>OVER 절을 사용하여 윈도우의 범위와 계산 방식을 정의</li>
</ul>
</li>
</ul>
</li>
<li>윈도우 함수의 종류 <ul>
<li>순위 함수: RANK, DENSE_RANK, ROW_NUMBER</li>
<li>집계 함수: SUM, MAX, MIN, AVG, COUNT</li>
<li>행 순서 함수: FIRST_VALUE, LAST_VALUE, LAG, LEAD</li>
<li>비율 함수: CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT</li>
</ul>
</li>
<li>윈도우 함수의 종류별 특징- <strong>순위 함수</strong><ul>
<li>RANK<ul>
<li>순위를 카운트, 중복 순위를 포함</li>
<li>즉, 중복된 수 만큼 증가한 후 그 다음 카운트 시작</li>
</ul>
</li>
<li>DENSE_RANK<ul>
<li>순위를 카운트, 중복 순위를 무시</li>
</ul>
</li>
<li>ROW_NUMBER<ul>
<li>동일한 값(순위)라도 고유한 순위를 부여</li>
</ul>
</li>
</ul>
</li>
<li>윈도우 함수의 종류별 특징- <strong>집계 함수</strong><ul>
<li>SUM (합계) </li>
<li>MAX (최대값)</li>
<li>MIN (최소값) </li>
<li>AVG (평균값)</li>
<li>COUNT (건수)</li>
</ul>
</li>
<li>윈도우 함수의 종류별 특징- <strong>행 순서 함수</strong><ul>
<li>FIRST_VALUE (가장 앞의 데이터)</li>
<li>LAST_VALUE (가장 마지막의 데이터)</li>
<li>LAG (특정 수 만큼 앞의 데이터) </li>
<li>LEAD (특정 수 만큼 뒤의 데이터)</li>
</ul>
</li>
<li>윈도우 함수의 종류별 특징- <strong>비율 함수</strong><ul>
<li>RATIO_TO_PERCENT: 파티션 합계에서 차지하는 비율 계산</li>
<li>PERCENT_RANK: 현재 행의 백분위 수를 계산 (0 ~ 1을 구간으로 함)</li>
<li>CUME_DIST: 누적 백분율을 계산 (0 ~ 1 사이의 값</li>
<li>NTILE: 행들을 N 등분 후 현재 행의 등급을 계산</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br /><br /></p>
<h2 id="2-top-n-쿼리-계층-쿼리-self-join">2. TOP-N 쿼리, 계층 쿼리, SELF JOIN</h2>
<h3 id="1-top-n-쿼리의-개념과-방식">(1) TOP-N 쿼리의 개념과 방식</h3>
<ul>
<li>TOP-N 쿼리의 개념<ul>
<li>TOP-N 쿼리<ul>
<li>테이블에서 상위 N 개의 행을 검색하는 쿼리 </li>
</ul>
</li>
<li>TOP-N 쿼리의 실행 방식<ul>
<li>ROWNUM<ul>
<li>오라클에서 사용하는 의사 컬럼</li>
<li>‘=‘ 조건은 사용할 수 없으며, &lt; 혹은 &lt;= 조건을 이용함</li>
</ul>
</li>
<li>FETCH FIRST N ROWS ONLY<ul>
<li>ANSI SQL에서 사용하는 구문 </li>
<li>ORDER BY 절과 함께 사용 </li>
</ul>
</li>
<li>계층 쿼리 (계층형 질의)<ul>
<li>계층형 데이터를 조회하기 위해 사용</li>
<li>엔터티를 순환관계의 데이터 모델로 설계한 경우 발생 (예: 조직, 메뉴, 부품 등)</li>
<li>START WITH … CONNECT BY 구문 사용</li>
</ul>
</li>
<li>셀프 조인 (Self Join)<ul>
<li>동일한 테이블 간 조인</li>
<li>한 테이블 내 컬럼간 연관 관계가 있을 경우에 사용, ALIAS(별칭) 사용 필수</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-SQL"># ROWNUM
SELECT column_name
FROM (
    SELECT column_name
    FROM table_name
    ORDER BY column_name DESC
)
WHERE ROWNUM &lt;= N;


# FETCH FIRST N ROWS ONLY
SELECT column_name
FROM table_name
ORDER BY column_name DESC
FETCH FIRST N ROWS ONLY;


# 계층 쿼리
SELECT employee_id, first_name, manager_id
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id
ORDER SIBLINGS BY first_name;


# 셀프 조인
SELECT e.employee_id, e.first_name AS Employee, m.first_name AS Manager
FROM employees e LEFT JOIN employees m ON e.manager_id = m.employee_id;</code></pre>
<p><br /><br /></p>
<h2 id="3-pivot과-unpivot">3. PIVOT과 UNPIVOT</h2>
<h3 id="1-pivot과-unpivot의-특징">(1) PIVOT과 UNPIVOT의 특징</h3>
<ul>
<li>PIVOT의 특징<ul>
<li>행을 열로 변환하여 데이터를 요약하기 위해 사용</li>
</ul>
</li>
<li>UNPIVOT의 특징<ul>
<li>열을 행으로 변환하여 데이터를 요약하기 위해 사용</li>
</ul>
</li>
</ul>
<h4 id="2-정규-표현식의-특징">(2) 정규 표현식의 특징</h4>
<ul>
<li>정규표현식<ul>
<li>문자열의 특정 패턴을 기술하는 방법</li>
</ul>
</li>
</ul>
<pre><code>SELECT phone_number,
    CASE
        WHEN REGEXP_LIKE
        (phone_number, &#39;^01[0-1|6-9]-?[0-9]{3,4}-?[0-9]{4}$’)
        THEN &#39;유효한 휴대폰 번호’
        ELSE &#39;유효하지 않은 휴대폰 번호’
    END AS validation_result
FROM contacts;</code></pre><p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[7. SQL의 활용(1)]]></title>
            <link>https://velog.io/@april_5/7.-SQL%EC%9D%98-%ED%99%9C%EC%9A%A91</link>
            <guid>https://velog.io/@april_5/7.-SQL%EC%9D%98-%ED%99%9C%EC%9A%A91</guid>
            <pubDate>Sun, 27 Apr 2025 02:36:09 GMT</pubDate>
            <description><![CDATA[<h2 id="1-서브쿼리의-특징과-활용">1. 서브쿼리의 특징과 활용 </h2>
<h3 id="1-서브쿼리subquery의-개념과-종류">(1) 서브쿼리(Subquery)의 개념과 종류 </h3>
<ul>
<li>서브쿼리의 개념<ul>
<li>서브쿼리(Subquery)란? <ul>
<li>메인 쿼리 내부에 포함된 하위 쿼리</li>
<li>하나의 SQL문 안에 포함된 또 다른 SQL문</li>
</ul>
</li>
</ul>
</li>
<li>서브쿼리의 종류<ul>
<li>Nested Subquery <ul>
<li>WHERE 절에 위치</li>
<li>1개 이상의 칼럼 또는 1개 이상의 행을 반환 <pre><code>SELECT name, position FROM t_player
WHERE team_id =
(SELECT team_id FROM t_player WHERE name = &#39;Ruby&#39;)
ORDER BY name;</code></pre></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>서브쿼리의 종류<ul>
<li>연관 서브쿼리<ul>
<li>메인 쿼리와 관계가 있음(메인 쿼리의 칼럼이 존재함)</li>
</ul>
</li>
<li>비연관 서브쿼리 <ul>
<li>메인 쿼리와 관계가 없음 </li>
</ul>
</li>
<li>Inline View<ul>
<li>FROM 절에 위치</li>
<li>뷰(View)와 동일한 방식으로 사용(임시 뷰)</li>
</ul>
</li>
<li>Scalar SubQuery <ul>
<li>SELECT 절에 위치</li>
<li>단일 컬럼, 단일 행을 반환</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>&gt; 반환 데이터 형태에 따라 &#39;단일행 서브쿼리, 다중행 서브쿼리, 다중컬럼 서브쿼리&#39;로 구분할 수 있음</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/24e64f3a-7ea8-4b27-b38d-0ce52a775807/image.png" alt=""></p>
<p><br /><br /></p>
<h2 id="2-join의-특징과-활용">2. JOIN의 특징과 활용</h2>
<h3 id="1-조인join의-개념과-유형">(1) 조인(JOIN)의 개념과 유형</h3>
<ul>
<li>JOIN의 개념 <ul>
<li>둘 이상의 테이블을 논리적 관계를 기준으로 연결하여 결과 집합을 만드는 기법</li>
<li>하나의 SQL문으로 여러 테이블의 데이터를 연관하여 조회하는 기법</li>
</ul>
</li>
<li>JOIN의 유형<ul>
<li>EQUI JOIN<ul>
<li>테이블 간 컬럼 값들이 정확히 일치하는 경우에 사용 </li>
<li>대부분 PK와 FK 관계를 기반으로 함 </li>
<li>형식<ul>
<li>SELECT 컬럼(들) FROM 테이블1 A, 테이블2 B WHERE A.컬럼명=B.컬럼명 </li>
</ul>
</li>
</ul>
</li>
<li>NON-EQUI JOIN <ul>
<li>테이블 간의 조인 조건이 동등 비교(=)가 아닌 다른 비교 연산자를 사용하는 조인 방식<ul>
<li>BETWEEN, &gt;, &gt;=, &lt;, &lt;=, != 등의 연산자</li>
</ul>
</li>
</ul>
</li>
<li>INNER JOIN<ul>
<li>행에 동일한 값이 있는 컬럼 조인 (<strong>가장 일반적으로 사용</strong>)</li>
<li>조건에 충족되는 데이터만 출력</li>
<li>특징<ul>
<li>USING 혹은 ON 조건 절 필수</li>
<li>CROSS JOIN 혹은 OUTER JOIN과 동시에 사용할 수 없음</li>
<li>동일한 컬럼명이 있을 경우 ALIAS(별칭) 사용</li>
</ul>
</li>
</ul>
</li>
<li>NATURAL JOIN<ul>
<li>두 테이블 간에 같은 이름을 가진 모든 컬럼을 자동으로 매칭하여 조인하는 방식</li>
</ul>
</li>
<li>OUTER JOIN <ul>
<li>상대 테이블에서 대응되는 행을 찾지 못하거나, NULL 값이 포함된 행들을 다루기 위한 조인</li>
<li>LEFT OUTER JOIN<ul>
<li>왼쪽의 테이블을 기준으로 결과를 생성</li>
<li>왼쪽 테이블의 행들을 모두 표시한 후</li>
<li>대응되는 행이 없을 경우 NULL로 대체</li>
</ul>
</li>
<li>RIGHT OUTER JOIN <ul>
<li>오른쪽 테이블을 기준으로 결과를 생성</li>
<li>오른쪽 테이블의 행들을 모두 표시한 후</li>
<li>대응되는 행이 없을 경우 NULL로 대체</li>
</ul>
</li>
<li>FULL OUTER JOIN<ul>
<li>양쪽 테이블 모두를 기준으로 결과를 생성 </li>
<li>대응되는 행이 없을 경우 양쪽 모두 NULL로 대체</li>
</ul>
</li>
<li>CROSS JOIN<ul>
<li>연결된 테이블의 Cartesian Product를 반환 (모든 조합)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code># EQUI JOIN
SELECT user_t.name USER_NAME, team_t.name
TEAM_NAME FROM user_t, team_t
WHERE user_t.team_id = team_t.team_id;



# NON-EQUI JOIN
SELECT e.employee_name, e.salary, s.grade
FROM employees e
JOIN salary_grades s ON e.salary BETWEEN s.lower_salary
AND s.upper_salary;



# INNER JOIN
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;



# NATURAL JOIN
SELECT employee_id, first_name, last_name, department_name
FROM employees
NATURAL JOIN departments;



# FULL OUTER JOIN
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id
= d.department_id;</code></pre><ul>
<li><p>JOIN의 유형: 수행 방식에 따른 유형</p>
<ul>
<li>SELF JOIN <ul>
<li>동일한 테이블을 두 번 이상 참조하여 조인하는 방식 (별칭 사용 필수)</li>
</ul>
</li>
<li>NESTED LOOP JOIN<ul>
<li>선행 테이블을 하나씩 접근하며 추출한 값으로 연결할 테이블을 조인</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li>SORT MERGE JOIN<ul>
<li>대상 테이블의 처리 범위를 각자 접근 및 정렬한 결과를 차례로 스캔하며 연결 조건으로 머지 (Merge)</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/bea9768c-ab55-4e58-b8a9-572af312d238/image.png" alt=""></p>
<br />
<br />

<h2 id="3-view의-특징과-활용">3. View의 특징과 활용</h2>
<h3 id="1-뷰view의-개념과-특징">(1) 뷰(View)의 개념과 특징</h3>
<ul>
<li>View의 개념<ul>
<li>하나 이상의 기본 테이블이나 다른 뷰를 이용하여 생성된 가상의 테이블</li>
<li>장점: 보안성, 편의성</li>
</ul>
</li>
<li>View의 특징<ul>
<li>데이터딕셔너리에 뷰의 정의만 저장</li>
<li>데이터를 위한 저장공간 할당은 안 됨</li>
<li>View의 형식<ul>
<li>생성<ul>
<li>CREATE [OR REPLACE] VIEW 뷰이름 [(컬럼1, 컬럼2, ...)]</li>
<li>AS SELECT 문</li>
<li>[WITH CHECK OPTION [CONSTRAINT 제약조건명]]</li>
<li>[WITH READ ONLY]</li>
</ul>
</li>
<li> 삭제<ul>
<li>DROP VIEW 뷰이름</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>CREATE VIEW other_view
AS SELECT name, age, deptno FROM user_t;</code></pre><table>
<thead>
<tr>
<th>종류</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>단순 뷰   (Simple View)</td>
<td>- 하나의 기본 테이블에 의해 정의된 뷰로 기본 테이블과 동일한 DML 문 사용   - 뷰에 대한 무결성 제약조건도 기본 테이블의 제약조건이 적용됨</td>
</tr>
<tr>
<td>복합 뷰   (Complex View)</td>
<td>- 두 개 이상의 기본 테이블로 구성된 뷰   - 무결성 제약조건, 표현식, GROUP BY 사용 유무에 따라 DML 명령문을 제한적으로 사용</td>
</tr>
<tr>
<td>인라인 뷰(Inline View)</td>
<td>- FROM 절에서 참조하는 테이블의 크기가 클 경우, 필요한 행과 컬럼만으로 구성된 집합을 재정의하여 질의문을 효율적으로 구성   - FROM 절에서 서브쿼리를 사용하여 생성한 임시 뷰로 SQL 쿼리 실행 범위 내에서만 존재하는 임시 뷰</td>
</tr>
</tbody></table>
<p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6. SQL의 기본(2)]]></title>
            <link>https://velog.io/@april_5/6.-SQL%EC%9D%98-%EA%B8%B0%EB%B3%B82</link>
            <guid>https://velog.io/@april_5/6.-SQL%EC%9D%98-%EA%B8%B0%EB%B3%B82</guid>
            <pubDate>Sat, 12 Apr 2025 00:05:21 GMT</pubDate>
            <description><![CDATA[<h2 id="1-select-구문과-활용">1. SELECT 구문과 활용</h2>
<h3 id="1-dml-data-manipulation-language">(1) DML (Data Manipulation Language)</h3>
<ul>
<li>DML의 개념과 특징<ul>
<li>데이터베이스의 데이터를 조작, 검색/추가/삭제/갱신 등 수행하는 SQL 언어 </li>
</ul>
</li>
</ul>
<table>
<thead>
<tr>
<th>SQL 명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>INSERT</td>
<td>새로운 레코드를 삽입하는 명령어</td>
</tr>
<tr>
<td>SELECT</td>
<td>조건에 맞는 레코드를 선택하여 반환하는 명령어</td>
</tr>
<tr>
<td>UPDATE</td>
<td>선택된 레코드의 속성값을 수정하는 명령어</td>
</tr>
<tr>
<td>DELETE</td>
<td>선택된 레코드를 삭제하는 명령어</td>
</tr>
</tbody></table>
<br />

<ul>
<li>INSERT 구문- 데이터 입력<ul>
<li>명령어 형식 <ul>
<li>INSERT INTO 테이블명 (column명, ...) VALUES (value 값, ...) </li>
<li>INSERT INTO 테이블병 VALUES (값, ...) </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>INSERT INTO 
employees (employee_id, first_name, last_name, email, hire_date, job_id) 
VALUES (405, &#39;Ruby&#39;, &#39;Kim&#39;, &#39;ruby@mail.com’, TO_DATE(&#39;2025-04-12&#39;, &#39;YYYY-MM-DD&#39;), &#39;IT_PROG&#39;);</code></pre><ul>
<li>UPDATE 구문- 데이터 수정<ul>
<li>명령어 형식 <ul>
<li>UPDATE 테이블명 SET column명=value</li>
<li>WHERE 절을 이용하여 조건 지정. <strong>WHERE 절이 없을 경우 모든 행이 업데이트 됨!!</strong> </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>UPDATE employees SET job_id = &#39;AC_ACCOUNT&#39; WHERE employee_id = 405;</code></pre><ul>
<li>DELETE 구문- 데이터 삭제<ul>
<li>명령어 형식 <ul>
<li>DELETE FROM 테이블명 </li>
<li>WHERE 절을 이용하여 조건 지정 </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code> DELETE FROM employees WHERE employee_id = 405;</code></pre><br />

<h3 id="2-select-구문의-형식과-활용">(2) SELECT 구문의 형식과 활용</h3>
<ul>
<li>SELECT 구문- 데이터 선택/가져오기<ul>
<li>명령어 형식 <ul>
<li>SELECT 컬럼명 FROM 테이블명 </li>
<li>SELECT * FROM 테이블명</li>
<li>SELECT DISTINCT 컬럼명 FROM 테이블명<ul>
<li>DISTINCT: 중복 제거</li>
<li>ALIAS(별칭)을 설정하여 간결하고 명확한 SQL 작성 가능, 별칭을 사용한 경우 별칭을 이용한 참조 필수</li>
<li>DUAL: 오라클이 제공하는 기본 더미 테이블, 연산 수행을 위해 사용</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>SELECT S.NAME, B.NAME FROM student_t AS S, band_t AS B WHERE S.bcode = B.bcode;</code></pre><ul>
<li>SELECT 구문- 산술연산자의 활용<ul>
<li>산술 연산자: 수학의 사칙연산, NUMBER / DATE 등의 데이터에 사용<ul>
<li>사칙연산: +, /, +, -</li>
<li>나머지 연산: % (Oracle는 MOD 함수를 이용)</li>
<li>괄호 (): 먼저 처리해야 할 것을 지정</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>SELECT 1+1, 10/2 FROM DUAL;
SELECT C1+C2 AS A, C1-C2 AS B FROM sample_t;</code></pre><ul>
<li>SELECT 구문- 문자 연결 연산자와 문자함수의 활용<ul>
<li>문자 연결 연산자: 여러 개의 문자열을 하나의 문자열로 합성<ul>
<li>오라클: ||</li>
<li>SQL 서버: +</li>
<li>MariaDB: CONCAT() </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>SELECT ‘H’ || ‘I’ AS HI FROM DUAL;
SELECT NAME || ‘선수, HEIGHT || ‘cm’ FROM member_t;</code></pre><ul>
<li>SELECT 구문- 문자 연결 연산자와 문자함수의 활용<ul>
<li>문자함수: 문자열을 특정 목적에 따라 처리하는 함수<ul>
<li>CHR (숫자): 아스키 코드에 대한 문자 출력</li>
<li>LOWER (문자열): 소문자열로 변환</li>
<li>UPPER (문자열): 대문자열로 변환</li>
<li>LTRIM (문자열, 점검문자): 문자열의 왼쪽부터 점검문자를 제거, 점검문자를 지정하지 않으면 공백 문자를 대상으로 함 </li>
<li>RTRIM (문자열, 점검문자): 문자열의 오른쪽부터 점검문자를 제거, 점검문자를 지정하지 않으면 공백 문자를 대상으로 함</li>
<li>TRIM (문자열, 점검문자): 문자열의 양쪽부터 점검문자를 제거, 점검문자를 지정하지 않으면 공백 문자를 대상으로 함 </li>
<li>SUBSTR (문자열, 시작점, 길이): 문자열의 시작위치 부터 길수(개수)만큼 추출, 길이를 지정하지 않은 경우 끝까지 추출</li>
<li>LENGTH (문자열): 문자열의 길이 반환 </li>
<li>REPLACE (문자열, 대상 문자열, 대체 문자열): 문자열에 포함된 대상 문자열을 대체, 대체 문자열을 지정하지 않으면 제거 </li>
<li>LPAD (문자열, 길이, 문자): 설정한 길이의 문자열이 될 때까지 문자열의 왼쪽을 지정한 문자로 채움</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code># TRIM
SELECT LTRIM(‘ CHRIS’) FROM DUAL;
SELECT TRIM(‘~~~Hi~~~’, ‘~’’) FROM DUAL;


# LPAD
SELECT SUBSTR(‘MyHome’, 3) FROM DUAL;
SELECT SUBSTR(‘YourHome’, 1, 3) FROM DUAL;
SELECT REPLACE(‘MyHome’, ‘My’, ‘Your’) FROM DUAL;
SELECT LPAD(‘Hi’, 5, ‘~’) FROM DUAL;</code></pre><ul>
<li>SELECT 구문- 숫자함수의 활용<ul>
<li>숫자 함수: 숫자 데이터를 특정 목적에 따라 처리하는 함수 <ul>
<li>ABS (숫자): 절대값을 반환 </li>
<li>SIGN (숫자): 수의 부호를 반환 (양수 : 1, 음수 : -1, 0 : 0) </li>
<li>ROUND (숫자, 자리수): 지정된 소수점 자리수로 반올림, 자리수를 지정하지 않을 경우 0을 기본값으로 사용 </li>
<li>TRUNC (숫자, 자리수): 지정된 소수점 자리수까지 버림하여 반환, 자리수를 지정하지 않을 경우 0을 기본값으로 사용  </li>
<li>CEIL (숫자): 소수점 이하의 수를 올림 한 정수를 반환 </li>
<li>FLOOR(숫자): 소수점 이하의 수를 버림 한 정수를 반환 </li>
<li>MOD(숫자1, 숫자2): 나머지를 반환, 숫자2가 0일 경우 숫자1을 반환</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>SELECT ROUND(123.76, 1) FROM DUAL;
SELECT ROUND(173.76, -2) FROM DUAL;
SELECT TRUNC(123.76, 1) FROM DUAL;
SELECT TRUNC(123.76, -1) FROM DUAL;
SELECT CEIL(12.77) FROM DUAL;
SELECT FLOOR(25.4) FROM DUAL;
SELECT FLOOR(-25.4) FROM DUAL;
SELECT MOD(15, -2) FROM DUAL;
SELECT MOD(-15, -2) FROM DUAL;</code></pre><ul>
<li>SELECT 구문- 날짜함수의 활용<ul>
<li>날짜함수: 날짜 데이터를 특정 목적에 따라 처리하는 함수 <ul>
<li>SYSDATE: 현재의 연, 월, 시, 분, 초를 반환</li>
<li>EXTRACT(단위 FROM 날짜): 날짜 중 특정 단위의 데이터를 추출하여 반환 (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND)</li>
<li>ADD_MONTHS(날짜, 개월 수): 날짜에 지정한 개월 수를 더한 날짜를 반환 (기준 날짜가 없을 시 마지막 일자 반환) </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>SELECT SYSDATE FROM DUAL;
EXTRACT (YEAR FROM SYSDATE) AS YEAR FROM DUAL;
ADD_MONTHS(TO_DATE(‘2025-04-12’, ‘YYYY-MM-DD’), 1) AS NEXT FROM DUAL;</code></pre><ul>
<li>SELECT 구문- 데이터 형식 변환 함수의 활용<ul>
<li>데이터 변환 방식의 종류 <ul>
<li>명시적 변환: 데이터 형식 변환 함수를 이용하여 명시적으로 변환</li>
<li>암시적 변환: 연산 방식에 따라 자동으로 변환</li>
</ul>
</li>
<li>데이터 형식 변환 함수 <ul>
<li>TO_NUMBER(문자열): 숫자형으로 변환</li>
<li>TO_CHAR(데이터, 포맷): 숫자, 날짜 데이터를 지정한 포맷의 문자열로 변환, 포맷 생략 시 전체를 문자열로 변환 </li>
<li>TO_DATE(문자열, 포맷): 포맷에 따라 날짜형으로 변환 (YYYY, MM, DD, HH, HH24, MI, SS) </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>SELECT TO_CHAR(123) FROM DUAL;
SELECT TO_CHAR(SYSDATE, ‘YYYYMMDD HH24MISS‘) FROM DUAL;</code></pre><ul>
<li>SELECT 구문- NULL 관련 함수의 활용<ul>
<li>NULL 관련 함수<ul>
<li>결과가 NULL일 경우 어떤 방식으로 처리할 지 지정하는 함수 <ul>
<li>NVL(인자1, 인자2): 인자 1이 NULL일 경우 인자2를 반환, NULL이 아닌 경우 인자 1을 반환</li>
<li>NULLIF(인자1, 인자2): 인자1과 인자2가 같으면 NULL을 반환, 같지 않은 경우 인자1을 반환  </li>
<li>COALESCE(인자1, 인자2, 인자3, ...): 전달한 인자 중 NULL이 아닌 최초의 인자의 값을 반환</li>
<li>NVL2(인자1, 인자2, 인자3): 인자1이 NULL이 아닌 경우 인자2를 반환, NULL일 경우 인자3을 반환 </li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>SELECT USER_NO, NVL(GRADE, 0) AS HAKJUM FROM user_t;
SELECT USER_NAME, COALESCE (TEL, MAIL, SOCIAL) AS USER_CONTACT FROM user_t;
SELECT USER_NAME, NVL2(GRADE, &#39;학점취득&#39;, &#39;학점미취득&#39;) AS GRADE_CHECK FROM user_t;</code></pre><ul>
<li>SELECT 구문- CASE, DECODE 구문의 활용<ul>
<li>IF<del>THEN</del>ELSE의 논리구조와 유사한 방식</li>
<li>CASE 구문의 예와 DECODE (오라클 전용)</li>
</ul>
</li>
</ul>
<pre><code># ELSE 생략 시 NULL 출력
CASE WHEN GRADE =&#39;A&#39; THEN ‘HIGH’ WHEN GRADE =&#39;B&#39; THEN &#39;MIDDLE&#39; ELSE &#39;LOW&#39; END

CASE GRADE WHEN GRADE =&#39;A&#39; THEN ‘HIGH’ WHEN GRADE =&#39;B&#39; THEN &#39;MIDDLE&#39; ELSE &#39;LOW&#39; END

DECODE (GRADE, &#39;A&#39;, &#39;HIGH&#39;, &#39;B&#39;, &#39;MIDDLE&#39;, &#39;LOW&#39;)</code></pre><p><br /><br /></p>
<h2 id="2-where절의-특징과-활용">2. WHERE절의 특징과 활용 </h2>
<h3 id="1-where절의-특징과-연산자">(1) WHERE절의 특징과 연산자</h3>
<ul>
<li>WHERE절의 목적과 기본 형식 <ul>
<li>SELECT, UPDATE, DELETE 문에서 조건을 설정하는 구문 </li>
<li>원하는 조건을 WHERE 이후에 지정  <ul>
<li>SELECT * FROM user_t WHERE NAME = ‘Ruby’; </li>
<li>SELECT * FROM user_t WHERE NAME &lt;&gt; ‘Ruby’;</li>
<li>UPDATE user_t SET AGE = 30 WHERE NAME = ‘Ruby’;</li>
<li>DELETE user_t WHERE NAME = ‘Ruby’;</li>
</ul>
</li>
</ul>
</li>
<li>WHERE절에서 사용할 수 있는 연산자<ul>
<li>비교 연산자 : = , &lt; , &lt;= , &gt;, &gt;= </li>
<li>부정의미의 비교 연산자 : !=, ^=, &lt;&gt;, not 컬럼명 = 값, not 컬럼병명 &gt; 값</li>
<li>SQL 고유 연산자 <ul>
<li>BETWEEN A AND B : A와 B를 포함한 사이의 값</li>
<li>IN (리스트) : 리스트 내의 값<ul>
<li>NOT BTWEEN A AND B</li>
<li>NOT IN (리스트)</li>
<li>IS NOT NULL</li>
</ul>
</li>
<li>LIKE ‘비교 문자열‘ : 비교 문자열을 포함 (% : 문자열, _ : 하나의 문자)</li>
<li>IS NULL : NULL 값 확인(※ NULL은 일반 비교연산자로 확인할 수 없음)</li>
</ul>
</li>
<li>논리 연산자 : NOT, AND, OR </li>
</ul>
</li>
</ul>
<pre><code>SELECT NAME, GRADE FROM user_t WHERE NAME LIKE &#39;Ruby%Kim%&#39;;
SELECT NAME, JUMSU FROM user_t WHERE JUMSU in (100, 80, 70);</code></pre><ul>
<li>연산자 우선 순위<ul>
<li>괄호 &gt; 부정 연산자 &gt; 비교 연산자 &gt; 논리연산자<ol>
<li>괄호</li>
<li>NOT</li>
<li>AND</li>
<li>비교 연산자, SQL 연산자</li>
<li>OR </li>
</ol>
</li>
<li>문자열 비교: 첫 서로 다른 문자의 값 비교</li>
<li>CHAR와 VACHAR의 비교: 길이가 다르면 길이가 긴 값이 크다고 판단 </li>
</ul>
</li>
</ul>
<br />
<br />

<h2 id="3-group-by-having-order-by-절의-특징과-활용">3. GROUP BY, HAVING, ORDER BY 절의 특징과 활용</h2>
<h3 id="1-group-by-절의-특징과-집계-함수">(1) GROUP BY 절의 특징과 집계 함수 </h3>
<ul>
<li><p>데이터를 그룹 별로 묶어서 처리하기 위해 사용</p>
</li>
<li><p>형식 : GROUP BY 기준 컬럼명(기준 컬럼은 2개 이상이 될 수 있음)</p>
</li>
<li><p>집계 함수를 이용한 집계 데이터 도출 가능</p>
</li>
<li><p>GROUP BY 사용 시 SELECT 절에는 GROUP BY에 사용된 컬럼과 집계 함수만 사용할 수 있음</p>
</li>
<li><p>집계함수의 특징</p>
<ul>
<li>집계함수란?<ul>
<li>여러 행들의 그룹을 대상으로 하나의 결과를 반환하는 다중행 함수</li>
</ul>
</li>
<li>집계함수의 종류<ul>
<li>COUNT(*): NULL 값을 포함한 행의 개수</li>
<li>COUNT(컬럼): 값이 NULL인 행을 제외한 개수 </li>
<li>COUNT(DISTINCT 컬럼): 값이 NULL이 아닌 행을 대상으로 중복을 제거한 개수 </li>
<li>SUM(컬럼): 컬럼 값들의 합계</li>
<li>AVG(컬럼): 컬럼 값들의 평균</li>
<li>MIN(컬럼): 컬럼 값 중 최소값</li>
<li>MAX(컬럼): 컬럼 값 중 최대값</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>SELECT AVG(AGE) AS AVG_AGE FROM user_t;</code></pre><h3 id="2-having-order-by절의-특징과-활용">(2) HAVING, ORDER BY절의 특징과 활용</h3>
<ul>
<li>HAVING 절의 특징과 활용<ul>
<li>그룹을 나타내는 결과 집합의 행을 대상으로 조건 지정</li>
<li>일반적으로 GROUP BY 절 뒤에 위치하며, GROUP BY 절에서 사용된 컬럼을 조건으로 사용할 수 있음 </li>
<li>SELECT 한 결과를 특정 컬럼을 기준으로 정렬하기 위해 사용하는 구문 (※ 기본 : 임의의 순으로 출력)</li>
<li>ORDER BY 절에 컬럼을 지정하는 방식<ul>
<li>컬럼명, ALIAS(별칭), 컬럼 순서를 나타내는 정수</li>
<li>GROUP BY 절이 있을 경우 GROUP BY 대상 컬럼명만 지정 가능</li>
<li>2 개 이상의 컬럼도 지정 가능</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>                  - ORDER BY 절의 정렬 옵션: ASC (오름차순, 기본), DESC (내림차순)</p>
<p>                  - 오라클은 NULL을 최대값으로 판단함</p>
<p>                  - NULL FIRST, NULL LAST 옵션으로 변경 가능</p>
<pre><code>SELECT JOB, COUNT(*) AS CNT, SUM(SAL) AS TOTAL_SAL FROM emp_t 
WHERE DEPT_NO IN (&#39;1&#39;, &#39;2&#39;, &#39;3&#39;) 
GROUP BY JOB HAVING COUNT(*) &gt; 2 AND SUM(SAL) &gt; 5000


SELECT NAME, POSITION FROM player_t 
WHERE NUMBER IS NOT NULL ORDER BY NAME DESC;</code></pre><h3 id="3-select-관련-구문의-실행-순서">(3) SELECT 관련 구문의 실행 순서</h3>
<ul>
<li>ORDER BY 절의 특징과 활용</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/15e7c740-f835-4838-af19-a93184eb4289/image.png" alt=""></p>
<p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[5. SQL의 기본 (1)]]></title>
            <link>https://velog.io/@april_5/5.-SQL%EC%9D%98-%EA%B8%B0%EB%B3%B8-1</link>
            <guid>https://velog.io/@april_5/5.-SQL%EC%9D%98-%EA%B8%B0%EB%B3%B8-1</guid>
            <pubDate>Sat, 05 Apr 2025 01:17:19 GMT</pubDate>
            <description><![CDATA[<h2 id="1-crud를-위한-sql-구문">1. CRUD를 위한 SQL 구문</h2>
<h3 id="1-crudcreate-read-update-delete">(1) CRUD(Create, Read, Update, Delete)</h3>
<ul>
<li><p>CRUD의 개념 </p>
<ul>
<li>데이터베이스에서 데이터를 관리하는 4가지의 기본 연산인 Create, Read, Update, Delete의 약어 <ul>
<li>Create: 데이터 생성, 새로운 데이터를 추가할 때 사용 <ul>
<li>INSERT INTO users (name, email) VALUES (‘ruby’, ‘<a href="mailto:ruby@dev.com">ruby@dev.com</a>’)</li>
</ul>
</li>
<li>Read: 데이터 읽기, 저장된 데이터를 조회/검색할 때 사용<ul>
<li>SELECT * FROM users WHERE name = ‘ruby’</li>
</ul>
</li>
<li>Update: 데이터 수정, 저장되어 있는 데이터를 수정할 때 사용<ul>
<li>UPDATE users SET email =‘<a href="mailto:ruby00@dev.com">ruby00@dev.com</a>’ WHERE name = ‘ruby’</li>
</ul>
</li>
<li>Delete: 데이터 삭제, 저장되어 있는 데이터를 삭제할 때 사용<ul>
<li>DELETE FROM users where name = ‘ruby’ </li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>CRUD Matrix </p>
<ul>
<li>데이터베이스에서 데이터에 대해 수행할 수 있는 CRUD 작업을 시각적으로 표현한 도구</li>
<li>사용자 역할이나 프로세스가 특정 엔터티에 대하여 어떤 CRUD 작업을 수행할 수 있는지 표 형식으로 표현</li>
<li>행(Row): 시스템에서 수행되는 프로세스 혹은 기능</li>
<li>열(Column): 시스템에서 다루는 엔티티 </li>
<li>값(Value):CRUD 연산</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/dfb9311d-379c-4a6b-92e9-d08aed589bfa/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/5c570c4a-6723-46d0-b4cb-a8ba832c9827/image.png" alt=""></p>
</li>
</ul>
<br />

<h3 id="2-sql과-관계-대수">(2) SQL과 관계 대수</h3>
<ul>
<li><p>SQL(Structured Query Language)의 개념 </p>
<ul>
<li>관계 대수에 기초하여 RDBMS의 데이터를 관리하기 위한 프로그램 언어 </li>
<li>RDBMS에 저장된 데이터를 생성, 조작, 제어하기 위한 프로그램 언어 </li>
</ul>
</li>
<li><p>관계 대수(Relational Algebra)와 관계 대수식(Relational Algebra Expression)</p>
<ul>
<li><p>관계 대수: 관계형 데이터베이스에서 데이터를 조회하고 조작하기 위한 수학적 언어 
➔ SQL의 이론적 기초</p>
</li>
<li><p>관계 대수식: 관계 대수의 연산을 수행하기 위한 일련의 수식 </p>
</li>
<li><p>관계 연산자의 구분</p>
<ul>
<li>단항 연산자</li>
<li>이항 연산자</li>
<li>일반 집합 연산자</li>
<li>순수 관계 연산자 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/d06a8518-0afe-43a9-b1b3-6502e89adfc6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/339d467f-21f8-4a26-aa01-3034432a7ffa/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/649afcbc-0b2f-4c5d-a365-527cc43ee7d9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/64f26828-d89f-4e8b-9659-3c48e6b87648/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/8cb2350e-37fe-490d-bfbd-e83fced3aa73/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/16851834-9744-4854-a709-05d5f2280786/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h3 id="3-sql-문의-종류">(3) SQL 문의 종류</h3>
<p><img src="blob:https://velog.io/aa526a88-f430-4d1c-982e-4e27a2d67847" alt="업로드중.."></p>
<p><br /><br /></p>
<h2 id="2-ddldata-definition-language-구문과-활용">2. DDL(Data Definition Language) 구문과 활용</h2>
<h3 id="1-ddldata-definition-language">(1) DDL(Data Definition Language)</h3>
<ul>
<li>DDL의 개념과 특징 <blockquote>
<p>DDL(Data Definition Language)이란?<br>데이터베이스의 구조를 정의, 수정하는 SQL 언어<br>➔ 데이터 사전 (Data Dictionary, Data Schema)에 저장</p>
</blockquote>
</li>
</ul>
<table>
<thead>
<tr>
<th>DDL SQL명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>CREATE</td>
<td>데이터베이스, 테이블, 인덱스, 뷰 등을 생성하는 명령어</td>
</tr>
<tr>
<td>DROP</td>
<td>테이블과 같은 데이터베이스 내 객체를 삭제하는 명령어</td>
</tr>
<tr>
<td>ALTER</td>
<td>데이터베이스 내 객체의 정의 혹은 속성을 변경하는 명령어</td>
</tr>
</tbody></table>
<ul>
<li>CREATE TABLE - 테이블 생성 <ul>
<li>명령어 형식: CREATE TABLE 테이블명 (칼럼명 데이터 타입 제약 조건…) </li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/e33b324a-d911-4ef3-a0e2-e047c5aa79fd/image.png" alt=""></p>
<ul>
<li>DROP TABLE - 테이블 제거 <ul>
<li>명령어 형식: DROP TABLE 테이블명 <ul>
<li>테이블의 데이터와 구조 모두를 삭제, 복구 불가 <ul>
<li>Oracle: FLASHBACK을 이용하여 복구 가능 (단, PURGE 옵션으로 삭제 시 완전 삭제)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>TRUNCATE TABLE - 테이블의 데이터 제거 <ul>
<li>명령어 형식 : TRUNCATE TABLE 테이블명 <ul>
<li>테이블의 전체 데이터(만) 삭제, ROLLBACK 불가 (로그를 기록하지 않음)<ul>
<li>MariaDB: AUTO_INCREMENT 초기화됨</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>ALTER TABLE - 테이블 수정<ul>
<li>명령어 형식<ul>
<li>ALTER TABLE 테이블명 ADD (컬럼명 데이터타입) </li>
<li>ALTER TABLE 테이블명 DROP COLUMN 컬럼명</li>
<li>ALTER TABLE 테이블명 MODIFY (컬럼명 데이터타입 제약조건)<ul>
<li>칼럼명 변경 시 RENAME TABLE ~ 혹은 ALTER TALBLE ~ RENAME TO 사용</li>
<li>Oracle : 다중 컬럼 삭제 지원</li>
</ul>
</li>
</ul>
</li>
<li>MODIFIY 시 제약사항<ul>
<li>칼럼의 크기 축소 시 NULL 혹은 값이 없는 경우에만 가능<ul>
<li>MariaDB는 컬럼 크기 감소 시 데이터 손실이 발생할 수 있음</li>
</ul>
</li>
<li>데이터 유형 변경 시 NULL만 있는 경우에 가능</li>
<li>NOT NULL 설정은 NULL이 없을 경우에 가능 </li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>RENAME (TABLE) - 테이블 이름 변경<ul>
<li>명령어 형식<ul>
<li>RENAME 테이블명 TO 새로운 테이블명<ul>
<li>MariaDB : RENAME TABLE 테이블명 TO 새로운 테이블명</li>
</ul>
</li>
<li>ALTER TABLE 테이블명 RENAME TO 새로운 테이블명</li>
</ul>
</li>
</ul>
</li>
<li>DESCRIBE / DESC - 테이블 구조 확인<ul>
<li>명령어 형식 : DESCRIBE 테이블명<ul>
<li>SQL Server : sp_help dbo.테이블명</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br /><br /></p>
<h2 id="3-dcl-data-control-language-구문과-활용">3. DCL (Data Control Language) 구문과 활용</h2>
<h3 id="1-dcldata-control-language">(1) DCL(Data Control Language)</h3>
<ul>
<li>DLC의 개념과 특징<blockquote>
<p>DCL (Data Control Language)란?<br>데이터에 대한 접근 권한 부여 등 관리를 위한 SQL 언어</p>
</blockquote>
</li>
</ul>
<br />

<table>
<thead>
<tr>
<th>DCL SQL명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>GRANT</td>
<td>데이터베이스 사용자에게 특정 권한을 부여하는 명령어</td>
</tr>
<tr>
<td>REVOKE</td>
<td>데이터베이스 사용자의 특정 권한을 제거하는 명령어</td>
</tr>
</tbody></table>
<ul>
<li><p>CREATE / ALTER / DROP USER </p>
<ul>
<li>사용자 생성: CREATE USER 사용자명 IDENTIFIED BY 패스워드<ul>
<li>MariaDB: CREATE USER &#39;사용자명&#39;@&#39;호스트명&#39; IDENTIFIED BY ‘패스워드’ </li>
</ul>
</li>
<li>사용자 변경: ALTER USER 사용자명 IDENTIFIED BY 패스워드<ul>
<li>MariaDB: ALTER USER &#39;사용자명&#39;@&#39;호스트명&#39; IDENTIFIED BY ‘패스워드’</li>
</ul>
</li>
<li>사용자 삭제: DROP USER 사용자명<ul>
<li>Oracle: CASCADE 옵션 사용 가능 (사용자의 모든 객체도 함께 삭제) </li>
<li>MariaDB: &#39;사용자명&#39;@&#39;호스트명&#39; 형식 사용 (% : 전체)</li>
</ul>
</li>
</ul>
</li>
<li><p>GRANT - 권한 부여 </p>
<ul>
<li><p>명령어 형식 : GRANT 권한 ON 대상 TO 사용자</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/755aed0f-bb50-460b-9ceb-a7287309b533/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li>REVOKE - 권한 회수(제거) <ul>
<li>명령어 형식 : REVOKE 권한 ON 대상 FROM 사용자 <ul>
<li>GRANT로 부여된 권한 회수<ul>
<li>Oracle: CASCADE CONSTRAINTS 옵션으로 관련된 참조 무결성 제약조건도 함께 삭제 </li>
<li>WITH GRANT OPTION (해당 사용자가 다른 사용자에게 부여한 권한도 함께 회수)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[4. 논리적 모델링과 정규화]]></title>
            <link>https://velog.io/@april_5/4.-%EB%85%BC%EB%A6%AC%EC%A0%81-%EB%AA%A8%EB%8D%B8%EB%A7%81%EA%B3%BC-%EC%A0%95%EA%B7%9C%ED%99%94</link>
            <guid>https://velog.io/@april_5/4.-%EB%85%BC%EB%A6%AC%EC%A0%81-%EB%AA%A8%EB%8D%B8%EB%A7%81%EA%B3%BC-%EC%A0%95%EA%B7%9C%ED%99%94</guid>
            <pubDate>Fri, 28 Mar 2025 23:46:07 GMT</pubDate>
            <description><![CDATA[<h2 id="1-논리적-모델링-개요">1. 논리적 모델링 개요</h2>
<h3 id="1-논리적-모델링의-개념과-특징">(1) 논리적 모델링의 개념과 특징 </h3>
<ul>
<li>논리적 모델링(Logical Modeling) 의 개념<ul>
<li>개념적 모델링을 기반으로 <strong>키</strong>, <strong>속성</strong>, <strong>관계</strong> 등 데이터의 <strong>논리적 구조를 정확하게 정의</strong>하는 과정</li>
<li>관계형 데이터베이스의 <strong>논리적 구조에 적합하도록 변환하고 정체</strong>하는 과정</li>
</ul>
</li>
<li>논리적 모델링의 일반적인 특징<ul>
<li>특정 DBMS 혹은 물리적 구현에 독립적인 설계 </li>
<li>엔터티를 테이블로 변환</li>
<li>속성을 칼럼(속성)으로 변환</li>
<li>기본키와 외래키 설정</li>
<li>제약 조건 설정</li>
</ul>
</li>
</ul>
<p>⇒ 정규화를 통한 데이터 중복 최소화, 데이터 이상현상 방지, 무결성 및 일관성 유지 </p>
<ul>
<li><p>논리적 모델의 주요 고려사항</p>
<ul>
<li>엔터티 정제: 유사한 엔터티의 통합 및 분리를 통한 구조화</li>
<li>식별자(Key) 선정: 릴레이션(테이블)의 튜플(레코드)를 대표하는 식별자(Key) 선정</li>
<li>관계 설정/해소: 교차 엔터티를 이용하여 M:N 관계 재 설정(해소) </li>
<li>다중값 속성 해소: 다중값 속성을 별도의 릴레이션으로 분리, 원래 엔터티의 기본키를 외래키로 포함</li>
<li>정규화 및 제약조건: 데이터 중복제거 및 이상현상 해소, 무결성 검사 및 제약 사항 적용 </li>
</ul>
</li>
<li><p>키(Key)의 종류와 특징</p>
<ul>
<li>기본키(Primary Key)<ul>
<li>주식별자, 여러 개의 후보키 중에서 하나를 선정</li>
<li>테이블을 대표하는 키</li>
<li>대표성</li>
</ul>
</li>
<li>후보키(Candidate Key)<ul>
<li>키의 특성인 유일성과 최소성을 만족하는 키 </li>
</ul>
</li>
<li>슈퍼키(Super Key)<ul>
<li>유일성은 만족하나 최소성을 만족하지 않는 키</li>
</ul>
</li>
<li>대체키(Alternative Key)<ul>
<li>후보키 중 기본키로 선정되지 않는 키</li>
<li>기본키를 대체할 수 있는 키</li>
</ul>
</li>
<li>외래키(Foreign Key)<ul>
<li>한 릴레이션의 속성(집합)이 다른 릴레이션의 기본키로 이용되는 키 </li>
</ul>
</li>
</ul>
</li>
<li><p>키(Key)의 상호 관계</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/cfbf358e-a85d-4430-8958-1deb4c8d46ae/image.png" alt=""></p>
</li>
</ul>
<p><br /><br /></p>
<h2 id="2-정규화">2. 정규화</h2>
<h3 id="1-함수적-종속성의-개념과-종류">(1) 함수적 종속성의 개념과 종류 </h3>
<ul>
<li>함수적 종속성의 개념</li>
</ul>
<blockquote>
<p>함수적 종속성이란?<br>데이터들이 결정자와 종속자의 관계로 상호 종속되는 관계
➜ X → Y: 결정자인 X가 종속자인 Y를 결정
➜ 한 릴레이션(R)의 X → Y인 관계에서 X가 기본키가 아닐 경우 이상현상이 발생할 수 있음</p>
</blockquote>
<ul>
<li>함수적 종속성의 종류
<img src="https://velog.velcdn.com/images/april_5/post/22370b68-b61f-4303-9bcd-806377e70582/image.png" alt=""></li>
</ul>
<table>
<thead>
<tr>
<th>종류</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>완전함수 종속성</td>
<td>(X,Y) → Z일때, X→Z가 아니고   Y→Z가 아니면 Z는 완전함수 종속</td>
</tr>
<tr>
<td>부분함수 종속성</td>
<td>(X,Y)→Z일때, X→Z이거나 Y→Z인 경우</td>
</tr>
<tr>
<td>이행함수 종속성</td>
<td>X→Y, X→Z 인 상황에서 Y→Z를 만족하는 경우</td>
</tr>
</tbody></table>
<br />

<h3 id="2-이상현상의-개념과-특징">(2) 이상현상의 개념과 특징</h3>
<ul>
<li>이상현상(Anomaly)의 개념</li>
</ul>
<blockquote>
<p>이상현상(Anomaly)이란?<br>데이터의 중복성으로 인해 릴레이션을 조작 시 발생하는 비합리적인 현상
➜ 중복된 속성, 속성 간에 종속하는 다양한 종속관계에 따라 발생하는 문제</p>
</blockquote>
<ul>
<li>이상현상의 종류와 특징</li>
</ul>
<table>
<thead>
<tr>
<th>종류</th>
<th>특징</th>
</tr>
</thead>
<tbody><tr>
<td>갱신 이상</td>
<td>릴레이션에서 특정 속성값을 갱신할 경우   중복 저장된 속성값 중 하나만 변경되어,   데이터간 불일치가 발생하는 문제</td>
</tr>
<tr>
<td>삭제 이상</td>
<td>릴레이션에서 특정 튜플을 삭제할 경우   보유하고자 하는 정보까지도 삭제되는 현상</td>
</tr>
<tr>
<td>삽입 이상</td>
<td>릴레이션에 특정 튜플을 삽입하고자 할 경우   원하지 않는 (불필요한) 정보까지도 추가해야 하는 현상</td>
</tr>
</tbody></table>
<ul>
<li><p>이상현상의 사례</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/d6b689ac-f964-42c6-a161-0dfb79f37e79/image.png" alt=""></p>
</li>
</ul>
<br />

<h3 id="3-정규화의-개념과-특징">(3) 정규화의 개념과 특징</h3>
<ul>
<li>정규화(Normalization)의 개념</li>
</ul>
<blockquote>
<p>정규화(Normalization)란?  </p>
<ul>
<li>이상현상(Anomaly)을 해결하기 위해 중복을 최소화 하면서 무손실 분해하는 과정  </li>
<li>함수적 종속성을 참고하여 기본적으로 하나의 종속성이 하나의 릴레이션으로 표현되도록 분해하는 과정</li>
</ul>
<p>➜ 정규형: 정규화로 도출된 데이터 모델이 갖추어야 할 특성</p>
</blockquote>
<ul>
<li><p>정규화의 특징</p>
<ul>
<li>이상현상 해결, 일관성과 무결성 확보</li>
<li>중복 제거로 저장 공간 회소화</li>
<li>연관 관계를 이용한 유연한 관리</li>
</ul>
<p>➜  정보의 무손실, 데이터 중복 최소화, 분리의 원칙 </p>
<p>※ 조인(Join)을 위한 정보 구성 및 활용 시 성능 저하</p>
</li>
</ul>
<br />

<ul>
<li>정규화의 유형별 특징</li>
</ul>
<table>
<thead>
<tr>
<th>종류</th>
<th>특징</th>
</tr>
</thead>
<tbody><tr>
<td>1차 정규화</td>
<td>- 속성의 원자값 확보(Atomic Value)   - 반복되는 속성 제거, 다중값 속성의 분리</td>
</tr>
<tr>
<td>2차 정규화</td>
<td>- 부분함수 종속성 제거   - 릴레이션 R이 1NF이고, 릴레이션의 기본키가 아닌 속성들이 기본키에 완전히 함수적으로 종속</td>
</tr>
<tr>
<td>3차 정규화</td>
<td>- 이행함수 종속성 제거   - 릴레이션 R이 2NF이고, 기본키가 아닌 모든 속성들이 기본키에 대하여 이행적 함수 종속성의 관계를 가지지 않음   - 기본키 외의 속성들 간에 함수적 종속적을 가지지 않는 경우</td>
</tr>
<tr>
<td>기타</td>
<td>- BCNF, 4차 정규화, 5차 정규화</td>
</tr>
</tbody></table>
<ul>
<li><p>1차 정규화의 예: atomic 하게 적용하기</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/417f7937-a675-40df-88d1-484b0e39c029/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>2차 정규화의 예: 부분 종속성 제거하기 </p>
<p><img src="https://velog.velcdn.com/images/april_5/post/7cd5d5f9-68cb-4bb9-9930-2a117d7e1285/image.png" alt=""> </p>
</li>
</ul>
<ul>
<li><p>3차 정규화의 예: 이행적 종속성 제거하기 </p>
<p><img src="https://velog.velcdn.com/images/april_5/post/ccd039a3-938a-4efa-8d7d-5b9f07c2e500/image.png" alt=""> </p>
</li>
</ul>
<p><br /><br /></p>
<h2 id="3-반정규화">3. 반정규화</h2>
<h3 id="1-정규화의-고려사항과-반정규화">(1) 정규화의 고려사항과 반정규화</h3>
<ul>
<li>정규화의 고려사항<ul>
<li>정규화의 장점<ul>
<li>데이터 이상현상 제거</li>
<li>데이터 중복 최소화</li>
<li>입력/수정/삭제 효율화</li>
</ul>
</li>
<li>정규화 고려사항<ul>
<li>조회 시 처리 조건에 따라 성능 저하 발생</li>
<li>Join 시 성증 저하 발생<ul>
<li>Join: 논리적 관계를 기준으로 둘 이상의 테이블을 연결하여 결과 집합을 만드는 과정</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>반정규화(Denormalization)의 개념</li>
</ul>
<blockquote>
<p>반정규화(Denormalization)란?<br>정규화 이후 조회(질의) 성능 향상을 위하여, 일부 데이터의 중복을 허용하거나 테이블의 구조를 변경하는 작업</p>
</blockquote>
<ul>
<li><p>반정규화의 절차</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/f4b458c7-c39f-4218-a5e6-c295dca5ca24/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>반정규화의 주요 기법<ul>
<li>테이블 반정규화: 테이블 병합, 테이블 분할, 테이블 추가</li>
<li>컬럼 반졍규화: 중복 컬럼 추가, 파생 컬럼 추가, 집계 컬럼 추가</li>
<li>관계 반정규화: 중복 관계 추가</li>
</ul>
</li>
</ul>
<p><br /><br /><br /> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3. 데이터 모델링의 이해]]></title>
            <link>https://velog.io/@april_5/3.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@april_5/3.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Sun, 23 Mar 2025 00:52:26 GMT</pubDate>
            <description><![CDATA[<h2 id="1-데이터-모델링-개요">1. 데이터 모델링 개요</h2>
<h3 id="1-데이터-모델링의-개념과-특징">(1) 데이터 모델링의 개념과 특징</h3>
<blockquote>
<p>모델링?<br>공통된 것. 공통된 것을 잘 모아서 설명해보자.<br>아주 구체적인 것 보다는 상위 레벨(=추상화된 단계)에서 공통된 속성을 중심으로 설명해보자 </p>
</blockquote>
<ul>
<li><p>데이터 모델링(Data Modeling)의 개념</p>
<ul>
<li>데이터의 공통적인 특징을 찾아서 상위 레벨의 표현 기법으로 정리하는 과정 및 관련 기법</li>
<li>데이터의 특징을 단순화하여 표현하는 과정 및 관련 기법</li>
</ul>
<p>⇒ 즉, 현실 세계의 데이터를 (목적과 의도에 따라)추상화하여 물리적 데이터베이스로 변환하는 일련의 과정</p>
</li>
</ul>
<br />

<ul>
<li><p>데이터 모델링의 일반적인 특징</p>
<ol>
<li>추상화(Abstraction): 공통된 속성을 중심으로 상위 레벨에서 </li>
<li>단순화(Simplificatioin): 복잡하고 디테일한게 아니라 단순하고</li>
<li>명확성(Clarity): 명확하게</li>
<li>중복 배제</li>
<li>유연성</li>
<li>일관성</li>
</ol>
<p>⇒ 잘 정의된 표기법(문서로 정리한다 === 의사소통이 잘 된다)에 의해 표현</p>
</li>
</ul>
<br />

<ul>
<li>데이터 모델링의 접근 관점<ul>
<li>데이터 관점, 프로세스 관점</li>
<li>데이터와 프로세스 관점</li>
</ul>
</li>
</ul>
<br />

<h3 id="2-데이터베이스-3단계-스키마three-level-schema">(2) 데이터베이스 3단계 스키마(Three Level Schema) </h3>
<ul>
<li>데이터베이스의 3단계 스키마의 개념</li>
</ul>
<blockquote>
<p>데이터베이스 3단계 스키마란?<br>ANSI/SPARC이 제안, 데이터베이스의 구조를 3가지 추상화 수준으로 설계하는 방법</p>
</blockquote>
<p>⇒ 외부 스키마, 개념 스키마, 내부 스키마 구조로 독립성 확보, 유연성 제공</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/5095a8a2-35fe-4408-bc9c-45fc3b1b25c3/image.png" alt=""></p>
<ul>
<li>데이터베이스 3단계 스키마의 구조와 특징<ul>
<li>외부 스키마(External Schema)<ul>
<li>개별 사용자 관점에서 데이터베이스를 표현</li>
<li>사용자마다 다른 관점으로 데이터베이스를 볼 수 있음</li>
<li><strong>서브 스키마(Sub Schema)</strong>라고도 불림</li>
<li>특정 응용에 한정된 논리적 데이터 구조를 정의</li>
</ul>
</li>
<li>개념 스키마(Conceptual Schema)  <ul>
<li>조직 전체 관점에서의 통합된 데이터베이스 구조</li>
<li>모든 사용자에게 필요한 데이터를 통합, 전체 데이터베이스의 논리적 구조를 정의</li>
<li>데이터베이스 하나에 개념 스키마 하나만 존재</li>
<li>데이터 간의 관계, 제약조건, 접근권한, 보안정책 등을 포함</li>
</ul>
</li>
<li>내부 스키마(Internal Schema)<ul>
<li>물리적 저장장치 관점에서 데이터베이스를 표현</li>
<li>실제 데이터가 저장되는 방법을 정의</li>
<li>내부 레코드 형식, 인덱스 유무, 데이터 저장 구조 등을 포함</li>
<li>데이터베이스 하나에 내부 스키마 하나만 존재</li>
</ul>
</li>
</ul>
</li>
</ul>
<br />

<ul>
<li>데이터베이스 3단계 모델링의 개념</li>
</ul>
<blockquote>
<p><strong>데이터베이스 3단계 모델링의 개념</strong><br>데이터베이스 모델링을 개념적 모델링, 논리적 모델링, 물리적 모델링의 3단계로 수행하는 방법</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/april_5/post/24e32131-a226-4880-9f68-339c0b0fa197/image.png" alt=""></p>
<ul>
<li>데이터베이스 3단계 모델링의 구조와 특징  <ul>
<li>개념적 모델링 (Conceptual Modeling): <strong>ERD(Entity-Relationship Diagram)</strong><ul>
<li>업무 중심적이고 포괄적인 수준의 모델링 수행</li>
<li>핵심 엔터티와 그들 간의 관계를 발견하고 엔터티-관계 다이어그램 생성</li>
</ul>
</li>
<li>논리적 모델링(Logical Modeling): <strong>테이블 설계서, 정규화</strong><ul>
<li>키, 속성, 관계 등 데이터의 논리적 구조를 정확하게 정의</li>
<li>정규화를 통한 데이터 일관성 확보와 중복 제거 수행 </li>
</ul>
</li>
<li>물리적 모델링(Physical Modeling): <strong>인덱스, 반정규화 (조회 성능 최적화)</strong><ul>
<li>실제 데이터베이스에 이식할 수 있도록 물리적 특성을 고려한 설계 </li>
<li>테이블, 컬럼 등의 물리적 저장구조 정의</li>
<li>성능, 저장공간 등 물리적 요소를 고려한 설계 수행</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br /><br /></p>
<h2 id="2-개념적-모델링">2. 개념적 모델링 </h2>
<h3 id="1-개념적-모델링의-개념과-특징">(1) 개념적 모델링의 개념과 특징</h3>
<p><img src="https://velog.velcdn.com/images/april_5/post/5232d584-274e-42ba-9f34-4f9ca469215c/image.png" alt=""></p>
<ul>
<li><p>개념적 모델링의 특징</p>
<ul>
<li>현실 세계 추상화: 복잡한 정보를 단순화하여 엔터티, 속성, 관계로 표현</li>
<li>DBMS 독립성: (특정 DBMS의 특징을 고려하지 않고) 개념적 수준에서 모델링 수행 </li>
</ul>
<p>⇒ 이해 용이성, 의사소통, 유연성
⇒ ERD(Entity-Relationship Diagram)으로 표현 </p>
</li>
</ul>
<br />

<h3 id="2-개념적-모델링의-세부-단계">(2) 개념적 모델링의 세부 단계</h3>
<p><img src="https://velog.velcdn.com/images/april_5/post/4641de7e-f645-4d5c-8d23-af60076a228d/image.png" alt=""></p>
<ol>
<li>주제영역 도출<ul>
<li>사용자 요구사항 분석, 업무 프로세스 파악, 데이터 요구사항 및 제약사항 점검</li>
<li>데이터 모델링의 기초 자료 수립</li>
<li>데이터 요소 목록</li>
<li>예) 회원 정보, 도서 정보, 대출 정보</li>
</ul>
</li>
<li>핵심 엔티티 도출<ul>
<li>엔터티 분류 (기본, 중심, 행위, 사건), 엔터티 목록 작성 (이름, 설명)</li>
<li>엔터티의 속성 식별, 속성 분류 (기본, 설계, 파생, 필수, 선택), 속성 목록 작성 (이름, 설명)</li>
<li>식별자 정의 (후보 식별자 → 주식별자)</li>
<li>독립적인 개체(Entity) 식별: 회원, 도서, 대출</li>
<li>속성 도출: 회원(ID, Name, Tel, Date)
 ※ ID : 주식별자 </li>
</ul>
</li>
<li>관계 설정<ul>
<li>엔터티 간 관계 파악, 관계 유형 결정 (1:1, 1:N, M:N), 관계 정의 및 이름 관계 참여도 (필수, 선택), 순환관계 검토</li>
<li>회원과 대출관계: 1:N(한명이 여러 도서 대출 가능)
※  카디널리티(Cardinality): 관계에 참여하는 수</li>
</ul>
</li>
<li>ERD 작성 <ul>
<li>개체, 속성, 관계를 ERD로 명세</li>
</ul>
</li>
</ol>
<br />

<h3 id="3-식별자의-개념과-특징">(3) 식별자의 개념과 특징</h3>
<blockquote>
<p><strong>식별자(Identifier)</strong>란?<br>하나의 엔터티 내에서 각각의 인스턴스를 유일하게 구분할 수 있는 속성 혹은 속성의 그룹</p>
</blockquote>
<ul>
<li>식별자의 주요 특징<ul>
<li>유일성: 엔터티 내의 모든 인스턴스들을 <strong>유일하게</strong> <strong>구분</strong>(식별)할 수 있어야 함</li>
<li>최소성: 식별자를 구성하는 속성의 수는 유일성을 만족하는 최소한의 개수여야 함</li>
<li>불변성:지정된 식별자의 값은 <strong>변경되지 않아야 함</strong></li>
<li>존재성:식별자로 지정된 속성은 <strong>반드시 값</strong>을 가져야 함</li>
</ul>
</li>
<li>식별자의 종류<ul>
<li>주식별자<ul>
<li>엔터티를 대표하는 유일한 식별자</li>
</ul>
</li>
<li>보조식별자<ul>
<li>대표성은 없으나 인스턴스를 구분할 수 있는 식별자</li>
</ul>
</li>
<li>내부식별자 <ul>
<li>엔터티 내부에 있는 식별자</li>
</ul>
</li>
<li>외부식별자<ul>
<li>다른 엔터티와의 관계를 통해 가져와서 사용하는 식별자 </li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br /><br /></p>
<h2 id="3-erd-entity-relationship-diagram">3. ERD (Entity Relationship Diagram) </h2>
<h3 id="1-erd의-개념과-특징">(1) ERD의 개념과 특징</h3>
<blockquote>
<p><strong>ERD(Entity Relationship Diagram)</strong>란? <br>데이터베이스의 구조를 개체(Entity), 속성(Attribute), 관계(Relationship)을 중심으로 정의된 형식의 다이어그램으로 표현하는 방법 <br>⇒ 객체, 속성, 관계를 시각적으로 표현. 개념적 모델링 단계에서 주로 사용<br>⇒ 복잡한 구조를 시각적으로 표현하여 분석 및 이해 용이, 의사소통 용이 </p>
</blockquote>
<table>
<thead>
<tr>
<th><strong>ERD의 구성요소</strong></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>개체 (Entity)</td>
<td>- 구별 가능한 사물 혹은 개념   - 2개 이상의 인스턴스가 존재, 유일한 식별자로 상호 구분   - 속성과 관계를 가짐</td>
</tr>
<tr>
<td>속성 (Attribute)</td>
<td>- 개체의 특성을 설명하는 요소   - 업무에 필요한 정보, 최소단위의 정보   - 종류 : 기본 속성, 설계 속성, 유도 속성, 복합 속성, 다중값 속성</td>
</tr>
<tr>
<td>관계 (Relationship)</td>
<td>- 개체 간 논리적인 연관성   - 관계명, 관계차수, 관계선택여부 등으로 구성   - 1:1 관계, 1:N 관계, M:N 관계, 자기 참조 관계, 병렬관계</td>
</tr>
</tbody></table>
<ul>
<li>ERD의 대표적인 종류  </li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/bc53da89-df6f-4ca1-b762-cc46ff173036/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/d6e3413e-a8a2-4b98-8860-c7db2e077ff5/image.png" alt=""></p>
<ul>
<li><p>ERD를 이용한 모델링 절차 </p>
<p><img src="https://velog.velcdn.com/images/april_5/post/17888c04-0d18-4912-ac21-14471a2ef32f/image.png" alt=""></p>
</li>
</ul>
<br />

<h3 id="2-peter-chen-표기법의-특징">(2) Peter-Chen 표기법의 특징</h3>
<ul>
<li><p>엔터티와 속성 </p>
<ul>
<li>강한 개체<ul>
<li>다른 개체의 도움 없이 독립적으로 존재 가능</li>
<li>독립적으로 식별이 가능한 주 식별자 보유</li>
</ul>
</li>
<li>약한 개체<ul>
<li>다른(상위, 소유) 개체의 존재여부에 종속적으로</li>
<li>존재, 소유 객체의 식별자를 포함하여 식별 가능</li>
</ul>
</li>
</ul>
</li>
<li><p>관계</p>
<ul>
<li>식별관계<ul>
<li>부모 개체의 식별자가 자식 개체의 식별자에 포함되어 사용</li>
</ul>
</li>
<li>비식별관계 <ul>
<li>부모 개체의 식별자가 자식 개체의 일반 속성으로 사용</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/5288ec70-2c4e-46eb-a07f-d2bbe34f0ab2/image.png" alt=""></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/67e09b7d-3e12-4bcc-b0fb-10e3e34bed1f/image.png" alt="">    </p>
<br />

<h3 id="3-iecrows-foot-표기법의-특징">(3) IE/Crow’s Foot 표기법의 특징</h3>
<p><img src="https://velog.velcdn.com/images/april_5/post/3ef9c3bf-3d2b-4687-b177-a0d9c9233ae9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/f8dc0646-b676-4d25-b2e5-14764aa6cd55/image.png" alt=""></p>
<p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2. DBMS의 설치와 활용 - MySQL, Docker]]></title>
            <link>https://velog.io/@april_5/02.-DBMS%EC%9D%98-%EC%84%A4%EC%B9%98%EC%99%80-%ED%99%9C%EC%9A%A9-MySQL-Docker</link>
            <guid>https://velog.io/@april_5/02.-DBMS%EC%9D%98-%EC%84%A4%EC%B9%98%EC%99%80-%ED%99%9C%EC%9A%A9-MySQL-Docker</guid>
            <pubDate>Sat, 15 Mar 2025 01:03:05 GMT</pubDate>
            <description><![CDATA[<h2 id="1-mysql-설치">1. MySQL 설치 </h2>
<h3 id="1-mysql-설치-1">(1) MySQL 설치</h3>
<ul>
<li><p><a href="https://dev.mysql.com/downloads/mysql/">다운로드</a> 및 설치 </p>
<ul>
<li>설치 시 비번 잘 기억하기! </li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/65ef8827-ba14-4efc-b543-bad33d765134/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>설치 확인</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/704fd4ff-1f71-4a93-9cbc-46bce0a83371/image.png" alt=""></p>
</li>
</ul>
<h3 id="2-mysql-실행">(2) MySQL 실행</h3>
<ul>
<li>시스템설정 &gt; Start MySQL Server</li>
<li>터미널 실행 </li>
</ul>
<pre><code>cd /usr/local/mysql/bin
./mysql -uroot -p 
# ./mysql: mysql을 쓰고 싶어
# -u: user
# root: 나는 root라는 사용자야
# -p: 패스워드를 입력할꺼야


SHOW DATABASES;</code></pre><p><img src="https://velog.velcdn.com/images/april_5/post/77c3e5f2-e2cc-4b59-8aad-9495368508d0/image.png" alt=""></p>
<br />

<h2 id="2-docker를-활용한-mysql-설치">2. Docker를 활용한 MySQL 설치 </h2>
<ul>
<li><p>Docker Desktop 설치</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/f8bd531f-d10f-49ed-97a0-8e68f41b0518/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><a href="https://hub.docker.com/_/mysql">Docker Hub</a> 에서 MySQL Image 확인</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/2c2981b9-ff71-4c96-9fcf-49f28b378d0a/image.png" alt=""></p>
</li>
</ul>
<h3 id="1-mysql-컨테이너-실행-기본-명령어">(1) MySQL 컨테이너 실행 (기본 명령어)</h3>
<pre><code>docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql:latest

# 설명:
# --name mysql-container → 컨테이너 이름
# -e MYSQL_ROOT_PASSWORD=root → 루트 비밀번호 설정
# -d → 백그라운드 실행
# -p 3306:3306 → 호스트의 3306 포트를 컨테이너의 3306 포트에 연결
# mysql:latest → 최신 버전 MySQL 이미지 사용</code></pre><br />

<h3 id="2-docker-volume으로-데이터-유지-추천">(2) Docker Volume으로 데이터 유지 (추천)</h3>
<pre><code>docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root \
  -v mysql_data:/var/lib/mysql \
  -d -p 3306:3306 mysql:latest

# 설명:
# -v mysql_data:/var/lib/mysql → MySQL 데이터 저장소를 **볼륨(mysql_data)**에 저장</code></pre><p><img src="https://velog.velcdn.com/images/april_5/post/698e8942-b1dc-43f0-9276-1f9b5371ff71/image.png" alt=""></p>
<h3 id="3-mysql-접속하기">(3) MySQL 접속하기</h3>
<pre><code># 컨테이너 확인
docker ps

# MySQL 내부로 접속
docker exec -it mysql-container mysql -uroot -p</code></pre><p><img src="https://velog.velcdn.com/images/april_5/post/f3a33bdc-3e57-41e8-b7e4-14e8e8e82fc7/image.png" alt=""></p>
<h3 id="4-mysql-컨테이너-중지--삭제">(4) MySQL 컨테이너 중지 &amp; 삭제</h3>
<pre><code>docker stop mysql-container   # 중지
docker rm mysql-container     # 삭제
docker volume rm mysql_data   # 볼륨 삭제 (데이터도 삭제됨)</code></pre><br />

<h2 id="3-docker로-mysql을-쓰는-이유-🚀">3. Docker로 MySQL을 쓰는 이유 🚀 </h2>
<table>
<thead>
<tr>
<th><strong>이유</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>설치가 간편함</strong></td>
<td>한 줄 명령어로 실행 가능</td>
</tr>
<tr>
<td><strong>버전 관리 용이</strong></td>
<td>다양한 MySQL 버전을 쉽게 실행 가능</td>
</tr>
<tr>
<td><strong>설정 꼬임 방지</strong></td>
<td>삭제하면 깨끗한 환경 유지</td>
</tr>
<tr>
<td><strong>프로젝트별 독립 환경</strong></td>
<td>각 프로젝트마다 다른 DB 실행 가능</td>
</tr>
<tr>
<td><strong>실제 배포 환경과 동일</strong></td>
<td>로컬 개발 ≒ 배포 환경 (일관성 유지)</td>
</tr>
</tbody></table>
<p>👉 <strong>결론:</strong> macOS에 직접 설치해도 되지만, <strong>개발/테스트 환경을 관리하기 쉽게 하려면 Docker가 훨씬 유리함!</strong> 💡</p>
<p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1. 데이터베이스와 SQL 개요]]></title>
            <link>https://velog.io/@april_5/01.-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80-SQL-%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@april_5/01.-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80-SQL-%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Sat, 08 Mar 2025 04:12:02 GMT</pubDate>
            <description><![CDATA[<h2 id="1-데이터와-데이터베이스">1. 데이터와 데이터베이스</h2>
<h3 id="1-데이터-정보-데이터베이스">(1) 데이터, 정보, 데이터베이스</h3>
<p><img src="https://velog.velcdn.com/images/april_5/post/d3f7fee2-1204-4791-a3a1-0560212d5de3/image.png" alt=""></p>
<p>데이터(Data)의 개념</p>
<ul>
<li>관찰 혹은 측정하여 수집한 사실(Fact)이나 값(Value)</li>
<li>수치 데이터, 문자 데이터, 이미지 데이터 등</li>
</ul>
<p>정보(Information)의 개념</p>
<ul>
<li>데이터를 의사 결정 등에 활용하기 위하여 체계적으로 처리한 결과물</li>
<li>일정한 프로그램에 의해 처리되거나 정의된 양식에 의하여 가공됨</li>
</ul>
<p>데이터베이스(Database)</p>
<p>개념</p>
<ul>
<li>조직, 업무 목적에 따라 여러 사람들이 공유하여 사용할 목적으로 통합 및 관리되는 데이터의 집합</li>
<li>공동의 목적을 지원하기 위한 관련 자료들의 집합체</li>
</ul>
<p>특징</p>
<ul>
<li>통합 데이터 (Integrated Data): 중복을 제외하거나 의도적인 중복을 파악하여 관리</li>
<li>저장 데이터 (Stored Data): 컴퓨터 시스템의 저장매체에 저장하여 관리</li>
<li>운영 데이터 (Operation Data): 조직의 기능과 역할 수행을 위해 필요한 데이터 </li>
<li>공용 데이터 (Shared Data):  여러 사용자 혹은 응용시스템들이 목적에 따라 공유하여 이용</li>
</ul>
<h3 id="2-빅데이터와-빅데이터-인프라-플랫폼">(2) 빅데이터와 빅데이터 인프라 플랫폼</h3>
<p>빅데이터(Big Data)란?</p>
<ul>
<li>다양한 형태의 데이터가 생산되는 속도 및 양이 매우 방대하여 기존의 방법과 도구로는 데이터를 수집, 저장, 분석이 어려운 데이터<ul>
<li>정형 데이터, 비정형 데이터를 모두 포함</li>
<li>데이터에서 가치를 생성하기 위한 처리 및 분석 기술 포함 </li>
</ul>
</li>
<li>빅데이터(Big data)의 특징 <ul>
<li>Volume(데이터의 크기): 방대한 양의 데이터, 기존 기술로는 처리 및 관리가 어려운 규모 </li>
<li>Velocity(생성 속도): 데이터가 생성되고 처리되는 속도를 의미, 실시간 생성 및 전송 </li>
<li>Variety(다양성): 정형, 반정형, 비정형 등 여러 형태의 데이터를 포함 </li>
<li>Value(가치): 유의미한 가치를 창출할 수 있는 데이터, 데이터 분석 등에 활용 </li>
<li>Veracity(정확성): 데이터의 품질과 신뢰도를 나타내는 특성, 정확성과 일관성 </li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/bb4517bc-c1a3-4be8-a92c-efe7264d5e3c/image.png" alt=""></p>
<p><br /><br /></p>
<h2 id="2-dbms의-종류와-특징">2. DBMS의 종류와 특징</h2>
<h3 id="1-dbmsdata-base-management-system의-개념">(1) DBMS(Data Base Management System)의 개념 </h3>
<p>DBMS란?</p>
<ul>
<li>사용자와 데이터베이스 사이에서 데이터를 관리하고 사용자의 요청에 따라 데이터베이스에 연산을 수행하여 정보를 생성하는 프로그램</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/3ae4e00e-f2dd-4640-8116-af67dcb0d5a4/image.png" alt=""></p>
<p>DBMS(DataBase Management System)의 종류와 특징 </p>
<ul>
<li><p>계층형 데이터 베이스 (DBMS)</p>
<ul>
<li>데이터의 관계를 트리 구조로 정의, 부모-자식 형태를 갖는 구조</li>
<li>상위 레코드가 복수의 하위 레코드를 가짐</li>
</ul>
</li>
<li><p>네트워크형 데이터베이스 (DBMS)</p>
<ul>
<li>레코드 간의 다양한 관계를 그물처럼 가짐</li>
<li>복잡한 구조로 인하여 구조 변경 시 어려움이 따름</li>
</ul>
</li>
<li><p>관계형 데이터베이스 (DBMS) </p>
</li>
<li><ul>
<li>행/열로 구성된 Table 간의 관계 표현</li>
<li>SQL을 이용하여 데이터에 접근, 관리 </li>
<li>오라클, MySQL/MariaDB, SQLite 등</li>
</ul>
</li>
<li><p>NoSQL</p>
<ul>
<li>Document, Key-Value의 비정형 구조</li>
<li>전용 API를 이용하여 데이터에 접근, 관리</li>
<li>MongoDB, 카산드라 등</li>
</ul>
</li>
</ul>
<h3 id="2-dbmsdata-base-management-system-종류와-특징">(2) DBMS(Data Base Management System) 종류와 특징</h3>
<p><img src="https://velog.velcdn.com/images/april_5/post/2423b66d-6598-454f-aea1-fb055645a823/image.png" alt=""></p>
<p>관계형 DBMS의 종류</p>
<ul>
<li><a href="https://www.oracle.com/">ORACLE</a> </li>
<li><a href="https://mariadb.org/">MariaDB</a></li>
<li><a href="https://www.postgresql.org/">PostgreSQL</a></li>
<li><a href="https://www.sqlite.org/">SQLite</a> <ul>
<li>파일 형식</li>
</ul>
</li>
<li><a href="https://www.microsoft.com/ko-kr/sql-server/sql-server-2022">Microsoft SQL Server</a><ul>
<li>Windows 운영체제에 최적화</li>
</ul>
</li>
</ul>
<p>비정형 DBMS의 종류</p>
<ul>
<li><a href="https://www.mongodb.com/">MongoDB</a><ul>
<li>Document-Oriented (JSON 형태의 문서 데이터)</li>
<li>Schema-less 구조, Replication (고가용성)</li>
</ul>
</li>
</ul>
<pre><code>&lt;br /&gt;&lt;br /&gt;</code></pre><h2 id="3-sql의-종류와-특징">3. SQL의 종류와 특징</h2>
<h3 id="1-sql의-개념">(1) SQL의 개념</h3>
<p>SQL(Structured Query Language)이란? </p>
<ul>
<li>데이터베이스에 저장된 데이터를 조회, 입력, 수정, 삭제하는 등의 조작이나, 테이블을 비롯한 객체를 생성 및 제어하기 위한 프로그램 언어</li>
</ul>
<p>SQL 문의 종류와 특징</p>
<ul>
<li>DDL:CREATE TABLE, ALTER TABLE, DROP TABLE <ul>
<li>Data Definition Language</li>
<li>데이터베이스의 논리적 구조를 정의하기 위한 언어, 데이터 사전에 저장</li>
<li>기본 Auto Commit</li>
</ul>
</li>
<li>DML:INSERT, SELECT, UPDATE, DELETE <ul>
<li>Data Manipulation Language</li>
<li>데이터베이스에 저장된 데이터를 조작 하기 위해 사용하는 언어</li>
<li>검색, 추가, 삭제, 갱신 작업 수행</li>
</ul>
</li>
<li>DCL / TCL:GRANT, REVOKE<ul>
<li>Data Control Language</li>
<li>Transaction Control Language</li>
<li>데이터에 대한 접근 권한 부여, 트랜잭션 등을 관리하기 위한 언어</li>
</ul>
</li>
</ul>
<p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2024 회고]]></title>
            <link>https://velog.io/@april_5/2024-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@april_5/2024-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Mon, 30 Dec 2024 01:41:17 GMT</pubDate>
            <description><![CDATA[<h2 id="2024년을-돌아보며">2024년을 돌아보며,</h2>
<p>우리 회사는 올 해 아주아주 큰 변화를 맞았다.. 당시엔 절망? 분노? 안타까움, 아쉬움.. 이런 감정들이었는데, 지금 생각해보면 우리 회사의 색깔과 강점으로 앞으로 더 나아가기엔 오히려 잘 된 변화가 아닐까.. 싶다.(<em>물론 지금 생각이지만.. 당시엔 정말..</em> 😮‍💨😤😠)</p>
<blockquote>
<p>추석만 되면 부는 시베리아 칼바람..</p>
</blockquote>
<p>작년에 이어 올해 추석에도 시베리아 칼바람 직격탄을 맞았다. 너무너무 추웠다.. 
그 여파로 작년과 비교할 수 없을 정도로 <del>많은 동료들을 떠나보내고</del>.. 매우 소수의 인원만 남겨진채로.. 연말을 맞이하고 있다.(<em>이 정도면 추석이 이제 무서워지려 하네</em>..)</p>
<p>당시에 어수선 했던 분위기는 현재 각종 지표들이 보여주는 <code>목표를 훌쩍 뛰어넘는 달성</code>, <code>긍정적인 추이</code>를 보며 <code>내년에는 더 잘할 수 있다</code>는 의지, 기대감 등의 분위기로 바뀌었다. 다행이지.</p>
<p>그 속에서 나는.. <del>조금은</del> 많이 부끄럽고.. 반성하며 스스로를 다독이고.. 개인적으로 지치고 너덜너덜 해진 멘탈을 부여잡으며 (<em>회사에 적당히 남긴 것 말고.. 찐!!</em>)회고록을 작성중이다. 
(<em>매년 한 해를 정리하며 작성하는 회고는 중요한 것 같다. 뭔가 마침표를 찍고 다음으로 넘어가는 느낌</em> 🤔)</p>
<br />

<h3 id="span-stylebackground-colore7f3f8조금은-부끄럽고span"><span style='background-color:#E7F3F8'>조금은 부끄럽고,</span></h3>
<blockquote>
<p>함께 하고 싶은 개발자</p>
</blockquote>
<p>매년 회사에서는 <span style='color:dodgerblue'><strong>회고톤&amp;종무식</strong></span>을 진행하는데 한 해를 돌아보며 각자 회고록을 작성하고 의미있게 한 해를 마무리하는 시간을 가진다.
동료들이 남긴 회고록을 둘러보며 <code>아 이런 일도 있었지!</code>, <code>성과와 반성</code>, 특히 <code>회사와 동료들에 대한 애정과 감사함이 담긴 회고</code> 들을 되짚어보다 스스로 부끄러워지는 회고를 발견했다.
(<em>꼰대적인 생각이겠지만</em>) 나보다 한참 어리고 사회생활도 적은 친구가 작성한 회고인데.. 뭔가 뒷통수 씨게 맞은 느낌.. </p>
<p>회고라 하여.. 이력서 쓰듯 올해 한 일들을 나열하기만 했던, 일에 대해 집중하기만 했던, 온전히 나만 바라보았던 나의 회고와 달리 
<span style='color:dodgerblue'>개발자의 본질</span>, 한해 성장하며 느낀 <span style='color:dodgerblue'>생각과 가치관에 대한 이야기</span>, <span style='color:dodgerblue'>개발자가 지녀야 할 태도</span> 등에 대한 성찰이 담긴 회고였다.
그 회고를 읽으며 너무 너무 부끄러웠다. 그리고 부러웠다.. 
그 친구가 지난해에 남긴 회고와 올해 작성한 회고를 번갈아보며 한해 동안 이 친구는 이렇게나 성장하고 성숙해졌는데 나는 제자리구나.. 라는 생각이 나를 너무 초라하고 부끄럽게 만들었다. </p>
<p>요즘 종종 나의 사회생활, 내가 살아가는 방식에 대한 생각, 가치관, 태도 등에 대해 자기반성, 고민, 정체성, 방향성에 대해 많은 생각을 하는데.. 내가 지닌 생각, 가치관, 태도 등을 흔들었달까, </p>
<p>그 친구가 지닌 회사와 일, 동료를 대하는 태도와 가치관 등으로, 
왜 그 수많은 동료들이 함께 하고 싶어하는지를 다시 한번 깨닫고 스스로를 반성하는 시간이었다.
내가 그토록 열망하는 <span style='color:dodgerblue'><strong>함께 하고 싶은 개발자</strong></span>의 모습을 갖춘 동료였다.
그리고 그런 동료와 함께 할 수 있음에, 나를 자극하고 채찍질 해줄 수 있는 동료가 있음에 진심으로 감사하다.🙏 
(<strong>부디 내년엔 스스로에게 부끄럽지 않은, 성숙해진 내가 되어보자!</strong> 💪💪)</p>
<br />

<h3 id="span-stylebackground-colore7f3f8스스로를-다독이며span"><span style='background-color:#E7F3F8'>스스로를 다독이며</span></h3>
<blockquote>
<p>나는 필요한 사람인가?</p>
</blockquote>
<p>종종 스스로에게 묻게 되는 순간이 있다. 그리고 이 질문에 스스로 긍정할 수 있는지가 나에겐 특히 더 중요하다. 이 질문이 동기부여에 있어 매우 중요하게 작용하기 때문.</p>
<p>올해의 회고를 작성하기 전, 작년의 회고를 되짚어보았다. 
그중에서도 특히 마음에 남은 건, 내가 필요한 사람이었음을 느끼게 해준 동료들의 회고였다. </p>
<p>지금은 떠나고 없는 동료들의 글에서, 나는 내 할 일을 다하며 필요한 &#39;띵플러&#39;로서 자리하고 있었구나 하고 되돌아보니 뿌듯..(_도 잠시.. 였지.._😭😭)
애써 <code>잘 하고 있구나..</code> 스스로를 다독이며
내년에도 나를 필요로 하고, 함께 하고 싶은 개발자의 모습을 고민하며 성숙한 사람이 되어야겠다 또또 다짐한다.</p>
<br />

<h3 id="span-stylebackground-colore7f3f8그럼에도-아쉬움이-많은-해span"><span style='background-color:#E7F3F8'>그럼에도 아쉬움이 많은 해</span></h3>
<blockquote>
<p>서비스에 대한 이해</p>
</blockquote>
<p>이 서비스를 본격적으로 담당하고 이제 막 1년이 지났다. 그 1년 동안 나는 <code>서비스를 이해하려 노력했을까?</code> 내가 개발하고 있는 <code>서비스의 모든 기능을 나는 다 알고 있을까?</code> <code>모든 코드를 다 이해하고 개발하는 것일까??</code> 아니기에 아쉬움이 남겠지.. 이 또한 부끄럽구나..</p>
<p>처음 이 서비스를 맡게 되었을 땐 모든 기능(<em>특히 스튜디오..</em>)을 다 한 번에 익힐 수 없기에.. 
개발하는, 개선하는 부분부터 차근차근 익히자.. 라는 안일한 생각을 했던 것 같다. 분발해야지..</p>
<blockquote>
<p>내가 n년차면 그 경력에 맞는 실력과 경험을 가져야 한다.</p>
</blockquote>
<p>개발자는 평생 공부하는 사람이라고 생각하는데 올 해엔 특별하게 어떠한 기술, 지식을 습득했다?라고 할 만한 것이 있나? 싶다. 
매년 무언가 새로운 것을 배워야 한다기 보다, 내가 다루는 기술에 대한 이해, 업데이트 내용 등 이런 실제 필요한 것들..
(<em>사실 angular를 다루고 있지만 react, nextjs 를 처음 접했을 때 처럼 이해하거나 고민하지 않고 개발하고 있기에..</em>)
회고를 하며 매년 스스로에게 하는 질문인데, 올해는 무언가 시작은 했던 것 같은데 결과가 없달까..</p>
<p>밀린 기술블로그(<em>내가 보려고 작성하지만 그 마저도 밀린 상태.. 왜이렇게 게을러졌늬..</em>)도 아쉽고..
한 해 열심히 살았다.. 라는 흔적이 없어 더욱 아쉬운 것 같다.</p>
<br />

<h3 id="span-stylebackground-colore7f3f8너덜너덜한-멘탈-지침span"><span style='background-color:#E7F3F8'>너덜너덜한 멘탈.. 지침</span></h3>
<p>연말 갑작스럽게 아빠가 사고를 당했다. 수술 경과는 좋다지만 허리와 다리 골절로 후유증이 남고.. 현재도 혼자 거동이 어렵고.. 입원중이시고.. 1월초 퇴원 예정이지만 재활병원에서 입원은 이어가야 한다. 평온했던 일상이 그립다..</p>
<br />

<hr>
<h2 id="2025년-계획-다짐">2025년 계획, 다짐</h2>
<blockquote>
<p>또 다시, <code>나는 필요한 사람인가?</code></p>
</blockquote>
<p>연말, 이 질문에 집착하는 이유는..
남겨진 소수의 인원에 내가 포함된 이유를 아직 찾지 못해서.. 스스로 납득하지 못해서.. 일까.. 
한껏 움추러들고 우울한 연말이다. 자신감? 자존감도 많이 떨어지고.. 땅파고 있는 연말이지만.. 
<span style='color:dodgerblue'><strong>스스로 납득할 이유를 찾고! 만들고!!</strong></span> 실천으로 이어가야 하겠다.</p>
<p>2025년에는 더 나은 팀원, 더 나은 개발자가 되기 위해 내가 할 수 있는 일에 집중하고, <span style='color:dodgerblue'><strong>고민보다 행동으로 답을 찾는</strong></span> 한 해를 다짐한다.</p>
<p><br /><br /><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[사이드 프로젝트] 📆 자원예약시스템 🕘 회고]]></title>
            <link>https://velog.io/@april_5/%EC%82%AC%EC%9D%B4%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9E%90%EC%9B%90%EC%98%88%EC%95%BD%EC%8B%9C%EC%8A%A4%ED%85%9C</link>
            <guid>https://velog.io/@april_5/%EC%82%AC%EC%9D%B4%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9E%90%EC%9B%90%EC%98%88%EC%95%BD%EC%8B%9C%EC%8A%A4%ED%85%9C</guid>
            <pubDate>Fri, 14 Jun 2024 02:36:31 GMT</pubDate>
            <description><![CDATA[<h2 id="-계기">:: 계기</h2>
<h3 id="스스로의-성장">스스로의 성장</h3>
<p>항상 <span style='color:dodgerblue'><strong>성장</strong></span>이란 단어에 압박을 느끼고 아쉬움이 남는 것 같다🥲
이번 사이드 프로젝트는</p>
<ul>
<li>평소 경험해보지 못했던 것을 배워보자!</li>
<li>TPM님이 직무미팅때 공유해주신 supabase를 언젠간 사용해보리라! 라는 생각을 계속 하던 차에!!</li>
</ul>
<p>짝꿍님이 <code>회사에서 사용할 사이트 하나 만들어줄 수 있어?</code>라는 질문에 흔쾌히 <code>ok!!!</code> 하며 시작된 프로젝트!!!👍</p>
<blockquote>
<p>그리고 내가 이전에 다녔던, 이전 동료들이 사용하는 서비스를 만들며
내가 _개발자로 전향하게 된 계기_를 다시 떠올리게 된 프로젝트 이기도 하다.💪💪</p>
</blockquote>
<br />



<h1 id="-프로젝트-소개">:: 프로젝트 소개</h1>
<blockquote>
<p>총 1명, 약 보름간 퇴근 후 틈틈이 작업한 프로젝트</p>
</blockquote>
<h2 id="개요">개요</h2>
<h3 id="소개">&gt; 소개</h3>
<ul>
<li>최종 목표는 그룹웨어의 형태로, </li>
<li>시작은 회의실/교육장/코칭룸 예약 시스템이다.</li>
</ul>
<h3 id="기술-스택">&gt; 기술 스택</h3>
<ul>
<li><code>nextjs14</code> <code>supabase</code> <code>@reduxjs/toolkit</code> <code>@fullcalendar</code> <code>moment</code> <code>tailwindcss</code> <code>typescript</code></li>
</ul>
<h3 id="구현-기능">&gt; 구현 기능</h3>
<blockquote>
<p>권한에 따라 미로그인, 로그인, 관리자로 구분</p>
</blockquote>
<h4 id="🔷-자원예약">🔷 자원예약</h4>
<p><img src="https://velog.velcdn.com/images/april_5/post/806b994a-f1d6-46d2-b4ff-7ef89a8a9efa/image.png" alt=""></p>
<ul>
<li>미로그인, 로그인, 관리자 누구나 예약 가능</li>
<li>종일, 시간별, 기간 선택하여 예약 가능<ul>
<li>일/주/월 별 확인</li>
</ul>
</li>
<li>기존 예약된 내용 수정 및 삭제 기능<ul>
<li>삭제 및 수정은 관리자만 가능(기획 의도)</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/april_5/post/0e5c9be9-b9a2-4b3b-b950-f57132dde44a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/3e7d52f6-69fa-439b-8a17-9aab85d26ae6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/d248b8bf-2c25-44ab-89b7-79fe7d8cf130/image.png" alt=""></p>
<h4 id="🔷-로그인-회원가입-로그아웃">🔷 로그인, 회원가입, 로그아웃</h4>
<p><img src="https://velog.velcdn.com/images/april_5/post/b3a4ba0a-aa2d-473e-bb6e-27b58cce8a8c/image.png" alt=""></p>
<br />




<h2 id="🌈-나의-역할">🌈 나의 역할</h2>
<ul>
<li>supabase 로 <ul>
<li>예약시스템에서 필요한 CRUD 적용되게끔 하고,</li>
<li>관리자와 로그인 구분하여 UD 가능하게 하고</li>
<li>누구나 회의실/교육장/코칭룸 정보 get 요청 가능하게 하고</li>
<li>누구나 예약 가능하게 하도록 구현</li>
</ul>
</li>
<li>nextjs로 위의 기능에 맞게 UI 구현하고  </li>
<li>@reduxjs/toolkit 데이터 전역 상태 관리하고</li>
<li>@fullcalendar 로 일정 확인 가능하도록 구현하고</li>
<li>gpt와 함께 customTimeline 컴포넌트 구현 <ul>
<li><img src="https://velog.velcdn.com/images/april_5/post/806b994a-f1d6-46d2-b4ff-7ef89a8a9efa/image.png" alt=""></li>
</ul>
</li>
</ul>
<br />

<h2 id="기억에-남는-일">기억에 남는 일?!</h2>
<h3 id="keep">Keep</h3>
<ul>
<li><p>생각보다 꽤 좋은 파트너 gpt👍</p>
<ul>
<li>가장 처음 구현한게 customTimeline 컴포넌트인데, 딱 원하는 기능을 제공하는 라이브러리를 찾지 못해(있으면 유료, 비쌈..) 직접 구현해야겠다 마음먹었고, 
생각보다 쉽지 않아 gpt를 적극 활용해서 구현. gpt가 생각보다 꽤 좋은 파트너의 역할을 했던 기억이 긍정적인 경험으로 오래 기억된다.</li>
</ul>
</li>
<li><p>tailwind가 디자인도 해줬어요🙌</p>
<ul>
<li>디자이너 없이 실제 유저에게 제공되는 서비스를 구현하자니.. 디자인 적인 부분에서 어려움이 있었는데, <a href="https://v1.tailwindcss.com/">tailwind</a> 의 도움을 받아 생각보다 쉽게 디자인적인 어려움이 해소되었다.</li>
</ul>
</li>
<li><p>백엔드 없이 supabase로 DB, API 구현하는 새로운 경험</p>
<ul>
<li>이런 걸로(?) 풀스택 말할 수 있다면 가장 처음 풀스택으로 서비스 구현한 프로젝트가 되겠다.</li>
<li>새로운 기술 습득 후 바로 적용한 사례 중 하나로, supabase의 공식문서가 꽤 잘 되어 있고, 이고잉님의 유튭 강의를 보며 요구되었던 기능을 구현해내어 뿌듯하다!</li>
</ul>
</li>
</ul>
<h3 id="problem">Problem</h3>
<ul>
<li>어서와👋 supabase는 처음이지? <ul>
<li>supabase와 프론트에서 저장하는 예약하기 데이터의 Date 시점이 맞지 않아 초반에 원인 찾기(utc)에서 시간 소요가 있었다. </li>
<li>supabase 에서 제공하는 Database Roles을 정확히 사용하지 못한 부분이 아쉬움이 남는다. (그로 인해 시간 지체가 있었지..🥲)</li>
</ul>
</li>
</ul>
<h3 id="try">Try</h3>
<ul>
<li>회사에서는 POC 단계를 거쳐 구현 가능한가? 어떤 라이브러리를 써야 할까? 등에 대한 검증 단계가 있는데, 초반에 이런 과정을 좀 더 적극적으로 했다면 라이브러리 선택 과정이 훨씬 수월했을 것 같은 아쉬움.. 다음엔 일정 관리할 때 POC 과정 먼저 추가 해야겠다!</li>
</ul>
<br />

<hr>
<h2 id="-마무리">:: 마무리</h2>
<p>이번 사이드 프로젝트는 요청자인 짝꿍 포함, 이전 동료들이 사용하게 될(사용하고 있는) 사이트를 구현했는데, 처음으로 백엔드 영역까지 도전한 프로젝트였기에 더더더!!! 뿌듯하다 😆🤭😊</p>
<p>막상 백엔드 부분을 작업할 때 처음 사용해보기도 했고 관련 지식도 많지 않았기에(현업에서 협업하며 얻은 지식이 전부..😳) 제대로 구현할 수 있을까 걱정도 많았지만🥺🥺 구글링, gpt 등의 도움으로 무사히 런칭할 수 있었다.😊</p>
<p>백엔드 영역까지 도전해보며 개발 영역에서 배워야 할 게 너무나 많구나..💪라는 것을 새삼 느꼈고, 꼭 내 분야 아니더라도 협업할 때 등 도움이 되니 이렇게 경험해보고 배우는게 필요하다!라는 것을 체감한 프로젝트였다!✨</p>
<p>업무에서만 개발을 하는 것이 아닌 
나의 성장👩🏻‍💻과 재미🥳 등 평소에도 개발을 적용할 수 있어서 바쁘기도 했지만 하나 끝내놓고 나니 다음엔 뭘 도전해볼까.. 또 고민하게 된다!</p>
<p>다음 도전도 무사히 마칠 수 있기를 바라며!!
화이팅!!! 💪💪</p>
<p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GitHub Action으로 Release 자동화 + Slack 연동 + Release/Tag 자동으로 만들어 주기]]></title>
            <link>https://velog.io/@april_5/GitHub-Action%EC%9C%BC%EB%A1%9C-Release-%EC%9E%90%EB%8F%99%ED%99%94-Slack-%EC%97%B0%EB%8F%99-ReleaseTag-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EB%A7%8C%EB%93%A4%EC%96%B4-%EC%A3%BC%EA%B8%B0</link>
            <guid>https://velog.io/@april_5/GitHub-Action%EC%9C%BC%EB%A1%9C-Release-%EC%9E%90%EB%8F%99%ED%99%94-Slack-%EC%97%B0%EB%8F%99-ReleaseTag-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EB%A7%8C%EB%93%A4%EC%96%B4-%EC%A3%BC%EA%B8%B0</guid>
            <pubDate>Tue, 02 Apr 2024 02:53:49 GMT</pubDate>
            <description><![CDATA[<h2 id="☐-들어가며">☐ 들어가며</h2>
<p>1분기 개발팀 이니셔티브 중 하나인 <code>형상 관리 표준화 및 전파</code> 작업! 주요 내용은 </p>
<ul>
<li>개발 본부의 표준 깃전략 확정</li>
<li>개발 본부의 표준 커밋 컨벤션 확정</li>
<li>개발 본부의 표준 PR 규칙 확정</li>
</ul>
<p>이다. </p>
<p>깃 전략 및 깃허브 워크플로우 전략 등이 </p>
<ul>
<li>각 직무별(<em>서버, 웹 프론트엔드, 안드로이드, iOS</em>)로 다르고</li>
<li>해당 직무의 레포지토리(<em>스플, 헬봇 등</em>)별로 또 달라서</li>
<li>같은 웹 프론트엔드 개발자라 하더라도 어떤 서비스를 담당하느냐에 따라 깃, 배포 전략 등을 새로 익혀야 하고</li>
<li>새로 입사한 개발자의 온보딩 시간을 고려하고</li>
<li>개발팀 역량강화 차원에서</li>
</ul>
<p>해당 이니셔티브를 진행하게 되었다.</p>
<p>그 중 Web Workflow 표준화 작업을 담당하게 되어 작업 히스토리와 결과 산출물을 기록해본다</p>
<p><br /><br /></p>
<hr>
<h2 id="☐-깃헙-워크플로우-동작">☐ 깃헙 워크플로우 동작</h2>
<p><img src="https://velog.velcdn.com/images/april_5/post/30ad64cc-0b04-487c-a346-71a59b4a9cb5/image.png" alt=""></p>
<h3 id="▪︎-main">▪︎ main</h3>
<pre><code class="language-yaml">name: (서비스명) deploy-prod
on:
    push:
    branches:
        - main # 배포 브랜치

    jobs:
      deploy:
        runs-on: ubuntu-latest

        steps:
          - name: Checkout
            uses: actions/checkout@v2

          - name: Setup Environment
            uses: pnpm/action-setup@v3
            with:
              version: 8 
          - name: Install Dependencies
            uses: actions/setup-node@v3
            with:
              node-version: &#39;18.x&#39; # node-version-file: &#39;.nvmrc&#39;
          - name: Build
            run: |
              pnpm i
              pnpm build


      # 슬랙 알림
      slack_notifications:
        runs-on: ubuntu-latest
        # 배포 결과 슬랙 알림
        steps:
          - name: Notify Deployment Failure
            if: ${{ failure() }}
            uses: slackapi/slack-github-action@v1.23.0
            with:
              payload: |
                {
                  &quot;attachments&quot;: [
                      {
                        &quot;title&quot;: &quot;❌ 배포 실패했습니다 🥲&quot;,
                        &quot;author_name&quot;: &quot;${{github.actor}} 님의 배포 에러 😱&quot;,
                        &quot;color&quot;: &quot;danger&quot;,
                        &quot;fields&quot;: [
                          {
                            &quot;title&quot;: &quot;Branch&quot;,
                            &quot;value&quot;: &quot;${{github.ref}}&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Event&quot;,
                            &quot;value&quot;: &quot;${{github.event_name}}&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Actions URL&quot;,
                            &quot;value&quot;: &quot;&lt;${{github.server_url}}/${{github.repository}}/commit/${{github.sha}}/checks|${{github.workflow}}&gt;&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Commit&quot;,
                            &quot;value&quot;: &quot;&lt;${{github.server_url}}/${{github.repository}}/commit/${{github.sha}}|Commit Link&gt;&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Message&quot;,
                            &quot;value&quot;: &quot;${{github.event.head_commit.message}}&quot;,
                            &quot;short&quot;: false
                          }
                        ]
                      }
                    ]
                }
            env:
              SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
              SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

          - name: Notify Deployment Success
            uses: slackapi/slack-github-action@v1.23.0
            with:
              payload: |
                {
                  &quot;attachments&quot;: [
                      {
                        &quot;title&quot;: &quot;✅ 배포 완료되었습니다! 👍&quot;,
                        &quot;author_name&quot;: &quot;${{github.actor}} 님! 성공적으로 배포되었습니다.🎉&quot;,
                        &quot;color&quot;: &quot;adff2f&quot;,
                        &quot;fields&quot;: [
                          {
                            &quot;title&quot;: &quot;Branch&quot;,
                            &quot;value&quot;: &quot;${{github.ref}}&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Event&quot;,
                            &quot;value&quot;: &quot;${{github.event_name}}&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Actions URL&quot;,
                            &quot;value&quot;: &quot;&lt;${{github.server_url}}/${{github.repository}}/commit/${{github.sha}}/checks|${{github.workflow}}&gt;&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Commit&quot;,
                            &quot;value&quot;: &quot;&lt;${{github.server_url}}/${{github.repository}}/commit/${{github.sha}}|Commit Link&gt;&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Message&quot;,
                            &quot;value&quot;: &quot;${{github.event.head_commit.message}}&quot;,
                            &quot;short&quot;: false
                          }
                        ]
                      }
                    ]
                }
            env:
              SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
              SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

      # 배포 후 릴리즈 태그 생성
      release:
        needs: deploy # deploy 성공하면 실행해라
        runs-on: ubuntu-latest

        steps:
          - uses: actions/checkout@v2

          # package.json에서 버전 정보 추출
          - name: Get Package.json Info
            id: info
            uses: jaywcjlove/github-action-package@main
          - run: echo &quot;version - ${{ steps.info.outputs.version }}&quot;

          - name: Get Latest Release Tag
            uses: actions-ecosystem/action-get-latest-tag@v1
            id: get-latest-tag
            with:
              semver_only: true

          - name: Create Release
            uses: actions/create-release@v1
            env:
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            with:
              tag_name: ${{  steps.info.outputs.version }}
              release_name: ${{  steps.info.outputs.version }}
              body: |
                ${{ github.event.head_commit.message }}

                **Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.get-latest-tag.outputs.tag }}...${{ steps.info.outputs.version }}

      # release, hotfix 배포 후 개발 배포도 동시에 되게끔 develop 브랜치에 머지
      back-merge-to-develop:
        needs: deploy # deploy 성공하면 실행해라
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2

          - name: Merge main → develop
            uses: devmasx/merge-branch@master
            with:
              type: now
              from_branch: main
              target_branch: develop # 개발 배포 브랜치
              github_token: ${{ secrets.GITHUB_TOKEN }}
</code></pre>
<br />


<h3 id="▪︎-release--push---개발-테스트-운영-테스트-배포">▪︎ release : Push - 개발 테스트, 운영 테스트 배포</h3>
<pre><code class="language-yaml"># Github Flow 전략에선 release 브랜치가 불필요한 경우가 많다.
# 따라서 아예 분기하지 않는 경우가 일반적이다.

# ...

# develop 브랜치에 머지
 back-merge-to-develop:
    needs: deploy # deploy 성공하면 실행해라
     runs-on: ubuntu-latest
     steps:
        - uses: actions/checkout@v2

        - name: Merge main → develop
           uses: devmasx/merge-branch@master
          with:
            type: now
            from_branch: main # merge 시작할 브랜치
            target_branch: develop # 개발 배포 브랜치
            github_token: ${{ secrets.GITHUB_TOKEN }}
</code></pre>
<br />

<h3 id="▪︎-hotfix-push---운영-테스트-배포">▪︎ hotfix: Push - 운영 테스트 배포</h3>
<pre><code class="language-yaml"># hotfix PR merge 후 배포 브랜치 merge 후 배포 
# Github Flow 전략에선 hotfix를 사소한 기능 변화로 바라본다.
# 마찬가지로 아예 분기하지 않는 경우가 많다.

# ...

# develop 브랜치에 머지
back-merge-to-develop:
  needs: deploy # deploy 성공하면 실행해라
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v2

    - name: Merge main → develop
      uses: devmasx/merge-branch@master
      with:
        type: now
        from_branch: main # merge 시작할 브랜치
        target_branch: develop # 개발 배포 브랜치
        github_token: ${{ secrets.GITHUB_TOKEN }}
</code></pre>
<br />

<h3 id="▪︎-pr-시-공통-style-unittest-각-단계마다-범위가-강화되는">▪︎ PR 시 공통: Style, UnitTest (각 단계마다 범위가 강화되는)</h3>
<pre><code class="language-yaml"># 모든 PR 체크
name: Check PR
on: [pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup Environment
        uses: pnpm/action-setup@v3
        with:
          version: 8
      - name: Install Dependencies
        uses: actions/setup-node@v3
        with:
          node-version: &#39;18.x&#39; # node-version-file: &#39;.nvmrc&#39;

      - name: Check Lint
        run: |
          pnpm i
          pnpm lint
        env:
          CI: true

      # 테스트 코드 실행 결과 보여주기       
      - name: Run Tests and Create Comment         
        uses: actions/github-script@v6
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const script = require(&#39;./test-result-commit.js&#39;)
            console.log(script({github, context}))

      # 결과 슬랙 알림
      - name: Notify PR🎁 Check Failure
        if: ${{ failure() }}
        uses: slackapi/slack-github-action@v1.23.0
        with:
          payload: |
                 {
                  &quot;attachments&quot;: [
                      {
                        &quot;title&quot;: &quot;❌ ${{ github.event.pull_request.title }} &lt;&lt; 다시 확인해주세요! 🥲&quot;,
                        &quot;author_name&quot;: &quot;${{github.actor}} 님의 PR 에러 발생 😱&quot;,
                        &quot;color&quot;: &quot;danger&quot;,
                        &quot;fields&quot;: [
                          {
                            &quot;title&quot;: &quot;Title&quot;,
                            &quot;value&quot;: &quot;${{ github.event.pull_request.title }}&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Actions URL&quot;,
                            &quot;value&quot;: &quot;&lt;${{github.server_url}}/${{github.repository}}/commit/${{github.sha}}/checks|${{github.workflow}}&gt;&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Commit&quot;,
                            &quot;value&quot;: &quot;&lt;${{github.server_url}}/${{github.repository}}/commit/${{github.sha}}|Commit Link&gt;&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Message&quot;,
                            &quot;value&quot;: &quot;${{github.event.pull_request.html_url}}&quot;,
                            &quot;short&quot;: false
                          }
                        ]
                      }
                    ]
                }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
          SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

      - name: Notify PR🎁 Check Success
        uses: slackapi/slack-github-action@v1.23.0
          with:
              payload: |
                {
                  &quot;attachments&quot;: [
                      {
                        &quot;title&quot;:  &quot;PR🎁: ${{ github.event.pull_request.title }}&quot;,
                        &quot;author_name&quot;: &quot;${{github.actor}} 님의 PR🎉&quot;,
                        &quot;color&quot;: &quot;adff2f&quot;,
                        &quot;fields&quot;: [
                          {
                            &quot;title&quot;: &quot;Commit&quot;,
                            &quot;value&quot;: &quot;&lt;${{github.server_url}}/${{github.repository}}/commit/${{github.sha}}|Commit Link&gt;&quot;,
                            &quot;short&quot;: true
                          },
                          {
                            &quot;title&quot;: &quot;Message&quot;,
                            &quot;value&quot;: &quot;${{github.event.pull_request.html_url }}&quot;,
                            &quot;short&quot;: false
                          }
                        ]
                      }
                    ]
                }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
          SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK
</code></pre>
<p><img src="https://velog.velcdn.com/images/april_5/post/2eac17de-13f8-42bc-a606-35fe05489461/image.png" alt=""></p>
<br />

<hr>
<h2 id="추가">:추가</h2>
<blockquote>
<p>💡 테스트 코드가 통과해야 merge 가능하도록 Github repository 설정하기</p>
</blockquote>
<br />

<h3 id="▪︎-설정하기">▪︎ 설정하기</h3>
<ol>
<li><p>Repository <code>Settings</code> → <code>Branches</code> → <code>Add rule</code> 을 선택 </p>
<p><img src="https://velog.velcdn.com/images/april_5/post/d43c8ae5-7a2a-4351-b9cd-cb1cb9855a4e/image.png" alt=""></p>
</li>
</ol>
<ol start="2">
<li><p><code>Branch name pattern</code> 을 설정하고 <code>Require status checks to pass before merging</code> 설정을 통해 merge를 위해 통과해야할 Action들을 선택할 수 있다</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/e9b6613f-65bd-465d-8c4d-0de085d7a95c/image.png" alt=""></p>
</li>
</ol>
<p>  <img src="https://velog.velcdn.com/images/april_5/post/a05e19dc-aeb3-4ac2-9995-4c1b5003d5c9/image.png" alt=""></p>
<hr>
<h2 id="☐-적용-과정">☐ 적용 과정</h2>
<h3 id="▪︎-자동화하고-싶은-것">▪︎ 자동화하고 싶은 것</h3>
<ul>
<li>일단 tag</li>
<li>pr 요청 시 lint 체크</li>
<li>테스트 결과도 확인해야 하고</li>
<li>배포 완료/실패시 슬랙 알림<ul>
<li>내용도 있음 좋겠지?</li>
</ul>
</li>
<li>release, hotfix 후 개발 배포도 자동화</li>
</ul>
<h3 id="▪︎-자동화하고-싶은-시점">▪︎ 자동화하고 싶은 시점?</h3>
<ul>
<li><p>각 브랜치에 푸시 시 동작</p>
<ul>
<li><p>배포시 Git Tag, Release Note 생성</p>
<ol>
<li><p>Git Tag 생성하기</p>
<ul>
<li><p>방법1: Release branch가 master/main으로 merge 될때</p>
<ul>
<li><p><code>release/1.0.0</code>생성</p>
</li>
<li><p>merge commit 으로부터 버전 정보 추출</p>
<pre><code class="language-yaml">  # 브랜치로 태그 생성
  name: Release Tag
  on:
    push:
      branches:
        - main
  jobs:
    build:
      runs-on: ubuntu-latest
      steps:
        - uses: actions/checkout@v2
        - name: 버전 정보 추출
          run: echo &quot;##[set-output name=version;]$(echo &#39;${{ github.event.head_commit.message }}&#39; | egrep -o &#39;[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}&#39;)&quot;
          id: extract_version_name

        - name: Release 생성
          uses: actions/create-release@v1
          env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          with:
            tag_name: ${{ steps.extract_version_name.outputs.version }}
            release_name: ${{ steps.extract_version_name.outputs.version }}</code></pre>
</li>
</ul>
</li>
<li><p>방법2: master/main 으로 pr 및 merge 될 때 생성 ✅</p>
<pre><code class="language-yaml">  # package.json의 version 정보로 태그 생성
  name: Create Release Tag
  on:
    push:
      branches:
        - main

  jobs:
    release:
      runs-on: ubuntu-latest
      steps:
        - uses: actions/checkout@v2

        # package.json에서 버전 정보 추출
        - name: package.json info
          id: info
          uses: jaywcjlove/github-action-package@main
        - run: echo &quot;version - ${{ steps.info.outputs.version }}&quot;

        - name: Get latest release tag
          uses: actions-ecosystem/action-get-latest-tag@v1
          id: get-latest-tag
          with:
            semver_only: true

        - name: Create Release 
          uses: actions/create-release@v1
          env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          with:
            tag_name: ${{  steps.info.outputs.version }}
            release_name: ${{  steps.info.outputs.version }}
            body: |
              ${{ github.event.head_commit.message }} 

              **Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.get-latest-tag.outputs.tag }}...${{ steps.info.outputs.version }}
</code></pre>
</li>
<li><p>추출된 버전 정보를 통해 tag 생성</p>
<p>  <img src="https://velog.velcdn.com/images/april_5/post/27aec7e4-33dc-4843-aea1-257bd59bea9a/image.png" alt=""></p>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
<br />


<ul>
<li><p>PR 시 공통: Style, UnitTest (각 단계마다 범위가 강화되는)</p>
<ul>
<li>일단 lint 체크함. 통과안되면 머지 안됨
<img src="https://velog.velcdn.com/images/april_5/post/0b07f7ff-954c-4572-af8f-4a0fd440c96d/image.png" alt=""></li>
</ul>
<pre><code class="language-yaml">              # 모든 PR lint 체크
              name: Check PR
              on: [pull_request]

              jobs:
                build:
                  runs-on: ubuntu-latest

                  steps:
                    - name: Checkout
                      uses: actions/checkout@v2

                    # pnpm 아닌 경우 제거
                    - name: Setup pnpm
                      uses: pnpm/action-setup@v3
                      with:
                        version: 8

                    - name: Node.js Setting
                      uses: actions/setup-node@v3
                      with:
                        node-version: &#39;18.x&#39;

                    - name: Check
                      run: |
                        pnpm i
                        pnpm lint
                      env:
                        CI: true
</code></pre>
</li>
</ul>
<br />

<ul>
<li><p>테스트 결과도 확인해야 하고</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/2937d2b7-25c0-45ca-b13e-82788ec7345b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/58fb6c82-0025-4b39-a08a-4c92163ce24d/image.png" alt=""></p>
<pre><code class="language-yaml">      # 테스트 코드 실행
      - name: Run tests
        run: |
          pnpm test

      - name: Publish Unit Test Results
        uses: EnricoMi/publish-unit-test-result-action@v1
        if: ${{ always() }} # 테스트가 실패하여도 Report를 보기 위해 `always`로 설정
        with:
          files: build/test-results/**/*.xml

      - name: 테스트 커버리지 결과 PR에 코멘트 추가하기
        if: always()
        uses: ArtiomTr/jest-coverage-report-action@v2
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}</code></pre>
</li>
</ul>
<br />

<ul>
<li><p>배포 완료/실패시 슬랙 알림</p>
<p><img src="https://velog.velcdn.com/images/april_5/post/cda75a51-1f4d-484d-b090-7813d6477de9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/april_5/post/b07860c0-799a-4d1f-a77f-6844cd7ffce5/image.png" alt=""></p>
</li>
</ul>
<br />


<ul>
<li>release, hotfix 후 개발 배포도 자동화</li>
</ul>
<pre><code class="language-bash">          back-merge-to-develop:
            needs: build # deploy 성공하면 실행해라
            runs-on: ubuntu-latest
            steps:
              - uses: actions/checkout@v2

              - name: Merge main → develop
                uses: devmasx/merge-branch@master
                with:
                  type: now
                  from_branch: main
                  target_branch: develop # TODO: 브랜치 전략 확인 후 수정
                  github_token: ${{ secrets.GITHUB_TOKEN }}</code></pre>
<br />

<hr>
<h2 id="☐-논의하고-싶은-것">☐ 논의하고 싶은 것</h2>
<h3 id="1-파일-분리할-것인가-한번에-작성할-것인가">1) 파일 분리할 것인가? 한번에 작성할 것인가?</h3>
<ul>
<li><p>각 역할을 하는 파일을 분리하여 관리할 것인가? 아님 한 번에 적용할 것인가?</p>
<ul>
<li><p>슬랙 알림 등</p>
</li>
<li><p>파일 분리를 했을 때 작성</p>
<pre><code class="language-yaml">  #  package.json의 version 정보로 태그 생성
  name: Create Release Tag

  on:
    workflow_run:
      workflows: [&#39;deploy&#39;] # deploy workflow 후 실행
      branches: [main]
      types: [completed]

  jobs:
    release:
      if: ${{ github.event.workflow_run.conclusion == &#39;success&#39; }} # 성공했을 때
      runs-on: ubuntu-latest</code></pre>
</li>
<li><p>한 파일에 작성</p>
<pre><code class="language-yaml">  #...

  back-merge-to-develop:
      needs: build # deploy 성공하면 실행해라
      runs-on: ubuntu-latest</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="2-깃-전략">2) 깃 전략</h3>
<ul>
<li>배포 브랜치 등<ul>
<li>master/develop에 머지되면 배포 PR(운영, 개발 배포) 자동 생성되게끔~~</li>
<li>깃허브 전략 따르기로~~</li>
<li>운영 배포는 master에 머지되면, 개발 배포는 deploy-dev 유지<ul>
<li>단, 이름 변경하기<ul>
<li>master &gt; main 변경하기</li>
<li>deploy-dev는 고민해보기</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="3-통과해야-merge-가능하도록-github-repository-설정하기를-할-것인가">3) 통과해야 merge 가능하도록 Github repository 설정하기를 할 것인가?</h3>
<ul>
<li>테스트 코드 등</li>
<li>lint 체크 등 오류 발생 했을 경우 어떻게 해결할 것인가?<ul>
<li>스프린트 중에 조치할 것인가</li>
<li>이 룰을 일시적으로 제거해서 merge 할 것인가</li>
</ul>
</li>
<li>담에 논의하기로</li>
</ul>
<p><br /><br /><br /></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[테크 북 스터디] 타이탄의 도구들 3장 ]]></title>
            <link>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A4-3%EC%9E%A5</link>
            <guid>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A4-3%EC%9E%A5</guid>
            <pubDate>Thu, 21 Mar 2024 01:41:06 GMT</pubDate>
            <description><![CDATA[<h3 id="why--읽기-전-뭘-얻고-싶었는가">Why : 읽기 전, 뭘 얻고 싶었는가?</h3>
<ul>
<li><h3 id="what--뭘-읽었는가">What : 뭘 읽었는가?</h3>
</li>
<li><p>(미친 듯이 걸으며) ‘자기 삶의 모든 미친 짓을 천천히 털어냈다’, (경찰에 쫓기듯 땀을 흘려라 그것만이) ‘우리 정신속 찌꺼기들을 밖으로 내보내는 유일한 배출구’</p>
<ul>
<li>💬 한계에 내몰리는것을 즐기는 타이탄들. 그 한계를 깼을 때의 성취감 때문..? 그 과정을 통해 스트레스를 덜어내기 때문?!</li>
</ul>
</li>
<li><p>언제나 지금보다 더 나빠질 수 있다는 사실을 기억하라. 지금 땀을 흘리지 않으면 언젠가는 진짜 ‘데스 레이스’를 뛰게 될 것이다</p>
</li>
<li><p>매사 주도적인 모습을 보이는 사람은 다른 사람들보다 더 빨리, 더 멀리, 더 높이 뛸 수 있는 가능성이 크다</p>
</li>
<li><p>꿈은 일어나지 않을지도 모르는 일을 그냥 상상하는 것. 목표는 그걸 이루기 위한 구체적인 계획을 세우고 열심히 노력해 마침내 이루는 것.</p>
</li>
<li><p>탁월함은 좌절감에 대처하는 방법을 찾아낸 사람들이 가는 길. 제대로 된 길을 가고 있는지를 점검하는 좋은 기회. 탁월함의 길이 곧장 뻗은 ‘직선’이 아니라는 것.</p>
<ul>
<li>훌륭한 일터는 멋진 동료들이 있는 곳입니다. 띵스플로우에서는 탁월한 역량을 가진 사람들이 모여 시너지를 내며 일합니다. 모든 띵플러는 뛰어난 동료에 자부심을 느끼며 더 훌륭한 성과를 내고자 합니다. 탁월하기 위해 끊임없이 시도합니다.</li>
</ul>
</li>
</ul>
<h3 id="how--실생활에-어떻게-적용시키고-싶은가">How : 실생활에 어떻게 적용시키고 싶은가?</h3>
<ul>
<li><p>주도적인 삶을 위한 고민. 현재의 모습을 되돌아보고 점검하는 시간을 가져야겠다</p>
<ul>
<li><p>주도성(Personal Initiative). 주도성이란 구성원 개개인이 자신에게 주어진 업무를  ‘왜’하는지, ‘무엇’을 해야 하는지, ‘바람직한 결과’가 무엇인지를 파악하여 책임감을 가지고 일을 완수하는 의지/행동을 말한다.</p>
<p>  즉, 조직 내에서 자신의 사명이 무엇인지를 명확히 인지하고, 업무 수행을 위해 필요한 제반 지식과 정보를 스스로 획득하여 일정 기간 내에 성과를 창출해내는 행동</p>
<ul>
<li>LG경영연구원</li>
</ul>
</li>
<li><p>중심이 되어 어떤일을 이끄는</p>
</li>
<li><p>계획을 세워서 실행에 옮기는</p>
</li>
</ul>
</li>
</ul>
<h3 id="discussion--같이-논의해보고-싶은-것">Discussion : 같이 논의해보고 싶은 것</h3>
<p>- </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[테크 북 스터디] 타이탄의 도구들 2장 (14~27)]]></title>
            <link>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A4-2%EC%9E%A5-1427</link>
            <guid>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A4-2%EC%9E%A5-1427</guid>
            <pubDate>Thu, 14 Mar 2024 22:25:45 GMT</pubDate>
            <description><![CDATA[<h3 id="why--읽기-전-뭘-얻고-싶었는가">Why : 읽기 전, 뭘 얻고 싶었는가?</h3>
<ul>
<li>이번엔 어떤 타이탄들이 성공 노하우인가..?!</li>
</ul>
<h3 id="what--뭘-읽었는가">What : 뭘 읽었는가?</h3>
<ul>
<li><p>인생 카운트다운 시계</p>
<ul>
<li><p>💬 기한이 정해져있으면 일에 대한 우선순위를 정하는데 더 이성적으로 생각하게 되는데</p>
<p>  인생에 대한 부분을 그렇게 관리할 수 있다면 더 효율적이고 집중해서 의미있게 살아갈 수 있을 것 같다는 생각에..? </p>
</li>
</ul>
</li>
<li><p>강해지고 싶다면 강해져라!</p>
<ul>
<li>강한 정신력을 소유하려면 먼저 자신이 생각하는 능력보다 더 강하게 자신을 몰아세워야 한다<ul>
<li>💬 기대하는 수준까지 올라가는 게 아니라, 훈련한 수준까지 떨어지는 것 이라는 문구가 와 닿았던 만큼 강하게 몰아세워야 한다는 말이 결국 훈련이라 생각해서. 즉 강한 정신력을 위한 훈련.</li>
</ul>
</li>
</ul>
</li>
<li><p>💬 일기가 또 나왔다..(냉난방 기능을 갖춘 침대 매트리스, 칠리패드도 또 나옴..)</p>
<ul>
<li>모든 것을 기록해두라</li>
<li>단 나만의 호흡으로 다른 사람들과는 좀 다르게 써라</li>
</ul>
</li>
<li><p>오늘 하루도 무사히 넘겼다! 하루하루 작고 소박한 멋진 일들</p>
<ul>
<li>💬 남편과 퇴근 후 서로 건네는 말은 “별일 없었어?” 인데, 그 말에 답을 하려 하루를 돌아봤을 때 “별 일”이라고 할 것 까지의 일은 사실 거의 없었다는 사실을 깨닫게 되면 그 날 있었던 아주 사소한 스트레스도 왠지 다 날아가버리는 기분..</li>
</ul>
</li>
<li><p>받아들여라</p>
<ul>
<li>💬 평소 “그럴수도 있지!”로 대부분을 넘기는 편. 내려놓는다는 다른 수용의 의미</li>
</ul>
</li>
<li><p>디로딩 시간: 의도적으로 확보한 여유의 시간</p>
</li>
</ul>
<h3 id="how--실생활에-어떻게-적용시키고-싶은가">How : 실생활에 어떻게 적용시키고 싶은가?</h3>
<ul>
<li>1, 3, 5년에 대한 계획 세우기<ul>
<li>5년: 실천할 가치가 있는 중요한 아이디어의 수명</li>
<li>5년: 처음 아이디어를 떠올리고 완전히 그만 생각하게 되기까지 걸리는 시간</li>
</ul>
</li>
</ul>
<h3 id="discussion--같이-논의해보고-싶은-것">Discussion : 같이 논의해보고 싶은 것</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[테크 북 스터디] 타이탄의 도구들 2장 (~13)]]></title>
            <link>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A4-2%EC%9E%A5-13-60huuvjk</link>
            <guid>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A4-2%EC%9E%A5-13-60huuvjk</guid>
            <pubDate>Wed, 06 Mar 2024 23:15:44 GMT</pubDate>
            <description><![CDATA[<h3 id="why--읽기-전-뭘-얻고-싶었는가">Why : 읽기 전, 뭘 얻고 싶었는가?</h3>
<ul>
<li><h3 id="what--뭘-읽었는가">What : 뭘 읽었는가?</h3>
</li>
<li><p>불안에서 벗어나는 가장 좋은 방법은 지금 이순간의 좋은 일에 감사하는 것</p>
</li>
<li><p>두려움을 어떻게 써먹느냐가 승패를 결정한다</p>
<ul>
<li>겁쟁이처럼 피해 도망치거나 혹은 던져버려 이겨내거나!</li>
</ul>
</li>
<li><p>더 나은 사람이 되려면 실수와 한계를 드러내는 일에 두려움을 갖지 않아야 한다. 가장 많은 실수를 드러내는 사람이 가장 열심히 노력하는 사람이다. 그러니 그것들을 보여주는 건 부끄러워할 이유가 아니다</p>
<ul>
<li>💬 잘하고픈 마음에, 틀렸다는 생각에, 실수한다는 것이 부끄러워 숨기려는 경향이 있는데 이 말에 위안이 되었고 마음을 바꿔먹게 되었다</li>
</ul>
</li>
<li><p>다른 방법이 없을 때는 그냥 열심히 하라</p>
</li>
</ul>
<h3 id="how--실생활에-어떻게-적용시키고-싶은가">How : 실생활에 어떻게 적용시키고 싶은가?</h3>
<ul>
<li>적용시킬 것들이 너무 많아 우선순위를 먼저 정해야겠다..<ul>
<li>💬 명상도 아직 시작을 몬함..🥲😭</li>
</ul>
</li>
</ul>
<h3 id="discussion--같이-논의해보고-싶은-것">Discussion : 같이 논의해보고 싶은 것</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[테크 북 스터디] 타이탄의 도구들 1장 (11~24)]]></title>
            <link>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A4-1%EC%9E%A5-1124</link>
            <guid>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A4-1%EC%9E%A5-1124</guid>
            <pubDate>Wed, 06 Mar 2024 23:14:26 GMT</pubDate>
            <description><![CDATA[<h3 id="why--읽기-전-뭘-얻고-싶었는가">Why : 읽기 전, 뭘 얻고 싶었는가?</h3>
<ul>
<li>다양한 성공을 위한 사례?!</li>
</ul>
<h3 id="what--뭘-읽었는가">What : 뭘 읽었는가?</h3>
<ul>
<li>의문의 수준이 삶의 수준을 결정한다<ul>
<li>자신에 대해 의심을 품는 사람은 아무것도 이룰 수 없다</li>
<li>난 견뎌낸 게 아니라오. 준비하고 있었던 거지</li>
</ul>
</li>
<li>아침일기를 쓰는 이유<ul>
<li>현재 처한 상황을 파악하고자<ul>
<li>💬 아침에 업무일지 쓰는것과 비슷한듯?</li>
</ul>
</li>
<li>날뛰는 정신을 잠시나마 종이 위에 붙들기 위해..<ul>
<li>💬 차분한 하루의 시작을 위해?!</li>
</ul>
</li>
<li>타협이 아니라 극복을 제시</li>
</ul>
</li>
<li>승패가 바로 결정되는 단기적인 목표에 집착하지 말고 지속가능한 장기적인 목표, 체계를 그리자<ul>
<li>목표: 글을 잘 쓰는 작가 되기,</li>
<li>체계: 블로그에 꾸준히 글 써보기. 어떤 글이 반응이 좋은지 살피고 전략 세우기</li>
</ul>
</li>
<li>자본주의는 희귀하고 가치 있는 것들을 보상해 준다. 두 가지 이상의 괜찮은 능력을 결합해 자신을 보기 드문 존재로 반들어야 한다<ul>
<li>💬 이전 내용 중 타인이 절대 대체할 수 없는 나만의 사명을 갖는 것 이라는 내용이 있었는데, 그럼 어떻게 가질 수 있는가?에 대한 답을 찾을 수 있는 듯?!</li>
</ul>
</li>
<li>안테암블로가 되어라<ul>
<li>자발적 안테암블로가 되어야 한다</li>
<li>내 위에 있는 사람들을 위해 길을 열어주는 것이 곧 나를 위한 길을 만들어가는 것</li>
<li>타인을 섬기겠다는 자세를 가진 사람이 성공 못하는 경우는 거의 없다<ul>
<li>위기에 처했을 때 모욕감 없이 자존심을 굽힐 수 있게 해주고</li>
<li>편견 없이 모든 유용한 조언들을 스폰지처럼 흡수하게 해준다</li>
</ul>
</li>
<li>누군가가 가고자 하는 방향을 미리 읽어내 그들이 짐을 효율적으로 꾸릴 수 있도록 도와주는 역할</li>
</ul>
</li>
</ul>
<h3 id="how--실생활에-어떻게-적용시키고-싶은가">How : 실생활에 어떻게 적용시키고 싶은가?</h3>
<ul>
<li>작은 디테일의 습관 만들기..(매일 성공한 기분을 느끼기?!)<ul>
<li>퇴근 후 책상에 최소 10분 이상 앉아있기<ul>
<li>단, 일하지 않기</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="discussion--같이-논의해보고-싶은-것">Discussion : 같이 논의해보고 싶은 것</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[테크 북 스터디] 타이탄의 도구들 1장 (~24)]]></title>
            <link>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A424-x5z3cuf5</link>
            <guid>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A424-x5z3cuf5</guid>
            <pubDate>Wed, 28 Feb 2024 03:11:29 GMT</pubDate>
            <description><![CDATA[<h3 id="why--읽기-전-뭘-얻고-싶었는가">Why : 읽기 전, 뭘 얻고 싶었는가?</h3>
<ul>
<li>다양한 성공을 위한 사례?!</li>
</ul>
<h3 id="what--뭘-읽었는가">What : 뭘 읽었는가?</h3>
<ul>
<li>의문의 수준이 삶의 수준을 결정한다<ul>
<li>자신에 대해 의심을 품는 사람은 아무것도 이룰 수 없다</li>
<li>난 견뎌낸 게 아니라오. 준비하고 있었던 거지</li>
</ul>
</li>
<li>아침일기를 쓰는 이유<ul>
<li>현재 처한 상황을 파악하고자<ul>
<li>💬 아침에 업무일지 쓰는것과 비슷한듯?</li>
</ul>
</li>
<li>날뛰는 정신을 잠시나마 종이 위에 붙들기 위해..<ul>
<li>💬 차분한 하루의 시작을 위해?!</li>
</ul>
</li>
<li>타협이 아니라 극복을 제시</li>
</ul>
</li>
<li>승패가 바로 결정되는 단기적인 목표에 집착하지 말고 지속가능한 장기적인 목표, 체계를 그리자<ul>
<li>목표: 글을 잘 쓰는 작가 되기,</li>
<li>체계: 블로그에 꾸준히 글 써보기. 어떤 글이 반응이 좋은지 살피고 전략 세우기</li>
</ul>
</li>
<li>자본주의는 희귀하고 가치 있는 것들을 보상해 준다. 두 가지 이상의 괜찮은 능력을 결합해 자신을 보기 드문 존재로 반들어야 한다<ul>
<li>💬 이전 내용 중 타인이 절대 대체할 수 없는 나만의 사명을 갖는 것 이라는 내용이 있었는데, 그럼 어떻게 가질 수 있는가?에 대한 답을 찾을 수 있는 듯?!</li>
</ul>
</li>
<li>안테암블로가 되어라<ul>
<li>자발적 안테암블로가 되어야 한다</li>
<li>내 위에 있는 사람들을 위해 길을 열어주는 것이 곧 나를 위한 길을 만들어가는 것</li>
<li>타인을 섬기겠다는 자세를 가진 사람이 성공 못하는 경우는 거의 없다<ul>
<li>위기에 처했을 때 모욕감 없이 자존심을 굽힐 수 있게 해주고</li>
<li>편견 없이 모든 유용한 조언들을 스폰지처럼 흡수하게 해준다</li>
</ul>
</li>
<li>누군가가 가고자 하는 방향을 미리 읽어내 그들이 짐을 효율적으로 꾸릴 수 있도록 도와주는 역할</li>
</ul>
</li>
</ul>
<h3 id="how--실생활에-어떻게-적용시키고-싶은가">How : 실생활에 어떻게 적용시키고 싶은가?</h3>
<ul>
<li>작은 디테일의 습관 만들기..(매일 성공한 기분을 느끼기?!)<ul>
<li>퇴근 후 책상에 최소 10분 이상 앉아있기<ul>
<li>단, 일하지 않기</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="discussion--같이-논의해보고-싶은-것">Discussion : 같이 논의해보고 싶은 것</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[테크 북 스터디] 타이탄의 도구들 1장 (~10)]]></title>
            <link>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A410</link>
            <guid>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%83%80%EC%9D%B4%ED%83%84%EC%9D%98-%EB%8F%84%EA%B5%AC%EB%93%A410</guid>
            <pubDate>Fri, 23 Feb 2024 22:45:31 GMT</pubDate>
            <description><![CDATA[<h3 id="why--읽기-전-뭘-얻고-싶었는가">Why : 읽기 전, 뭘 얻고 싶었는가?</h3>
<ul>
<li>성공한 사람들이 가지고 있는 습관? 태도? 등을 배우고 싶다</li>
</ul>
<h3 id="what--뭘-읽었는가">What : 뭘 읽었는가?</h3>
<ol>
<li>승리하는 아침을 만드는 5가지 의식<ul>
<li>하루의 첫 60분이 중요하다.</li>
<li>작은 디테일이 강력한 영향력을 끼친다</li>
<li>잠자리 정리, 명상, 한 동작 반복(5~10회), 차를 마셔라, 아침 일기<ul>
<li>명상: 기대하는 수준까지 올라가는 게 아니라, 훈련한 수준까지 떨어지는 것</li>
</ul>
</li>
</ul>
</li>
<li>남들보다 뛰어난 감각을 동원하라<ul>
<li>아이디어와 창의성의 진보는 다시 그리는 순간 사이에 존재</li>
<li>독창적이고 창의적인 인물이 되는 조건은 해석력</li>
<li>보는 것을 배우고 훈련하는 것</li>
</ul>
</li>
<li>인생을 걸어볼 목표를 찾아라<ul>
<li>실패는 오래가지 않는다</li>
<li>타인이 절대 대체할 수 없는 나만의 사명을 갖는 것</li>
</ul>
</li>
<li>폭발적인 아이디어는 어떻게 탄생하는가<ul>
<li>황당한 아이디어 속 좋은 아이디어 몇 개가 나타나는 법</li>
<li>돈이 아닌, 흥미를 자극할 만한 아이디어</li>
</ul>
</li>
<li>원하는 곳에서 원하는 방식으로 하라<ul>
<li>공격적인 삶: 내가 내 삶의 조건들을 주도해나가는 삶</li>
<li>사람에게 투자하는 것</li>
<li>나만의 독특함과 유별남</li>
</ul>
</li>
<li>레드 팀을 이끌어라<ul>
<li>점점 똑똑해진다는 것은 점점 강해진다는 뜻<ul>
<li>사내 레드팀의 공격을 극복하지 못하면, 세상이라는 진짜 무시무시한 레드 팀에 무릎 꿇고 만다</li>
</ul>
</li>
<li>반대편을 연구하라</li>
<li>강력한 의견, 침착한 태도</li>
</ul>
</li>
<li>영웅적인 날들로 복귀하라<ul>
<li>성과를 내는 날을 그렇지 못한 날보다 많이 만들 것</li>
</ul>
</li>
<li>눈에 잘 띄는 곳에 존재하라<ul>
<li>비전: 승리. 이기러 나간다</li>
<li>버티는 자가 이긴다</li>
</ul>
</li>
<li>세 번째 떠오르는 것이 진짜다<ul>
<li>느리지만 의식적이고 이성적인 사고를 활용해야 새로운 것을 만들어 낼 수 있다</li>
<li>성공은 역설적이다. 느리게 가면 가장 좋은 것을 빠르게 얻는다</li>
</ul>
</li>
<li>매일 손님을 맞이하라, 환대하라<ul>
<li>화를 내고 속상해하는 것은 백해무익하다. 그 시간에 대안을 찾는 것, 왜 그런 일이 일어났는지에 대한 질문을 통해 뭔가 배우고 얻어야 한다는 것</li>
<li>자, 그다음은?</li>
<li>글을 명확하게 쓸 줄 아느냐는 사고의 명확성을 나타내는 지표</li>
</ul>
</li>
</ol>
<h3 id="how--실생활에-어떻게-적용시키고-싶은가">How : 실생활에 어떻게 적용시키고 싶은가?</h3>
<ul>
<li>작은 디테일이 강력한 영향력을 끼친다<ul>
<li>💬 매우매우 동의! 큰 변화보다 자잘하게 행동으로 옮길 수 있는 것 부터 찾아보고 적용시켜야겠다.<ol>
<li>잠자리 정리</li>
<li>명상<ul>
<li>명상: 기대하는 수준까지 올라가는 게 아니라, 훈련한 수준까지 떨어지는 것</li>
</ul>
</li>
<li>성과를 내는 날을 그렇지 못한 날보다 많이 만들 것 </li>
<li>그 시간에 대안을 찾는 것, 왜 그런 일이 일어났는지에 대한 질문을 통해 뭔가 배우고 얻어야 한다는 것</li>
<li>황당한 아이디어 속 좋은 아이디어 몇 개가 나타나는 법 <ul>
<li>💬 말도 안되는 생각, 상상은 하지 않으려 노력하는 편인데 황당한 생각, 상상이면 어떠랴.. 맘껏 상상해보자! (성격상 쉽진 않겠지만..)</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li>버티는 자가 이긴다<ul>
<li>💬 매우 공감!</li>
</ul>
</li>
</ul>
<h3 id="discussion--같이-논의해보고-싶은-것">Discussion : 같이 논의해보고 싶은 것</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[테크 북 스터디] 거인의 노트 #3]]></title>
            <link>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%EA%B1%B0%EC%9D%B8%EC%9D%98-%EB%85%B8%ED%8A%B8-3</link>
            <guid>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%EA%B1%B0%EC%9D%B8%EC%9D%98-%EB%85%B8%ED%8A%B8-3</guid>
            <pubDate>Fri, 23 Feb 2024 22:36:40 GMT</pubDate>
            <description><![CDATA[<h3 id="why--읽기-전-뭘-얻고-싶었는가">Why : 읽기 전, 뭘 얻고 싶었는가?</h3>
<ul>
<li>적용 가능한 구체적인 방법 체득</li>
</ul>
<h3 id="what--뭘-읽었는가">What : 뭘 읽었는가?</h3>
<ul>
<li>효율적인 공부 방법<ul>
<li>확실성<ul>
<li>설명 가능해야 함</li>
</ul>
</li>
<li>요약성<ul>
<li>키워드</li>
</ul>
</li>
<li>종합성<ul>
<li>재정렬<ul>
<li>💬 지식을 지혜로 만드는 과정과 유사</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>보다 쉽게 책 읽기</li>
<li>상호성장 가능한 대화<ul>
<li>다양한 사람을 만나야 새로운 기회도 생긴다<ul>
<li>💬 가끔 대화의 자리가 피로하다 느낄때가 있었는데 대화와 더 가까워저야겠다..</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="how--실생활에-어떻게-적용시키고-싶은가">How : 실생활에 어떻게 적용시키고 싶은가?</h3>
<ul>
<li>보다 쉽게 책 읽기<ul>
<li>💬 책에 메모하며 읽기는 하지만, 메모하는 방법을 바꿔서 키워드로 요약하고 다시 읽는 습관도 길러야겠다</li>
</ul>
</li>
<li>대화를 즐기고 기록하고 소화시키자</li>
</ul>
<h3 id="discussion--같이-논의해보고-싶은-것">Discussion : 같이 논의해보고 싶은 것</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[테크 북 스터디] 거인의 노트 #1, #2]]></title>
            <link>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%EA%B1%B0%EC%9D%B8%EC%9D%98-%EB%85%B8%ED%8A%B8-1-2</link>
            <guid>https://velog.io/@april_5/%ED%85%8C%ED%81%AC-%EB%B6%81-%EC%8A%A4%ED%84%B0%EB%94%94-%EA%B1%B0%EC%9D%B8%EC%9D%98-%EB%85%B8%ED%8A%B8-1-2</guid>
            <pubDate>Fri, 23 Feb 2024 22:35:07 GMT</pubDate>
            <description><![CDATA[<h3 id="why--읽기-전-뭘-얻고-싶었는가">Why : 읽기 전, 뭘 얻고 싶었는가?</h3>
<p>기록에 어떻게 하는 것이 효율적인가, 실천방안 등</p>
<h3 id="what--뭘-읽었는가">What : 뭘 읽었는가?</h3>
<p><strong>1부 기록하는 인간</strong></p>
<ul>
<li>왜 기록해야 하는가? (💬 동기부여가 가장 중요하다고 생각함)<ul>
<li>인간이 성장하는 방법은 크게 두 가지가 있는데<ul>
<li>외부로부터 받아들이는 것</li>
<li>내 안에서 끄집어 내는 것<ul>
<li>내면 깊숙이 존재하는 잠재력을 기록<ul>
<li>💬 지식을 위해 독서를 할 때도 요약하며 기록하면 더 이해하기 쉽고 오래간다. 쉽게 읽힌다. ex)클린코드</li>
</ul>
</li>
<li>내 안에 내포된 것을 명시화함으로써 잠재성을 현실 능력으로 활용할 수 있다</li>
</ul>
</li>
</ul>
</li>
<li>머릿속 방을 깨끗이 정리해 언제든 적재적소에 맞게 꺼내 쓸 수 있도록 생각을 차곡차곡 정리해놓으면 얼마나 좋을까!</li>
</ul>
</li>
<li>기록하고 되뇌고 말하라(반복/복습 → 장기기억이라고 인식)<ul>
<li>집중해서 보고</li>
<li>그것을 생각해서 기록하고</li>
<li>그 후 기록한 것을 되돌아보는 과정<ul>
<li>말과 글로 내뱉어 보는 것</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>2부 거인의 요약법과 분류법</strong></p>
<ul>
<li>기록의 핵심: 제일 유용한 것을 골라서 활용<ul>
<li>평가해서<ul>
<li>평가 기준: 가치</li>
</ul>
</li>
<li>선별하기<ul>
<li>선별 기준: 지속적 활용</li>
</ul>
</li>
</ul>
</li>
<li>기록형 인간은<ul>
<li>기록 전체를 담는 동시에</li>
<li>대표격에 해당하는 단어 몇 개를 기록으로 남긴다</li>
</ul>
</li>
</ul>
<p>→ 자기화하고 핵심 키워드만 메모, 재요약 </p>
<p>✎ 자기화란? 키워드로 요약하고, 그 키워드를 소화하고, 내 이야기를 10% 추가 </p>
<ul>
<li>집중하기 위해 기록한다?!<ul>
<li>기록하는 일이 주는 직접적인 효용은 집중!</li>
</ul>
</li>
<li>기록학에서 중요한 분류!</li>
<li></li>
</ul>
<h3 id="how--실생활에-어떻게-적용시키고-싶은가">How : 실생활에 어떻게 적용시키고 싶은가?</h3>
<ul>
<li>평소 작성하는 업무일지, 다이어리 작성 방법에 적용하기 부터 시작!</li>
</ul>
<h3 id="discussion--같이-논의해보고-싶은-것">Discussion : 같이 논의해보고 싶은 것</h3>
<p>-</p>
]]></description>
        </item>
    </channel>
</rss>