<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>nayoon-kim.log</title>
        <link>https://velog.io/</link>
        <description>뚜벅뚜벅 열심히 공부하는 개발자</description>
        <lastBuildDate>Tue, 05 Apr 2022 01:39:18 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>nayoon-kim.log</title>
            <url>https://images.velog.io/images/nayoon-kim/profile/f03fd676-3279-45bf-b4ef-6faae726a358/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. nayoon-kim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/nayoon-kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[시간 지연에 대해서]]></title>
            <link>https://velog.io/@nayoon-kim/%EC%8B%9C%EA%B0%84-%EC%A7%80%EC%97%B0%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C</link>
            <guid>https://velog.io/@nayoon-kim/%EC%8B%9C%EA%B0%84-%EC%A7%80%EC%97%B0%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C</guid>
            <pubDate>Tue, 05 Apr 2022 01:39:18 GMT</pubDate>
            <description><![CDATA[<p>경험과 지식 부족으로 말문이 막혔던 질문이 있다.</p>
<p>request가 들어왔고 여러 테이블에 걸쳐 write를 해야 하는 작업이다.</p>
<p>트랜잭션을 통해 원자성 원칙을 준수하고 싶다.</p>
<p>그런데 여러 테이블에 한 번에 트랜잭션을 걸게 되면 테이블 lock으로 시간 지연이 발생하게 될 거다.</p>
<p>그러면 트랜잭션을 걸지 말아야 할까..?</p>
<p>아니면 트랜잭션을 걸고 시간 지연으로 불편을 초래할 것인가..?</p>
<p>해결방안 중 하나</p>
<p>mysql engine 중 InnoDB는 row lock을 지원하고 있다.</p>
<p>위의 engine을 사용함으로써 row lock으로 시간 지연을 막을 수 있는 방법을 모색할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 신고 결과 받기]]></title>
            <link>https://velog.io/@nayoon-kim/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%8B%A0%EA%B3%A0-%EA%B2%B0%EA%B3%BC-%EB%B0%9B%EA%B8%B0</link>
            <guid>https://velog.io/@nayoon-kim/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%8B%A0%EA%B3%A0-%EA%B2%B0%EA%B3%BC-%EB%B0%9B%EA%B8%B0</guid>
            <pubDate>Thu, 10 Mar 2022 13:12:27 GMT</pubDate>
            <description><![CDATA[<p>오랜만에 풀어도 이렇게 오래 걸릴 문제는 아니었는데, 개인적으로는 많이 아쉽다.</p>
<p>(작년 카카오 코테에서는 깔끔은 아니어도 빨리 풀었던 거 같은데.. 이래서 시간 압박이 중요한가보다..)</p>
<h2 id="내-풀이">내 풀이</h2>
<pre><code class="language-java">import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Arrays;

public class Programmers_신고_결과_받기 {

    public static int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        Map&lt;String, Map&lt;String, Boolean&gt;&gt; map = new HashMap&lt;&gt;();
        Map&lt;String, Integer&gt; success = new HashMap&lt;&gt;();

        for(String id: id_list) {
            map.put(id, new HashMap&lt;&gt;());
            success.put(id, 0);
        }
        StringTokenizer st;
        String reporter, attacker;
        Map&lt;String, Boolean&gt; temp;

        for(String rep: report) {
            st = new StringTokenizer(rep);
            reporter = st.nextToken();
            attacker = st.nextToken();

            temp = map.get(reporter);
            if (!temp.getOrDefault(attacker, false)) {
                temp.put(attacker, true);

                success.put(attacker, success.get(attacker) + 1);
            }

        }

        for(String id: id_list) {
            if (success.get(id) &gt;= k) {
                for(int i = 0; i &lt; id_list.length; i++) {
                    if (map.get(id_list[i]).containsKey(id)) answer[i]++;
                }
            }
        }

        return answer;
    }    

    public static void main(String[] args) {
        System.out.println(Arrays.toString(solution(new String[] {&quot;muzi&quot;, &quot;frodo&quot;, &quot;apeach&quot;, &quot;neo&quot;}, new String[] {&quot;muzi frodo&quot;,&quot;apeach frodo&quot;,&quot;frodo neo&quot;,&quot;muzi neo&quot;,&quot;apeach muzi&quot;}, 2)).toString());
        System.out.println(Arrays.toString(solution(new String[] {&quot;con&quot;, &quot;ryan&quot;}, new String[] {&quot;ryan con&quot;, &quot;ryan con&quot;, &quot;ryan con&quot;, &quot;ryan con&quot;}, 3)).toString());
    }
}
</code></pre>
<h2 id="다른-사람-풀이">다른 사람 풀이</h2>
<p><img src="https://images.velog.io/images/nayoon-kim/post/3ac18251-cf1b-414a-8b79-1c11c4be050f/image.png" alt=""></p>
<p>다른 사람들 풀이를 보았는데, stream을 이용해서 푼 코드가 가장 상단에 있었고 가장 눈에 띄었다.</p>
<p>다음 문제 조건을 첫 줄부터 처리하고 넘어가는데 멋있었다.</p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/926b3a39-cfc8-45e9-afea-af333699cf7e/image.png" alt=""></p>
<h2 id="stream">Stream</h2>
<p>Java8부터 Stream을 지원하게 되었는데, 컬렉션, 배열 등에 대해 저장되어있는 요소들을 하나씩 참조하며 반복적인 처리를 가능하게 하는 기능이다.</p>
<p>이러한 Stream을 이용한다면 불필요한 for문과 그 안에서의 if문 등의 분기 처리를 쓰지 않고도 깔끔하고 직관적인 코드를 변형할 수 있다.</p>
<h3 id="특징">특징</h3>
<ol>
<li><p>Stream은 데이터를 읽기만 할 뿐 데이터를 변경하지 않는다.</p>
</li>
<li><p>Stream은 한번 사용하면 닫히기 때문에 재사용이 불가능하다.</p>
</li>
<li><p>Stream을 사용하면 메소드 내부에 반복문을 숨기기 때문에 간결하게 코드를 구성하는 것이 가능하다.</p>
</li>
</ol>
<h3 id="중개-연산">중개 연산</h3>
<p>Stream을 전달받아 Stream으로 반환하기 때문에 중개 연산을 연속으로 사용할 수 있다. </p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/5438b00a-7848-49ae-93d8-bb4f80239be6/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/3c4b8950-7629-434e-a6e3-6f462c2de97a/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/6bfda934-cde2-4758-a641-93709e05636d/image.png" alt=""></p>
<h3 id="최종-연산">최종 연산</h3>
<p>중개 연산을 통해 만들어진 stream에 있는 요소들에 대해 마지막으로 각 요소를 소모하며 최종 결과를 표시한다.</p>
<p>즉, 지연(lazy) 되었던 모든 중개 연산들이 최종 연산 시에 모두 수행되는 것이다.</p>
<p>이렇게 최종 연산 시에 모든 요소를 소모한 해당 stream은 더 이상 사용할 수 없다.</p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/fb71a170-a7a0-4ecd-91e9-6bb589b057d2/image.png" alt=""></p>
<p><a href="https://ahndding.tistory.com/23">https://ahndding.tistory.com/23</a></p>
<h2 id="위-풀이를-보고-한-생각">위 풀이를 보고 한 생각</h2>
<h3 id="개선할-점">개선할 점</h3>
<ul>
<li><p>for문 횟수 줄이기</p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/c4d0c8ff-7507-43fd-865a-b07abaf7263b/image.png" alt="">
굳이 Stream을 사용하지 않아도 Set을 이용해서 중복된 report를 줄일 수 있을 것 같다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 노트]]></title>
            <link>https://velog.io/@nayoon-kim/%EA%B0%9C%EB%B0%9C-%EB%85%B8%ED%8A%B8</link>
            <guid>https://velog.io/@nayoon-kim/%EA%B0%9C%EB%B0%9C-%EB%85%B8%ED%8A%B8</guid>
            <pubDate>Fri, 25 Feb 2022 04:38:46 GMT</pubDate>
            <description><![CDATA[<p>Slim</p>
<ul>
<li>Slim 프레임워크는 PHP 프레임워크 중 하나로 빠르면서도 강력한 웹 애플리케이션, API 개발이 가능하다.</li>
</ul>
<p>DDD</p>
<ul>
<li>Slim을 익히는 시간을 최소화하기 위해 Slim-skeleton이라고 하는 프로젝트를 클론받았다.</li>
<li>slim-skeleton은 DDD로 이루어져 있었는데, Application, Domain, Infrastructure 로 src가 이루어져 있었다.</li>
<li>DDD는 소프트웨어 초기 설계 비용은 많이 들어가지만 이후 유지보수, 확장 시에 유용하게 사용된다.</li>
</ul>
<p>PDO</p>
<p>PDO 정의, PDO 선택 이유</p>
<p>다른 선택지는 없었나? 왜 PDO를 선택했는가?</p>
<p>MySQL</p>
<p>다른 DB를 선택하지 않은 이유</p>
<p>미들웨어</p>
<p>Session, Token</p>
<p>Redis 선택 이유</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[이번주 내가 겪은 에러]]></title>
            <link>https://velog.io/@nayoon-kim/%EC%9D%B4%EB%B2%88%EC%A3%BC-%EB%82%B4%EA%B0%80-%EA%B2%AA%EC%9D%80-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@nayoon-kim/%EC%9D%B4%EB%B2%88%EC%A3%BC-%EB%82%B4%EA%B0%80-%EA%B2%AA%EC%9D%80-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Fri, 18 Feb 2022 07:33:03 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-1">문제 1</h3>
<p>PHP : LOAD DATA LOCAL INFILE forbidden</p>
<h3 id="해결-1">해결 1</h3>
<p> return new PDO($dsn, $username, $password, [PDO::MYSQL_ATTR_LOCAL_INFILE =&gt; true]);</p>
<blockquote>
<p>[PDO::MYSQL_ATTR_LOCAL_INFILE =&gt; true] local data infile을 허용하는 것이라고 한다.</p>
</blockquote>
<p> 그런데 /etc/my.cnf에 [mysql]local_infile=on
 [mysqld] local_infile=on 은 하나도 먹지 않았다.</p>
<blockquote>
</blockquote>
<p> show variables like &#39;local_infile&#39;을 해도 on이라고 잘만 떴는데, 왜 그런건지 좀 더 알아보자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MySQL 한글 깨짐]]></title>
            <link>https://velog.io/@nayoon-kim/MySQL-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90</link>
            <guid>https://velog.io/@nayoon-kim/MySQL-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90</guid>
            <pubDate>Mon, 07 Feb 2022 05:48:41 GMT</pubDate>
            <description><![CDATA[<p><a href="https://hongsii.github.io/2017/10/15/mysql-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-%EB%AC%B8%EC%A0%9C/">MySQL 한글 깨짐 문제</a>를 참고해서 문제를 해결하였다.</p>
<p>위의 블로그와 모두 동일하게 진행하였는데 유일하게 달랐던 점이 있다면</p>
<p>my.cnf 파일의 경로였다.</p>
<p>나의 경우에는 my.cnf가 /etc 아래 있었다.</p>
<p>mysql 디렉토리 안에 존재하지 않았다.</p>
<hr>

<p>위의 블로그 말처럼 기존에 만든 테이블은 바뀐 character-set이 적용되지 않는다.</p>
<p>따라서 </p>
<blockquote>
<p>alter table &#39;테이블 명&#39; convert to character set utf8;</p>
</blockquote>
<p>로 기존에 존재하는 테이블을 모두 일일이 수정해주어야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[GAME] 실시간 게임서버]]></title>
            <link>https://velog.io/@nayoon-kim/GAME-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EA%B2%8C%EC%9E%84%EC%84%9C%EB%B2%84</link>
            <guid>https://velog.io/@nayoon-kim/GAME-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EA%B2%8C%EC%9E%84%EC%84%9C%EB%B2%84</guid>
            <pubDate>Tue, 25 Jan 2022 01:15:27 GMT</pubDate>
            <description><![CDATA[<p>stateful 게임 서버는 실시간 온라인 게임에 사용되는 기술이다.</p>
<p>MMORPG, MOBA 등등의 게임이 stateful 게임 서버를 이용해서 서비스를 제공하고 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 첫걸음 - 6장]]></title>
            <link>https://velog.io/@nayoon-kim/SQL-%EC%B2%AB%EA%B1%B8%EC%9D%8C-6%EC%9E%A5</link>
            <guid>https://velog.io/@nayoon-kim/SQL-%EC%B2%AB%EA%B1%B8%EC%9D%8C-6%EC%9E%A5</guid>
            <pubDate>Thu, 20 Jan 2022 10:01:59 GMT</pubDate>
            <description><![CDATA[<h2 id="25강-데이터베이스-객체">25강 데이터베이스 객체</h2>
<h3 id="데이터베이스-객체">데이터베이스 객체</h3>
<p>테이블이나 뷰, 인덱스 등 데이터베이스 내에 정의하는 모든 것을 일컫는 말</p>
<p>객체는 데이터베이스 내에 실체를 가지는 어떤 것을 말하는데, 객체의 종류에 따라 데이터베이스에 저장된는 내용도 달라진다.</p>
<p>테이블은 데이터베이스의 객체로 행과 열이 저장된다.</p>
<p>SQL 명령은 SELECT나 INSERT 등을 통해 객체를 조작한다.</p>
<p>객체는 이름을 가지는데, 데이터베이스 내에서 객체를 작성할 때는 이름이 겹치지 않도록 해야 한다.</p>
<h3 id="스키마">스키마</h3>
<p>데이터베이스 객체는 스키마라는 그릇 안에 만들어지는데, 
객체의 이름이 같아도 스키마가 서로 다르다면 상관없다.</p>
<p>보통 MySQL에서는 데이터베이스가 스키마가 된다.</p>
<p>테이블 안에는 열을 정의할 수 있고 스키마 안에는 테이블을 정ㅇ의할 수 있다.</p>
<p>각각의 그릇 안에서는 중복하지 않도록 이름을 지정해야 하고 이름이 충돌하지 않도록 기능하는 그릇을 네임스페이스(namespace)라고 부르기도 한다..!</p>
<h2 id="26장-테이블-작성-삭제-변경">26장 테이블 작성, 삭제, 변경</h2>
<h3 id="테이블-작성">테이블 작성</h3>
<p>DDL은 모두 같은 문법을 사용한다.</p>
<p>CREATE - 작성
DROP - 삭제
ALTER - 변경</p>
<p>뒤이어 어떤 종류의 객체를 작성, 삭제, 변경할 지를 지정한다.</p>
<pre><code>create table 테이블명 (
    열 정의1,
    열 정의2
)</code></pre><p>위와 같이 하고 자료형을 적을 때 유의할 점이 문자열형의 경우 (char나 varchar) 최대 길이를 괄호로 묶어줘야 한다.</p>
<pre><code>컬럼명 자료형 [Default 기본값] [NULL | NOT NULL]</code></pre><h3 id="테이블-삭제">테이블 삭제</h3>
<pre><code>DROP TABLE 테이블명</code></pre><h4 id="데이터-행-삭제">데이터 행 삭제</h4>
<pre><code># DML
DELETE FROM 테이블명</code></pre><p>where 조건을 붙이지 않으면 테이블에 있는 모든 행을 삭제한다.</p>
<pre><code># DDL
TRUNCATE TABLE 테이블명</code></pre><p>DELETE 명령은 행 단위로 여러가지 내부처리가 일어나므로 삭제할 행이 많으면 처리속도가 상당히 늦어진다.</p>
<p>이런 경우에는 <strong>DDL로 분류되는 TRUNCATE TABLE 명령</strong>을 사용하는데, WHERE로 조건을 걸 수는 없지만 <strong>모든 행을 삭제해야 할 때 빠른 속도로 삭제할 수 있다.</strong></p>
<h3 id="테이블-변경">테이블 변경</h3>
<pre><code>ALTLER TABLE 테이블명 변경명령

변경명령
- column 추가, 삭제, 변경
- constraint 추가, 삭제</code></pre><p>테이블 작성 후 column을 추가하거나 데이터 최대길이 변경 등 구성을 변경할 때 사용한다.</p>
<p>빈 테이블의 경우 DROP 후 CREATE TABLE을 해도 되지만 이미 데이터가 존재하는 테이블의 경우에는 ALTER를 쓰자.</p>
<pre><code># 열 추가
ALTER TABLE sample62 ADD newcol varchar(30);

# 열 속성 변경
ALTER TABLE sample62 MODIFY newcol varchar(20);

# 열 이름 변경
&#39;ALTER TABLE 테이블명 CHANGE [기존 열 이름] [신규 열 정의] [열 속성도 변경 가능]
ALTER TABLE sample62 CHANGE newcol new_newcol varchar(40);

# 열 삭제
ALTER TABLE 테이블명 DROP new_newcol</code></pre><h2 id="27강-제약">27강 제약</h2>
<h3 id="열-제약">열 제약</h3>
<p>열에 대해 정의하는 제약</p>
<p>UNIQUE 제약, NOT NULL 제약 등</p>
<h3 id="테이블-제약">테이블 제약</h3>
<p>한 개의 제약으로 복수의 열에 제약을 설명하는 경우</p>
<p>기본키 제약</p>
<p>제약에는 이름을 붙일 수 있다.</p>
<h2 id="28강-인덱스-구조">28강 인덱스 구조</h2>
<p>인덱스는 데이터베이스 객체 중 하나로 create(DDL)로 생성이 가능하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MySQL Notes for Professionals 공부]]></title>
            <link>https://velog.io/@nayoon-kim/MySQL-Notes-for-Professionals-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@nayoon-kim/MySQL-Notes-for-Professionals-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Thu, 20 Jan 2022 09:01:34 GMT</pubDate>
            <description><![CDATA[<h2 id="chapter-11-delete">Chapter 11: DELETE</h2>
<h3 id="section-112-delete-vs-truncate">Section 11.2: DELETE vs TRUNCATE</h3>
<blockquote>
<p>DELETE FROM TABLENAME vs TRUNCATE TABLENAME</p>
</blockquote>
<p>속도 측면에서 truncate가 훨씬 빠르다.</p>
<p>truncate를 하게 되면 table을 drop 했다가 다시 생성하는 것이다.</p>
<p>큰 dataset의 경우 delete from tableName보다 truncate가 훨씬 빠르다.</p>
<p>또한, truncate의 경우 기존 저장되어 있던 page를 삭제한 후 재할당하며, delete는 데이터만 삭제하기 때문에 데이터를 저장하기 위해 늘린 저장 공간은 그대로 유지한다.
(innodb_file_per_table=OFF 옵션을 사용해도 사용하던 공간을 즉시 회수할 수는 없다..!)</p>
<h2 id="chapter-14-group-by">Chapter 14: Group By</h2>
<h3 id="section-142-group-by-using-group-concat">Section 14.2: Group By using Group Concat</h3>
<p>column 당 둘 이상의 결과가 있는 표현식의 연결된 값을 가져오는 데 사용한다.</p>
<pre><code># Grade 테이블
Name Score
Adam A+
Adam A-
Adam B
Adam C+
Bill D-
John A-

select name, GROUP_CONCAT(Score ORDER BY Score DESC SEPARATOR  &#39; &#39;) AS GRADES
FROM Grade
GROUP BY Name

# result
Name Grades
Adam C+ B A- A+
Bill D-
John A-</code></pre><h2 id="chapter-45-transaction">Chapter 45: Transaction</h2>
<p>트랜잭션은 연속적인 select, insert, update, delete와 같은 SQL 문장들인데, 하나의 작업 단위이다.</p>
<p>다르게 말하자면 트랜잭션은 그룹 안에 있는 각각의 연산이 성공적으로 이루어지지 않으면 절대 성공할 수가 없다.
트랜잭션에 있는 어떤 연산이 실패하든, 전체 트랜잭션이 실패하는 것이다.</p>
<p>ACID는 트랜잭션의 특성인데, </p>
<p>Atomicity 원자성
Consistency 일관성
isolation 격리성
Durability 지속성</p>
<p>4가지로 이루어져 있다.</p>
<p>트랜잭션은 &quot;START TRANSACTION 혹은 BEGIN WORK&quot;로 시작해서 &quot;COMMIT이나 ROLLBACK&quot; 문장으로 끝나게 된다.</p>
<p>시작과 끝 문장 사이에 위치하는 SQL 문장들은 대부분 트랜잭션으로 이루어져 있다.</p>
<pre><code>START TRANSACTION;
SET @transAmt = &#39;500&#39;;
SELECT @availableAmt:=ledgerAmt FROM accTable WHERE customerId=1 FOR UPDATE;
UPDATE accTable SET ledgerAmt=ledgerAmt-@transAmt WHERE customerId=1;
UPDATE accTable SET ledgerAmt=ledgerAmt-@transAmt WHERE customerId=2;
COMMIT;</code></pre><p>START TRANSACTION</p>
<p>위의 문장 실행 시, autocommit이 꺼져서 COMMIT이나 ROLLBACK이 있을 때까지 유지되고 </p>
<p>autocommit 모드가 이전 상태로 되돌아간다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 첫걸음 - 2장]]></title>
            <link>https://velog.io/@nayoon-kim/SQL-%EC%B2%AB%EA%B1%B8%EC%9D%8C-2%EC%9E%A5</link>
            <guid>https://velog.io/@nayoon-kim/SQL-%EC%B2%AB%EA%B1%B8%EC%9D%8C-2%EC%9E%A5</guid>
            <pubDate>Tue, 18 Jan 2022 01:58:17 GMT</pubDate>
            <description><![CDATA[<h2 id="데이터베이스-객체">데이터베이스 객체</h2>
<p>데이터베이스에는 테이블 외에 다양한 데이터를 저장하거나 관리하는 &#39;어떤 것&#39;을 만들 수 있고 이를 데이터베이스 객체라고 한다.</p>
<p>예. 뷰(View)</p>
<ul>
<li>이름을 붙여서 관리한다.</li>
</ul>
<p>예약어와 데이터베이스 객체명은 대소문자를 구별하지 않는다!</p>
<p>테이블은 행과 열로 구성된 표 형식의 데이터이다</p>
<p>행은 레코드
열은 컬럼/필드</p>
<p><em><strong>NULL은 값이 없음을 의미한다.</strong></em></p>
<h2 id="테이블-구조-참조하기">테이블 구조 참조하기</h2>
<h3 id="desc">desc</h3>
<blockquote>
<p>desc 테이블명;</p>
</blockquote>
<h3 id=""></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 첫 걸음 정리 - 1장]]></title>
            <link>https://velog.io/@nayoon-kim/SQL-%EC%B2%AB-%EA%B1%B8%EC%9D%8C-%EC%A0%95%EB%A6%AC-1%EC%9E%A5</link>
            <guid>https://velog.io/@nayoon-kim/SQL-%EC%B2%AB-%EA%B1%B8%EC%9D%8C-%EC%A0%95%EB%A6%AC-1%EC%9E%A5</guid>
            <pubDate>Tue, 18 Jan 2022 01:45:23 GMT</pubDate>
            <description><![CDATA[<h1 id="데이터베이스">데이터베이스</h1>
<h2 id="데이터">데이터</h2>
<p>컴퓨터에 저장된 의미있는 숫자</p>
<h2 id="데이터베이스-1">데이터베이스</h2>
<p>비 휘발성 저장장치에 저장되는 영속된 데이터의 집합.</p>
<h2 id="dbms">DBMS</h2>
<p>데이터베이스를 관리하는 소프트웨어</p>
<h2 id="sql">SQL</h2>
<p>RDBMS에서 데이터를 조작하는 명령</p>
<h1 id="데이터베이스-서버">데이터베이스 서버</h1>
<p>많은 RDBMS가 클라이언트/서버 모델을 채택해서 가동 중</p>
<h2 id="클라이언트서버-모델">클라이언트/서버 모델</h2>
<ul>
<li><p>사용자 조작에 따라 요청을 전달하는 &#39;클라이언트&#39;</p>
</li>
<li><p>해당 요청을 받아 처리하는 &#39;서버&#39;</p>
</li>
</ul>
<p>위의 두 가지로 소프트웨어가 구성되어 있고, 복수의 컴퓨터 상에서 하나의 모델을 구현하는 시스템</p>
<h3 id="웹-시스템의-클라이언트서버-모델">웹 시스템의 클라이언트/서버 모델</h3>
<p>request(요청)와 response(응답)을 되풀이하며 페이지 내용을 전달받고 페이지 내용을 표시.</p>
<h3 id="rdbms의-클라이언트서버-모델">RDBMS의 클라이언트/서버 모델</h3>
<ul>
<li><p>사용자 인증
RDBMS는 사용자별로 데이터베이스 접근을 제한하고 있기 때문에, ID와 비밀번호를 이용해서 사용자 인증을 진행한다.</p>
</li>
<li><p>SQL 명령 실행
RDBMS에 접속하면 SQL 명령을 서버에 보낼 수 있다.</p>
</li>
</ul>
<p>서버가 가동 중이고 네트워크에도 연결되어 있다면, 클라이언트가 SQL 명령을 보낼 때 서버가 응답할 것.</p>
<p>한번 데이터베이스에 접속하면, 이를 유지해서 재접속없이 SQL 명령을 여러 번 보낼 수 있다.</p>
<p>사용이 끝나면 데이터베이스와의 접속은 끊긴다.</p>
<hr>

<h2 id="웹-애플리케이션-구조">웹 애플리케이션 구조</h2>
<p>웹 애플리케이션 = 웹 서버 + 데이터베이스 서버</p>
<p>동적으로 HTML을 생성하기 위해서는 제어용 프로그램이 필요한데 서버에는 CGI라 불리는 동적 콘텐츠를 위한 확장 방식이 있다.</p>
<p>데이터베이스에 접속하는 것은 실제로는 CGI 프로그램인데, 데이터베이스에 접속 후 필요한 SQL 명령을 전달한 후, 실행 결과를 클라이언트에게 전달하게 된다.</p>
<p>이때, 웹 서버의 CGI 프로그램이 데이터베이스의 클라이언트가 된다.</p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/cf1cad11-5513-4f7d-a78a-878b56e6ee94/image.png" alt="">
<a href="https://velog.io/@seanlion/cgi">출처</a></p>
<h3 id="cgi">CGI</h3>
<p>Common Gateway Interface의 약자이다.</p>
<p>서버와 애플리케이션 간에 데이터를 주고 받는 방식 또는 컨벤션을 이야기한다.</p>
<p>CGI는 클라이언트로부터 사용자 데이터를 받고 필요한 데이터를 다시 반환한다.</p>
<hr>


<h3 id="참고">참고</h3>
<p><a href="http://www.yes24.com/Product/Goods/22744867">SQL 첫걸음</a>
<a href="https://live-everyday.tistory.com/197">Common Gateway Interface(CGI)란 무엇인가</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터베이스]]></title>
            <link>https://velog.io/@nayoon-kim/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</link>
            <guid>https://velog.io/@nayoon-kim/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</guid>
            <pubDate>Mon, 17 Jan 2022 09:44:45 GMT</pubDate>
            <description><![CDATA[<h2 id="rdbms">RDBMS</h2>
<p>Relational DBMS</p>
<p>ex. Oracle, MySQL, SQL Server, PostgreSQL</p>
<h2 id="document-store">Document store</h2>
<p>NoSQL 중 하나</p>
<p>JSON 유사 형식의 문서로 데이터를 저장 및 쿼리하도록 설계된 비관계형 데이터베이스 유형이다.</p>
<p>문서 및 문서 데이터베이스의 유연하고 반구조화된 계층적 특성을 통해 개발자는 계속해서 애플리케이션의 요구를 발전시킬 수 있다.</p>
<p>문서 모델은 각 문서가 고유하고 시간에 따라 진화하는 콘텐츠 관리 시스템, 사용자 프로파일 및 카탈로그와 같은 사용 사례에 유용하다.</p>
<p>문서 데이터베이스에서는 유연한 인덱싱, 강력한 임시 쿼리, 문서 모음에 대한 분석을 지원한다.</p>
<p>ex. MongoDB</p>
<h3 id="콘텐츠-관리--카탈로그">콘텐츠 관리 &amp; 카탈로그</h3>
<p>문서 데이터베이스는 블로그 및 비디오 플랫폼과 같은 콘텐츠 관리 애플리케이션으로 아주 훌륭한데, 애플리케이션이 추적하는 각 엔티티를 단일 문서로 저장할 수 있다.</p>
<p>전자 상거래 애플리케이션에서 다른 제품의 개별 속성 수는 서로 다른데, RDBMS에서는 수많은 속성을 관리하는 것이 비효율적이며 읽기 성능에도 영향을 준다.
하지만, 문서 데이터베이스를 사용하면 각 제품의 속성을 단일 문서로 기술해서 관리가 쉽고 읽기 속도도 빨라진다. 한 제품의 속성을 변경해도 다른 제품에는 영향을 주지 않는다.</p>
<p><strong>스키마를 업데이트하거나 데이터베이스 중단이 필요하지 않다.</strong></p>
<h2 id="key-value-store">Key-value store</h2>
<h2 id="search-engine">Search engine</h2>
<h2 id="wide-column-store">Wide column store</h2>
<h2 id="데이터-타입">데이터 타입</h2>
<h3 id="string">string</h3>
<table>
<thead>
<tr>
<th>데이터 타입</th>
<th>특징</th>
<th>예제</th>
</tr>
</thead>
<tbody><tr>
<td>CHAR(n)</td>
<td>고정 길이 string <br> 되도록이면 쓰지말 것 <br> 쓸 거면 <strong>CHARACTER SET ascii</strong> 를 붙일 것 <br> 길이가 고정길이보다 적은 문자열을 입력하면 공백으로 채워진다</td>
<td>country_code char(2) CHARACTER set ascii</td>
</tr>
<tr>
<td>VARCHAR(n)</td>
<td>가변 길이 string(설정된 max len) <br> max len를 넘어서면  자동으로 잘린다.</td>
<td>phone varchar(20) not null</td>
</tr>
</tbody></table>
<p>TINYTEXT는 쓰지말 것!</p>
<hr>

<h3 id="date">date</h3>
<table>
<thead>
<tr>
<th>데이터 타입</th>
<th>특징</th>
<th>예제</th>
</tr>
</thead>
<tbody><tr>
<td>DATE</td>
<td>날짜 O, 시간 X</td>
<td>date -&gt; &#39;YYYY-MM-DD&#39;</td>
</tr>
<tr>
<td>DATETIME</td>
<td>날짜 O, 시간 O</td>
<td>&#39;YYYY-MM-DD HH:MM:SS&#39;</td>
</tr>
<tr>
<td>TIMESTAMP</td>
<td>&#39;1970-01-01 00:00:01&#39;UTC~&#39;2038-01-19 03:14:07&#39;UTC 사이의 날짜 및 시간으로 구성된 정수 유형</td>
<td></td>
</tr>
<tr>
<td>YEAR</td>
<td>year를 나타내고 1901부터 2155 범위이다.</td>
<td></td>
</tr>
<tr>
<td>TIME</td>
<td>&#39;HH:MM:SS&#39; 형태로 시간을 나타내고 &#39;-838:59:59&#39;~&#39;838:59:59&#39; 범위이다.</td>
<td></td>
</tr>
</tbody></table>
<h3 id="참고">참고</h3>
<p><a href="https://aws.amazon.com/ko/nosql/document/">문서 데이터베이스란</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[대비]]></title>
            <link>https://velog.io/@nayoon-kim/%EB%8C%80%EB%B9%84</link>
            <guid>https://velog.io/@nayoon-kim/%EB%8C%80%EB%B9%84</guid>
            <pubDate>Mon, 17 Jan 2022 01:58:53 GMT</pubDate>
            <description><![CDATA[<h2 id="game-log">Game Log</h2>
<p>심플하게 보관하는 게 가장 효과적이다.</p>
<p>사용자의 행동을 모두 JSON으로 파일에 기록해서 아카이빙
심플하기 때문에 소실될 가능성도 최소
나중에 여력이 될 때 Hadoop 등을 구성해서 분석해도 충분하다.</p>
<p>쿠키런의 경우 크리스탈 사용내역만 MySQL에 보관하고 있다.</p>
<h2 id="로그-분석">로그 분석</h2>
<p>실시간 로그 분석: ElasticSearch, Logstash, Kibana</p>
<p>서비스 초기에 적용할 필요는 없으나 정말 유용한 시스템
어뷰저 차단, C/S 응대, 간단한 데이터 분석 등에 활용</p>
<p>일괄 로그 분석: Hadoop, Pig, Hive
출시 이후부터의 시계열 분석이나 대용량 분석을 위해서 필수적
일단 시스템과 ETL 구축이 완료되면 정말 다양한 분석 가능</p>
<p>로그 분석은 흥행 이후에 구축하는 게 가장 효율적</p>
<h2 id="안정적인-서버의-최소-요건">안정적인 서버의 최소 요건</h2>
<p>충분한 테스트가 구현된, 형상관리가 되고 있는 품질 높은 빌드를 확보
<strong>수평적 확장이 손쉬운 서버 아키텍처</strong>
서버 형상관리가 구현되어 서버 자동 설정, 자동 확장 가능
서버의 장애/성능 상황 모니터링 구축
일일 게임로그를 JSON 형태로 최대한 단순한 방법으로 보관</p>
<h2 id="레이턴시-병목-해결">레이턴시 병목 해결</h2>
<p>nginx 활용, keep-alive를 통해 최대 3분에서 필요 시 10분까지도 통신을 지속할 수 있다.</p>
<p>http1.1부터 keep-alive 옵션이 포함되어있다.</p>
<blockquote>
<p>Connection: keep-alive
Keep-alive: timeout=300</p>
</blockquote>
<p>보안 문제를 위해 https는 꼭 사용해야 한다.</p>
<h2 id="용어">용어</h2>
<h3 id="throughput---처리율">throughput - 처리율</h3>
<p>통신에서 네트워크 상의 어떤 노드나 터미널로부터 또 다른 터미널로 전달되는 단위 시간당 디지털 데이터 전송으로 처리하는 양을 말한다.</p>
<p><strong>단위 시간 당 처리량, 한꺼번에 얼마나 많은 일을 해낼 수 있는가.</strong></p>
<h3 id="latency---지연-시간">latency - 지연 시간</h3>
<p>데이터를 요청해서 나올 때까지 걸리는 대기 시간</p>
<p>*<em>응답하는 데 걸리는 시간
*</em></p>
<blockquote>
<p><strong>컴퓨터 성능에 있어서 throughput과 latency 모두 중요하다.</strong></p>
</blockquote>
<h3 id="참고">참고</h3>
<p><a href="https://www.slideshare.net/serialxnet/1-35304689">쿠키런 1년, 서버개발 분투기</a>
<a href="https://swev.net/35">쓰루풋과 레이턴시, 그리고 새로운 인텔 CPU</a>
<a href="https://www.slideshare.net/XionglongJin1/https-kgc-2016-korea-games-conference">KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 공부]]></title>
            <link>https://velog.io/@nayoon-kim/%EA%B0%9C%EB%B0%9C-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@nayoon-kim/%EA%B0%9C%EB%B0%9C-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Mon, 17 Jan 2022 01:16:01 GMT</pubDate>
            <description><![CDATA[<h2 id="dao">DAO</h2>
<p>Data Access Object는 데이터베이스의 Data에 접근하기 위한 객체이다.</p>
<blockquote>
<p>DataBase에 접근하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용한다.</p>
</blockquote>
<h2 id="데이터베이스">데이터베이스</h2>
<p>데이터의 집합</p>
<h2 id="데이터">데이터</h2>
<p>컴퓨터 안에 저장되어 있는 숫자</p>
<h2 id="dto">DTO</h2>
<p>Data Transfer Object는 계층 간 데이터 교환을 하기 위해 사용하는 객체이다.</p>
<p>DTO는 로직을 가지지 않는 순수한 데이터 객체(getter &amp; setter만 가지는 클래스)이다.</p>
<blockquote>
<ol>
<li>유저가 가지고 있는 데이터의 형태를 DTO에 넣는다. </li>
<li>해당 DTO를 받은 서버가 DAO를 이용해서 데이터를 저장한다.</li>
</ol>
</blockquote>
<h2 id="vo">VO</h2>
<p>Value Object는 값을 위해 사용되는데, read-only 특징을 가지고 있어 변경이 불가하고 읽기만 가능합니다.</p>
<p>DTO와 유사하지만 VO는 setter 기능이 없습니다.</p>
<h2 id="결론">결론</h2>
<table>
<thead>
<tr>
<th>DAO</th>
<th>DTO</th>
<th>VO</th>
</tr>
</thead>
<tbody><tr>
<td>Data Access Object</td>
<td>Data Transfer Object</td>
<td>Value Object</td>
</tr>
<tr>
<td>데이터베이스의 데이터에 접근하기 위해 사용</td>
<td>계층 간 데이터 교환을 위해 사용</td>
<td>값을 위해 사용</td>
</tr>
<tr>
<td><strong>데이터베이스 접근 로직과 비즈니스 로직을 분리하기 위해 사용</strong></td>
<td><strong>로직을 가지지 않는</strong> 순수한 데이터 객체</td>
<td><strong>read-only</strong> 특징을 가지고 있는 객체</td>
</tr>
</tbody></table>
<h3 id="vo와-dto-차이">VO와 DTO 차이</h3>
<p>VO는 read-only로 getter만 가능하며, setter는 불가능하다.</p>
<p>DTO는 로직을 가지지 않는 순수한 데이터 객체(getter &amp; setter만 가지는 클래스)로 읽고 변경하는 것이 모두 가능하다.</p>
<h3 id="참고">참고</h3>
<p><a href="http://melonicedlatte.com/2021/07/24/231500.html">DAO, DTO, VO 란? 간단한 개념 정리</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[php 공부]]></title>
            <link>https://velog.io/@nayoon-kim/php-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@nayoon-kim/php-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Fri, 14 Jan 2022 03:03:58 GMT</pubDate>
            <description><![CDATA[<p>w3schools php 번역..</p>
<h2 id="what-is-php">What is PHP?</h2>
<ol>
<li>PHP is an acronym for &quot;PHP: Hypertext Preprocessor&quot;
PHP: Hypertext Preprocessor의 약자이다.</li>
<li>PHP is a widely-used, open source scripting language
널리 사용되는 오픈 소스 스크립트 언어이다.</li>
<li>PHP scripts are executed on the server
PHP 스크립트는 서버에서 실행된다.</li>
<li>PHP is free to download and use</li>
</ol>
<h2 id="what-is-a-php-file">What is a PHP File?</h2>
<ol>
<li>PHP files can contain text, HTML, CSS, JavaScript, and PHP code
PHP 파일은 텍스트, HTML, CSS, JavaScript, PHP 코드를 포함할 수 있다.</li>
<li>PHP code is executed on the server, and the result is returned to the browser as plain HTML
PHP 코드는 서버에서 실행되고, 일반 HTML로 브라우저에서 결과를 확인할 수 있다.</li>
<li>PHP files have extension &quot;.php&quot;</li>
</ol>
<h2 id="what-can-php-do">What Can PHP Do?</h2>
<ol>
<li>PHP can generate dynamic page content
동적페이지 생성이 가능하다.</li>
<li>PHP can create, open, read, write, delete, and close files on the server
서버에서 파일을 생성, 열기, 읽기, 쓰기, 삭제, 닫기를 할 수 있다.</li>
<li>PHP can collect form data
form data를 수집할 수 있다.</li>
<li>PHP can send and receive cookies
cookies(쿠키)를 주고 받을 수 있다.</li>
<li>PHP can add, delete, modify data in your database
데이터베이스에 data를 추가, 삭제, 수정할 수 있다.</li>
<li>PHP can be used to control user-access
사용자 접근을 컨트롤할 수 있다.</li>
<li>PHP can encrypt data
data를 암호화할 수 있다.</li>
</ol>
<h2 id="whats-new-in-php-7">What&#39;s new in PHP 7</h2>
<ol>
<li>PHP 7 is much faster than the previous popular stable release (PHP 5.6)</li>
<li>PHP 7 has improved Error Handling</li>
<li>PHP 7 supports stricter Type Declarations for function arguments
유형 선언이 더욱 엄격해졌다.</li>
<li>PHP 7 supports new operators (like the spaceship operator: &lt;=&gt;)</li>
</ol>
<h2 id="php-data-types">PHP Data Types</h2>
<ol>
<li>String</li>
<li>Integer</li>
<li>Float</li>
<li>Boolean</li>
<li>Array</li>
<li>Object</li>
<li>NULL</li>
<li>Resource</li>
</ol>
<p>var_dump()를 통해 data type과 value를 알 수 있다.</p>
<pre><code class="language-php">$x = 1;
var_dump($x);

# int 1</code></pre>
<h3 id="object">Object</h3>
<pre><code class="language-php">&lt;?php
class Car {
   public $color;
   public $model;
   public function __construct($color, $model) {
       $this-&gt;color = $color;
       $this-&gt;model = $model;
   }
   public function message() {
       return &quot;My car is a &quot;. $this-&gt;color . &quot; &quot;. $this-&gt;model.&quot;!&quot;;
   }
}

$myCar = new Car(&quot;black&quot;, &quot;Volvo&quot;);
echo $myCar-&gt;message();
echo &quot;&lt;br&gt;&quot;;
$myCar = new Car(&quot;red&quot;, &quot;Toyota&quot;);
echo $myCar-&gt;message();
?&gt;

# My car is a black Volvo!
# My car is a red Toyota!</code></pre>
<h2 id="php-strings">PHP Strings</h2>
<h3 id="strlen---string의-길이-반환">strlen() - string의 길이 반환</h3>
<pre><code class="language-php">&lt;?php
echo strlen(&quot;Hello World&quot;); # 11
echo &quot;&lt;br&gt;&quot;;
echo strlen(12); # 2
?&gt;</code></pre>
<h3 id="str_word_count---string의-단어-개수-세기">str_word_count() - string의 단어 개수 세기</h3>
<pre><code class="language-php">echo str_word_count(&quot;Hello World&quot;).&quot;&lt;br&gt;&quot;; # 11</code></pre>
<h3 id="strrev---string-뒤집기">strrev() - string 뒤집기</h3>
<pre><code class="language-php">echo strrev(&quot;Hello World&quot;).&quot;&lt;br&gt;&quot;; # dlroW olleH</code></pre>
<h3 id="strpos---string-내-text-검색">strpos() - string 내 text 검색</h3>
<pre><code class="language-php">echo str_replace(&quot;World&quot;, &quot;nayoon&quot;, &quot;Hello World&quot;); # Hello nayoon</code></pre>
<h3 id="str_replace---string-내-text-바꾸기">str_replace() - string 내 text 바꾸기</h3>
<pre><code class="language-php">echo strpos(&quot;Hello World&quot;, &quot;World&quot;); # 6</code></pre>
<h2 id="php-nan">PHP NaN</h2>
<p>NaN은.. Not a Number를 의미한다.</p>
<p>NaN은 불가능한 수학 연산에 주로 사용되는데, is_nan() 함수를 사용하면 NaN을 체크할 수 있다.</p>
<h2 id="php-math">PHP Math</h2>
<h3 id="min-and-max-function">min and max function</h3>
<pre><code class="language-php">&lt;?php
$arr = array(0, 150, 30, 20, -8, -200);

# 변수 넣어도 되고
echo min($arr).&quot;&lt;br&gt;&quot;; # -200
# 그냥 통째로 넣어도 된다.
echo max(0, 150, 30, 20, -8, -200); # 150

?&gt;</code></pre>
<h3 id="abs-function">abs() function</h3>
<pre><code class="language-php">&lt;?php
echo abs(-6.7); # 6.7
?&gt;</code></pre>
<h3 id="round-function">round() function</h3>
<p>round() 함수는 부동 소수점 숫자를 가장 가까운 정수로 반올림한다.</p>
<pre><code class="language-php">&lt;?php
echo round(0.60).&quot;&lt;br&gt;&quot;; # 1
echo round(1.60).&quot;&lt;br&gt;&quot;; # 2
echo round(-4.40).&quot;&lt;br&gt;&quot;; # -4
echo round(-4.60).&quot;&lt;br&gt;&quot;; # -5
?&gt;</code></pre>
<h3 id="rand-function">rand() function</h3>
<p>랜덤으로 숫자를 만든다.</p>
<pre><code class="language-php">&lt;?php
echo rand(); # 1381167960

# 10과 100 사이 랜덤한 수 (10이랑 100 포함)
echo rand(10, 100);
?&gt;</code></pre>
<h2 id="php-constants">PHP Constants</h2>
<p>Constants -&gt; 상수^^!
define을 사용하면 상수를 만들 수 있다^^!</p>
<p>letter나 underscore로 시작하고 $는 안붙인다.</p>
<p>automatically global이다.</p>
<pre><code class="language-php">define(name, value, case-insensitive)</code></pre>
<p>case-insensitive란 문자의 대소문자 구분이 없다는 뜻이다.</p>
<pre><code class="language-php">&lt;?php

// case-sensitive constant name
define(&quot;GREETING&quot;, &quot;Welcome to W3Schools.com!&quot;);
echo GREETING;

// case-insensitive constant name
define(&quot;GREETING&quot;, &quot;Welcome to W3Schools.com!&quot;, true);
echo greeting;

?&gt; </code></pre>
<p>그냥 해봤는데 이것도 된다.</p>
<pre><code class="language-php">&lt;?php

function myTest() {
    define(&quot;GREETING&quot;, &quot;Welcome to W3Schools.com!&quot;);
}

myTest();
echo GREETING;
?&gt; </code></pre>
<h2 id="php-operators">PHP Operators</h2>
<h3 id="">===</h3>
<pre><code class="language-php">$x === $y</code></pre>
<p>Identical, Returns true if $x is equal to $y, and they are of the same type.</p>
<h3 id="and-or-xor">and(&amp;&amp;), or(||), xor</h3>
<p>or(||) - True if either $x or $y is true</p>
<p>xor - True if either $x or $y is true, but not both</p>
<pre><code class="language-php">
&lt;?php
$x = 100;  
$y = 50;

if ($x == 100 xor $y == 50) {
    echo &quot;Hello world!&quot;;
}

# returns Hello world!
?&gt;  </code></pre>
<p>if $x is true and $y is true, then &quot;xor&quot; returns false</p>
<pre><code class="language-php">&lt;?php
$x = 100;  
$y = 50;

if ($x == 100 xor $y == 50) {
    echo &quot;Hello world!&quot;;
}
?&gt;  

# returns nothing</code></pre>
<h3 id="php-string-operators">PHP String Operators</h3>
<p>. - Concatenation
.= - Concatenation assignment ( Append )</p>
<pre><code class="language-php">
&lt;?php
$txt1 = &quot;Hello&quot;;
$txt2 = &quot; world!&quot;;

echo $txt1 . $txt2; # Hello world!

$txt1 .= $txt2;
echo $txt1; # Hello world!
?&gt;  
</code></pre>
<h2 id="php-foreach">PHP foreach</h2>
<h3 id="foreach">foreach</h3>
<pre><code class="language-php">$colors = array(&quot;red&quot;, &quot;green&quot;, &quot;blue&quot;, &quot;yellow&quot;);

foreach($colors as $value) {
    echo &quot;$value &lt;br&gt;&quot;;
}</code></pre>
<p>key and value</p>
<pre><code class="language-php">$age = array(&quot;Peter&quot; =&gt; &quot;35&quot;, &quot;Ben&quot;=&gt;37, &quot;Joe&quot;=&gt;&quot;43&quot;);

foreach($age as $x =&gt; $val) {
    echo &quot;$x = $val&lt;br&gt;&quot;;
}</code></pre>
<h2 id="php-type">PHP Type</h2>
<p>PHP는 값에 따라 데이터 유형을 변수에 자동으로 연결하는데, 데이터 유형이 엄격하게 설정되지 않기 때문에 오류없이 정수에 문자열을 추가하는 등의 작업을 할 수 있다.</p>
<p>PHP 7에서는 유형 선언이 추가되었다. </p>
<p>따라서 함수를 선언할 때 예상되는 데이터 유형을 지정할 수 있는 옵션이 제공되고 데이터 유형을 선언했을 때 이를 지키지 않으면 치명적인 오류가 발생한다!!!!!!!!!!!</p>
<h2 id="passing-arguments-by-reference">Passing Arguments by Reference</h2>
<p>인자는 보통 값으로 전달되는데, &amp;를 이용하면 참조값으로 전달할 수 있다.</p>
<pre><code class="language-php">&lt;?php

function add_five(&amp;$value) {
    $value += 6;
}

$num = 2;
add_five($num);
echo $num; # 8
?&gt;</code></pre>
<h2 id="php-fpm">PHP-FPM</h2>
<p>PHP FastCGI Process Manager의 약자로 FastCGI란 CGI보다 더 빠른 처리를 이야기한다.</p>
<h2 id="cgi">CGI</h2>
<p>Common Gateway Interface의 약자로 서버와 애플리케이션 간에 데이터를 주고 받는 방식 또는 컨벤션을 이야기한다.</p>
<p>참고
<a href="https://www.w3schools.com/php/php_intro.asp">PHP Introduction</a>
<a href="https://www.w3schools.com/php/php_datatypes.asp">PHP Data Types</a>
<a href="https://www.w3schools.com/php/php_string.asp">PHP Strings</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux OS 공부]]></title>
            <link>https://velog.io/@nayoon-kim/Linux-OS-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@nayoon-kim/Linux-OS-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Mon, 10 Jan 2022 08:13:14 GMT</pubDate>
            <description><![CDATA[<h1 id="linux-os">Linux OS</h1>
<p>리눅스는 컴퓨터 운영체제의 한 종류이자, 커널 자체를 의미하기도 한다.</p>
<blockquote>
<p>리눅스의 가장 큰 특징은 두 가지인데, </p>
</blockquote>
<p><strong>첫째</strong>는 소스 코드가 공개되어있는 &#39;자유 소프트웨어&#39;와 &#39;오픈 소스 개발&#39;의 가장 유명한 표본이라는 점, </p>
<blockquote>
</blockquote>
<p><strong>둘째</strong>는 다중 사용자, 다중 작업(멀티 태스킹), 다중 스레드를 지원하는 네트워크 운영체제(NOS)로, 여러 사람이 하나의 리눅스 시스템에 접속해서 다수의 프로그램을 동시에 실행할 수 있다는 점이다.</p>
<p>오픈소스 운영체제로 오픈소스이기 때문에 누구나 소스에 접근할 수 있다.</p>
<p>리눅스와 유닉스의 경우 서버 OS에 주로 쓰이는데, 유닉스는 유료이고 리눅스는 무료이다.</p>
<p>과거 유닉스가 서버 OS 점유율이 훨씬 높았는데, 현재는 리눅스가 더 높다.
이러한 변화가 생긴 이유는 유닉스 서버는 독점적이고 폐쇄적이라 안정성은 높지만, 서버 자체가 비싸고 리눅스 서버 대비 전력 소모량도 많다.
또한, 유닉스의 독점적인 성격으로 인해 사용자가 적절한 버그 수정을 지원받는데까지 오랜 시간이 걸린다.</p>
<p>리눅스의 경우 버그가 발생하더라도 기업 입맛에 맞게 재구성해서 사용할 수 있다. (-&gt; 오픈소스니까!)</p>
<p>금융권이나 알만한 대기업은 아직도 유닉스를 쓰는데, 아마 그 이유는 리스크를 떠안아가며 리눅스로 바꿀 이유가 없기 때문이다. (이미 안정적으로 잘 작동하고 있고, 전산망도 매우 복잡하게 구성되어 있기 때문에 옮겨가는데 위험요소가 많기 때문이다)</p>
<h2 id="자유-소프트웨어">자유 소프트웨어</h2>
<p>자유 소프트웨어의 핵심은 &#39;자유&#39;인데, 이 자유는 무료를 뜻하는 것이 아니다.</p>
<p>자유 소프트웨어는 사용자가 소프트웨어를 실행시키거나 이를 복제 및 배포할 수 있는 자유와 함께 소스 코드에 대한 접근을 통해서 이를 학습하고 수정, 개선시킬 수 있는 원천적인 자유까지를 모두 포괄하는 것이다.</p>
<p>4가지 종류의 자유를 내포하고 있는데, 다음과 같다.</p>
<blockquote>
</blockquote>
<p>자유 0. 프로그램을 어떠한 목적을 위해서도 실행할 수 있는 자유</p>
<blockquote>
</blockquote>
<p>자유 1. 프로그램의 작동 원리를 연구하고 이를 자신의 필요에 맞게 변경시킬 수 있는 자유. 이러한 자유를 위해서는 소스 코드에 대한 접근이 선행되어야 한다.</p>
<blockquote>
</blockquote>
<p>자유 2. 이웃을 돕기 위해서 프로그램을 복제하고 배포할 수 있는 자유.</p>
<blockquote>
</blockquote>
<p>자유 3. 프로그램을 향상시키고 이를 공동체 전체의 이익을 위해서 다시 환원시킬 수 있는 자유. 이러한 자유를 위해서는 소스 코드에 대한 접근이 선행되어야 한다.</p>
<p>이 정의에 대해 알려진 최초의 발행은 지금은 존재하지 않는 GNU의 FSF(자유 소프트웨어 재단)에 있었다고 한다. </p>
<h3 id="gnu-프로젝트">GNU 프로젝트</h3>
<p><img src="https://images.velog.io/images/nayoon-kim/post/fc5f3f80-3438-4cc2-9299-b8551616f1bb/image.png" alt=""></p>
<p>GNU 프로젝트는 리처드 스톨먼(자유 소프트웨어 운동의 중심, FSF와 GUN 프로젝트 설립자)의 주도하에 시작된 공개 소프트웨어 프로젝트이다.</p>
<p>GNU 프로젝트는 누구나 자유롭게 &quot;실행, 복사, 수정, 배포&quot;할 수 있고, 누구도 그런 권리를 제한하면 안된다는 사용 허가권(License) 아래 소프트웨어를 배포한다.</p>
<p>카피레프트로 불리는 이런 생각은 GPL(GNU 일반 공중 사용 허가서)에 나타나 있다.</p>
<h3 id="카피레프트-copyleft">카피레프트, copyleft</h3>
<p><img src="https://images.velog.io/images/nayoon-kim/post/64aaba82-dc62-409b-a48e-5a3ae9e61fdd/image.png" alt=""></p>
<p>카피레프트 또는 저좌권은 저작권(카피라이트)에 반대되는 개념으로, 저작권에 기반을 둔 사용 제한이 아니라 <strong>저작권을 기반으로 한 정보의 공유를 위한 조치</strong>이다. </p>
<p>즉, 저작권 소유자가 자신의 창작물을 무료로 사용하도록 허용하는 것이다. </p>
<p>카피레프트를 주장하는 사람들은 보통, 지식과 정보는 소수에게 독점되어서는 안되며, 모든 사람에게 열려 있어야 한다고 주장한다.</p>
<hr>

<h2 id="linux-os-종류">Linux OS 종류</h2>
<p>리눅스 OS에서 유명한 건 <strong>우분투, 센토스, 데비안</strong>이다.</p>
<h2 id="linux-배포판">Linux 배포판</h2>
<p>리눅스 배포판은 리눅스 커널을 중심으로 여러 시스템 소프트웨어 및 응용 소프트웨어를 같이 묶어서 구성한 운영 체제이다. 여러 용도의 배포판이 존재하는데, 대표적인 것은 <strong>슬랙웨어, 데비안, 레드햇</strong>이 있다.</p>
<h3 id="슬랙웨어">슬랙웨어</h3>
<p>슬랙웨어는 가장 오래된 배포판이며 초보자가 쓰기에는 좀 어렵다. 설치할 때 의존성 문제를 일으킨다.</p>
<h3 id="데비안">데비안</h3>
<p><img src="https://images.velog.io/images/nayoon-kim/post/e16231bc-7da3-4405-b792-5d0bdfcea060/image.png" alt="">
<a href="https://ko.wikipedia.org/wiki/%EB%8D%B0%EB%B9%84%EC%95%88">출처</a></p>
<p>데비안도 초보자가 쓰기에는 어려운데 안정성이 높고 다양한 패키지 활용이 가능하다. 다만 소프트웨어가 구시대적이다..?</p>
<p>슬랙웨어 대비 관리가 매우 편하다..!</p>
<p>우분투는 데비안 계열에서 파생되었다..!
따라서 데비안과 우분투는 비슷한 점이 많은데, 차이점이 무엇이냐면 데비안은 애초에 안정성을 기반으로 나온 모델이고, 우분투는 정기적으로 버전이 업데이트 되는 모델이다.</p>
<p>안정성을 기반으로 둔 데비안은 안정성이 강하다는 장점이 있지만, 구시대적이다.(오랜 검증 시간을 가졌다.)</p>
<p>데비안 계열: Ubuntu, Linux Mint 등등</p>
<h3 id="레드햇">레드햇</h3>
<p><strong>기업용 서버 OS</strong>로 인기가 높다. </p>
<p>예전에는 무료 버전도 있었는데, 지금은 RHEL(RedHatEnterpriseLinux) 상용 버전만 존재한다.</p>
<p>RHEL에 사용될 기능 테스트를 위해 배포하는 페도라(Fedora)와 예전 레드햇의 무료 버전 계보를 잇는 CentOS가 레드햇 계열이다.</p>
<p><strong>RedHat은 현재 상용버전(회사 버전)만 존재하고 RedHat의 무료 버전 계보를 잇는 CentOS가 있다!</strong></p>
<p>-&gt; 서버 시장이 주 타겟인 배포판이다!!</p>
<h3 id="centos">CentOS</h3>
<p>CentOS는 RHEL의 소스 코드를 기반으로 만들어진 리눅스 배포판이다. 그러니까, CentOS는 RHEL와 매우 유사하면서도 무료로 안정적인 리눅스를 사용할 수 있다.</p>
<p>CentOS는 RHEL 새 버전 발표 후 한 달 내에 거의 동일한 소스코드로 배포되는 리눅스 배포판이다. 따라서, 로고만 다르지 사실상 RHEL의 복제이기 때문에 매우 안정적이며, 무료로 RHEL을 사용할 수 있었다.</p>
<p>(RHEL과 CentOS가 같다면 무료인 CentOS때문에 RHEL을 안쓰겠다고 생각할 수 있지만 레드햇으로부터 각종 기술지원을 받을 수 있다)</p>
<p>RHEL은 Enterprise 버전이기 때문에 무료로 사용이 불가했는데, RHEL을 무료로 사용할 수 있다는 이점을 가지고 있어 널리 사용되어 왔다.</p>
<p>근데, CentOS가 지원을 종료한다.</p>
<p>centos가 기존의 지원을 종료하고 stream 버전만 지원한다고 한다..!</p>
<h3 id="centos-stream">CentOS Stream</h3>
<p>기존에는 Red Hat Enterprise Linux(RHEL)에서 재구축 환경인 CentOS Linux 배포로 운영되고 있었는데</p>
<p><strong>앞으로는 RHEL의 업스트림(개발)용 역할을 하게 된다.</strong></p>
<p>Fedora Linux와 RHEL 사이의 중간 포지션으로 역할이 변경된다고 한다.</p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/8d026536-3f92-4e73-937e-177fbe91fa66/image.png" alt="">
<a href="http://www.opennaru.com/linux/centos-%EC%A2%85%EB%A3%8C/">출처</a></p>
<p>기존에는 Fedora 리눅스를 통해 RHEL 버전에 들어갈 새로운 기능과 오류를 검증해왔다.</p>
<p>페도라 리눅스는 RHEL보다 6개월 앞서 새 버전을 발표하며, 레드햇은 커뮤니티의 반응과 피드백을 받아 RHEL 업데이트에 적용 여부를 결정했다.</p>
<p>CentOS Stream은 페도라 리눅스와 RHEL 사이의 중간 포지션 역할을 하게 됨으로써 <strong>CentOS Stream에서 RHEL 새 버전에 들어갈 기능과 코드를 만들고, 이를 검증해 RHEL 최신 버전을 만들게 된다.</strong></p>
<p>CentOS Stream은 검증용이기 때문에 안정성이 떨어지게 된다.</p>
<h3 id="업스트림">업스트림</h3>
<p>위키를 참고하니까 <strong>소프트웨어 개발에서 업스트림이란 소스 코드로 배포되는 소프트웨어의 원래 작성자 또는 유지 보수 관리자에게 전송하는 방향을 말한다고 한다.</strong></p>
<p>주로 버그 또는 패치 자격으로 전송하는 것을 의미한다.
예를 들어, 업스트림으로 전송된 패치는 소프트웨어의 원본 작성자 또는 유지 보수 관리자에게 제공된다.</p>
<p>centos stream은 대애충 개발용을 말하는 것 같다.</p>
<p>이전에는 배포할 수 있었다면 지금은 배포는 안되고 개발만 할 수 있는..? 용도로만 쓸 수 있다는 것 같다..! (-&gt; 배포는 할 수 있는데,, 그동안 CentOS를 썼던 이유가 안정적인 서버용 리눅스를 제공했기 때문이고 개발용으로 나온 리눅스를 굳이 배포해서 모험을 할 필요는 없으니까..? 개발용으로 봐도 될 것 같다..!)</p>
<h3 id="록키-리눅스">록키 리눅스</h3>
<p>Rocky Linux는 RHEL의 소스 코드를 이용해서 만들어진 무료 리눅스 배포판이다. CentOS가 Stream 버전에 집중한다고 발표하면서 CentOS 창립자 중 한 명의 주도로 진행되어 나온 리눅스 배포판이다. 2021년 6월 RHEL 8.4 기반 STABLE 버전이 나온 상태이다.</p>
<hr>

<h2 id="참고">참고</h2>
<p><a href="https://jcil.co.kr/3">리눅스 종류와 역사 - Linux OS</a>
<a href="https://thenicesj.tistory.com/78">centos의 변화(centos 지원종료 / centos stream)</a>
<a href="https://foxydog.tistory.com/43">CentOS 8 에서 CentOS Stream 으로 변환하기</a>
<a href="https://library.gabia.com/contents/infrahosting/3448/">[리눅스 서버 구축하기] 1. 기초 지식 알아보기</a>
<a href="https://www.gnu.org/philosophy/free-sw.ko.html">자유 소프트웨어란 무엇인가?</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[GAME] 게임 서버 입문]]></title>
            <link>https://velog.io/@nayoon-kim/GAME-%EA%B2%8C%EC%9E%84-%EC%84%9C%EB%B2%84-%EC%9E%85%EB%AC%B8</link>
            <guid>https://velog.io/@nayoon-kim/GAME-%EA%B2%8C%EC%9E%84-%EC%84%9C%EB%B2%84-%EC%9E%85%EB%AC%B8</guid>
            <pubDate>Sun, 09 Jan 2022 13:49:57 GMT</pubDate>
            <description><![CDATA[<h1 id="게임-서버는">게임 서버는...?</h1>
<p>크게 두 가지로 나뉜다.</p>
<p><strong>1. Stateful(실시간 온라인 게임) 게임서버
2. Stateless(비실시간 비동기 온라인 게임) 게임 서버</strong></p>
<h2 id="stateful-게임-서버">Stateful 게임 서버</h2>
<p>모르는 게 너무 많아서 일단 단어부터 짚고 가자..!</p>
<h3 id="🌟-stateful-상태-저장">🌟 stateful: 상태 저장</h3>
<p><strong>server side에 client와 server의 동작, 상태 정보를 저장하는 형태이다.</strong></p>
<p>대표적인 stateful protocol은 <strong>TCP</strong>가 있다.</p>
<p>TCP의 server와 client는 3-way handshake라고 하는 과정을 통해 연결되고 데이터를 전송하게 된다.</p>
<p>이 때, server가 client의 세션 정보를 저장한다. </p>
<p>** -&gt; 그리고 이 client의 세션 정보에 기반해서 server의 응답이 달라지게 된다.**</p>
<hr>


<h2 id="stateless-게임-서버">Stateless 게임 서버</h2>
<h3 id="🌟-stateless-상태-비저장">🌟 stateless: 상태 비저장</h3>
<p>** server side에 client와 server의 동작, 상태정보를 저장하지 않는 형태이다.**</p>
<p>대표적인 stateless protocol은 <strong>UDP와 HTTP</strong>가 있다.</p>
<p>UDP는 TCP와 달리 client의 세션 상태와 관계 없이 요청에 대한 응답만을 수행하고 server가 client의 정보를 저장하지 않는다.</p>
<p>server의 응답이 client와의 세션 상태와는 독립적이다. </p>
<p>서버가 client의 정보를 저장, 관리하지 않기 때문에 Scaling이 자유롭다는 장점이 있다.</p>
<hr>

<h1 id="그렇다면-게임-종류는">그렇다면 게임 종류는?</h1>
<p>MMORPG, MOBA, FPS, 대전플레이 게임, 수집형, 롤플레잉, RPG 게임...</p>
<p>등등 이것저것 있다..!</p>
<p>게임의 장르, 플레이 방식에 따라 게임 서버의 개발 방식이 다른데..!</p>
<p><a href="http://post.procademy.co.kr/archives/624">게임 서버의 2가지 기술 [1 / 4], 실시간 게임서버 (Stateful) 와 비동기 게임서버 (Stateless)</a></p>
<p>여기에 들어가면 다양한 사진과 함께 설명이 덧붙여져 있다.</p>
<h2 id="mmorpg">MMORPG</h2>
<p>MMORPG란 대규모 멀티온라인 RPG이다.</p>
<p>같은 필드 내에 수십 수백 명의 플레이어가 동시에 접속하는 롤플레잉 게임(RPG)이다.</p>
<p>MMORPG의 두 가지 축은 PvP와 PvE로서 사람들끼리 싸우는 것과 강력한 적을 여러 플레이어가 힘을 합쳐 쓰러트리는 것으로 나뉜다.</p>
<p>(보통은 두 가지를 모두 사용하고 있다.)</p>
<h3 id="rpg">RPG</h3>
<p>Role-Playing Game의 약자로 한국에서는 자신의 캐릭터를 육성하는 게임, 해외에서는 게임에서 어떤 역할을 연기하는 모든 게임을 통틀어서 말하는 단어이다.</p>
<h2 id="moba">MOBA</h2>
<p>multiplayer online battle arena의 약자이며 라이엇 게임즈(리그 오브 레전드 회사)에서 부르는 명칭이다.</p>
<p>ARTS(Action real-time strategy, 액션 실시간 전략 게임) 혹은 AOS(Aeon of strife)이라고도 불린다.</p>
<p>스타크래프트, 히오스, 롤 등등이 해당 장르의 게임이다.</p>
<p>참고 사이트</p>
<p><a href="https://velog.io/@makeitcloud/%EB%9E%80-Stateless-Stateful-%EC%9D%B4%EB%9E%80">[란] Stateless / Stateful 란?</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[GAME] 시작]]></title>
            <link>https://velog.io/@nayoon-kim/GAME-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@nayoon-kim/GAME-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Sun, 09 Jan 2022 02:23:41 GMT</pubDate>
            <description><![CDATA[<p>웹서버 개발만 했는데..</p>
<p>게임 서버는 처음이다..!</p>
<p>나 같은 입문자들이 많을 것 같아서, 게임서버 입문용으로 글을 써보려고 한당<del>~</del>!!!!!!!!!!!!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[폰 노이만]]></title>
            <link>https://velog.io/@nayoon-kim/%ED%8F%B0-%EB%85%B8%EC%9D%B4%EB%A7%8C</link>
            <guid>https://velog.io/@nayoon-kim/%ED%8F%B0-%EB%85%B8%EC%9D%B4%EB%A7%8C</guid>
            <pubDate>Thu, 09 Dec 2021 14:13:27 GMT</pubDate>
            <description><![CDATA[<h1 id="폰-노이만-구조">폰 노이만 구조</h1>
<p>폰 노이만은 사실 폰 노이만 구조를 만든 사람으로 수학자이자 물리학자입니다.</p>
<p>이 사람은 현재와 같은 CPU, 메모리, 프로그램 구조를 갖는 범용 컴퓨터 구조를 확립했는데, 이 구조가 바로 폰 노이만 구조입니다.</p>
<p>폰 노이만 구조는 폰 노이만과 다른 사람들이 서술한 1945년 설명에 기반한 컴퓨터 아키텍처입니다.</p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/cef1ccb3-9dfc-4135-b485-dcef6505f7cf/image.png" alt=""></p>
<p>위의 모습이 바로 폰 노이만 구조인데, 당장 그림에 보이는 Central Processing Unit, Memory Unit 뿐만 아니라 입출력 장치, 저장장치로 이루어져 있습니다.</p>
<p>또한, 내장 메모리 순차처리 방식으로 데이터 메모리와 프로그램 메모리가 구분되어 있지 않고 하나의 버스를 가지고 있는 구조를 말한다.</p>
<h3 id="장점">장점</h3>
<ul>
<li>뛰어난 범용성<blockquote>
</blockquote>
폰 노이만 구조는 프로그램 내장 방식 컴퓨터이기 때문에 새로운 프로그램을 실행할 때마다 하드웨어를 변경할 필요없이 소프트웨어만 교체하면 됩니다.<blockquote>
</blockquote>
하드웨어 변경이란 컴퓨터에 다른 작업을 수행하기 위해 전선을 재배치하는 것을 말하는데, 이 과정에 상당한 시간과 인력이 필요해서 여러 작업들을 수행하는데에는 한계가 있었습니다.<blockquote>
</blockquote>
이러한 과정을 생략하고 오로지 소프트웨어만 교체하면 되기 때문에 편의성이 크게 증가하고 다양한 작업을 수행할 수 있어 범용성이 향상되었습니다.</li>
</ul>
<h2 id="병목현상">병목현상</h2>
<p>폰 노이만 구조는 인간의 사고과정을 참고해서 설계된 구조입니다.</p>
<p>인간은 어떤 연산을 마주쳤을 때, 머릿 속의 기억을 불러와서 계산하는 과정을 통해 연산을 해결하는데, 폰 노이만 구조 역시 이러한 과정을 통해 문제를 해결합니다.</p>
<p>하지만 이러한 과정은 치명적인 단점이 있는데, 기억을 불러오는 속도가 느리면 전체적으로 속도가 느려진다는 것입니다. </p>
<p><strong>즉, 계산 속도가 기억장치 속도에 영향을 받게 됩니다.</strong></p>
<blockquote>
<p><strong>기억장치의 속도가 전체 시스템의 성능 저하를 야기하는 이 현상을 폰 노이만 병목현상(Von-Neumann Bottleneck)이라고 합니다.</strong></p>
</blockquote>
<p>병목현상을 해결하기 위한 방법으로 여러 기술과 구조들이 등장했는데, 그 중 하나가 하버드 구조이다.</p>
<h1 id="하버드-구조">하버드 구조</h1>
<p>폰 노이만 병목현상의 근본적인 원인은 폰 노이만 구조에 있었는데, 프로그램 메모리와 데이터 메모리가 물리적 구분 없이 하나의 버스를 통해 CPU와 교류하고 있기 때문이었습니다.</p>
<p>이러한 구조로 인해 CPU는 명령어와 데이터에 동시에 접근할 수 없고 나열된 명령을 한 번에 하나씩 읽고 쓰게 됩니다.</p>
<p><img src="https://images.velog.io/images/nayoon-kim/post/2bcd3f16-2708-4f12-a06d-63af1d1d152a/image.png" alt=""></p>
<p>하버드 구조는 CPU가 명령어와 데이터를 동시에 사용할 수 있도록 명령어 버스와 데이터용 버스를 물리적으로 구분했습니다.</p>
<p>이를 통해 현재 명령의 처리를 끝냄과 동시에 다음 명령을 읽어 들일 수 있기 때문에 기존의 폰 노이만 구조보다 더 빠른 속도를 낼 수 있습니다.</p>
<p><a href="https://m.blog.naver.com/with_msip/221981730449">참고 - 컴퓨터의 구조는 어떻게 생겼을까?</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CS 면접 공부 목록]]></title>
            <link>https://velog.io/@nayoon-kim/CS-%EB%A9%B4%EC%A0%91-%EA%B3%B5%EB%B6%80-%EB%AA%A9%EB%A1%9D</link>
            <guid>https://velog.io/@nayoon-kim/CS-%EB%A9%B4%EC%A0%91-%EA%B3%B5%EB%B6%80-%EB%AA%A9%EB%A1%9D</guid>
            <pubDate>Thu, 09 Dec 2021 11:52:00 GMT</pubDate>
            <description><![CDATA[<h2 id="frontend">FrontEnd</h2>
<p>HTML
CSS
JavaScript
Ajax
jQuery</p>
<h2 id="backend">BackEnd</h2>
<h3 id="server">Server</h3>
<p>Apache Struts
Spring Framework
Django
Flask</p>
<h3 id="database">Database</h3>
<p>RDBMS
Data Modeling
E-R
key
constraint
ORM
Big Data</p>
<h2 id="data-structure">Data Structure</h2>
<p>linear data structure
linear list
linked list
stack
queue
deque
tree
binary tree
graph</p>
<h2 id="algorithm">Algorithm</h2>
<p>sort
search</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 가장 큰 수]]></title>
            <link>https://velog.io/@nayoon-kim/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%88%98</link>
            <guid>https://velog.io/@nayoon-kim/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%88%98</guid>
            <pubDate>Mon, 29 Nov 2021 12:22:19 GMT</pubDate>
            <description><![CDATA[<p><a href="https://programmers.co.kr/learn/courses/30/lessons/42746">가장 큰 수</a></p>
<h2 id="잘못된-풀이">잘못된 풀이..</h2>
<pre><code>import java.util.*;

class Solution {
    // 앞자리가 가장 큰 수가 앞으로 오도록 정렬
    public String solution(int[] numbers) {
    ArrayList&lt;String&gt; arr = new ArrayList&lt;&gt;();
        for(int n: numbers)
            arr.add(Integer.toString(n));

        Collections.sort(arr, new Comparator&lt;String&gt;(){
            @Override
            public int compare(String o1, String o2) {
                for(int i = 0; i &lt; 3; i++) {
                    if (o1.charAt(i) == o2.charAt(i)) {
                        if (o1.length() == i + 1) {
                            if (o2.length() == i + 1) {
                                return 0; // 같은 숫자이면서, 자릿수가 같은 경우
                            } else {
                                for(int t = i + 1; t &lt; o2.length(); t++) {
                                    if (o2.charAt(t) &gt; o1.charAt(i))
                                        return 1;
                                    else if (o2.charAt(t) &lt; o1.charAt(i))
                                        return -1; // o1이 더 크다..!
                                }
                                return 0;
                            }
                        } else if (o2.length() == i + 1) {
                            for(int t = i + 1; t &lt; o1.length(); t++) {
                                if (o1.charAt(t) &gt; o2.charAt(i))
                                    return -1;
                                else if (o1.charAt(t) &lt; o2.charAt(i))
                                    return 1; // o1이 더 크다..!
                            }
                            return 0;
                        }
                    } else 
                        return o2.compareTo(o1);
                }
                return o2.compareTo(o1);
            }
        });

        return String.join(&quot;&quot;, arr);
    }
}</code></pre><p>자릿수마다 비교하는 식으로 했다.</p>
<p>백 단위 수와 일 단위 수는 다음과 같이 했다.</p>
<p>예)
334 3</p>
<ol>
<li>0번째 인덱스가 가리키는 값은 각각 3이다.</li>
<li>두번째 수는 1의 자리 수 이기 때문에 첫번째 수만 진행한다.</li>
<li>1번째 인덱스가 3이기 때문에 연산을 계속한다.</li>
<li>2번째 인덱스가 4이기 때문에 첫번째의 0번째 인덱스보다 크다.</li>
</ol>
<p>-&gt; 따라서 334가 3보다 앞에 위치한다.</p>
<p>라고 풀었는데..!</p>
<p>엄청나게 간단하면서도 똑똑한 풀이를 봐버렸다..</p>
<pre><code>import java.util.*;

class Solution {
    // 앞자리가 가장 큰 수가 앞으로 오도록 정렬
    public String solution(int[] numbers) {
        ArrayList&lt;String&gt; arr = new ArrayList&lt;&gt;();
        for(int n: numbers)
            arr.add(Integer.toString(n));

        Collections.sort(arr, (a, b) -&gt; (b + a).compareTo(a + b));

        if (arr.get(0).startsWith(&quot;0&quot;)) return &quot;0&quot;;

        return String.join(&quot;&quot;, arr);
    }
}</code></pre><p>0에 대해 처리하고, 람다식까지 이용해서 앞 + 뒤, 뒤 + 앞 으로 연산해본 결과 중 큰 값을 return하도록 했다.</p>
]]></description>
        </item>
    </channel>
</rss>