<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Junbyeol Blog]]></title><description><![CDATA[소프트웨어 엔지니어 윤준성의 기술블로그]]></description><link>https://junbyeol.github.io</link><generator>GatsbyJS</generator><lastBuildDate>Fri, 10 Feb 2023 08:40:15 GMT</lastBuildDate><item><title><![CDATA[No title]]></title><description><![CDATA[200524 JPA Tags: Java, Server Layered Architecture Presentation layer : View Control layer: Controller Business layer: Service Persistence…]]></description><link>https://junbyeol.github.io/spring/200130-JPA/</link><guid isPermaLink="false">https://junbyeol.github.io/spring/200130-JPA/</guid><content:encoded>&lt;h1 id=&quot;200524-jpa&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#200524-jpa&quot; aria-label=&quot;200524 jpa permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;200524 JPA&lt;/h1&gt;
&lt;p&gt;Tags: Java, Server&lt;/p&gt;
&lt;h1 id=&quot;layered-architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#layered-architecture&quot; aria-label=&quot;layered architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Layered Architecture&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Presentation layer : View&lt;/li&gt;
&lt;li&gt;Control layer: Controller&lt;/li&gt;
&lt;li&gt;Business layer: Service&lt;/li&gt;
&lt;li&gt;Persistence layer: DAO(Data Access Object, Repository) ← 데이터에 영속성을 부여해줌&lt;/li&gt;
&lt;li&gt;Domain Model layer: VO(Value Object), DTO(Data Transfer Object)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;dto&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dto&quot; aria-label=&quot;dto permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DTO&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;로직을 갖지 않는 순수한 데이터 객체&lt;/li&gt;
&lt;li&gt;속성과 getter, setter만으로 이루어진 클래스!&lt;/li&gt;
&lt;li&gt;VO는 DTO와 거의 비슷하나 read only 속성을 가짐&lt;/li&gt;
&lt;li&gt;DTO는 전송되는 데이터의 컨테이너, VO는 데이터 그 자체(객체)의 의미로 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dao&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dao&quot; aria-label=&quot;dao permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DAO&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DB로의 접근을 전담하는 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;persistence영속성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#persistence%EC%98%81%EC%86%8D%EC%84%B1&quot; aria-label=&quot;persistence영속성 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Persistence(영속성)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Entity를 영구적으로 저장해주는 환경&lt;/li&gt;
&lt;li&gt;프로그램을 종료해도 데이터를 잃지 않도록, DB에 데이터를 저장하는 것 == 영속성을 부여하는 것&lt;/li&gt;
&lt;li&gt;Persistence Framework는 SQL Mapper와 ORM으로 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ormobject-relational-mapping&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ormobject-relational-mapping&quot; aria-label=&quot;ormobject relational mapping permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ORM(Object-relational mapping)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;객체와 테이블의 매핑&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;객체의 메소드 호출만으로 쿼리를 수행할 수 있음&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ex) SELECT * FROM user == user.findAll()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이 둘을 mapping하는 것은 ORM framework&lt;/li&gt;
&lt;li&gt;Persistant API라고도 부름&lt;/li&gt;
&lt;li&gt;ex) JPA, Hibernate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;cf) &lt;strong&gt;SQL Mapper&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;→ ORM이 객체 - 데이터의 매핑이라면, SQL Mapper는 객체 - SQL 쿼리의 매핑&lt;/p&gt;
&lt;p&gt;→ ex) Mybatis, JdbcTempletes&lt;/p&gt;
&lt;h1 id=&quot;jpajava-persistence-api&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jpajava-persistence-api&quot; aria-label=&quot;jpajava persistence api permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JPA(Java Persistence API)&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.notion.so/Copy-of-JPA-YouTube-aaf597bc74474145904450f94a2f7623&quot;&gt;Copy of JPA YouTube 강의&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ORM을 사용하기 위한 표준 인터페이스 모음&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이 때, JPA를 구현하는 Implementation들을 ORM Framework라 부른다&lt;/li&gt;
&lt;li&gt;ex) Hibernate, EclipseLink, DataNucleus, OpenJPA&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;세가지 구성요소&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;javax.persistence.* 패키지로 정의된 API 그 자체&lt;/li&gt;
&lt;li&gt;JPAL(Java Persistence Query Language)&lt;/li&gt;
&lt;li&gt;객체/관계 메타데이터&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;jdbcjava-database-connectivity&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jdbcjava-database-connectivity&quot; aria-label=&quot;jdbcjava database connectivity permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JDBC(Java Database Connectivity)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DB에 접근할 수 있도록 Java에서 제공하는 API&lt;/li&gt;
&lt;li&gt;모든 Persistence Framework가 내부적으로 사용하고 있다&lt;/li&gt;
&lt;li&gt;DB에서 자료를 쿼리, 업데이트하는 방법 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;hibernate&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hibernate&quot; aria-label=&quot;hibernate permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hibernate&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JPA의 구현체 중 하나&lt;/li&gt;
&lt;li&gt;JDBC API가 내부에서 동작하고 있지만, 개발자가 직접 SQL을 작성할 필요는 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;jpa의-동작과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jpa%EC%9D%98-%EB%8F%99%EC%9E%91%EA%B3%BC%EC%A0%95&quot; aria-label=&quot;jpa의 동작과정 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JPA의 동작과정&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 29.666666666666668%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAAAwElEQVQY042RTQrCMBCFgx5KbyDoKQTv4cZzCQFLFoIrD9FN/5vQtJPEl9BIXKgd+JjM8PKYSRhDOOdWc95aa+9KKZHS972QUgoiEtBEbuAJ/Sl6ABYCzWi4d19iGIaPepqmeLzMd9dvw2TCnVeM40hd11HTNAQjatuW8jwP2ffLsqS6rvVseP5rqLWmoigCWJmwLlVV5U0CeALfW2R4WLIyniitf668gTjDVBwTcJ89mCjUxhgOTeQKHtAf0095AWTZcpPYg3WVAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20JPA%20af566361ed454afe8d7b86ad6d1b7e25/Untitled.png&quot;
        title=&quot;200524%20JPA%20af566361ed454afe8d7b86ad6d1b7e25/Untitled.png&quot;
        src=&quot;/static/3059651462ce352321370f3e6c5c2b2f/c1b63/200130-1.png&quot;
        srcset=&quot;/static/3059651462ce352321370f3e6c5c2b2f/5a46d/200130-1.png 300w,
/static/3059651462ce352321370f3e6c5c2b2f/0a47e/200130-1.png 600w,
/static/3059651462ce352321370f3e6c5c2b2f/c1b63/200130-1.png 1200w,
/static/3059651462ce352321370f3e6c5c2b2f/d61c2/200130-1.png 1800w,
/static/3059651462ce352321370f3e6c5c2b2f/1df5b/200130-1.png 1999w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JPA는 애플리케이션과 JDBC(Java DB connectivity)사이에서 동작한다&lt;/p&gt;
&lt;p&gt;→ 개발자가 직접 JDBC를 쓰는 것은 아님&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;jpa를-사용하는-이유&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jpa%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&quot; aria-label=&quot;jpa를 사용하는 이유 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JPA를 사용하는 이유&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;SQL 중심적 개발 대신 객체 중심으로 개발 가능&lt;/li&gt;
&lt;li&gt;Java Collection에 데이터를 넣었다 뺐다 하듯이 사용 가능(간단한 CRUD)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;유지보수가 편리하다&lt;/p&gt;
&lt;p&gt;→필드가 바뀌어도 모든 SQL을 수정할 필요가 없다&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Object와 RDB들 간의 패러다임의 불일치들을 해결해준다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html&quot;&gt;[JPA] JPA란 - Heee’s Development Blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html&quot;&gt;[JDBC] JDBC, JPA/Hibernate, Mybatis의 차이 - Heee’s Development Blog&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;트랜잭션transaction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98transaction&quot; aria-label=&quot;트랜잭션transaction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;트랜잭션(Transaction)&lt;/h1&gt;
&lt;p&gt;:DB의 상태를 변환시키는 작업 단위&lt;/p&gt;
&lt;h2 id=&quot;acid트랜잭션의-특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#acid%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-%ED%8A%B9%EC%A7%95&quot; aria-label=&quot;acid트랜잭션의 특징 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ACID(트랜잭션의 특징)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://victorydntmd.tistory.com/129&quot;&gt;[DB이론] 트랜잭션(transaction)과 ACID 특성을 보장하는 방법&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mangkyu.tistory.com/30&quot;&gt;[Database] 8. 트랜잭션, 동시성 제어, 회복&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Atomicity(원자성)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;트랜잭션의 연산은 DB에 모두 반영되거나, 모두 반영되지 않아야 한다&lt;/li&gt;
&lt;li&gt;하나의 연산이라도 오류가 발생하면 트랜잭션 전체가 취소되어야 한다&lt;/li&gt;
&lt;li&gt;Transaction은 Commit되거나 Rollback된다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Consistency(일관성)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;트랜잭션이 DB의 고정요소들을 변화시키지 않는 것/ 제약조건을 위배하지 않는 것&lt;/li&gt;
&lt;li&gt;ex) 트랜잭션이 계좌 엔티티의 잔고 필드를 integer에서 string으로 바꾸면 안된다&lt;/li&gt;
&lt;li&gt;ex) 트랜잭션 수행 후&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Isolation(격리성)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들어서는 안된다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Durability(지속성)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;성공적으로 수행된 트랜잭션은 영원히 반영된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 565px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAACo0lEQVQoz02TWU8TURTH+7X8Aj4YlyfjkhgfxGh8EIgkLmgFcSOgcUlMjFuMikGwIig0LJIihWkptralHdrOTBe60CpCW+zen7eLhJOcO/dm7pz8t9FVaVS12tgVyxXGAlFGlDijaqMNgRhSKMmEJ8mwM8GoO8FmNle/XxHfVZtdK11tKZdK9UO5WCCY2uDEnIe2nxFO2zQOmf3smZU5OOPiwqRK61Sc/UMaHeMKpWKpCaax1IbqVpO/uGK24l5PQqHA+laGbknmgVPj2pKflu8ezpi99FpleqYVrk6HaR8PMi5QVsslgbCBstJkqnNFQrQOvGQ5pEGpzEZ2m1tLq+htAe7+UOh3qHTZFN65ZGy+Sb45BjE5DcSDU6Q9z4hI91iT+siqBor5DLpwIsSjV70oUZVKoUggkeKU5OemP0WbK8pxW4h9ksp+kw+Tf5KPc90YHY+xrr4nbb+B/c1e7AMHSM2eZCM4iy6SDPP6y1O8mkz+b550Ls+jZR+PHQq9Nh96i0yX1Y9RXsGtjGN2j7AcmCIRXiTj/0Dc9Yao/QWpwGRDw8h6mM/m96gxlVKuQHxzi7bvK1z/odIpaJ9dkDli8nJx0cWMoDps6scw/5CV0DzFpnD/k1LXMJQI82TgPkpMoywoB4VJ5yQfPd4Yna4Ievca7cLxFjF4STUyvdSHxfcCZ9BIvpBrulxptkDoWBPxGPuEFBSmlMuk8wX6JA93LF76hbO1Z9eCh6/ClCGrhefzEm8XLWxmso0cVio7kakjXE9nGJQVYumsoJxDS/7mvMVPjxzntkDZIdAdtWocm/NyeTZK59wfDn+Oc8moUhQx2/1T7AR7p8SLVGabdrMHvV3joohL57JCh9Dy6qKMfkoEe0LjzGgAgzNeV682a/fAfyi3+ZwX95gjAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20JPA%20af566361ed454afe8d7b86ad6d1b7e25/Untitled%201.png&quot;
        title=&quot;200524%20JPA%20af566361ed454afe8d7b86ad6d1b7e25/Untitled%201.png&quot;
        src=&quot;/static/21d170256aab71fcf6b409e1e34e7d1b/07eba/200130-2.png&quot;
        srcset=&quot;/static/21d170256aab71fcf6b409e1e34e7d1b/5a46d/200130-2.png 300w,
/static/21d170256aab71fcf6b409e1e34e7d1b/07eba/200130-2.png 565w&quot;
        sizes=&quot;(max-width: 565px) 100vw, 565px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;원자성지속성-보장&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9B%90%EC%9E%90%EC%84%B1%EC%A7%80%EC%86%8D%EC%84%B1-%EB%B3%B4%EC%9E%A5&quot; aria-label=&quot;원자성지속성 보장 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;원자성/지속성 보장&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;회복 관리자 프로그램을 이용&lt;/li&gt;
&lt;li&gt;롤백 세그멘트(rollback segment)에 트랜잭션 수행 직전의 상태를 보관&lt;/li&gt;
&lt;li&gt;오류가 발생해도 롤백이 가능하다&lt;/li&gt;
&lt;li&gt;일부만 진행된 트랜잭션을 취소시킨다(원자성)&lt;/li&gt;
&lt;li&gt;값을 트랜잭션 이전의 상태로 복원한다 지속성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;일관성격리성-보장&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%BC%EA%B4%80%EC%84%B1%EA%B2%A9%EB%A6%AC%EC%84%B1-%EB%B3%B4%EC%9E%A5&quot; aria-label=&quot;일관성격리성 보장 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;일관성/격리성 보장&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;동시성 제어로 해결해야 한다&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;무결성 제약 조건을 통해 일관성을 보장한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 720px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.33333333333331%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAbCAYAAAB836/YAAAACXBIWXMAAAsSAAALEgHS3X78AAAFCklEQVRIx01U2VIbSRDU/67BH7AvtnHYsbu2AXMJAQIhoVuje3SM5tLoPpFZf09uZouw96Gip7unszKzqju28+uY2AVMO0UsBhZm/QpGmvfKJkZ2HqNODpNeEWHrCZNuAcN21qyZ0Hcrg2W/gLVTRGzjWph3i1i7VWyCJlZMIKD5oIKlqwQlJqoQsIBxN49pv7gPzQk47eR5voAVwZZcjz0HDQOm8Tls4XnYxnbYwm7UxnPU5HcTm2EDS7+KhWdx3sCP8X7veVjnWQsrJly7FQMae4la+Dnu4N+xjblTRtTOY9Iv48eEa7OuiZ/znhlfph3sxm0Dugnr+whqWBHUAA7KYtjELmpj5dUpscafxIjZmUjMxpTm1h6MXyse3pLZmkAKzdcCJPu1twc1krcBf2DsRjZeJmLSJUPbsJHMQZWAdvYX4JbJnmnJOqQVXnXPlKAb/hsT2IJSNxzlnaQqZvRF7IJ2Bv3KHQbWPdfKmImJ2AuQSlYiQ2Ax3QP6pMwPUwCGfJJfcx4e1O4x6kmqRfbaJyMWYiMfqWBDAmsq3BhgyvcJuGBbrAkqQHm2Y3FepraROurlsSTYOqBHIQ8Ma1hS3nbSxo6Jt6OW8XJDhvJxJcAJG3ehKnHDjK9+SoKquSWjCYHngxL9spiAilg4xYLspjyzIKE5C7L0WJSxnTPylEFNvJIFjJlTgldPoVe+RT19jsbThfFSvu6rKwJVzosmyVzALttm0nkF9MpYOpJfJasar1cG1sMJao+naKTPUEl+hVsVoGxgReUnGevWyA6tLYkRmxJwSTlzZp7xaukneaHNxaDIpi1hbGe4l+W8wBvDfR1mYhHRHV/9H3DYeOTjkDXRycVhF66NTK/+gBnZLBw+Du20ATXBtSmVSPqwnUNk7xkv6N9CgKFag6+FopOPo1+6MTfDb6QIlGGiDLxqEkH9HlErzRuTxVTM6Peos395NBfgnGpivnWHqJE2gOP2E32kyTRXHoZk75Sukbv6jMrdVwM6bKZ537OmrSRZL9BMFZYFAvQqtwh1V5ldgPJxQUmOlURVRWFYyW9kniDYAyadJ0QEVTHVCWM+XRp/AQaU45ZfQQkoL2f8SS1SS31Hiy3TLybgMrHHKs/pYVh/NKrUcgIU46mzfycJeA+fbAI+AMos6Xo0e4UEmR2jlTlHN3fJpDcYNVOY0tOAvoe1FIYE1iMbNlkDA55jlcnMIxuB7gHThqWdvUQ+/hdKib/RSJ0YQBVw3HqEfBcRzaOmvNY5WmE/IRYR0C3dwqGsIW9GxEKMCNxn+7TY0L38FeSzrAksyq6wC8oJk8ChCoVr/QaOhZLLEOCALaNwitdMcg2PB30CaPTKmse5zuD+gAkdJusbO+6Mrx6BY9bNF1QS/6B+z4reH8PmnbUzZ/BV1eotRvW731Fji9VYwOoNfCUgsMf/3KLseKS3KcSUZVCImw2/fGPCK8YRkElksRBVxe1r3GBYSSAgmF+64j8E5Nk+/e7nqaqSZB9ywX8FCyjP/Fy8QshRhyMrQaD9GJb3iRQ9qihcfEKVCvPnn/j9GbXkCWJunh6QpU9WAuplTtF5PEb/6RRO7jsGuTM42VOun5i9Lsdu+gTt1DEayS+w2fg2u6D9QLvYtzG/cAEvf85D35E++RMX79/g8t0fuD46wPXHQ8Q/HuDq6A2uPhwgfnTI77f8fouLdwe4fM+9D4conr1D5+Ebwb/hP3zqi9VVZU3KAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20JPA%20af566361ed454afe8d7b86ad6d1b7e25/Untitled%202.png&quot;
        title=&quot;200524%20JPA%20af566361ed454afe8d7b86ad6d1b7e25/Untitled%202.png&quot;
        src=&quot;/static/43f7964b2571ac63687fcabbb93b9a85/37523/200130-3.png&quot;
        srcset=&quot;/static/43f7964b2571ac63687fcabbb93b9a85/5a46d/200130-3.png 300w,
/static/43f7964b2571ac63687fcabbb93b9a85/0a47e/200130-3.png 600w,
/static/43f7964b2571ac63687fcabbb93b9a85/37523/200130-3.png 720w&quot;
        sizes=&quot;(max-width: 720px) 100vw, 720px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[No title]]></title><description><![CDATA[200525 TLS/SSL Tags: Network…]]></description><link>https://junbyeol.github.io/network/200525 TLS SSL 376350998350494eb1b0c6e2fca91508/</link><guid isPermaLink="false">https://junbyeol.github.io/network/200525 TLS SSL 376350998350494eb1b0c6e2fca91508/</guid><content:encoded>&lt;h1 id=&quot;200525-tlsssl&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#200525-tlsssl&quot; aria-label=&quot;200525 tlsssl permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;200525 TLS/SSL&lt;/h1&gt;
&lt;p&gt;Tags: Network&lt;/p&gt;
&lt;h1 id=&quot;암호화&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%95%94%ED%98%B8%ED%99%94&quot; aria-label=&quot;암호화 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;암호화&lt;/h1&gt;
&lt;h2 id=&quot;대칭키-암호&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8C%80%EC%B9%AD%ED%82%A4-%EC%95%94%ED%98%B8&quot; aria-label=&quot;대칭키 암호 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;대칭키 암호&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;암호화키와 복호화키가 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;공개키-암호비대칭키-암호&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B3%B5%EA%B0%9C%ED%82%A4-%EC%95%94%ED%98%B8%EB%B9%84%EB%8C%80%EC%B9%AD%ED%82%A4-%EC%95%94%ED%98%B8&quot; aria-label=&quot;공개키 암호비대칭키 암호 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;공개키 암호(비대칭키 암호)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;암호화키와 복호화키가 따로 있음&lt;/li&gt;
&lt;li&gt;외부에 공개되는 키가 암호화/복호화 용인지에 따라&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;공개-키-암호&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B3%B5%EA%B0%9C-%ED%82%A4-%EC%95%94%ED%98%B8&quot; aria-label=&quot;공개 키 암호 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;공개 키 암호&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;공개키로 암호화, 비밀키로 복호화&lt;/li&gt;
&lt;li&gt;비밀키를 갖고있는 사용자만 해독 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 아무나 우체통에 편지를 넣을 수 있지만, 꺼내는 사람은 키를 가진 사람 한 명 뿐!&lt;/p&gt;
&lt;h3 id=&quot;공개-키-서명&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B3%B5%EA%B0%9C-%ED%82%A4-%EC%84%9C%EB%AA%85&quot; aria-label=&quot;공개 키 서명 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;공개 키 서명&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;비밀키로 암호화, 공개키로 복호화&lt;/li&gt;
&lt;li&gt;비밀키를 갖고있는 사용자만 암호화 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 인장으로 편지봉투를 봉하면 누구나 열어볼수 있지만, 발신자가 무조건 본인임을 증명 가능&lt;/p&gt;
&lt;h2 id=&quot;참고-해시&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B0%B8%EA%B3%A0-%ED%95%B4%EC%8B%9C&quot; aria-label=&quot;참고 해시 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;참고) 해시&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;데이터를 특정길이의 다른 데이터로 전환하는 것!&lt;/li&gt;
&lt;li&gt;복호화할 수 없으므로 엄밀하게 암호화는 아니다&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;tlsssl&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tlsssl&quot; aria-label=&quot;tlsssl permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TLS/SSL&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 560px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAACxklEQVQ4y22TC08aQRSF+cdN6gs11WotasHWBwsLCAhCRKGKtuCCBHl0QXk/bEWrlmJitEYTE2BB0NOZQYxJu8mXu3N25+y9c+/KHh8f8b+r3W7B5smDc+Wg28iDX88R8gy6foasOWcGWlcWB6VfkNHNl5eXODw8RLlcZjw8PKDRaGBpfQcOIQy904/1QBQ6pw9OXxhmdxAGVwAuf4hofnhjGQjxDIKRWMeQGpydnaFYLKJWq7EMJakJYTeAg6MEiT4cnabgDQrIFKKIJiLwBH0o/hCxvetH6TSH0995REVi2G63Qbm/v2dZUXO6luo1TJji6OfTGNAmMKRPkZjEsCGDIYJcl8IbYxb9ROvT7EPOJxCK5yFrtVrMqGtYrVaZaa1WxTg1NKQxbCIGi2n068hmfo8hX0yhV7vP4qAxDTl5L7RX7JTcvaghLb1UKuHk5wkmrR6otgSo3F5MuzwYtbgx5drCiNkOxaob43Yv5oUQ5rYDUG2KCESykFUqFZyfn+Pi4gJXV1fsDOtSnZRch8ISxshyBGO2CEatYfSovZDrtzGoF0ipX9HLCXi3IhK+kedx7MYKkNESKZIk4ebmBnd3d4zrP9eYskcxvZkmWVIyUJL7CUcU71dFfHCnMPMl8xzH7MRQzP9bMjWnGVfKFXxyhWHcK8AUy8NEDnxRzGJma4ehCyeJViBaDpZkEUp3rFMybUCz2QRtDr2nkUK7/NYg4tVCHL2aOHq4DgO02/pOQ14/aTT2kXW42xQ62LQZdKhvb29ZtnWpASX/GWreAk5vIyxDrbNiekYDhVKNee0SOIONaMvQGqyYVK8hSM+QbqYZ0qE+Pj5mM8jKb7YwpVkDx5ug0VsIxEBnhmpWA+UnjnzI9KQtgTeYoVhwYCdKzrD7L9M5pKW+/JeNG0l8tO9j3pHE3EqCsbCaYsy90Gaf9Nz3E/wFG9tZGiCeU7AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled.png&quot;
        title=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled.png&quot;
        src=&quot;/static/7a79541254f7de53ea2b8da28ff72ebd/b06ae/Untitled.png&quot;
        srcset=&quot;/static/7a79541254f7de53ea2b8da28ff72ebd/5a46d/Untitled.png 300w,
/static/7a79541254f7de53ea2b8da28ff72ebd/b06ae/Untitled.png 560w&quot;
        sizes=&quot;(max-width: 560px) 100vw, 560px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP/IP 계층에서 Application Layer에 속함&lt;/li&gt;
&lt;li&gt;TLS 1.0 == SSL 3.0, 같은 말이라는 뜻&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;악수(HandShake) ⇒ 전송(Session) ⇒ 통신종료&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이중 HandShake가 너무너무너무너무 중요함&lt;/p&gt;
&lt;h2 id=&quot;ssl-handshake&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ssl-handshake&quot; aria-label=&quot;ssl handshake permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SSL Handshake&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;데이터 전송(Session) 때 사용할 대칭 키를 서로 안전하게 확보하는 것이 목표!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;사진출처) 내가 만듦&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABfklEQVQoz51S226CQBTk/3/G9Bd8kapt4oNpmoCArIDITS6CIEx3UGyCJE16yGTZ25w5s0cJggCqqvZYLpeYz+fYbrfYbDZYr9dYrVbwfR+32w3X6xV1Xb+gbVswuq6DUlUVPM+DaZqwLAuGYUDTtB5c03UdYRgiSRLEcTwJkg6hOI6D2ewNeZ7jvyGEgOu6yLIMCrMvFou+JJKez2fkcmMIlvFXUBTvkkNh/ZTMieu5sB0B4R6QFwWK4oLLReIxUkGaZn1SguWWZSnPFc/EStM0yOQhLmiWjvX2E1/GN0zpJz2ll7vdrveSPlLJ8Bh8JApK07QX9Ev4KDGULy5sgZN/6j3Z7/eS2IRt27CFDXYEX3xswwshs/IQFzv5MSvn44tde19jZ9A3JrqrLsaEhZRfS0+Spz/n5D5GcYSD70BIOL6LKIyk0hBH79i3G/3Lsny65KkoqxLqxzsMYeJwdBCc7mUT7BAS8f6TkOWRdGiRMbifSwVNPX2GwfvD/w86M0yjvEiFdgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled%201.png&quot;
        title=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled%201.png&quot;
        src=&quot;/static/1651999551a13a2d36e2a87dcde508e1/c1b63/Untitled%201.png&quot;
        srcset=&quot;/static/1651999551a13a2d36e2a87dcde508e1/5a46d/Untitled%201.png 300w,
/static/1651999551a13a2d36e2a87dcde508e1/0a47e/Untitled%201.png 600w,
/static/1651999551a13a2d36e2a87dcde508e1/c1b63/Untitled%201.png 1200w,
/static/1651999551a13a2d36e2a87dcde508e1/fde66/Untitled%201.png 1574w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABiUlEQVQoz5VSa2vCQBD0//8i+8lCoWBLi4qirajVJBrzfl2SS0ymtxuTKrZCD4bsHbuzs7PpaZqGxWKB8XiMyWSC0WiE6XSK5XLJ9/l8jtlsht1uB13XQfkt2vt2u2VQTg/qOI6D4XB4BSJuYyJP0/RXZFmGy8OEpmkyTqcTqqpi5HnexWVZcuFf8H2fyameCQeDR/T7D1xc1zX+cyh/vV7zlEVRNIQ/impIKRl0J8icYtm9U5EQAofDHntDQyoSxElyPXIhCyTqUYgUURRxQUvY+kRvIhGcF0YxDpaH8acBO0gUqeimawjPXXkEBU958qEWsVKjmJbFm7Rtm8eihp7n42BaWO4spLJSTeLOqhtCMtb92mD1+oLV+xu05yfomw3y87i0IPoS6qrkmii6Q8gJQQBfqfFdF+7xqBS5qO4s64awLIvGB6VOypzReJgpZeflKIWk/qga6JrOP7FhGOxvHF8QyrJCJkskqYQXJnC8EK4fXcP12D9XKQ7DsEEQIlCTUCOyoSX8Bh/XSdk+1Rn+AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled%202.png&quot;
        title=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled%202.png&quot;
        src=&quot;/static/dc216d05f4b7eef730cd5a13f2225a49/c1b63/Untitled%202.png&quot;
        srcset=&quot;/static/dc216d05f4b7eef730cd5a13f2225a49/5a46d/Untitled%202.png 300w,
/static/dc216d05f4b7eef730cd5a13f2225a49/0a47e/Untitled%202.png 600w,
/static/dc216d05f4b7eef730cd5a13f2225a49/c1b63/Untitled%202.png 1200w,
/static/dc216d05f4b7eef730cd5a13f2225a49/6568d/Untitled%202.png 1660w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABlUlEQVQoz4VSa2+CQBD0//+t9gNqrZGmsamNTeXlIeBxHAgITnfX2mircckGuMfszuwMQKG1RhAEkp7nQa3X2G638r/ZbJCmKQ6HA24F751ywAtKKUynU4xGI4zHY4woXdfF5OkJk8kE8/kcWZZJ4Wt5XkwAF4sPSY48z5GEHhIqEsexdFiWJbquQ9u2V5PPWGvR9/0RcOgM8fDwiKZphF6kPMQqks6jKJI1BrwVq9UKSZJgt9sdAau6wSIqEG8STJ+f4b68wn37hOM4Qtn3fTl80utcN46isJeUy7KCsRU6anm5XIpmDOoMHcxmM4RhKKApdcHB1C4Bi18GAsjVW6Jbdw10Y5DXBpnJUOxLmNZiHSt4foCQNGVQHtBdwLquj1R+ntN3VVpo0jAnK1XLD+yo8F8L3QTsuh7tvpNNkxsaBlmFpxwG2Cvy5uIdX+TThjTn6fIQmf5/wIoBG3pX0NSJWhNFzxfbaLJRYYk6XSpIa0sDMMZI5jqXRtgyF4A9dcaViAv6NIEmjfgCa8UevBcMdpLhGxCETDtamIa5AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled%203.png&quot;
        title=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled%203.png&quot;
        src=&quot;/static/e69a2ad06155d5437d221da48321d2dc/c1b63/Untitled%203.png&quot;
        srcset=&quot;/static/e69a2ad06155d5437d221da48321d2dc/5a46d/Untitled%203.png 300w,
/static/e69a2ad06155d5437d221da48321d2dc/0a47e/Untitled%203.png 600w,
/static/e69a2ad06155d5437d221da48321d2dc/c1b63/Untitled%203.png 1200w,
/static/e69a2ad06155d5437d221da48321d2dc/17d12/Untitled%203.png 1666w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABhElEQVQoz31T2W7CQAzs//8XfeEQSAUq9QFyBwjZ7JE7YWpvmlS0gKVRsl7v2J71voEsTVMcj0e4rgvHcRAEAZIkged5OJ1OOJ/PuN1ueGW8z3jjhRApNpsNVqsVFosF5vO5XS+XS4vdbofr9YpMSmRKQdJ3Qpah7/uJ2BLu95/YfmxfpUfbtmiqCiURFkVhYfIcVV3bDoQQaJpmIFyv15jN3slR22xj+WMrGNulw2UcWRmiMEQSx6iJmCVi2SZCPlRT8DNdfjH4uVVBEkBJQCsYbaYCLCEza3IqaofL5wspy/IfKZsxBiFVx3Ga/tm01ui67p7Q/Gxy6RVpNQr9l5D9ZVlRnJhiHhLmeYGenHEUUSfyScsEIhGU9EIV0uI5Id+azGvEV4WvQCAr2ocXXtQdwkTCv0i4l9z6lHpYIY1AVZMuBZTOCQYlJYnpJg+Hgx16Ho2cfBzDEFIPclHsHSG3wnrw8AZ+YEeChQ+DkIg8ekWOfUG+7w9+AsfwuHCScdTYvgEvh1EVYN5eGgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled%204.png&quot;
        title=&quot;200525%20TLS%20SSL%20376350998350494eb1b0c6e2fca91508/Untitled%204.png&quot;
        src=&quot;/static/2022743cbaa31781b3163da97eb6a398/c1b63/Untitled%204.png&quot;
        srcset=&quot;/static/2022743cbaa31781b3163da97eb6a398/5a46d/Untitled%204.png 300w,
/static/2022743cbaa31781b3163da97eb6a398/0a47e/Untitled%204.png 600w,
/static/2022743cbaa31781b3163da97eb6a398/c1b63/Untitled%204.png 1200w,
/static/2022743cbaa31781b3163da97eb6a398/6a5c3/Untitled%204.png 1646w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;⇒ 복잡한 과정이지만 아무튼 요지&lt;/p&gt;
&lt;p&gt;서로간의 대칭키를 안전하게 확보하면서 공개키 암호와 대칭키 암호의 각각의 장점만을 취함&lt;/p&gt;
&lt;p&gt;SSL이 이렇게 튼튼하다!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[No title]]></title><description><![CDATA[200524 Spring Framework Tags: Java, Server :Java EE 개발을 위한 오픈소스 애플리케이션 프레임워크 cheese10yun/spring-guide 특징 경량 컨테이너로 자바 객체를 직접 관리 POJO…]]></description><link>https://junbyeol.github.io/spring/200310-Spring-Framework/</link><guid isPermaLink="false">https://junbyeol.github.io/spring/200310-Spring-Framework/</guid><content:encoded>&lt;h1 id=&quot;200524-spring-framework&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#200524-spring-framework&quot; aria-label=&quot;200524 spring framework permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;200524 Spring Framework&lt;/h1&gt;
&lt;p&gt;Tags: Java, Server&lt;/p&gt;
&lt;p&gt;:Java EE 개발을 위한 오픈소스 애플리케이션 프레임워크&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cheese10yun/spring-guide&quot;&gt;cheese10yun/spring-guide&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B9%EC%A7%95&quot; aria-label=&quot;특징 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;특징&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;경량 컨테이너로 자바 객체를 직접 관리&lt;/li&gt;
&lt;li&gt;POJO 방식의 프레임워크&lt;/li&gt;
&lt;li&gt;IoC Container&lt;/li&gt;
&lt;li&gt;DI 지원&lt;/li&gt;
&lt;li&gt;AOP&lt;/li&gt;
&lt;li&gt;영속성과 관련된 다양한 서비스 지원&lt;/li&gt;
&lt;li&gt;높은 확장성&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;pojoplain-old-java-object&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pojoplain-old-java-object&quot; aria-label=&quot;pojoplain old java object permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;POJO(Plain Old Java Object)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://m.blog.naver.com/writer0713/220700687650&quot;&gt;[java] POJO란?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:말 그대로 오래된 방식의 간단한 자바 객체를 의미한다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개발자의 노고를 덜기 위해 EJB라는 개념이 널리 사용되었음&lt;/li&gt;
&lt;li&gt;그런데 EJB의 1만큼을 사용하기 위해 99의 짐을 추가로 지고 가야하는/ 배보다 배꼽이 더 큰 상황 발생&lt;/li&gt;
&lt;li&gt;POJO 기반의 프레임워크를 사용하자!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;현재의 POJO 프로그래밍의 의미 : 객체지향적인 설계원칙을 잘 따르며, 의존성이 적고, 테스트가 용이한 코드&lt;/p&gt;
&lt;h2 id=&quot;spring-bean&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#spring-bean&quot; aria-label=&quot;spring bean permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Spring Bean&lt;/h2&gt;
&lt;p&gt;:Spring이 다루는 POJO&lt;/p&gt;
&lt;p&gt;Spring IoC Container에 의해 인스턴스화, 관리, 생성된다&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 879px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 26.666666666666668%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAABTUlEQVQY0z2QS07CUBSGuw2HjlyDC3AHDhy4BBfgDkyc4EQHTJwYwkCJQnzEOBBCIBRJeAnGFIuVx6X0CgV621Lu+S0Y+JMv+U9yzhl8CgAH/5FLXNeTRCTX85pFiCS56jorymT2VAYuk9M5pCX8zZ7yyafC9Tz8jkbUZwNU6w2YQw5JAYRrw5eEcpuhEkLhhR/4sGcWrHEHD1oHezcf2L2qIFIwwB0PSrI1FLkfDvX1he7vbqlaeqPel0H11iPF0xF6Mjx6Lmukvut0HC9SLKcv/9JkDtpPabRzWaGt8wJtn6Up37ZI8YOFiFa7yDR1yjZaSDW6OMlq6I0sTByOhDZBtMFxFFNxeJFB0+jCnpgY20O0WReRXAsHiRpqzF55U0LEwPFRMmdUsQTybIq86cBdYBO1P8V16XvVA99BnzFwzsGHA0hPrFQsE7rHHylcaSq4sVrgAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled.png&quot;
        src=&quot;/static/f3c45be3f9692e37f32d3caa1828e015/bcb8c/200310-1.png&quot;
        srcset=&quot;/static/f3c45be3f9692e37f32d3caa1828e015/5a46d/200310-1.png 300w,
/static/f3c45be3f9692e37f32d3caa1828e015/0a47e/200310-1.png 600w,
/static/f3c45be3f9692e37f32d3caa1828e015/bcb8c/200310-1.png 879w&quot;
        sizes=&quot;(max-width: 879px) 100vw, 879px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;기본적으로 Spring은 모든 bean을 singleton으로 생성하여 관리한다!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 800px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAACWUlEQVQoz1WSy2/TQBDGt4j/ilOPQMWNG6q4cgFVCAQStJdy4cqFwg0hoFRQISCCc+mL5v2onUft+JEmjp3E6zh+pM58bE1bwUg/fbuzmt2ZnWE+t2mgFWhkFMkVpGoWiRs58qwmxdMpue6I+v0+OY5DlmUJHdJgMBBqX/h936fJZELMLn+k2lOGyjJDbYUh+5gh/4Sh8IDBfDePU3P6DmS5Dq2tC22gJmehGzp0zUS9UYeiKJhOpxCXgrnaPhmbt9D9ukjWt0XqfFkkdfM2tTdukr37nPxkQNNkSMCMZhTRMKqSFyvkBCUKk77wI2VGRHEcE3ONAumZe2hnlsj4sQT1+xI6P+/jOHMHo/xrhDMfk7gDHqmw/G0RHaRZz2iMUVgR6uPcTkSWzC59IEmUKC0zOhSl5x8x7D1k2L/LoL25Ap7Y8CMTXlxHxdxCTuni4KiJPUnBtryHndY2SloPJcOE7bpgvNcgc+cl+r/XaJhbg51dwzD/CsODF+DNDGbi5WQWYxyr0Ee7GIcEHkTwQ6Djyuh5CrwwEb4AkyAEc6qfqf6Mobp6iWqrc8guz+Fg5TJyojnm+jW4SVcEtBCeDOBGcpppIsqcTHW4YRX/2mlj2Ej5Rdr7q+huXCfr0wIdbyyQvn6D9Lfz5GytEJ19+jnBSZ941CI/NsUZ/XeWNmU8iUjrchQP26irFmSlJ+ii2jBRlVU0m01IkoRyuYxKpYxm4whHLRXVioRSqYxarYZCoZCOTiDKZmEY0JiPUjwBd4epevxMPS+Fc3625hf7v3hi8N10sKMooj8+pb7ws67xXgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%201.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%201.png&quot;
        src=&quot;/static/d9c3452d3e371d6444d344de27a52049/5a190/200310-2.png&quot;
        srcset=&quot;/static/d9c3452d3e371d6444d344de27a52049/5a46d/200310-2.png 300w,
/static/d9c3452d3e371d6444d344de27a52049/0a47e/200310-2.png 600w,
/static/d9c3452d3e371d6444d344de27a52049/5a190/200310-2.png 800w&quot;
        sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Singleton: 하나의 bean 정의에 대해, 하나의 객체만 존재한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 800px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAACRUlEQVQoz32SS2/TQBSF528hsYIdUsU/YIGQCpQFYoN4S+UHsIANZYVAQHkIiVCQEEIqj9IoCaR5OA8ndZynHSdx7MR2HDfnME5ZgeBK38wZ3dHMPbpXTMcmRtp32I1djPXd5e40k3Aa3+AaCoLZDP2+CcPowepbsKwBTNNcMhgM5NmSOQOu68L3fQhrbxOFa4K564LFG4Kpy5IrgulLgp3HRxmRrKs1lktV1mo1qrUKK5WqpMxGo0FN06goCh3HoXyQYtxMo5U4Q+P9KkxJd2sVeuIc9NenMEjewThswos0zCArCjIwvR3IP/5CLgjDEMJuZuQDZ6kl1tB8u8b9N+fZeneBncRpDlN3uYhvLyLOIoeTsE47yPBfcRBFFFZuE2VptXRLQMKfVwWT0nbyoqD+8Ag9TDn0Cux7X6h0c/xcbfNTUeHHfHHJtrS/s9/gbrPD3simcAwVrZ37NFMbGGY22E9tcPjjAUfpe3SqW5wjoBf2ZGV56iOVuU6deb0laTLX0FnqGlStAauSoevKCvOvULktmF8XKKzLZsSNkaRlla0nxzld2PTDLv15n5aXpDH58H/LtvYV2tMT7L5YQe/lClrPV6A9Ownt0TH0t28iRIT5gYvowMdk1oYdqFgAWCwWh8QacRDz+Rxi4s3QtjyW6gbLmklVt1iqdajUuqzsd7iX3aNSLLFaUVkslCRlqqq0nssxm80uiXW73abneRS+78F1bLjj0eH+h5bzJYfWwXQ6XQ5vrCeTyW/tLvMxcT4IAvwCw2m8jzwsZtUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%202.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%202.png&quot;
        src=&quot;/static/808627c824b850b4ef03a10f6d68a195/5a190/200310-3.png&quot;
        srcset=&quot;/static/808627c824b850b4ef03a10f6d68a195/5a46d/200310-3.png 300w,
/static/808627c824b850b4ef03a10f6d68a195/0a47e/200310-3.png 600w,
/static/808627c824b850b4ef03a10f6d68a195/5a190/200310-3.png 800w&quot;
        sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prototype: 하나의 bean 정의에 대해, 다수의 객체가 존재한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;제어의-역전ioc-inversion-of-control&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%9C%EC%96%B4%EC%9D%98-%EC%97%AD%EC%A0%84ioc-inversion-of-control&quot; aria-label=&quot;제어의 역전ioc inversion of control permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;제어의 역전(IoC, Inversion of Control)&lt;/h2&gt;
&lt;p&gt;: 프로그래머가 작성한 코드가 외부 라이브러리의 코드를 호출하는 경우가 아니라, 외부 라이브러리(프레임워크)의 코드가 프로그래머의 코드를 호출하는 것&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프레임워크가 전체 프로그램의 흐름을 결정하게 하자!&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;어떻게 하면 프레임워크가 내 코드를 호출하게 할 수 있을까?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프레임워크의 interface, abstract를 구현한 후 프레임 워크에 넘겨준다&lt;/li&gt;
&lt;li&gt;== 객체를 프레임워크에 주입한다(DI)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;의존성-주입di-dependency-injection&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85di-dependency-injection&quot; aria-label=&quot;의존성 주입di dependency injection permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;의존성 주입(DI, Dependency Injection)&lt;/h2&gt;
&lt;p&gt;:의존성+주입+의존성 분리&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/@jang.wangsu/di-dependency-injection-%EC%9D%B4%EB%9E%80-1b12fdefec4f&quot;&gt;[DI] Dependency Injection 이란?&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;의존성: A클래스 내부에서 B클래스 변수로 사용한다? → A클래스는 B클래스에 의존한다&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;주입: 외부에서 객체를 생성해서 넣어주는 것&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;생성자 주입&lt;/li&gt;
&lt;li&gt;Setter 주입&lt;/li&gt;
&lt;li&gt;인터페이스 주입&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;의존성 분리: SOLID의 ‘D’에 의거, interface를 이용하여 상위 계층이 하위 계층에 의존하는 상황에서 하위 계층의 구현으로 부터 독립됨&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;제어의 주체를 interface가 갖게된다 ⇒ IoC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;의존성 주입의 의의&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;의존관계의 설정이 컴파일 단계가 아닌 실행 단계에서 이루어져 모듈들 간의 결합도를 낮춤&lt;/li&gt;
&lt;li&gt;코드 재사용성을 높임&lt;/li&gt;
&lt;li&gt;Mock 등을 이용한 Unit Testing의 편의성을 높여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;관점지향-프로그래밍aop-aspect-oriented-programming&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B4%80%EC%A0%90%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8Daop-aspect-oriented-programming&quot; aria-label=&quot;관점지향 프로그래밍aop aspect oriented programming permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;관점지향 프로그래밍(AOP, Aspect-Oriented Programming)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://jojoldu.tistory.com/71&quot;&gt;AOP 정리 (3)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 443px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 112.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAAACXBIWXMAAAsSAAALEgHS3X78AAAEMklEQVQ4y51VzU9cVRR//4DRnWmraSouSGONiTHRVQ0ujCsTY5dGN9ZEk25sooadRAPVdKMBWygM/bAUmiIsqAzNAIWZgQIjQ0lTOkwV5vt9v5l532/m57l3mLFWbKI3+eV+nHt+97x7z/k9oVw2IEkiVFWBoigQRRG6poE113UhlkpQFRWKLFOv8N73fXiex/c2/OQGyCaoqopsNotCocA35PN5yGRgzbZtZDIZbisRMbPlcjl+kOM4yJFfntmKJW5nEERJxsJCDJOTU5hfiOL24hKyuQIndMgxeXcDN2emMROJIDI/h0QyiSAIOGly4y6mfg0jPBPBYmwJD1JpCOZvfagPPA38fAS4Qhh4Clbs6wZhPgP95ZfgPn8I1pHDcJ87iOqrr8A2HTj6DrTQUVihw6iE2mBeOAhj9E0I4fg6Pukewukfr3Gc7A7hRmSZE5qagd3QGEqDYyiGrqN0YRT5y+NwbBeuqcFInIOz8RPsjfNwkr2obF6GsDp0E71tHyH02imO3hc+RPTsKCe0DAniwucoRz+DHj0FI/oplNiX8FwTsuHizC8Kuieq6Jko45vxCvqmdQiVsRHYHW/Af+8dDqfjdZQHehuPohWQH3kX6shbkEfehnq1A6Xr78NzqhA1C52D9/DF4Da+GkrhdH8KPSPbROgHKNUBCQ2wsUFrrPl0+XKlBtUCdAdQTEAlBEENtcCnz1bh2xp8S+O9Z1GEaLZ6vYHW9K8x6gGKhVxzgic1gTnuh0dJPUqRzc1NPq7Vavg3HwbhSac1CVllpNPpf0b+fyM0DAPDw8O83Jrr/znCRyNhRNFodP/7fTzCSqXCRUEjQWB1zcZlioi1arXK13Vd52PWs/3NQ5p+zZ5BYJOdnR1SHIkbmFCIksSdmnMmFgxMGERRagnH7u4uFwe2r1gscvHghInVNYSnw4gvxbGyssKNnJBIEok13JoJYzEaw+2FRa4ovM5Jbba27iMyN4vZyCxWiYMdwAl3KUI2yVA0mUy25cRsOb6W4ZGyCCRJ+pu0ZbMZ7suiZxA8z6U8sxH4LnzPgWtb1Lt7UbjkSGueT1LmwbJsvsYalzAiDShHfYJHYzYXamQUNQei7kKp+JDKPiqWv/dmNWhyHqqUg64UUVZKdLjVelGdSItEovgeZDpUIWLBLN1HYqILkYudWJvswb3wWeS3GinyR07D4I076L06h9D4HYzd2sLmduM6gqqJVH8/5js7Ee/qwsaZ75C+dAlCdf086hefBcaOAtfa4fY/g0r8W+40tVzCBz9IOHlOxsd9Ik58n8eVSIPQevg77GPHgLYXgfZ2BAcOwDp+HIJNd7ZOL7kUjyG9/QA2v8NGRVgW2daTSKW2Ye/dp+f7rU82KG9Xl5f4ryAgH36HLOlZaamqRk7OY9VSA/srOo69bxUFJBS6Qclumi3bn3r1hb2xjS86AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%203.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%203.png&quot;
        src=&quot;/static/9e6d5376c0525396fdc122f57d64e229/a120c/200310-4.png&quot;
        srcset=&quot;/static/9e6d5376c0525396fdc122f57d64e229/5a46d/200310-4.png 300w,
/static/9e6d5376c0525396fdc122f57d64e229/a120c/200310-4.png 443w&quot;
        sizes=&quot;(max-width: 443px) 100vw, 443px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ClassA, B, C들에 반복 사용되는 흩어진 관심사(Crosscutting Concerns)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.notion.so/cross-cutting-concern-dc633923985044829ba5eac8f837b611&quot;&gt;cross-cutting concern&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;흩어진 관심사를 관점(Aspect)로 모듈화하여, 비즈니스 로직 내에서 재사용하자!&lt;/li&gt;
&lt;li&gt;OOP는 상속, 위임으로 공통된 기능을 재사용하지만, 전체 애플리케이션 여기저기서 사용되는 부가기능들을 처리하는 데에는 한계가 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.notion.so/Copy-of-Annotation-beade0b2883947589fb939eb46c74310&quot;&gt;Copy of Annotation&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;spring-모듈&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#spring-%EB%AA%A8%EB%93%88&quot; aria-label=&quot;spring 모듈 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Spring 모듈&lt;/h1&gt;
&lt;p&gt;: Spring Framework는 20여개의 모듈로 구성된다&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 579px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 77.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsSAAALEgHS3X78AAADpklEQVQ4y1WS+U9aWRzF/Z9nktmSNo1bq1W0UpFFoOzgAs8FUJTHAx6oD5BNBVFkccOFtmpbpyb9zMNpMpkfTs655/vNyc09ty9cDDC49iuT0is04ksm4q8Y23yBLjOEpTKGaW8EQ/k1xtJrDIUhFcOYSm/+nf30jKqnLw0yX7LSZ9kdZ1LUM+NdZdzlQuN0M+Fwq+zkndfJrBDGLHvQnNixdBVM10m0J2u8lGbRtjYxXMvM3ipMNO0MJ36hz1nWMp9OU46COF9la/WSlPiNUOQCz0KJdBJC8h7mjkIYEL7cYWs2MNaqOOqHhB4/E/nxgw+3Gd4mf6fPUZrCJYuUtr4Ti5RQkqfsbD+S2OmwLlVRlL9ZSuUwtCWkL0/4KlVij98Jfe1Qv9kiu7dM624P63mU0efA8hTuuIjSuCdwnGTzrEa2+I3WvkI+NcfpQYtAsoDxNEb05pqN8zqR6zMC9x1y5/vstorsdk4wX0g/A9UbeuQ41Z0nDnYapDcqpFYOKUWKtLeqtLbvEVJlXG2Rh5MM9cQCnxtpNm+v6KbPaSznecjfY28nGJHVQKcaOJsKUkx0OUrUSQoKol9GEjIcxOvk4ze4UzLTrSDSdQXxLIPYKeLrNhGPa0jVClKjja4dZvQ5cE+HMdZPKOhACFtYjdjxhyysrNtY6p2DNpwbY1gUDV7FzlzWgSWvx1w14ap71GJcOI+8GKuTvJX/oM+2N000MMFX+wZd1ypXNoGsxsi5NcBHd5BHb5Si304u5aGw6KUw7yUnuwgX3ci5IGImQEJZJVRzMZpSA91lPSOH/egaRt6f6NQ/pkPfMDDdmGGq9p4BeZBhZZj+7QEG0kNo6+pOW8f0qZ7pM6PKBnTns2iORxmT/+y9oR7npZ3sww7yJ4mde5n1LyLp+yRyV2LjaBWhuYxwJBCuLCHfxkg9JFm/i5K8Fkl2Y2x9lPFcedVS1EBrWUe8uQDNKsfpdejUOL7chqsqNyUZLmt0bvN8ui3xUFG4yEo8XR1QO0tzJAaJuE1cpCViF8sMpdRSXGUDM7UR1poegk3HM9xtC0LDpmonwYaD+bYNf9tOSNUh1ROaNjzqjr9qxp7XqmzB1HintvxXr+UpxoNWbJ4DzL4sFl+OD75dlXcxe3NY5wpozZtMmiLPuuf1Zr0d63we+2IBu2+fqRUfo+nf6PMWjbwJjjHrD6IPLGII+FX+D4ZAAO2chymfW9XC/2Z6fw+LGBeX0YSm0cRf8A/IZL96CJ80zQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%204.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%204.png&quot;
        src=&quot;/static/155bbdda69c78be5482d1e6c637dc31e/c08bc/200310-5.png&quot;
        srcset=&quot;/static/155bbdda69c78be5482d1e6c637dc31e/5a46d/200310-5.png 300w,
/static/155bbdda69c78be5482d1e6c637dc31e/c08bc/200310-5.png 579w&quot;
        sizes=&quot;(max-width: 579px) 100vw, 579px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;⇒ 경량성을 강조하던 프레임워크였으나 점차 무거워지기 시작&lt;/p&gt;
&lt;p&gt;⇒ 필요한 라이브러리만 추가하면 되나, 어떤 라이브러리를 추가해야 할지 알기 어렵다…!!&lt;/p&gt;
&lt;p&gt;⇒ Spring-Boot 탄생&lt;/p&gt;
&lt;h1 id=&quot;spring-boot&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#spring-boot&quot; aria-label=&quot;spring boot permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Spring Boot&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;자주 사용하는 Spring 하위 모듈을 미리 모아놓음&lt;/p&gt;
&lt;p&gt;ex) spring-boot-starter-web을 Gradle 설정만 해주면 관련 라이브러리를 받아옴&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;필요한 설정을 자동으로 수행함&lt;/p&gt;
&lt;p&gt;ex) @SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Tomcat 내장서버를 포함하고 있다&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;springmvc&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#springmvc&quot; aria-label=&quot;springmvc permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SpringMVC&lt;/h1&gt;
&lt;h2 id=&quot;mvc-pattern-front-controller-pattern&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mvc-pattern-front-controller-pattern&quot; aria-label=&quot;mvc pattern front controller pattern permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;MVC pattern, Front-Controller pattern&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Model: 실질적인 비즈니스 로직 동작, 뷰 템플릿에 렌더링할 데이터 관리&lt;/li&gt;
&lt;li&gt;View: 사용자에게 보여줄 화면 관리&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controller: Model과 View 사이의 상호작용 제어&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Front-Controller: 수많은 요청들이 여러 컨트롤러로 분산되기 이전, 모든 요청을 받아 제어하는 가장 앞에 서 있는 컨트롤러 ⇒ 이것을 이용하는 패턴이 Front-Controller Pattern&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAAC0ElEQVQ4y22TS28TZxSG80dYlgUbFv0PSKjsukcCVkgsugNVXbAodANIQJBoQZCi0KTGTTAkIQ6+xYkvE3zB9sSZeMZjj8eX8TiBEECClOTheOKEgBjp1XfVM+ec93xDDL71zbcYXZdar4fpup76c91x0doOWsfxzuu9NczeOquOQ7ndoer25N6ap/U3mwzZr1/jvN0kZ9uEqjViZlvUJSqaNx1m9Sp/LimiNFOrBhFD7uk6d5QCw4k0gWWNaLUu+zU0u8lQrtnihWmRqtSYWzYJroSZLvmYVh8xW35GIKUyOr/CSFhjIqFSX7vOq41TZOo+QkaLeM1isW6TsGwMiXjo3fsPpGIaT4N5bj6Ici/yMzemD3Plvx8YiR/jXiCJ/+9hJm//xvjMc1z3BGvtH9Fr50jUHQ8UrzU8qN4Htl5tkFYqRFJlxmMFxhK/czd0ituzpxlL/spsSWdi5gE+3x88Ka1S7oziblwgYQbxy1nIqLIgsH1gptlkueeQlzEthQ6kNfwCnlJU+XOTuETwcFnnbrHCSO4lYaNDXGo7pVmMZHJMazqLVlOgjV3g+48f2dr6n5eNJkHDYHJJxzd2n8Dln4il54jbXSZLKr5CEV9RJVI1BWAzX6t7ZvTTjR+McGdnx2ubrNXglqLwV3gJfzjDP49DBIolxgoqwUqVVKNF0otkt2Z7ae6t94Gftrc9oNbpMifWP82pPJaWGI/m8RfLjOYLTKgru5EMtAfx5oNxH7jtAXeoSP0WLJfhqYucuXSEs1eOiik+0s11rzXig2gORnhw/AaI1/kLVo+r/vOcvHiIX64dZyIzR1Jq2Ad6KUrKiwfAC99L+QuwS9hsEKqs8KycFbjUy2rJusq/iykeJRVGI/P4U0tiSOMrxQbGVFrtL0BL3qIikeTttsghI05mxfkXsvc8mycqDs+kFELSOv39bP98oP7dnOw15P1/BiH9fHcc/5pkAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%205.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%205.png&quot;
        src=&quot;/static/4356e09c1131fad3171dcd525d520bc4/c1b63/200310-6.png&quot;
        srcset=&quot;/static/4356e09c1131fad3171dcd525d520bc4/5a46d/200310-6.png 300w,
/static/4356e09c1131fad3171dcd525d520bc4/0a47e/200310-6.png 600w,
/static/4356e09c1131fad3171dcd525d520bc4/c1b63/200310-6.png 1200w,
/static/4356e09c1131fad3171dcd525d520bc4/c4842/200310-6.png 1634w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;springmvc-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#springmvc-1&quot; aria-label=&quot;springmvc 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SpringMVC&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAACA0lEQVQ4y3VT2Y7bMAzM//9aHwoUaB6KOHA369hryzosRZePKanAbgK0AghLNDUckqNT0zTo+x7ee9R1jaq64Ha7wTmLec7IKWJZFgzDgPb+iXWJiMEjxljMOYfXdVq35ybFgMiXV9A3w6gO4/0H7HiBEIIA+7Lv6m9Y03AApJRK4jlnrOuKk5VXBNvBugijFZy60mWNe6vhTIu+q3E+n2HthBQ0Jkq0EUuAmazEMqAn9peqgjEGJycrRNtiEBFdKxBMDSVHCkwHi98fH+i6lhhWsOIMpxuo4UoVfIfrr+hbidsQoYzDab8Uo6ey/XNPPfI+HIBKKerzF9Y8YYkKc3IUY6ktX1TFSJVNMDZgsi+APJQdJIRQbF+Z+tM0n9DDL0zDT+qhwF8iqfQx51Ti3gB3kFfAbduKKSURnISRLdbZk28fSjz2Zcr/A+TzDsiL5WGGC1ZfU9kjtoNhpOluR+IDsLCK8Qh6Lfm5NuSokbygKfs32exJC+A8L0W41toiZtaSpebymf3zPJfeZPouJFKOz3kucWyc+A3QTSO0NkVnQpIpmpghvU0Wo5RlwgzOPiEG8k9Fb+zjRDvDo2Qe/wc9tRKwkETMo0yUMy8UrAmUQYgMNOmM99wSBvvXOgkxYhzHAsgspXyeH48HEvu0hqIXNNlIgGR05v97j7mCruuKse8P3Nfuu8Q8u8wAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%206.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%206.png&quot;
        src=&quot;/static/40d0ef49896dba6168e6ce400903316a/c1b63/200310-7.png&quot;
        srcset=&quot;/static/40d0ef49896dba6168e6ce400903316a/5a46d/200310-7.png 300w,
/static/40d0ef49896dba6168e6ce400903316a/0a47e/200310-7.png 600w,
/static/40d0ef49896dba6168e6ce400903316a/c1b63/200310-7.png 1200w,
/static/40d0ef49896dba6168e6ce400903316a/0c3d0/200310-7.png 1414w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;사용자는 인터넷 브라우저를 통해서 웹사이트에 접속한다.&lt;/li&gt;
&lt;li&gt;웹서버(Nginx)는 WAS(Tomcat, servlet container)에 Reverse Proxy 처리를 수행하고, DispatcherServlet에서는 요청을 받는다. ⇒ FrontController의 역할!&lt;/li&gt;
&lt;li&gt;HandlerMapping의 도움을 받아 어떤 Controller에 위임을 할지 결정한다&lt;/li&gt;
&lt;li&gt;HandlerMapping의 도움으로 선택된 Controller에 요청을 보낸다. Controller는 적절한 응답을 모델을 통해 반환한다.&lt;/li&gt;
&lt;li&gt;ViewResolver의 도움을 받아, View이름에 매핑된 View를 반환한다.&lt;/li&gt;
&lt;li&gt;View는 화면을 템플릿 작업을 통해 반환하고, DispatcherServlet에 의해 사용자에게 반환된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;springmvc의-한계와-spring-webflux&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#springmvc%EC%9D%98-%ED%95%9C%EA%B3%84%EC%99%80-spring-webflux&quot; aria-label=&quot;springmvc의 한계와 spring webflux permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SpringMVC의 한계와 Spring WebFlux&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://alwayspr.tistory.com/44&quot;&gt;Spring WebFlux는 어떻게 적은 리소스로 많은 트래픽을 감당할까?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABy0lEQVQoz4VSaU/CQBBdaEtbm2JUQAuValvkEEp3t0AwEUwMiWAgHomJ8Y/41fjHfYNLxMRjkpfZ2bnezg7jQtwBD0BDSHnApfShcwwyGA7ZtkRxzDY+6ErK+fhyMnm/mc/fZrPZK+wBOVbAAxCpwAjFra06OmAAGhnlSmV9iZgjmWUly7YdmLuAidw20zSt57quxIVLgehSRbB53u3mJ9OpYZpmzzCMkW3bp7fLpd7t9XQVd5gNBs0wDONisTiCDtDggrU7HY7kcbPV2lOdq0IIBzpAxzMgxrmpmLeAuoor464BPQIkkMLmNKcX4DkbDhN0dXEpMcdzKgKcwE5UItl1+DqwA5zbyItqtZpfKBS4V60S4zGrB8EF6F57nldWnU+QtLfWQiQAFe8rncBHzDVoGg29gBhmICPWDC3LapZKpQS1dtRsPLgKcNIHkTa2QLam4ipgFB9DUCP1fZ8+aUxPvlVoqF+O0d1mvwiabfQhCviYfx0vDPFZRzQe6rQCnvppGuJiXz05v076ZPkNXO0h7Stii9OrKw17aNw/PlKTiOm63ncch6td+mIi5X8MbWzDMbSvUCN7s7g57Fl+vlgwMM1tJf1Z9Cf5AMSEbEkYVXDqAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%207.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%207.png&quot;
        src=&quot;/static/9d30cf9a095e446c9fbb85eb3412d465/c1b63/200310-8.png&quot;
        srcset=&quot;/static/9d30cf9a095e446c9fbb85eb3412d465/5a46d/200310-8.png 300w,
/static/9d30cf9a095e446c9fbb85eb3412d465/0a47e/200310-8.png 600w,
/static/9d30cf9a095e446c9fbb85eb3412d465/c1b63/200310-8.png 1200w,
/static/9d30cf9a095e446c9fbb85eb3412d465/21b4d/200310-8.png 1280w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tomcat의 default thread size는 200에 불과하다&lt;/li&gt;
&lt;li&gt;200개가 넘는 요청이 동시에 들어오면 남는 요청은 queue에서 대기해야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 599px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAACaUlEQVQoz22Sa1PaQBSG/eX1i3a8jSI3EYjcCQmEIAiK1ioEQiQRRKFeqtbeZqzT//D0iM447fTDu+/u7Nln352zM7lUi1KqQzFlUUxaLy5Sgjts+sypx/zbxAJV4sEayY1djHR3WvN8bqp0Bz1hsV1ymHmGVJI2ZqpHJe1QlrmR6BBbrRBa1IisGISXikRXSiRWyyTXa5jPNVudNyW6GEqHRvGEmYIAV5UWs4EGs1K8oLTx6yNCpTFB/ZyANiJsjPGlT+SgTVlzydtXlPq3GO6d+N3Us61PmCUBqok2a3kXf33A5sGA0K7HRnNAsOGS6FyjWNcEamMW9CEL0TaJjEX9/pH9r09UL79Svf7GwfffmJNvmOX+KzDnEjmckHFu2NgTeLWLr2KxZU2ItyRdZcSKAOcyLr5Um52bn+ze/aLgXKC5E5oPTxijh7+B0eNLCqf35OQpkX1JJ7DC4IF070YuuGBZG/BegIG0xc7VD3ZvH9m7f2JPwE1JbJx9eQP6BBjePyd2dEb0cEio4RBuurIeEflwxvr2OSvakPmshy92RKLmoVT7xE2HeOVkuo6ZLmZRuqxutVhTPaIfx4QbXXmywOq2zHtsNGxJ6xHcmUwTzkvC9WQb1bshstclWG+L2ygfPdLSqLIhTdGlwK9YzKkui/qABe1UGiCuv7rmvaggyg9Y2jwk0xuTtYdke+ekrFNyzoj48Rm6Zr/8w3LcYjH0gXcCno3/I+VN86kTliOHbEmjcs41oVqHSLOP2v8sPkTLd5kpyVAv9KnkeqgZm0K291+pWXu6X8zZ6Pnei9RnOVMvyH6j4vEHb+anXCwEsaQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%208.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%208.png&quot;
        src=&quot;/static/9224b0787eaa8cd054e27203b426e549/43142/200310-9.png&quot;
        srcset=&quot;/static/9224b0787eaa8cd054e27203b426e549/5a46d/200310-9.png 300w,
/static/9224b0787eaa8cd054e27203b426e549/43142/200310-9.png 599w&quot;
        sizes=&quot;(max-width: 599px) 100vw, 599px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;여기 겹쳐있는 스레드 들이 스레드 풀&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;스레드를 만들거나 지우는 일은 cost가 많이 드는 일이다&lt;/li&gt;
&lt;li&gt;스레드도 결국 객체, 빈 객체를 잔뜩 만들어두고 필요한 요청에 맞게 실행할 메소드, 전달받은 파라미터들을 스레드 메모리 공간에 담는 것이 스레드를 할당하는 것이다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스레드들은 힙에 있는 Controller Singleton에 제각각 요청을 날린다&lt;/li&gt;
&lt;li&gt;사실 request들을 처리하는 일에서 가장 많은 시간을 잡아먹는 일은 ‘기다리기’이다&lt;/li&gt;
&lt;li&gt;스레드가 Singleton에 요청을 날리고, 적절한 대답을 받기까지 기다리는 동안 요청들은 큐에서 대기중인 것이다!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 사실 이런 스레드풀의 개념은 앞단(클라이언트 → 서버) 간의 통신 뿐만 아니라, 뒷단(서버→DB)에도 있다 그것이 DB connection pool(DBCP)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 683px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.00000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAAB7ElEQVQoz41STWsTURTNj3MriNJFNwWXIkoXXbgvVNz4CVrEnyDFFjeiLmyLrdEEYkzTfEzTaZKZl2Ty5vt7Jsf7Xk2bNBS8cOByufe8c+59hclkgizLJUQukBP+NyZXegvXNSb0QEOzUOuZEg3dxsAKYHkRoiSFF8YIouRCxBQFy/Hx/lMR219LYNzFwAkxsAOUOwZ004cfpRK6GWC3ruOPOpJQhzYsP5pTKQm55WF57TVWHm2iPzTJLvBTGcEJkwXVotYkpUGSQ9U5GicaVM2YI5WWjxQN5foZDO5INcrQRZIkVO+jeaqjxzjqNBxHsVTuxxnKR6fY+lLC54MavOBSKRGeM/fIkghOO2oxByntab/UxH65iVKtg91fx4iIsMVshGmO9TcfcOPuY9y89xR71Cciy3MUplJdsuOGKSJqrpxxWcvz84vLn0DN0g0dKKORjbc7uP3gOZZWX+Kg0r4kFIm4VlsjW10DHWbie0OH6ccLO9Tpyr/VsczXN7dx6/4z3Hn4AocVZZ5QJII0zTIwuqxquCi2R+hzHx7tVKA39lDtmhfkT959lHaXVl+hWD3552jG8mwEcQpGan4Q6bc6w94xwyHlLc1EtcOgkAuNe7C9UCJOs9mjYOFzXhddw0FNHUIbu7jaNp37C00SOY6h/i4jAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%209.png&quot;
        title=&quot;200524%20Spring%20Framework%206595b24c0efd4514a9f11c421d559691/Untitled%209.png&quot;
        src=&quot;/static/bc140704538704f3811e8cd278624256/bca35/200310-10.png&quot;
        srcset=&quot;/static/bc140704538704f3811e8cd278624256/5a46d/200310-10.png 300w,
/static/bc140704538704f3811e8cd278624256/0a47e/200310-10.png 600w,
/static/bc140704538704f3811e8cd278624256/bca35/200310-10.png 683w&quot;
        sizes=&quot;(max-width: 683px) 100vw, 683px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring WebFlux는 Event Loop를 통해 다수의 요청을 처리한다&lt;/li&gt;
&lt;li&gt;worker thread default size는 서버의 core 개수와 같음&lt;/li&gt;
&lt;li&gt;core가 4개라면 thread도 4개뿐&lt;/li&gt;
&lt;li&gt;그럼에도 불구하고 더 많은 request를 효율적으로 처리할 수 있다&lt;/li&gt;
&lt;li&gt;Spring MVC와 Spring Web Flux의 효율성 차이는 위에서 말한 ‘기다리기’를 줄이는 것이 핵심&lt;/li&gt;
&lt;li&gt;Event Loop에는 수많은 ‘일감’들이 돌고있다&lt;/li&gt;
&lt;li&gt;Worker thread는 이 ‘일감’들을 메인 로직에 던져주고 알아서 처리된 일감들을 Event Loop로 다시 넣게끔 하거나, 처리된 일감을 응답으로 외부에 송출하는 등의 일을 한다&lt;/li&gt;
&lt;li&gt;이 Event Loop는 돌고있는 일감의 개수와 관계없이 계에에에속 돌고 있다 → size가 0인 루프다&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[No title]]></title><description><![CDATA[200525 TCP/IP Tags: Network 용어 Protocol 서로 다른 기기/사용자 간 정보를 주고받을 때, 그 정보의 형식, 순서, 에러 검출 방법 등을 결정하는 규칙 ex) HTTP, FTP, TCP 통신규약 Hosts 통신장비 ex…]]></description><link>https://junbyeol.github.io/network/200525 TCP IP 140a7ab664b342a8b9459cad5d38fe89/</link><guid isPermaLink="false">https://junbyeol.github.io/network/200525 TCP IP 140a7ab664b342a8b9459cad5d38fe89/</guid><content:encoded>&lt;h1 id=&quot;200525-tcpip&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#200525-tcpip&quot; aria-label=&quot;200525 tcpip permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;200525 TCP/IP&lt;/h1&gt;
&lt;p&gt;Tags: Network&lt;/p&gt;
&lt;h1 id=&quot;용어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9A%A9%EC%96%B4&quot; aria-label=&quot;용어 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;용어&lt;/h1&gt;
&lt;h2 id=&quot;protocol&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#protocol&quot; aria-label=&quot;protocol permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Protocol&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;서로 다른 기기/사용자 간 정보를 주고받을 때, 그 정보의 형식, 순서, 에러 검출 방법 등을 결정하는 규칙&lt;/p&gt;
&lt;p&gt;ex) HTTP, FTP, &lt;strong&gt;TCP&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;통신규약&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;hosts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hosts&quot; aria-label=&quot;hosts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hosts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;통신장비&lt;/p&gt;
&lt;p&gt;ex) 공유기에 연결된 내 노트북, 핸드폰, 데스크탑 모두 다 Hosts, 공유기도 Hosts&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;packet&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#packet&quot; aria-label=&quot;packet permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Packet&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;통신할 때 주고 받는 소포(?) 같은 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 28.333333333333332%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABPUlEQVQY04WR2XKCQBBF+f9/Sp5MCk20CjEsCrKojLKFJIBA1JN2ec/DqXt75nZXT41mWRZqn9G0PX0/MAwn+kG0729c/el84fwPl8sdLd7G7FRCnqeUZUZRtezzmqyoSPOKoqw4//ZwGm56OV0Z7ir1+UHXdbeFtJ2zR60y3FWOaads1x8U0Ri1fuNzMyEMXMbLkrdlzmSZoduKFzMWnzJxU3Tpn3kZibyyKEu0YrGgsC22jk1gLgjtKVlsELljsmiKtwp5ev1iNMsxogMjw+P53eJl7svgNboVYcYpXz8N7bFD2yQ68U5nIyg1xk8d7DxiGs5xigjDMwjFq70r2GyTBV4wlY0sEnVHHVy+61r+4YhW1z5NEwoBtdBKfaxXdK1P13ikB5PPypHwmnvWp22vWf+BJ+eB3Lccu54/uVy+ZvtZ6kYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled.png&quot;
        title=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled.png&quot;
        src=&quot;/static/e4213a6a6188d6b44fb58f5e2c780af3/c1b63/Untitled.png&quot;
        srcset=&quot;/static/e4213a6a6188d6b44fb58f5e2c780af3/5a46d/Untitled.png 300w,
/static/e4213a6a6188d6b44fb58f5e2c780af3/0a47e/Untitled.png 600w,
/static/e4213a6a6188d6b44fb58f5e2c780af3/c1b63/Untitled.png 1200w,
/static/e4213a6a6188d6b44fb58f5e2c780af3/d61c2/Untitled.png 1800w,
/static/e4213a6a6188d6b44fb58f5e2c780af3/81ebd/Untitled.png 1868w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;tcpip&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tcpip&quot; aria-label=&quot;tcpip permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TCP/IP&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Transmission Control Protocol/Internet Protocol&lt;/li&gt;
&lt;li&gt;가장 널리 쓰이는 프로토콜&lt;/li&gt;
&lt;li&gt;4계층으로 이루어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1012px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsSAAALEgHS3X78AAAD50lEQVQ4yzWSaUzUBxDF/036oR/6oaZHelkgQVOpBSOngRW5itXWKoq1Eq0IFgQpRxB6pNVauaq1NeDC7oKwu9wgKLAiAlvcBQQLAnJT7gUUWHCxFa/Kr39IOsnLvHnzJplJRlh8uEh/3wBjY+NMGCa4P29iwbTAnHGO5d7S8yWWw2Qy0dPdy+DgEH19/SszszOzK97lmTnjPI8fP0GYMU6jysnkalUFI4Yh6pt1FBTnkZ4pZ3B4gP/DOD8resqpqrlKeeUVrlVruH2nhTp9LercLApL8pidn0b46/Yk6h/qKIjXkxlbS3pUNfnxOorPNFDyWwMZ0bVifYM/q3tRRNVw8RutiBpU3+vIFLks6hrpx6tRRIvaT1qEG6VdHFyfwiGbFHxXn8PPUsoxNwXHXBWEuSvYb5lMiIuc/HNa/FfLOWIp50uzZALM5Rw2kxForiDQQiH2ZByzVSDkFP/Ba2sPsMY+iBde38mLb/my3iWUjVvCsfeI5KV39vKebQB5KbX8uDWfEzvyOPqhjAh7Jad8ClaQ6FdEhJ2SGDclwmV9LxuCVbhE5mLhJ2PdETWuIneNzME9Kpt1ASqco3MoSNUTsiaTMBslwVYKwjeoid2cw3HnbGJcsgmzVhHtokLQDj/gQOVdAqsm2VF6l50aEwFVUwRdn+TodQOflRkJ0BopVjYQZislwkVGiMN5vnZKI8wxVUTaCg+1kxLjLUNon2oiOPdzjqr9+K46gBP6IIKVXxCUuY9DUl++rfEnsS6WypZcIuTeRGd8ysnS3cRp9hKe8jGhv3vzVYKnqO0iqdwfYdRYh/SaExc0Ego7tpLb+hFJBU6cK9nE2aJNpGmdudJxkFsDSrL0m8m64Ulp1zZKu7dzvkxCcoWEX4udyW3xpKJ7P8K/z+oZH/FioH8bPN/Lo799qNdtoU00dLSJeq8Hz56Eik+cjWHMi9Hh7Tx/uoelZ3touukmejxX/A/uf8LTR4cRHs5o6apwpL1cwuwtT1rLnNHlO1KX40CjuGFjsR1D+n1M9lxkul7C3XpPJnTumMRL7tV7MCnyKb0HC63uGBp8EBaHa2hLsKY53o4ZpYS+8440nt5IY9wybGlPsmFUvZup1gwMRY4YLrkyr3GjPcOJBqk9nVmbuJnqQKvclpnKnQgPNJfRv/syTWvfYHTdmxit36bSYhUV5qu4ZPYKhvdfZURiz7guhdFCK0YKNmKsELfOs6FF/gG9amt6VNYMqK24d9UL4Z++HnrjTtL/SxzjZ+OZOBNPd8JpOhN+pivxNKOJpzBILzAz2IyxM43ZDgUTrWkilzPXpVjJxk4x35Ex2a7kP0pdC9IgaCO4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled%201.png&quot;
        title=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled%201.png&quot;
        src=&quot;/static/277be1d5b3ca3c666196e7d50be6a81f/ad997/Untitled%201.png&quot;
        srcset=&quot;/static/277be1d5b3ca3c666196e7d50be6a81f/5a46d/Untitled%201.png 300w,
/static/277be1d5b3ca3c666196e7d50be6a81f/0a47e/Untitled%201.png 600w,
/static/277be1d5b3ca3c666196e7d50be6a81f/ad997/Untitled%201.png 1012w&quot;
        sizes=&quot;(max-width: 1012px) 100vw, 1012px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;encapsulation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#encapsulation&quot; aria-label=&quot;encapsulation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Encapsulation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;캡슐화 - 각 단계에서 담아야 할 새로운 정보들을 기존 패킷에 추가하고(감싸고) 하위 계층으로 넘겨줌&lt;/li&gt;
&lt;li&gt;Decapsulation - 각 단계에서 필요한 정보만 추출하고 패킷에서 해당 정보를 삭제한 다음(벗기고) 상위 계층으로 넘겨줌&lt;/li&gt;
&lt;li&gt;각 계층은 다른 계층에서 일어나는 일을 신경쓰지 않아도 되므로 개발에 필요한 로드 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;application-layer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#application-layer&quot; aria-label=&quot;application layer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Application Layer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;웹 브라우저 - 서버 HTTP&lt;/li&gt;
&lt;li&gt;파일 전송 FTP&lt;/li&gt;
&lt;li&gt;메일 수신/발신 SMTP, IMAP, POP&lt;/li&gt;
&lt;li&gt;도메인 주소 해석 DNS&lt;/li&gt;
&lt;li&gt;암호화된 원격 Shell 접속 SSH&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;transfer-layer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#transfer-layer&quot; aria-label=&quot;transfer layer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Transfer Layer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;두 호스트 간의 통신 방식을 정의&lt;/li&gt;
&lt;li&gt;TCP/UDP가 여기에 속함&lt;/li&gt;
&lt;li&gt;TCP : initialization이 필요하나 신뢰성 있는 전송&lt;/li&gt;
&lt;li&gt;UDP : 간단하지만 패킷 손상/손실 가능성&lt;/li&gt;
&lt;li&gt;TCP와 UDP의 포트는 프로세스에 할당됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;internet-layer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#internet-layer&quot; aria-label=&quot;internet layer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Internet Layer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;패킷을 어떻게 보낼 것인지 결정&lt;/li&gt;
&lt;li&gt;IPv4, IPv6&lt;/li&gt;
&lt;li&gt;라우터는 IP를 기반으로 패킷을 라우팅한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;network-access-layer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#network-access-layer&quot; aria-label=&quot;network access layer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Network Access Layer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;네트워크 상의 기기들을 위한 규약&lt;/li&gt;
&lt;li&gt;Ethernet&lt;/li&gt;
&lt;li&gt;MAC 주소를 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;로컬-네트워크에서-일어나는-일&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A1%9C%EC%BB%AC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EC%97%90%EC%84%9C-%EC%9D%BC%EC%96%B4%EB%82%98%EB%8A%94-%EC%9D%BC&quot; aria-label=&quot;로컬 네트워크에서 일어나는 일 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;로컬 네트워크에서 일어나는 일&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABVElEQVQoz52RSa6CQBRFa48uxIHrYAMuwakTDQOjGLuoUw0BDfZ9EyEgCvfnvgTC78jPf8kJVNWtW69Rx+MR/+V0OuF6veJ8Pqd7Cn+MOI6/EUUR9vs97vd7qlM/CRMY7/cbnufh+XwiCIIUrpndZrPBcDiEbdv5howwDOUiM8kLaogY5gnZE9M04TjOrxo+xuxSQ9af5Xa7SYnL5RKj0QiVSgX1el3ELPHxeMi567pSOs0KhYI8LoaXywUJnBa/zKhcLqNUKqFYLELTNDnb7XYy2cPhIMNg/3zfR6PRkH0xfL1eSGDPWAIPx+MxarUaqtWqZGgYhmiS6RL+fx2U4itZttst1us15vM5VqsVptOp9LHX68l3NptJmcSyLLkzmUxkf7FYQHGRR2LIfrbbbXQ6nZRmsyn7rKLVakHXdaisIA9m2O/3PzEYDKQVbAnNu90uPgDfnC2vPwbTNQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled%202.png&quot;
        title=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled%202.png&quot;
        src=&quot;/static/421ea9cdc6ad06e4258e5a1007cb8e38/c1b63/Untitled%202.png&quot;
        srcset=&quot;/static/421ea9cdc6ad06e4258e5a1007cb8e38/5a46d/Untitled%202.png 300w,
/static/421ea9cdc6ad06e4258e5a1007cb8e38/0a47e/Untitled%202.png 600w,
/static/421ea9cdc6ad06e4258e5a1007cb8e38/c1b63/Untitled%202.png 1200w,
/static/421ea9cdc6ad06e4258e5a1007cb8e38/d61c2/Untitled%202.png 1800w,
/static/421ea9cdc6ad06e4258e5a1007cb8e38/97a96/Untitled%202.png 2400w,
/static/421ea9cdc6ad06e4258e5a1007cb8e38/42267/Untitled%202.png 2670w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;공유기router&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B3%B5%EC%9C%A0%EA%B8%B0router&quot; aria-label=&quot;공유기router permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;공유기(Router)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;우리 집에 인터넷에 연결하고 싶은 Hosts가 3개가 있음&lt;/li&gt;
&lt;li&gt;하나의 Public IP를 할당받아 인터넷과 연결&lt;/li&gt;
&lt;li&gt;내부의 Hosts들이 인터넷과 연결할 수 있도록 도와주는 놈!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;59666238public-ip&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#59666238public-ip&quot; aria-label=&quot;59666238public ip permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;59.6.66.238(Public IP)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WAN(Wide Area Network)과 이어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;새로운-host가-공유기와-연결하는-과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%83%88%EB%A1%9C%EC%9A%B4-host%EA%B0%80-%EA%B3%B5%EC%9C%A0%EA%B8%B0%EC%99%80-%EC%97%B0%EA%B2%B0%ED%95%98%EB%8A%94-%EA%B3%BC%EC%A0%95&quot; aria-label=&quot;새로운 host가 공유기와 연결하는 과정 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;새로운 Host가 공유기와 연결하는 과정&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;모든 통신장비 고유의 번호인 MAC 주소로 소통!&lt;/li&gt;
&lt;li&gt;그리고 이에 관련된 가장 널리 쓰이는 규약이 DHCP(Dynamic Host Configuration Protocol)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 23.666666666666668%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAArElEQVQY012QCQ6EIAxFvf9FQaUsAgpq0vFXa8yYvPzWlm6DMYZLKbxtG9daRdd1FW2tce9dfM2BDXIuF1n+fb/BWsspJSYi9t6/hBA4xsTLsoiNuHNO8Jd/x6PEARpAB0z4LUbkJRHgEZqFECWHJE7ycN93mR5gk9Y6H8dxF8Q6GP8fPQHiKKwaL9IDtlD7PM+7INaYponneRa14/j6uiZOAzQfzXDL+txU/R9lkn6MtaO1lwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled%203.png&quot;
        title=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled%203.png&quot;
        src=&quot;/static/0422728c5cf3044cf814b8283971742e/c1b63/Untitled%203.png&quot;
        srcset=&quot;/static/0422728c5cf3044cf814b8283971742e/5a46d/Untitled%203.png 300w,
/static/0422728c5cf3044cf814b8283971742e/0a47e/Untitled%203.png 600w,
/static/0422728c5cf3044cf814b8283971742e/c1b63/Untitled%203.png 1200w,
/static/0422728c5cf3044cf814b8283971742e/d61c2/Untitled%203.png 1800w,
/static/0422728c5cf3044cf814b8283971742e/97a96/Untitled%203.png 2400w,
/static/0422728c5cf3044cf814b8283971742e/d5ef8/Untitled%203.png 2462w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;이 때, 공유기는 Hosts 하나에 고정된 IP를 할당할수도&lt;/p&gt;
&lt;p&gt;→ Dynamic IP address&lt;/p&gt;
&lt;p&gt;매번 그때그때 새로운 IP를 할당할수도 있다&lt;/p&gt;
&lt;p&gt;→ Static IP address&lt;/p&gt;
&lt;h2 id=&quot;hosts가-client로써-인터넷과-소통하는-과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hosts%EA%B0%80-client%EB%A1%9C%EC%8D%A8-%EC%9D%B8%ED%84%B0%EB%84%B7%EA%B3%BC-%EC%86%8C%ED%86%B5%ED%95%98%EB%8A%94-%EA%B3%BC%EC%A0%95&quot; aria-label=&quot;hosts가 client로써 인터넷과 소통하는 과정 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hosts가 Client로써 인터넷과 소통하는 과정&lt;/h2&gt;
&lt;p&gt;private IP와 public IP를 전환해주는 과정이 NAT(network address translation)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hosts가 공유기에 192.168.0.4:80를 통해 요청을 보냄&lt;/li&gt;
&lt;li&gt;공유기가 Public IP를 통해 Server로 요청을 대신 보냄&lt;/li&gt;
&lt;li&gt;Server는 Public IP인 59.6.66.238:80으로 응답함&lt;/li&gt;
&lt;li&gt;공유기는 이를 192.168.0.4:80으로 전환하여 Hosts에게 응답함&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;hosts가-server가-되려면&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hosts%EA%B0%80-server%EA%B0%80-%EB%90%98%EB%A0%A4%EB%A9%B4&quot; aria-label=&quot;hosts가 server가 되려면 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hosts가 Server가 되려면?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;외부에서는 공유기의 public IP만 알고 있으므로, 특정 Hosts를 찾아갈수가 없다!&lt;/li&gt;
&lt;li&gt;공유기 차원에서 하나의 포트를 정해서 “이 포트로 들어오는 요청들은 이 Hosts의 이 포트로 연결해주면 되겠다!” 가 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 포트포워딩!&lt;/p&gt;
&lt;h1 id=&quot;ipv4&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ipv4&quot; aria-label=&quot;ipv4 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;IPv4&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;IPv4 : IP주소를 32비트로 나타냄 → 약 42억개&lt;/li&gt;
&lt;li&gt;IPv6 : IP주소를 128비트로 나타냄 → 지구상의 모래알보다 많다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ip-클래스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ip-%ED%81%B4%EB%9E%98%EC%8A%A4&quot; aria-label=&quot;ip 클래스 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;IP 클래스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IP의 앞부분은 네트워크 영역(서브넷, 지역), 뒷부분은 호스트 주소(상세 주소)를 가리킨다!&lt;/p&gt;
&lt;p&gt;ex) 카이스트의 네트워크는 143.248.35.xx 다!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;네트워크 영역에 몇 비트를 할당할지가 클래스!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 828px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAABt0lEQVQozzVS2XarMBDj//+tTSALJCELAQzG7AGy9EHVTO998MFmpLGksTfNC8bHDGMsbFXj8VgwjBOsrfXcdgNrJeq601rlGpjCKmYYZ7i6RWmdYqZpgVc3PUEd/GCP3f7IJh0JDpttpOd7WmjteLrCNQPic6K10rJR1eJwvGC13uDrO2DzHt4pvuB7FSBJDXKqTO45rreM+wq3JEew2SM6xGxsdO8Hu7+12en/a5JRQIWMXFHuVa6m3AJ9P2BenpgZwYMRyLfreoJKFFxN21G940UFsixHWVo0TacY4U3TDInPc/8ajuMD7/cHr9cbCwGyH4YRBYlCbtlQsNLcGIOKzaVZPwz4fH6U93y+4J3PN7Vwo/QsL5BmhpZTWjcIoxjBNmRmIULa82l5HWyx9rfY7iK1fDhdNA6xLpF5rq55W8WbOT3Tc5qjWni937TUqjrn/tRYW/HMCLiEJ6rFhSgUR88XFQrIFFSWlkiSiiSCaF8ysXwOKfOS3CTrNM1xv6e6JCbJtOali2a4KMeLz1edXsCprdY+5edq4cZpiyWxK7XoeFac2P1vOYxOfE4XRlUqpygdfgHdD5j911I9XQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled%204.png&quot;
        title=&quot;200525%20TCP%20IP%20140a7ab664b342a8b9459cad5d38fe89/Untitled%204.png&quot;
        src=&quot;/static/d60a8c55c3d9661744a8a6c6a0ee1f26/8efc2/Untitled%204.png&quot;
        srcset=&quot;/static/d60a8c55c3d9661744a8a6c6a0ee1f26/5a46d/Untitled%204.png 300w,
/static/d60a8c55c3d9661744a8a6c6a0ee1f26/0a47e/Untitled%204.png 600w,
/static/d60a8c55c3d9661744a8a6c6a0ee1f26/8efc2/Untitled%204.png 828w&quot;
        sizes=&quot;(max-width: 828px) 100vw, 828px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클래스 C는 네트워크 하나에 ip를 254개 밖에 못받고…클래스 B는 충분하긴 하지만 16000개만 받으면 동남&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cidrclassless-inter-domain-routing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cidrclassless-inter-domain-routing&quot; aria-label=&quot;cidrclassless inter domain routing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CIDR(Classless Inter-Domain Routing)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;네트워크 영역으로 사용될 비트의 수를 명시&lt;/li&gt;
&lt;li&gt;143.248.35.11/24&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 143.248.35.11 = 01001111 11110100 00100011 00001011&lt;/p&gt;
&lt;p&gt;→ 255.255.255.0 = 11111111 11111111 11111111 00000000 ← &lt;strong&gt;서브넷 마스크!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;⇒ 앞에 24비트가 네트워크 영역이라는 뜻!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Javascript 표준]]></title><description><![CDATA[이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다. https://wormwlrm…]]></description><link>https://junbyeol.github.io/web/201217-Javascript-표준/</link><guid isPermaLink="false">https://junbyeol.github.io/web/201217-Javascript-표준/</guid><pubDate>Thu, 17 Dec 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://wormwlrm.github.io/2020/08/12/History-of-JavaScript-Modules-and-Bundlers.html&quot;&gt;https://wormwlrm.github.io/2020/08/12/History-of-JavaScript-Modules-and-Bundlers.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ahnheejong.name/articles/ecmascript-tc39/&quot;&gt;https://ahnheejong.name/articles/ecmascript-tc39/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;ecmascript&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ecmascript&quot; aria-label=&quot;ecmascript permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ECMAScript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1990년대 중반, Netscape Navigator가 브라우저에 동적인 부분을 더하기 위해 개발&lt;/li&gt;
&lt;li&gt;1996년, Microsoft가 상표권 이슈를 피하기 위해 JScript라는 자바스크립트의 방언을 개발&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;이들이 찾아간 곳은 ECMA 인터내셔널(Ecma International)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;정보와 통신 시스템을 위한 국제적 표준화 기구&lt;/li&gt;
&lt;li&gt;ASCII 코드, CD-ROM 볼륨, JSON 등 온갖 표준을 책임지고 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이들간의 합의 끝에 ECMA-262(ECMAScript 언어 표준)이라는 표준이 탄생하고, 이를 ECMA 인터네셔널의 산하 위원회, TC39(Technical Committee 39)가 관리하게 된다&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2020년 6월까지 ECMA-262의 개정판이 11판 까지 나왔다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개정 연도에 따라 ECMAScript 2015 혹은 ES2015로 불리는 것.&lt;/li&gt;
&lt;li&gt;또한, 몇번째 개정판인지에 따라 ES6라고 불리기도 한다.&lt;/li&gt;
&lt;li&gt;즉, 2015년에 나온 6번째 개정판이 ES6 == ES2015&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;즉, ECMAScript가 사양이라면, Javascript는 그 구현체.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;javascript-모듈화&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#javascript-%EB%AA%A8%EB%93%88%ED%99%94&quot; aria-label=&quot;javascript 모듈화 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Javascript 모듈화&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;원래 자바스크립트는 모듈화가 없었다&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/src/foo.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/src/bar.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/src/baz.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/src/qux.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/src/quux.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;그래서 여러 js 파일들을 일일이 &lt;script&gt;로 가져와야 하는데, 이는 큰 문제가 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;모든 변수들이 전역 컨텍스트에 담긴다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이름이 같은 두 변수가 있다면.. js 파일 호출 순서에 따라 덮어쓰기가 돼버린다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이를 어떻게 해결해야 하는가? 해결방법은 크게 ES6 전과 후로 나뉜다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;es6-이전의-js-모듈화&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#es6-%EC%9D%B4%EC%A0%84%EC%9D%98-js-%EB%AA%A8%EB%93%88%ED%99%94&quot; aria-label=&quot;es6 이전의 js 모듈화 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ES6 이전의 js 모듈화&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CommonJS, AMD 등 확장된 Syntax를 지원하는 일종의 애드온을 활용했다&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;
💡 CommonJS, AMD는 사실 명세일 뿐. 구현체는 따로 있어야 한다. 이 구현체를 우리는 모듈 로더(Module Loader)라고 부른다. AMD의 대표적인 모듈 로더는 RequireJS.
&lt;/aside&gt;
&lt;ul&gt;
&lt;li&gt;물론, CommonJS나 AMD를 지원하지 않는 브라우저/엔진 이라면 활용 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;commonjs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#commonjs&quot; aria-label=&quot;commonjs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CommonJS&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// CommonJS&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 모듈 정의&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; foo&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 모듈 사용&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; foo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;./foo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;동기적인 모듈 호출이 특징&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;동기 코드라 직관적&lt;/li&gt;
&lt;li&gt;지금까지도 NodeJS가 이를 채택하고 사용중&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;비동기보다 느리다&lt;/li&gt;
&lt;li&gt;트리쉐이킹(tree shaking, 임포트 되었지만, 실제로 사용되지 않는 코드를 찾는 최적화 기술)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;동기적으로 작동하여, 브라우저에서는 사용할 수 없다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CommonJS 방식을 브라우저에서 사용하기위한 빌드도구 Browserify도 등장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;amdasynchronous-module-definition&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#amdasynchronous-module-definition&quot; aria-label=&quot;amdasynchronous module definition permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;AMD(Asynchronous Module Definition)&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//AMD&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//모듈 정의&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;defineModule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;util&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token function-variable function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
        &lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function-variable function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//모듈 사용&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; util &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;loadModule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;util&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
util&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;//todo&quot;&gt;//todo&lt;/a&gt; AMD 신택스&lt;/p&gt;
&lt;h2 id=&quot;es6의-모듈화&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#es6%EC%9D%98-%EB%AA%A8%EB%93%88%ED%99%94&quot; aria-label=&quot;es6의 모듈화 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ES6의 모듈화&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ES6에서 드디어 자바스크립트가 모듈화를 지원!&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// ES6&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; foo &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bar&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; qux&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;동기/비동기 로드를 모두 지원&lt;/li&gt;
&lt;li&gt;간단한 문법&lt;/li&gt;
&lt;li&gt;실제 객체/함수를 바인딩하기에 순환 참조 관리가 편리&lt;/li&gt;
&lt;li&gt;코드 정적 분석(코드를 실행하지 않기 전에 하는 분석)이 가능하여, 트리 쉐이킹이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;비교적 최근에 정의된 문법이라 구형 브라우저가 구현하지 않을 수 있음&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;그래서 CommonJS, AMD, ES6를 모두 지원하는 SystemJS가 나오기도..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;트랜스파일러&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8C%8C%EC%9D%BC%EB%9F%AC&quot; aria-label=&quot;트랜스파일러 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;트랜스파일러&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ES6 문법으로 일단 js 코드를 작성&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;트랜스파일러가 이 코드를 옛날 js코드로 바꿔주면 구형 브라우저에서도 쓸 수 있다!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가장 유명한 트랜스파일러가 바벨(babel)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;트랜스파일러가 있으면 꼭 js로 짤 필요도 없지!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TypeScript, CoffeeScript 같은 자바스크립트의 슈퍼셋 언어로 코드를 작성하자!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[함수형 프로그래밍]]></title><description><![CDATA[…]]></description><link>https://junbyeol.github.io/language/201123-함수형-프로그래밍/</link><guid isPermaLink="false">https://junbyeol.github.io/language/201123-함수형-프로그래밍/</guid><pubDate>Mon, 23 Nov 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://sungjk.github.io/2017/07/17/fp.html&quot;&gt;번역 - 함수형 프로그래밍이란 무엇인가?&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;함수형-프로그래밍이란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80&quot; aria-label=&quot;함수형 프로그래밍이란 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;함수형 프로그래밍이란?&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;순수함수(pure function)를 조합하고&lt;/li&gt;
&lt;li&gt;공유 상태(shared state), 변경 가능한 데이터(mutable data)를 피하는 &lt;/li&gt;
&lt;li&gt;선언형(declarative)의 프로그래밍 방법&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;순수-함수pure-function&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%88%9C%EC%88%98-%ED%95%A8%EC%88%98pure-function&quot; aria-label=&quot;순수 함수pure function permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;순수 함수(Pure Function)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;같은 입력이 주어지면, 같은 출력을 반환하고,&lt;/li&gt;
&lt;li&gt;부작용(side effect)가 없다!&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;부작용side-effects&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B6%80%EC%9E%91%EC%9A%A9side-effects&quot; aria-label=&quot;부작용side effects permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;부작용(Side Effects)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;함수 외부의 전역/멤버 변수 값 수&lt;/li&gt;
&lt;li&gt;콘솔에서 로깅&lt;/li&gt;
&lt;li&gt;파일 쓰기 작업 / 외부와 소통&lt;/li&gt;
&lt;li&gt;부작용을 동반한 다른 함수 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;공유-상태shared-state&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B3%B5%EC%9C%A0-%EC%83%81%ED%83%9Cshared-state&quot; aria-label=&quot;공유 상태shared state permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;공유 상태(Shared State)&lt;/h2&gt;
&lt;p&gt;공유하고 있는 범위(scope) 내에 있는 변수, 객체, 메모리 공간&lt;/p&gt;
&lt;h3 id=&quot;공유-상태에-관련된-두가지-문제&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B3%B5%EC%9C%A0-%EC%83%81%ED%83%9C%EC%97%90-%EA%B4%80%EB%A0%A8%EB%90%9C-%EB%91%90%EA%B0%80%EC%A7%80-%EB%AC%B8%EC%A0%9C&quot; aria-label=&quot;공유 상태에 관련된 두가지 문제 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;공유 상태에 관련된 두가지 문제&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;경쟁 조건(race condition)에 관한 문제&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;게임 속 캐릭터 객체가 있다.&lt;/li&gt;
&lt;li&gt;updateAvator()로 프로필 사진을 변경 요청을 서버에 보낸다.&lt;/li&gt;
&lt;li&gt;이 요청을 첫번째로 보내고, 두번째로 또 보냈는데… 두번째 응답이 먼저 도착한다면????&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;함수 호출 순서에 관한 문제&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	val&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;x1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;x2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val &lt;span class=&quot;token operator&quot;&gt;*=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 6&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//만일 호출 순서가 달랐다면?&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⇒ 함수형 프로그래밍스럽게 바꾼다면?&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	val&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;x1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; val&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;x2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; val&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 전역변수 x의 속성 값을 직접 바꾸는 것이 아닌, 아예 새로운 객체를 반환!&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;x2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;x1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 6&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⇒ 이로써 공유상태의 불변성을 유지하는 것이 아주 중요하다!&lt;/p&gt;
&lt;p&gt;⇒ 명령형 흐름 제어 보다는 합성함수를 이용하자!&lt;/p&gt;
&lt;h2 id=&quot;선언형-vs-명령형declarative-vs-imperative&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%A0%EC%96%B8%ED%98%95-vs-%EB%AA%85%EB%A0%B9%ED%98%95declarative-vs-imperative&quot; aria-label=&quot;선언형 vs 명령형declarative vs imperative permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;선언형 vs 명령형(Declarative vs Imperative)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;숫자 배열의 각 원소들을 두 배로 한 새 배열을 반환하는 함수를 각각의 패러다임으로 짜보자&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;명령형&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AA%85%EB%A0%B9%ED%98%95&quot; aria-label=&quot;명령형 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;명령형&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;doubleMap&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;numbers&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; doubled &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; numbers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    doubled&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numbers&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; doubled&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doubleMap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;for, if, switch, throw 등의 구문(statement)을 자주 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;선언형&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%A0%EC%96%B8%ED%98%95&quot; aria-label=&quot;선언형 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;선언형&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;doubleMap&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;numbers&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; numbers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; n  &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doubleMap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// [4, 6, 8]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;표현(expression)에 더 의존한다&lt;/li&gt;
&lt;li&gt;아래 것들이 표현의 예시&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;doubleMap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[타입]]></title><description><![CDATA[…]]></description><link>https://junbyeol.github.io/language/201027-타입/</link><guid isPermaLink="false">https://junbyeol.github.io/language/201027-타입/</guid><pubDate>Tue, 27 Oct 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hjaem.info/articles/kr_19_5&quot;&gt;타입 체계&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;타입-에러&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%83%80%EC%9E%85-%EC%97%90%EB%9F%AC&quot; aria-label=&quot;타입 에러 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;타입 에러&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;에러에는 런타임에러와 컴파일에러 두 종류가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 478px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 101%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAABkElEQVQ4y5VU2Q6CQAzk/z9NEx8MaEIMKKjgCXIoeFAzTWrqCgQ3abrs0Z1Oh1pN05C21+vFfujQZ3HXkgDwMIzL5UK+79PxeKTb7UZpmlJRFLy+XC4pSRJarVa8X9c1RVFEeZ7zXUujkoCHw4Fmsxk5jkPb7ZYvI9jpdCLXdSmOY/bT6ZTnOIdHOKAO9ng8eBGoyrL8pHK/33kP567XKz2fz5+UJcYnYJZlFIYhb+LV0WhEk8mEdrsdz4F6v98zFXhQODOtNWVcgAENOAJ/ghBogVDzLoa1r5S1Nytt7um5Nksf0JXuG22PdwYU2YgsRDaQBjjEmubvJ6B+TaqHAti2zbbZbMjzPC4YHkHBegPqYsgiUEkRNIfy3cXfF0IoXWSzXq8ZDTwGkLcVrzdlyKGqKp4DnRazKY1ehGZDMKXRprVBKZuXujpLX7BO2UAmqCwaAwoEDz7l//4LocgGHWQ+n7NsxuMxe2lRgzjUKem/pe27N+W2brNYLCgIgp/f7K+iQCLoLBjn8/mLr6HBYG//DR01MdYtPAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;위에서부터 1, 2, 3 번 오류&quot;
        title=&quot;위에서부터 1, 2, 3 번 오류&quot;
        src=&quot;/static/c829639602dff13d4a34511ee8c9fb68/50978/201027-1.png&quot;
        srcset=&quot;/static/c829639602dff13d4a34511ee8c9fb68/5a46d/201027-1.png 300w,
/static/c829639602dff13d4a34511ee8c9fb68/50978/201027-1.png 478w&quot;
        sizes=&quot;(max-width: 478px) 100vw, 478px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;위에서부터 1, 2, 3 번 오류&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;이런 에러는 런타임에러라고 볼 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;보통 프로그래머의 의도가 아닌, 실수이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;타입 에러는 런타임 에러의 한 종류이다.&lt;/li&gt;
&lt;li&gt;타입 에러를 정의하려면 타입부터 정의해야 한다.&lt;/li&gt;
&lt;li&gt;타입은 값을 분류한 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;1, 42, 0 , -1 : 정수
λx.x, λx.x 1 : 함수&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;타입 에러는 프로그램 실행 중 기대되는 타입과 실제 들어온 타입이 달라서 생긴 에러이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;위 실패한 에러들을 살펴보자.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1번 오류&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;+&lt;/code&gt; 의 피연산자의 타입은 모두 정수여야 하는데 함수가 들어왔으므로 타입 에러다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2번 오류&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;λx.x 1 이 녀석은 첫 피연산자 자리에 함수가 들어가야 하는데 정수가 들어왔으므로 타입 에러다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3번 오류&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자유 변수 y가 오류의 원인이다&lt;/li&gt;
&lt;li&gt;이는 자유 식별자 오류(free identifier error)이며 타입 오류는 아니다.&lt;/li&gt;
&lt;li&gt;런타임 에러이지만 타입오류는 아닌 오류로는 segmentation fault, ArrayIndexOutOfBoundsException 등이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;타입-체계&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%83%80%EC%9E%85-%EC%B2%B4%EA%B3%84&quot; aria-label=&quot;타입 체계 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;타입 체계&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;우리가 만든 프로그램이 타입 오류를 일으키는지 확인하는 체계&lt;/li&gt;
&lt;li&gt;프로그램을 실행하지 않아도 된다는 점에서 &lt;code class=&quot;language-text&quot;&gt;정적 의미&lt;/code&gt; 라고도 부름&lt;/li&gt;
&lt;li&gt;이 체계를 프로그램으로 구현한 것이 &lt;code class=&quot;language-text&quot;&gt;타입 검사기&lt;/code&gt; 이다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;타입-검사기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%83%80%EC%9E%85-%EA%B2%80%EC%82%AC%EA%B8%B0&quot; aria-label=&quot;타입 검사기 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;타입 검사기&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;어떤 프로그램이 타입오류가 일어난다면 NOT OK, 괜찮다면 OK를 반환&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;아래의 성질을 만족해야 한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;유한한 시간 내로 종료 될것&lt;/li&gt;
&lt;li&gt;OK, NOT OK 둘 중 하나를 결과로 낼 것&lt;/li&gt;
&lt;li&gt;오류가 없어야 할것&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;아래의 성질을 선택적으로 더 가질 수 있다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;타입 완전성(completeness)&lt;/li&gt;
&lt;li&gt;타입 안전성(soundness)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;타입-완전성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%83%80%EC%9E%85-%EC%99%84%EC%A0%84%EC%84%B1&quot; aria-label=&quot;타입 완전성 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;타입 완전성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;타입 오류를 일으키지 않는 모든 프로그램에 OK를 반환한다.&lt;/li&gt;
&lt;li&gt;NOT OK가 반환된 프로그램은 무조건 타입 오류를 일으킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;타입-안전성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%83%80%EC%9E%85-%EC%95%88%EC%A0%84%EC%84%B1&quot; aria-label=&quot;타입 안전성 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;타입 안전성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;타입 오류를 일으키는 모든 프로그램에 NOT OK를 반환한다.&lt;/li&gt;
&lt;li&gt;OK가 반환된 프로그램은 무조건 타입 안전하다!&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;튜링 완전한 언어라면, 완전하면서 안전할 수 없다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;타입-검사&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%83%80%EC%9E%85-%EA%B2%80%EC%82%AC&quot; aria-label=&quot;타입 검사 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;타입 검사&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;일반적으로 컴파일러나 인터프리터의 앞부분이다.&lt;/li&gt;
&lt;li&gt;실행 전에 타입 검사를 수행하는 것을 &lt;code class=&quot;language-text&quot;&gt;정적 타입 검사&lt;/code&gt;라고 한다.&lt;/li&gt;
&lt;li&gt;정적 타입 검사를 수행하는 언어를 &lt;code class=&quot;language-text&quot;&gt;정적 타입 언어&lt;/code&gt;라고 한다.&lt;/li&gt;
&lt;li&gt;실행 중에 타입 검사가 일어나는 &lt;code class=&quot;language-text&quot;&gt;동적 타입 언어&lt;/code&gt;도 있다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;타입 검사의 목적과 상충하는 것으로 보이나 의미가 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;타입 오류가 프로그램의 비정상 종료가 아닌, 비정상 작동을 유발할 경우&lt;/li&gt;
&lt;li&gt;ex) int 대신 float이 들어와 종료는 되지 않지만, 이상한 작동을 한다&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;정적-타입-언어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%95%EC%A0%81-%ED%83%80%EC%9E%85-%EC%96%B8%EC%96%B4&quot; aria-label=&quot;정적 타입 언어 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;정적 타입 언어&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;C, C++, Java, Scala&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;실행 전에 오류를 찾을 수 있다.&lt;/li&gt;
&lt;li&gt;미리 찾은 타입 정보로 최적화를 수행 할 수 있어, 성능 면의 이점까지 챙길 수 있다.&lt;/li&gt;
&lt;li&gt;타입 표시 자체가 주석의 역할을 하기도 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;안전성을 대가로 잃어버린 완전성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;타입 오류를 일으키지 않음에도 프로그램이 NOT OK를 반환할 수 있다&lt;/li&gt;
&lt;li&gt;이를 보완하는 기능이 명시적 타입 변환(explicit type casting)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;불필요한 타입 표시가 많이 필요함&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;타입 추론(type inference)을 통해 보완&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;동적-타입-언어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8F%99%EC%A0%81-%ED%83%80%EC%9E%85-%EC%96%B8%EC%96%B4&quot; aria-label=&quot;동적 타입 언어 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;동적 타입 언어&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;오류의 사전확인이 불가능 → 성능상의 단점&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;대신, 타입 검사기의 불완전함으로 인한 불편이 없다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;대충 만들면 대충 만든대로 돌아가니까 일단 편하다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;점진적-타입gradual-type&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%90%EC%A7%84%EC%A0%81-%ED%83%80%EC%9E%85gradual-type&quot; aria-label=&quot;점진적 타입gradual type permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;점진적 타입(gradual type)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;두 언어의 장점을 모두 취해보자!&lt;/li&gt;
&lt;li&gt;동적 타입 언어인 JavaScript에 타입표시를 추가하여 안전하게 사용할 수 있게 해준 TypeScript&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Babel]]></title><description><![CDATA[이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다. What is Babel? · Babel…]]></description><link>https://junbyeol.github.io/web/201026-Babel/</link><guid isPermaLink="false">https://junbyeol.github.io/web/201026-Babel/</guid><pubDate>Mon, 26 Oct 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://babeljs.io/docs/en/&quot;&gt;What is Babel? · Babel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jeonghwan-kim.github.io/series/2019/12/22/frontend-dev-env-babel.html&quot;&gt;프론트엔드 개발환경의 이해: Babel&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;트랜스파일러transpiler&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8C%8C%EC%9D%BC%EB%9F%ACtranspiler&quot; aria-label=&quot;트랜스파일러transpiler permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;트랜스파일러(transpiler)&lt;/h2&gt;
&lt;h3 id=&quot;트랜스파일-vs-컴파일&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8C%8C%EC%9D%BC-vs-%EC%BB%B4%ED%8C%8C%EC%9D%BC&quot; aria-label=&quot;트랜스파일 vs 컴파일 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;트랜스파일 vs 컴파일&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;컴파일: 한 언어로 작성된 소스 코드를 다른 언어로 변환하는 것&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java → bytecode&lt;/li&gt;
&lt;li&gt;c → assembly&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;트랜스파일: 한 언어로 작성된 소스 코드를 비슷한 수준의 추상화를 가진 다른 언어로 변환하는 것&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;es6 → es5&lt;/li&gt;
&lt;li&gt;c++ → c&lt;/li&gt;
&lt;li&gt;typescript → javascript&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;
💡 transpile이 compile에 포함되는 개념이라고도 할 수 있다!
&lt;/aside&gt;
&lt;h3 id=&quot;바벨&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B0%94%EB%B2%A8&quot; aria-label=&quot;바벨 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;바벨&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;구 브라우저는 ES6 이상의 자바스크립트 문법을 이해하지 못할수도 있다!&lt;/li&gt;
&lt;li&gt;이런 최신 ECMAScript를 ES5이하의 자바스크립트 문법으로 transpile해주는 것이 바벨&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;다양한 플러그인을 쉽게 추가해서 쓸 수 있다&lt;/li&gt;
&lt;li&gt;캐싱 + 단일 파일 방출 설계로 타입스크립트 컴파일보다 더 빠르다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;바벨로-작업하기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B0%94%EB%B2%A8%EB%A1%9C-%EC%9E%91%EC%97%85%ED%95%98%EA%B8%B0&quot; aria-label=&quot;바벨로 작업하기 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;바벨로 작업하기&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// yarn add -D @babel/core&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 이후 babel.config.json 혹은 babel.config.js를 작성해야 한다.&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; presets &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;@babel/env&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      targets&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        edge&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;17&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        firefox&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;60&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        chrome&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;67&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        safari&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;11.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      useBuiltIns&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;usage&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;corejs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3.6.4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; presets &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;babelcore&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#babelcore&quot; aria-label=&quot;babelcore permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;@babel/core&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 바벨의 핵심 기능을 담는 패키지로 아래와 같은 것이 가능하다!&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; babel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;@babel/core&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

babel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;code&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; optionsObject&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;하지만 아직까지는 ‘code’ 자리에 무엇을 넣어도 동일한 값이 리턴될 뿐이다.&lt;/p&gt;
&lt;h2 id=&quot;babelcli&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#babelcli&quot; aria-label=&quot;babelcli permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;@babel/cli&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 아래 명령어는 src의 파일들을 lib이라는 폴더에 transpile 해준다&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; -D @babel/cli
&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; babel src --out-dir lib

&lt;span class=&quot;token comment&quot;&gt;# 플러그인을 추가할 수도 있다&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 아래의 명령어로 비로소 &apos;code&apos;속 화살표 함수는 function(){} 문법으로 대체된다&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 즉, 플러그인은 babel이 코드를 transpile하는 규칙들이다&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; -D @babel/plugin-transform-arrow-functions
&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; babel src --out-dir lib --plugins&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;@babel/plugin-transform-arrow-functions&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;plugins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#plugins&quot; aria-label=&quot;plugins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;plugins&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;일일이 플러그인을 적용하고 싶을떄마다 cli로 입력해주기에는 번거롭다&lt;/li&gt;
&lt;li&gt;babel.config에 플러그인들을 미리 추가해 놓으면 터미널 상에서 플러그인들을 입력하지 않아도 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  plugins&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;@babel/plugin-transform-block-scoping&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;@babel/plugin-transform-arrow-functions&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;프리셋preset&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A6%AC%EC%85%8Bpreset&quot; aria-label=&quot;프리셋preset permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;프리셋(preset)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;위에서 플러그인을 하나 적용했는데, 매번 필요한 플러그인들을 추가해주어야 하는가?&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;필요한 플러그인들을 모아서 프리셋으로 묶어놓자!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;위의 플러그인 두개를 하나의 프리셋으로 묶은 예제&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mypreset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    plugins&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;@babel/plugin-transform-arrow-functions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;@babel/plugin-transform-block-scoping&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;@babel/plugin-transform-strict-mode&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	presets&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;mypreset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;바벨 공식 프리셋이 4가지 있다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;preset-env&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;preset-reset-es2015, preset-reset-es2016, preset-reset-es2017, preset-reset-latest을 합쳐놓은것&lt;/li&gt;
&lt;li&gt;ECMAScript2015+를 변환하는 프리셋&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;preset-flow&lt;/li&gt;
&lt;li&gt;preset-react&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;preset-typescript&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;flow, react, typescript를 변환하기 위한 프리셋이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;babelpreset-env&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#babelpreset-env&quot; aria-label=&quot;babelpreset env permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;@babel/preset-env&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;어떤 버전의 브라우저(or Node)까지 지원할지 등을 target 속성으로 지정해줄 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// babel.config.js&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  presets&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;@babel/preset-env&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        targets&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          chrome&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;79&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 크롬 79까지 지원하는 코드를 만든다&lt;/span&gt;
					ie&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;11&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// ie 11까지 지원하는 코드를 만든다&lt;/span&gt;
					node&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;current&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;promise는 간단한 스코핑 대체로 해결될 문제가 아니다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ES5에서 promise는 ‘구현’하는 수밖에 없다&lt;/li&gt;
&lt;li&gt;폴리필이라는 코드조각을 추가해줘야 한다&lt;/li&gt;
&lt;li&gt;우리는 폴리필 패키지 중 하나인 core-js를 이용한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// babel.config.js:&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  presets&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;@babel/preset-env&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        useBuiltIns&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;usage&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 폴리필 사용 방식 지정, usage, entry, false(default)&lt;/span&gt;
        corejs&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;// 폴리필 버전 지정&lt;/span&gt;
          version&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[프로그램 실행]]></title><description><![CDATA[이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다. 프로그램 실행: 프로그래밍 언어(High…]]></description><link>https://junbyeol.github.io/language/200816-프로그램-실행/</link><guid isPermaLink="false">https://junbyeol.github.io/language/200816-프로그램-실행/</guid><pubDate>Sun, 16 Aug 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;프로그램 실행: 프로그래밍 언어(High-level)를 런타임 이전에 기계어로 해석하는 과정&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 293px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.69624573378839%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsSAAALEgHS3X78AAADDklEQVQ4y3VU3U9SYRg/BKQFxwU0PkZRzMojjJAT7AABih4+RETBj1BRQJnf6NTwC2VeuLUu2mp159qs9Qe01m1XbfYXtPUX1LrwolVrXdHvxaOS0dl+e573ed/3eX/P16Go0+8cwzBShUIhgS4mBo1GI1GpVJLjfZ1OJ9Xr9dLjC319fVTNr6enR5HJZJ7n8/md+fn5B4uLi8WxsbH9qampJ0QfGRnZy+VyewsLCyWceQj7fZ7nteRud3f3vw77+/vp1dXVn3D2bHBw0AsHsYGBgXQ2m301OzsbhgxMTk6+xKNDAA/nXR6Px05Y12QYiUTqCoXC7/Hx8R0s5SKRqAXSEg6HH6nVagU5g72C2Ww2QTUA1wCVWCy+UNNhU1OTan19/fvS0tIHhBKJx+OJ3t5eiHim6+gLIi0ZhBeLRqPBWCwW9vl8UeS48phWq6U6OjpOHSKMpysrKx/B8lPVO3rgBqADbglSL+hmgDirIweNRuNfBEVw9L5YLB4iVy/wEhcIBNjW1lbO5XL52tvb7WDD+f1+zuv1wuTyOJ1OotxFBPdgbyBO2traKOS9wq6I6h3s7u6WUZTHaA0tNkxwYsOhFrfb7cBlBy5a4ZBFMVgikQYGxWyWy+WVaicSiSN6y8vL+1tbW7+Qv4OZmZkSsZXLZSIuCwUg8TSStgRuAiYh5Eq4LMtaksnkeaIj7xQ1PT39rlQq/djc3PwGQx7hhlB1kvxOrAMIiydAIUJkDSY8AfYjoVAogubOIRq70JMiant7u4zmfbOxsXE4MTHBnmmAK4BakEqBNdGvAherzl060cDsCxiW5+bm3iIvQ8jVHbSOG8VxORyOsN1u7+Q4LoBC8GRts9liVqs1jtz6g8GgE+wciCg1PDwcOp6S66jw17W1tc8IiUmn05bR0dEKwNiECWlGWCwBpsiGKbqNNDHoCHMqlbJgbcEomuG85YQ1RsmIgryGerbzRVU9yQho/M/I0YCMwrBX/ixKpZI2GAwqqVSKTpA3yGSyE9A0LRc+otCw0dX7xFZfX0/yKPkD/W3n0RUUMQYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled.png&quot;
        title=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled.png&quot;
        src=&quot;/static/beb8a09803b49ffb4b420b27d67b1518/3cf3e/200816-1.png&quot;
        srcset=&quot;/static/beb8a09803b49ffb4b420b27d67b1518/3cf3e/200816-1.png 293w&quot;
        sizes=&quot;(max-width: 293px) 100vw, 293px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%8B%A4%ED%96%89_(%EC%BB%B4%ED%93%A8%ED%8C%85)&quot;&gt;실행 (컴퓨팅)&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;c의-실행-과정gcc&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#c%EC%9D%98-%EC%8B%A4%ED%96%89-%EA%B3%BC%EC%A0%95gcc&quot; aria-label=&quot;c의 실행 과정gcc permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;C의 실행 과정(gcc)&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;전처리 단계 - 전처리기(cpp)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h1 id=&quot;include-define-등-으로-시작하는-문법-사항이-적절히-전처리된-c-언어-소스파일-생성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#include-define-%EB%93%B1-%EC%9C%BC%EB%A1%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%AC%B8%EB%B2%95-%EC%82%AC%ED%95%AD%EC%9D%B4-%EC%A0%81%EC%A0%88%ED%9E%88-%EC%A0%84%EC%B2%98%EB%A6%AC%EB%90%9C-c-%EC%96%B8%EC%96%B4-%EC%86%8C%EC%8A%A4%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1&quot; aria-label=&quot;include define 등 으로 시작하는 문법 사항이 적절히 전처리된 c 언어 소스파일 생성 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;include, #define 등 #으로 시작하는 문법 사항이 적절히 전처리된 C 언어 소스파일 생성&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;컴파일 단계 - 컴파일러(cc1)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;고급 언어 → 저급언어(어셈블리)&lt;/li&gt;
&lt;li&gt;C 언어 소스파일 —컴파일—&gt; 어셈블리 소스 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;어셈블 단계 - 어셈블러(as)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;어셈블리 소스 파일 —어셈블—&gt;목적파일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;링크 단계 - 링커(id)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;목적파일들 + 라이브러리 —링크—&gt; 실행 가능한 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 364px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsSAAALEgHS3X78AAABUklEQVQ4y42UDU+DMBCGOwIMkA0cUDdgOs3cTIwxGv//b/O6PE1uzUAveYH2eu99FmOupRMMglRQCPbsLQQPglGwFOSCR0GD7qY4grPgCNET3wOkZ/Yc0QvvV0E1Reg8W8EzntcQ73DWQuR1veBANpOSctinUSqDmLVRutj8ITHRaKNIOcuVbmX+IQtS87IRJHxHpKt1sxGuKLJviiv6iTptqe0J3ci5YxD1ldSCN8E3Ro7gCye+sz/su/Wn4F2QTRHeqUgs3R3ppmV0DuxblUU2l3YSjEEe6BK1zuaG2qjCV8GwF4pQd/Z+rrOJiq7AMEW3pRw9ugj9ki6nYWYDRh33tVEz6GvXEFGn9P4mNeqcc3oha2lGS7dTotoxbz7ymmhKyGru957A3PnLw3n7IIoSspJ6Wkg7Us3R9awHbAcf/QbDNahu/IU84mACGpzXkHe/IrYQSJ3nh5AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%201.png&quot;
        title=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%201.png&quot;
        src=&quot;/static/6ee0d92e82ccbedf6d6f30f36a31279d/e45a9/200816-2.png&quot;
        srcset=&quot;/static/6ee0d92e82ccbedf6d6f30f36a31279d/5a46d/200816-2.png 300w,
/static/6ee0d92e82ccbedf6d6f30f36a31279d/e45a9/200816-2.png 364w&quot;
        sizes=&quot;(max-width: 364px) 100vw, 364px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 500px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAABT0lEQVQoz22QSUsDQRCF598KogQ8KBG8COLBg39AQYLbWZGccoieokaMiRPcJeA6bolO90xvn53JIFF8UFR3v6rXryp4iR3Rl+UjgWbrlFqtRhie0pWGKCbjXiU8v3XZ292lWq1yfnFBT/k3z2W81zDWgXMEhZVjxlZOmCs/8v6VIoXAKsFW44OR5RYTpQbja5fs30p0EtPr9fgUKfM7HUaXjiiUWsxu3xFrMgRKKZTSaGP9B+4n+vfUc4PQ2L6DHJ5Ga4OQklhInxOSJKGvFfALA7F+/g/O/Tk4jfPTXJ2FVCoVwnabYNiVywvj1HH2rAfxpGg/ad6F9QLWO7XZvm5eDeFDQngvuXwxKDPo/eXQ5oLXvri4fkJxtc7MZpOpjZCD6y46FUgpsh0ulm+YLB0yvd5godzJd+j+jjw01j+Iooh6vY4xJl/QcJ/Ler8BmfEOIzFs/m8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%202.png&quot;
        title=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%202.png&quot;
        src=&quot;/static/ffac6c1b10a102b80a3b16937e3b653a/0b533/200816-3.png&quot;
        srcset=&quot;/static/ffac6c1b10a102b80a3b16937e3b653a/5a46d/200816-3.png 300w,
/static/ffac6c1b10a102b80a3b16937e3b653a/0b533/200816-3.png 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;용어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9A%A9%EC%96%B4&quot; aria-label=&quot;용어 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;용어&lt;/h1&gt;
&lt;h2 id=&quot;런타임&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%9F%B0%ED%83%80%EC%9E%84&quot; aria-label=&quot;런타임 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;런타임&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;프로그램이 실행되고 있는 때에 존재하는 곳&lt;/li&gt;
&lt;li&gt;Javascript의 런타임인 Browser 혹은 Node.js&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;
💡 런타임 VS 컴파일타임
&lt;ul&gt;
&lt;li&gt;이름에서도 알 수 있듯이 ‘실행되는 때’와 ‘번역되는 때’로 다르다&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;컴파일타임 오류&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Syntax error, Typecheck error&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;런타임 오류&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0나누기, Null참조, 스택오버플로우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;컴파일러-vs-인터프리터&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-vs-%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0&quot; aria-label=&quot;컴파일러 vs 인터프리터 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;컴파일러 vs 인터프리터&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;컴파일러는 소스코드 전체를 훑고 실행가능한 파일로 변환한 후 실행하지만,
인터프리터는 각 행을 중간코드로 변환하고 차례로 실행한다&lt;/li&gt;
&lt;li&gt;컴파일러가 인터프리터 보다 실행시간이 빠르다&lt;/li&gt;
&lt;li&gt;컴파일러는 전체파일을 변환한 뒤 에러를 보고하지만,
인터프리터는 에러가 발생한 행에서 에러를 보고하고 그 이후 코드는 보지 않는다&lt;/li&gt;
&lt;li&gt;컴파일러를 사용하는 언어: C
인터프리터를 사용하는 언어: Python&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;
💡 모든 언어를 엄밀하게 컴파일러/인터프리터 언어로 나눌 수는 없다
자바는 컴파일과 인터프리트를 병행하여 양단의 장점을 취하고, 심지어 자바스크립트는 해석 엔진에 따라 실행 과정이 제각각이다(추후 작성)
&lt;/aside&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 780px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAABbElEQVQ4y32Tia6CQAxF5/9/EZAgIIJsggsg0JfTpAbJ00kmMy13bm8XXNu2wu66TqZpkm+r73u5XC5S17VUVaW+2+0mYRjK4XCQpmlkWRZxAH3fl8fjIdfrVZ7Pp9zvd7U5scEURSFpmorneVKWpQrgxH8+n5V8nmdxkOR5ro5hGGRd1w9l2AAJQCYQEAQ/J2p5T1AlHMdR04CMTdo8yrJMI6OEVF6vl6bMY4hPp5PaYBBlwZ0p4DR1RGNbdAgIDDFYlBEIDIHwvwn3xd+mDBhC1ELya5kgZ5ct0d7e+799ZzmaQTc5rVakgo/aWDr/LRpFWdiUQBVyOR6PSgARxWY8giB4+2kWKdvGxk85mMMoirSx2mUKniSJKrSZAwwx33gMEKUosMYwDWRgjeOuhJDYoOKEEDuOYw1AdykD6YEhMDaEnDQM/LspFpFfh1QNsB0TgPadudv6yQDij7H51jHqQn2okw3vr7Fh/QGQDPBPQpxoswAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%203.png&quot;
        title=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%203.png&quot;
        src=&quot;/static/a7550be8c618f9383b68805fbe2ac3fc/a1792/200816-4.png&quot;
        srcset=&quot;/static/a7550be8c618f9383b68805fbe2ac3fc/5a46d/200816-4.png 300w,
/static/a7550be8c618f9383b68805fbe2ac3fc/0a47e/200816-4.png 600w,
/static/a7550be8c618f9383b68805fbe2ac3fc/a1792/200816-4.png 780w&quot;
        sizes=&quot;(max-width: 780px) 100vw, 780px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;빌드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B9%8C%EB%93%9C&quot; aria-label=&quot;빌드 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;빌드&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;소스코드 → 실행가능한 소프트웨어 산출물로 만드는 일련의 과정&lt;/li&gt;
&lt;li&gt;컴파일은 빌드의 한 단계&lt;/li&gt;
&lt;li&gt;대략, 컴파일 + 링크 = 빌드 라고 봐도 무방&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;java의-실행과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#java%EC%9D%98-%EC%8B%A4%ED%96%89%EA%B3%BC%EC%A0%95&quot; aria-label=&quot;java의 실행과정 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Java의 실행과정&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;java 파일은 javac(java compiler, gcc 자바 버전) 바이트코드로 쓰여진 .class 파일로 &lt;strong&gt;컴파일&lt;/strong&gt;됨&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;바이트코드는 JVM이 이해할 수 있는 자바 소스 코드&lt;/li&gt;
&lt;li&gt;JVM만 있으면 어떤 OS에서도 실행가능하다&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OS마다 맥용 JVM, 리눅스용 JVM이 있다는 뜻&lt;/p&gt;
&lt;p&gt;= JVM은 OS 종속적이지만, 자바는 OS에 비 종속적이다!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 549px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 92.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsSAAALEgHS3X78AAACa0lEQVQ4y42S207bQBCG/XYVKX2DqlIv+jJIlSrUi0ot4qLKDRTRAkIByrElBBICEYH4QOwkjmM7Byfx+rDeY9epVCEClP/C2p2ZTzO/dyR+TxTToD9020PH7LUN8fXsVjDo8GjIpyRNwQjXT9r5Vft0zTr5bhV+GEffBucbzFUmafYkzDnxXTa2edj1GjdJ3xQHOrJoNHpG54kQZQnlds8DMYoJp/xhPQAniHh+MhiMZeVW1Qw/gJ4fE0r/A/81BCJcMcbHFWPzsLy+XzyTncu6F0J03/FjY+sOyBUbywfy0n5tq9TUO6Np8lFYVBLKLWfg+RHChD/TM2MMI0Jw6rBjdWAUiwPGVASfggWWPjNhDc3KHxXLZ9XC73KlrBwfFa8u1GE/uFv2SGfKjFqnWtTkC6NSUGrn9evS7U1J79ujqR25A2OMkRAWHsXchDLq+z6EkFKKCU6zkwKRug8HAej2XIyTOI4FAGOIUNJumyAA6WWiBMIgDDq29W94SXRAJPCGrm5oCIvnBOkUBBIaNVv1btdGJEQEpstDQpgA3VB94CUYEEokQpK6W7jSd/OXa9XmXqNbFnV+5MjWYamWO6tu1qz9wbglgpZXvW7u5SvrlfrPW+cYoUgS7SMGzV5LbakhC0GS/lXMCCDA7JuqqQIKIEnXK8RxwAK5KVueFZBQTC5xZZvLufHpSvcwy5UddrPBvCbXdrmSA8WV3q8sV7eZiLuySHFtxzn4Gp6vcnWLKjsSX3o7/PhCmZvR32ec+QxbeIlrObb8jnyZaX/IWPOzdCFDsq9JKcsXX8WfZ7W5mdGnV3xxNsm++QMqMuwJJbuNmwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%204.png&quot;
        title=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%204.png&quot;
        src=&quot;/static/bf2a97e6329fc361cfa03e2a8875aeaf/928ea/200816-5.png&quot;
        srcset=&quot;/static/bf2a97e6329fc361cfa03e2a8875aeaf/5a46d/200816-5.png 300w,
/static/bf2a97e6329fc361cfa03e2a8875aeaf/928ea/200816-5.png 549w&quot;
        sizes=&quot;(max-width: 549px) 100vw, 549px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;aside&gt;
💡 JVM(Java Virtual **Machine**)도 기계어를 읽는 **기계**다
기계어가 지칭하는 기계가 꼭 하드웨어일 필요는 없다.
&lt;/aside&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;자바의 런타임 과정에서 자바 바이트코드와 라이브러리는 JVM의 클래스 로더에 의해 묶인다(일종의 링커?)&lt;/li&gt;
&lt;li&gt;자바 인터프리터와 JIT Compiler로 자바 바이트코드를 명령어 단위로 읽어서 실행함&lt;/li&gt;
&lt;li&gt;인터프리터의 속도가 느리다는 단점을 보완하기 위해 추후에 등장한 것이 JIT Compiler&lt;/li&gt;
&lt;li&gt;이 둘의 적절한 협업으로 Execution Engine의 성능이 향상된다&lt;/li&gt;
&lt;li&gt;JVM이 OS로부터 할당받은 메모리공간에서 자바가 실행된다!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 800px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAABM0lEQVQoz5VRa2+DMAzk//8xJD5M1TYhVTC6lhZIwiNA0aA8brG7tFXpl51kmVzs4+w4P02L4niCTjOo7z10lqE8JVC7Pfr2jP/CqYoSaRwjOx6RHg6QSYLECB+CELlUaJoGdV3fQmuNsixXvL1zhBSsPE4TpnnmvJizNg1932MaRwyXCy4mRvN97joIITCb2mEYmKdM56Io4CilXlonBySwwjyxw1cglzdB64DysiwsWNUaeaURJBVOeYSdiPGxU0iF5J7OuJVSsjMCj5znOVuOoghhGGK73fIFFbdtiy/D+0GEt3cPm88N9okA9RB834fneXBdlzXIhEN/IEy0w79Yj7yYHS3XOsNZR5TtI1Etj2wFacznHdL417s7T06s4DN45EdBG2vBO/8oSC9LPGUr+AtJJLdS4tCYeQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%205.png&quot;
        title=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%205.png&quot;
        src=&quot;/static/c74f9fd0eab2157b4cd5d57cef3c268f/5a190/200816-6.png&quot;
        srcset=&quot;/static/c74f9fd0eab2157b4cd5d57cef3c268f/5a46d/200816-6.png 300w,
/static/c74f9fd0eab2157b4cd5d57cef3c268f/0a47e/200816-6.png 600w,
/static/c74f9fd0eab2157b4cd5d57cef3c268f/5a190/200816-6.png 800w&quot;
        sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 234px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 92.3076923076923%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsSAAALEgHS3X78AAAEXUlEQVQ4y02U228UZRjG9y8wGk1M1MT4Fxj1xgQTueFwo4mRyJWJEYWEqKiVMwRrsZFyPrQgUKAt5dgtlNIDbSk9cChtgba73fPsebfdmdnZmZ3tdqEtP7+Z5cKLZ753nnnfZ5953sk6Cg4HxU8+prh8OcXVqyi+8Tqx2nq8JvjiGv60gTueo3U0ybWRBDfGkjaco+XT4m6Np/Cl87giCo7YmSZSV9tI3uwm6ewg2Xid6JSElFtEkovEsyUmEybfnHSx6vAEmy4H2NMW5uCdOL9eCbDi0ATrzk8TkucJiB93eAsglSAmELWwIGAsEleLRNV5Iso8nlSBQ3ei/H07TF1/gtP9URqH45y6l6Cq3eLitqAvpePwx7NIMyaNQ3Hq78U4PxCj+WGKM4MJ+qazJLQSYSE6oz8vI7+AP6HiS2RJGy8EVyKVKxFRS/iSlqCwGcoUWd/gYev1ENudIeEkwnfnPNT1hpBSKpNhmYmwYsMVyzLijjIl8pKUEv7ZOQICtqDl0JcybAfdLsVGj1u10fYsw1hYt1/byjIpnCa0eVL6C7EshWBKE/XCK/7/Dl8JDvs1IaQw4M1y11MWnYjniQlBy0H3lELXlCyeabSPJ2gbE5F4snROyvSKOUujnKFYtyRuvj/v4csTLqo7ovYmP695yoX7KTIis6cxkzViy2tOukUkEntvR6nujFF5K2LPWLNBuWR/Yg6/CDeSznGsK8C+W37q+4Kc6glS2eqjZyLNrJoXC8hxsCPA3hte6nokTveFOHc3KE6JPS0ejovZsNCwluXIhH0syGGW1Chko+jRaWYCk+jSBEpwAlmy7su1HvOgSZOk3CPkE/7yjBqxz0U5giJ6Hdal9KgZc+AshQfNFO43offUUnD3Yz5pJ99bi9p3lnRXHYbgzfE25n1DFOz+i5jDjZhDDZQeNJANTQqHITda1TKylZ9iXqrAOLce+ae3MXtPYFz+A3nDaxi1azHrf0Td+CaZf9eRvn0UZdN76Ke+Jd+wkWzVZ2i7P0LxPcEhh6YxnbvEcAWKswq99U9y9T8wN9aKee8Mev06tNZKVOdfGBc2oHcfQx+9YfO5aztQb1ajN/2MeXUzqojGoYS9vMylWDIyyBEv80qcpbzMgpYUEHxeoTAbQUsEeCn4xVyaJfHM6rd6tZiPRUPmpZ4mG3YLhyLD4uBZzO7DZG7WYHQdtut8VxmF7iNo7ftR2moo9Bwnf+eoDavWOw8hC94UfcX+k6hBK8OgC23vMmSRj7rpXZSKD9D2rcA4sBpj/wpyNStFvaqMI19gHP8K/cBKcse+RvntfZRf3iGz8S2yuz5E9ooMFbGUuY5/7AUY17bZyDt3M3txM+mmCrJXtiFf2kqmeQszjb+Legvq5S3kW3ZSaNnBnHMncy3bed5ZTU6awjEr+XieCVPMxJjPRG2UBNyjw4wO9jI1MsTko0G7fjxgoQfv+EMW1AQJ7zNcj4cIu8bFf+hjwlPj/Af+jLL3nOf7OAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%206.png&quot;
        title=&quot;200716%20%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%2071d799cf76294c2ea084bc4443b22495/Untitled%206.png&quot;
        src=&quot;/static/41313b906283047b35ddd223487566a0/7235c/200816-7.png&quot;
        srcset=&quot;/static/41313b906283047b35ddd223487566a0/7235c/200816-7.png 234w&quot;
        sizes=&quot;(max-width: 234px) 100vw, 234px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[NGINX]]></title><description><![CDATA[…]]></description><link>https://junbyeol.github.io/infra/200525-NGINX/</link><guid isPermaLink="false">https://junbyeol.github.io/infra/200525-NGINX/</guid><pubDate>Mon, 25 May 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;웹서버의-역할&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9B%B9%EC%84%9C%EB%B2%84%EC%9D%98-%EC%97%AD%ED%95%A0&quot; aria-label=&quot;웹서버의 역할 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;웹서버의 역할&lt;/h1&gt;
&lt;h3 id=&quot;정적-파일을-처리하는-http-서버&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%95%EC%A0%81-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94-http-%EC%84%9C%EB%B2%84&quot; aria-label=&quot;정적 파일을 처리하는 http 서버 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;정적 파일을 처리하는 HTTP 서버&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;HTML, CSS, JS, 이미지 등 정적 파일들의 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;응용프로그램-서버에-요청을-보내는-리버스-프록시-서버&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%91%EC%9A%A9%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%84%9C%EB%B2%84%EC%97%90-%EC%9A%94%EC%B2%AD%EC%9D%84-%EB%B3%B4%EB%82%B4%EB%8A%94-%EB%A6%AC%EB%B2%84%EC%8A%A4-%ED%94%84%EB%A1%9D%EC%8B%9C-%EC%84%9C%EB%B2%84&quot; aria-label=&quot;응용프로그램 서버에 요청을 보내는 리버스 프록시 서버 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;응용프로그램 서버에 요청을 보내는 리버스 프록시 서버&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트는 가짜 서버(NGINX)에 request&lt;/li&gt;
&lt;li&gt;가짜 서버는 진짜 배후 서버(reverse server)로부터 데이터를 가져옴&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;이점?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;보안 상의 이점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;보통 기업의 네트워크 환경은 메일서버, 웹서버, FTP 서버 등이 위치하는 DMZ가 존재&lt;/li&gt;
&lt;li&gt;DMZ가 털려도 이들은 어차피 그들에게 주어진 포트에만 접속 가능하므로 내부 망으로 연결 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;로드 밸런싱&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트가 직접 서버에 요청하면 프로세스 1개는 응답 대기상태로 기다려야 함&lt;/li&gt;
&lt;li&gt;프록시 서버를 둠으로써 요청을 배분하는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;참고-포워드-프록시-vs-리버스-프록시&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B0%B8%EA%B3%A0-%ED%8F%AC%EC%9B%8C%EB%93%9C-%ED%94%84%EB%A1%9D%EC%8B%9C-vs-%EB%A6%AC%EB%B2%84%EC%8A%A4-%ED%94%84%EB%A1%9D%EC%8B%9C&quot; aria-label=&quot;참고 포워드 프록시 vs 리버스 프록시 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;참고) 포워드 프록시 vs 리버스 프록시&lt;/h3&gt;
&lt;h3 id=&quot;포워드-프록시&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8F%AC%EC%9B%8C%EB%93%9C-%ED%94%84%EB%A1%9D%EC%8B%9C&quot; aria-label=&quot;포워드 프록시 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;포워드 프록시&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트가 요청을 보낸 서버 대신 요청을 받아 원래 요청을 보낸 서버에 대신 전달해줌&lt;/li&gt;
&lt;li&gt;LAN → WAN의 요청을 대리로 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;리버스-프록시&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A6%AC%EB%B2%84%EC%8A%A4-%ED%94%84%EB%A1%9D%EC%8B%9C&quot; aria-label=&quot;리버스 프록시 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;리버스 프록시&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트로 부터 직접 요청을 받아 배후 서버에 전달해줌&lt;/li&gt;
&lt;li&gt;WAN → LAN의 요청을 대리로 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;클라이언트가 최초에 요청을 보내는 곳의 차이!&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;nginx-디렉토리-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#nginx-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;nginx 디렉토리 구조 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Nginx 디렉토리 구조&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;├── conf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;d &lt;span class=&quot;token comment&quot;&gt;# (디렉토리) nginx.conf에서 불러들일 수 있는 파일을 저장&lt;/span&gt;
├── fastcgi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conf &lt;span class=&quot;token comment&quot;&gt;# (파일) FastCGI 환경설정 파일&lt;/span&gt;
├── fastcgi_params
├── koi&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;utf
├── koi&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;win
├── mime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;types&lt;/span&gt;
├── nginx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conf &lt;span class=&quot;token comment&quot;&gt;# 접속자 수, 동작 프로세스 수 등 퍼포먼스에 관한 설정들&lt;/span&gt;
├── proxy_params
├── scgi_params
├── sites&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;available &lt;span class=&quot;token comment&quot;&gt;# 비활성화된 사이트들의 설정 파일들이 위치한다.&lt;/span&gt;
│   └── &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;
├── sites&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;enabled &lt;span class=&quot;token comment&quot;&gt;# 활성화된 사이트들의 설정 파일들이 위치한다. 존재하지 않은 경우에는 디렉토리를 직접 만들 수도 있다.&lt;/span&gt;
│   └── &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;sites&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;available&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;
├── snippets
│   ├── fastcgi&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;php&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conf
│   └── snakeoil&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conf
├── uwsgi_params
└── win&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;utf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://extrememanual.net/9976&quot;&gt;NGINX 기본 환경 설정 튜닝 및 설명 - 익스트림 매뉴얼&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;sites-available에 server block을 추가해서 적절히 커스텀 가능&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Java & OOP]]></title><description><![CDATA[…]]></description><link>https://junbyeol.github.io/language/200524-java-oop/</link><guid isPermaLink="false">https://junbyeol.github.io/language/200524-java-oop/</guid><pubDate>Sun, 24 May 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B9%EC%A7%95&quot; aria-label=&quot;특징 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;특징&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;객체 지향적이다&lt;/li&gt;
&lt;li&gt;플랫폼 독립적이다&lt;/li&gt;
&lt;li&gt;보안성이 뛰어나다&lt;/li&gt;
&lt;li&gt;Garbage Collector가 자동으로 메모리를 관리해준다&lt;/li&gt;
&lt;li&gt;멀티 쓰레드를 지원한다&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;oopobject-oriented-programming&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#oopobject-oriented-programming&quot; aria-label=&quot;oopobject oriented programming permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OOP(Object-Oriented Programming)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;역할, 책임, 협력  -오브젝트&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Encapsulation, Inheritance, Polymorpism&lt;/p&gt;
&lt;p&gt;→ 이 모든 것을 포함한 개념 = Class&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;encapsulation캡슐화&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#encapsulation%EC%BA%A1%EC%8A%90%ED%99%94&quot; aria-label=&quot;encapsulation캡슐화 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Encapsulation(캡슐화)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;객체의 속성(field)와 행위(method)를 하나로 묶는 것 + 실제 구현 내용을 외부로부터 숨기는것(정보 은닉)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;자바의 접근제어자&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;public: 어떤 클래스의 객체에서든 접근 가능&lt;/li&gt;
&lt;li&gt;private: 이 클래스에서 생성된 객체들만 접근 가능&lt;/li&gt;
&lt;li&gt;protected: 이 클래스와 동일패키지에 있거나 상속관계에 있는 하위 클래스의 객체들만 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;inheritance상속&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#inheritance%EC%83%81%EC%86%8D&quot; aria-label=&quot;inheritance상속 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Inheritance(상속)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;객체들 간의 관계를 구축하는 방법&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;쉽게 말해 자식클래스가 부모클래스의 기능을 물려받는 것!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;polymorphism다형성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#polymorphism%EB%8B%A4%ED%98%95%EC%84%B1&quot; aria-label=&quot;polymorphism다형성 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Polymorphism(다형성)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;같은 모양의 코드가 여러 가지 형태/기능을 가질 수 있는 능력&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Overriding&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자식 클래스가 부모 클래스의 기능을 새롭게 정의하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Overloading&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;하나의 클래스에서 같은 이름의 메소드들을 여러 개 만드는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;solid&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#solid&quot; aria-label=&quot;solid permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SOLID&lt;/h1&gt;
&lt;p&gt;//todo&lt;/p&gt;
&lt;h1 id=&quot;자바-코드의-실행&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%9D%98-%EC%8B%A4%ED%96%89&quot; aria-label=&quot;자바 코드의 실행 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;자바 코드의 실행&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 549px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 92.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsSAAALEgHS3X78AAACa0lEQVQ4y42S207bQBCG/XYVKX2DqlIv+jJIlSrUi0ot4qLKDRTRAkIByrElBBICEYH4QOwkjmM7Byfx+rDeY9epVCEClP/C2p2ZTzO/dyR+TxTToD9020PH7LUN8fXsVjDo8GjIpyRNwQjXT9r5Vft0zTr5bhV+GEffBucbzFUmafYkzDnxXTa2edj1GjdJ3xQHOrJoNHpG54kQZQnlds8DMYoJp/xhPQAniHh+MhiMZeVW1Qw/gJ4fE0r/A/81BCJcMcbHFWPzsLy+XzyTncu6F0J03/FjY+sOyBUbywfy0n5tq9TUO6Np8lFYVBLKLWfg+RHChD/TM2MMI0Jw6rBjdWAUiwPGVASfggWWPjNhDc3KHxXLZ9XC73KlrBwfFa8u1GE/uFv2SGfKjFqnWtTkC6NSUGrn9evS7U1J79ujqR25A2OMkRAWHsXchDLq+z6EkFKKCU6zkwKRug8HAej2XIyTOI4FAGOIUNJumyAA6WWiBMIgDDq29W94SXRAJPCGrm5oCIvnBOkUBBIaNVv1btdGJEQEpstDQpgA3VB94CUYEEokQpK6W7jSd/OXa9XmXqNbFnV+5MjWYamWO6tu1qz9wbglgpZXvW7u5SvrlfrPW+cYoUgS7SMGzV5LbakhC0GS/lXMCCDA7JuqqQIKIEnXK8RxwAK5KVueFZBQTC5xZZvLufHpSvcwy5UddrPBvCbXdrmSA8WV3q8sV7eZiLuySHFtxzn4Gp6vcnWLKjsSX3o7/PhCmZvR32ec+QxbeIlrObb8jnyZaX/IWPOzdCFDsq9JKcsXX8WfZ7W5mdGnV3xxNsm++QMqMuwJJbuNmwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524 1&quot;
        title=&quot;200524 1&quot;
        src=&quot;/static/bf2a97e6329fc361cfa03e2a8875aeaf/928ea/200524-1.png&quot;
        srcset=&quot;/static/bf2a97e6329fc361cfa03e2a8875aeaf/5a46d/200524-1.png 300w,
/static/bf2a97e6329fc361cfa03e2a8875aeaf/928ea/200524-1.png 549w&quot;
        sizes=&quot;(max-width: 549px) 100vw, 549px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source code: 우리가 일반적으로 작성하는 코드&lt;/li&gt;
&lt;li&gt;byte code: 특정 프로그램(여기서는 JVM)이 이해하도록 변환된 코드&lt;/li&gt;
&lt;li&gt;VM: byte code를 로딩하고, 필요한 기능을 OS에게 호출하는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;cf) native code: 기계어 코드로, OS에 종속되는, 특정 OS에서만 실행할 수 있는 코드&lt;/p&gt;
&lt;p&gt;ex) 윈도우의 메모장은 native app이므로, native code로 되어 곧장 OS의 기능을 호출하고, VM을 거칠 필요가 없다&lt;/p&gt;
&lt;h2 id=&quot;jvm&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jvm&quot; aria-label=&quot;jvm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JVM&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 820px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 38.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAABy0lEQVQY0yWPy4rTUACG8zo+gG8gDLjSlTA7t7MTL+hKEF9AEQRHXMyoIM6AigijIqW2Iyl2mqRJc5ukSU5Ock5ycmly0qZtkmNB+PlW37f4OSWjSlrOIJJdoOJEzqiUUDcvN5tNVdd0SQH0HNcBEJZVtazXBa0ADHbbCdw4oUK2Glnej7E0sOAEIN6Y7+JznB2a4ePR/p3elWf6mxPCjtzoXZAfw/ytG70yA7NYcvxUHzlhT9J/jYRz0xvjfOhhOytFkn90okPp+YvJo/fWz29o9clBX2HyBaanc/TBAH5RcaJuyXNfssCFZtmYKC7QA+TFKWPMLcrfRmgsGrvuzLLiDU2APqgrCzqerbF2ywmi6AM/jomsqiROp4pyaVkuJjBJoijSUXQRZ2pVC8WWz5mYMpcyXDG0YoSuuSiOi7I0DFOUZeB5JaV+iP/6+OlQun7Su3p0djBQDib4tf1dD27K+L6G9sXgwfhyTyd9bkFICKExU9WpPJMVgnEaE8lHL2fe7b6695l/IswfTvCpfQbRDS28a4W39PCebF6bp30uyhY2gAN+1Bv+EWeaHxGU5mRRsK5lXbd7ztqWsa5purph9Zb957phm237D3KGmdBdjFJdAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524 2&quot;
        title=&quot;200524 2&quot;
        src=&quot;/static/cef03902dd2c0e5c12801007fcbf4de9/9f82e/200524-2.png&quot;
        srcset=&quot;/static/cef03902dd2c0e5c12801007fcbf4de9/5a46d/200524-2.png 300w,
/static/cef03902dd2c0e5c12801007fcbf4de9/0a47e/200524-2.png 600w,
/static/cef03902dd2c0e5c12801007fcbf4de9/9f82e/200524-2.png 820w&quot;
        sizes=&quot;(max-width: 820px) 100vw, 820px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Class Loader(클래스 로더): 일종의 Linker, 런타임시 클래스를 load함&lt;/li&gt;
&lt;li&gt;Execution Engine(실행 엔진): Class Loader를 통해 JVM 내부로 넘어와 JVM 메모리에 배치된 Byte code들을 명령어 단위로 실행&lt;/li&gt;
&lt;li&gt;GC : 참조되지 않거나 null인 객체의 메모리를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;타입&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%83%80%EC%9E%85&quot; aria-label=&quot;타입 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;타입&lt;/h1&gt;
&lt;h2 id=&quot;기본형-타입primitive-type&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B8%B0%EB%B3%B8%ED%98%95-%ED%83%80%EC%9E%85primitive-type&quot; aria-label=&quot;기본형 타입primitive type permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;기본형 타입(primitive type)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;boolean, byte, short, int, long, float, double, char(8가지)&lt;/li&gt;
&lt;li&gt;Null이 존재하지 않는다&lt;/li&gt;
&lt;li&gt;실제 값을 저장, stack 메모리에 저장된다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참조형-타입reference-type&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B0%B8%EC%A1%B0%ED%98%95-%ED%83%80%EC%9E%85reference-type&quot; aria-label=&quot;참조형 타입reference type permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;참조형 타입(reference type)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;기본형 타입이 아닌 모든 타입&lt;/li&gt;
&lt;li&gt;Null이 존재한다&lt;/li&gt;
&lt;li&gt;값이 저장되어 있는 주소값을 저장, heap 메모리에 저장된다&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;상속&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%83%81%EC%86%8D&quot; aria-label=&quot;상속 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;상속&lt;/h1&gt;
&lt;p&gt;:상위 클래스의 모든 멤버를 하위 클래스가 물려 받는것&lt;/p&gt;
&lt;p&gt;상속하는 클래스 : Base, Super, Parent&lt;/p&gt;
&lt;p&gt;상속받는 클래스 : Derivation, Sub, Child&lt;/p&gt;
&lt;p&gt;최상위 클래스는 java.lang.Object&lt;/p&gt;
&lt;h1 id=&quot;다형성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A4%ED%98%95%EC%84%B1&quot; aria-label=&quot;다형성 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;다형성&lt;/h1&gt;
&lt;p&gt;:여러가지 형태를 가질 수 있는 능력&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Overriding&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자식 클래스가 부모 클래스의 (추상) 메소드를 같은 이름, 같은 리턴, 같은 인자 내의 로직들 새롭게 정의하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Overloading&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;하나의 클래스에서 같은 이름의 메소드들을 여러 개 갖게 하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;추상-클래스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4&quot; aria-label=&quot;추상 클래스 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;추상 클래스&lt;/h1&gt;
&lt;p&gt;:하위 클래스에서 구현될 기능을 추상 메소드로 선언&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;abstract 예약어가 붙어 있어야함&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;인터페이스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4&quot; aria-label=&quot;인터페이스 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;인터페이스&lt;/h1&gt;
&lt;p&gt;:구현하는 모든 클래스에 대해 특정 메소드들을 반드시 포함하도록 한다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;public static final 변수와 public abstract만을 포함한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 43.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABb0lEQVQoz21R205CMRA8//83vvgFaqIkCvFBRKKooMIDeHrZttv2jLsFr7HJZLvT2Vu3276eYP1yjc3LGOvVGJejY1ycHeHp/ly4Cd5WVw36pr5iuRjh6qC7n51i86q6CdbLM3RmN8eujzDWCwjOJ0FEiBkpVURB4grrArY7CyIWrsB/6oLqimiAGN7RMT2C84BSGCVnfJ/hF3JmCYyotRy4n7q6v5UeXfKL1oGKY9yj1ophGH5BeWMMnHPNWmuliXJ4V72k1YTRPbS2YwxiQwtU0d+TUkLf918J1Xrvm/7rVIsuxydkmYI5yVi5QYM/u2Xmf/mf0OmYCzhu9x0SyQdbIxWddEkgqexkJCuc+lpME+vdOds6CyQ68s3XWCJZkN/oUp5BYRCkNrqX5BS4FdFt6ib1rovTzeqb/rla57TD3EChILORkd0Iyc0R7RRBEO1ts8FMkfys+cnNkOmucapj4VVD5kbebvfwc2Q/wQeHQLTnkeJjqgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524 3&quot;
        title=&quot;200524 3&quot;
        src=&quot;/static/11da70cceb8677b3884de01dfc49bdf0/c1b63/200524-3.png&quot;
        srcset=&quot;/static/11da70cceb8677b3884de01dfc49bdf0/5a46d/200524-3.png 300w,
/static/11da70cceb8677b3884de01dfc49bdf0/0a47e/200524-3.png 600w,
/static/11da70cceb8677b3884de01dfc49bdf0/c1b63/200524-3.png 1200w,
/static/11da70cceb8677b3884de01dfc49bdf0/d43b4/200524-3.png 1202w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;출처&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B6%9C%EC%B2%98&quot; aria-label=&quot;출처 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;출처&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://loustler.io/languages/oop_interface_and_abstract_class/&quot;&gt;인터페이스(interface)와 추상 클래스(abstract class)&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Transaction]]></title><description><![CDATA[…]]></description><link>https://junbyeol.github.io/database/200524-Transaction/</link><guid isPermaLink="false">https://junbyeol.github.io/database/200524-Transaction/</guid><pubDate>Sun, 24 May 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;트랜잭션-스케쥴&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%8A%A4%EC%BC%80%EC%A5%B4&quot; aria-label=&quot;트랜잭션 스케쥴 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;트랜잭션 스케쥴&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 581px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 35%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAABd0lEQVQoz22QS2/TUBCF/W8Rv4gFQgixYMVjA1S0NG3q1K5DU4qgTfxKXBeUNnZt52XHTvwxvkpRFox0dGfOzDmaOxoSdV2z+2Z5wfuBizXq89P7zg/3gn74i0unhzHs88F2yZY5/9NqbKMhNlvyJp3x5LjDq94Bbz6+4LXg09lbXr57xvPuPk91gyBO1GyjeTRThvWWeDSs1mvKqmKSZkyShHQ2ZfIQcx9FZPOZ4iZJqmbWMrvZ0Tf4t2ETq6JQKFcrahFsSoGIlvMFRZ6zqcRA+KZXlSW5fLssVrsWaLHca5jN8R8yBvexem+mC25nC0LBMJkyuIvw4lTlTe/PfIkvecO5UcJITuTGGdmqRHOilGvX56jVxjAtPu99wbYd9HDMpR9gyL1aRyd0Tk0O979iuAFno9/oxzqHojGtc9ptnYPWCZ4sowXi3um7dG1fwbh2+OYMuRjHWF6AKXVXakt65pWN4Yf0bseKP71yFG8NPDqSh+mUv1n/BVWBw/6hAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled.png&quot;
        src=&quot;/static/5d74122decd07756236edaa8d52e624b/92d15/200524-1.png&quot;
        srcset=&quot;/static/5d74122decd07756236edaa8d52e624b/5a46d/200524-1.png 300w,
/static/5d74122decd07756236edaa8d52e624b/92d15/200524-1.png 581w&quot;
        sizes=&quot;(max-width: 581px) 100vw, 581px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;직렬 스케쥴 : 하나의 트랜잭션이 끝나야 다음 트랜잭션을 실행할 수 있는 스케쥴&lt;/li&gt;
&lt;li&gt;비직렬 스케쥴: 트랜잭션의 실행 순서와 무관, 병행 수행&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;직렬가능 스케쥴: 서로 영향을 주지 않는 직렬 스케쥴을 비직렬적으로 수행하겠다!&lt;/p&gt;
&lt;p&gt;→ 동시성을 최대한 보장하면서도 직렬 스케쥴과 같은 결과를 얻을 수 있는 직렬 가능 스케쥴을 지향해야 함&lt;/p&gt;
&lt;p&gt;→ 같은 데이터에 동시에 두 트랜잭션이 접근하는 경우의 수&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 820px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 18.999999999999996%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsSAAALEgHS3X78AAAA9klEQVQY0x2O3U7CQBCF+/5PoW9A1HCpgBKDBDQtW/oD7ba77baUVsCIl5/LXpxM5nznTMY7X36YrRIeXtY8L1PGM9/pXRg+ogPLuGP6KXmafDFd525fbFvefMXC8skqY/zqMw8q1mmH9zjxiTONiFJUfSCMd+ylJtpJRLwn2ZdEac5mm7KJLCsq+vOvzXYkWUlzPFG3PYfh4nzvbjRHVQ21VpxP3zTG0B87tCpRZYGUObs0QVteVZqikI61jUHmGaXda+sbU/N3veLdj2b2I+WKxh6T0ha0Jo5jIqvbTJIEIUKatmUYBvp+cNkwDAmCwGWEEM77B1t9HjJMPaQjAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%201.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%201.png&quot;
        src=&quot;/static/47601b449975028b35b7ca71d309b26a/9f82e/200524-2.png&quot;
        srcset=&quot;/static/47601b449975028b35b7ca71d309b26a/5a46d/200524-2.png 300w,
/static/47601b449975028b35b7ca71d309b26a/0a47e/200524-2.png 600w,
/static/47601b449975028b35b7ca71d309b26a/9f82e/200524-2.png 820w&quot;
        sizes=&quot;(max-width: 820px) 100vw, 820px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;비직렬적-스케쥴에서-발생할-수-있는-현상&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B9%84%EC%A7%81%EB%A0%AC%EC%A0%81-%EC%8A%A4%EC%BC%80%EC%A5%B4%EC%97%90%EC%84%9C-%EB%B0%9C%EC%83%9D%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%98%84%EC%83%81&quot; aria-label=&quot;비직렬적 스케쥴에서 발생할 수 있는 현상 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;비직렬적 스케쥴에서 발생할 수 있는 현상&lt;/h1&gt;
&lt;h2 id=&quot;t1이-읽고-t2가-쓸때&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#t1%EC%9D%B4-%EC%9D%BD%EA%B3%A0-t2%EA%B0%80-%EC%93%B8%EB%95%8C&quot; aria-label=&quot;t1이 읽고 t2가 쓸때 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;T1이 읽고, T2가 쓸때&lt;/h2&gt;
&lt;h3 id=&quot;오손-읽기dirty-read&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%98%A4%EC%86%90-%EC%9D%BD%EA%B8%B0dirty-read&quot; aria-label=&quot;오손 읽기dirty read permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;오손 읽기(Dirty Read)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;T2가 값을 고치고&lt;/li&gt;
&lt;li&gt;T1이 그 값을 읽었는데&lt;/li&gt;
&lt;li&gt;T2가 롤백하면&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ T1은 무효가 된 데이터를 읽게 됨&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 730px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAAB3ElEQVQoz42SD2/aQAzF8/2/y7RJ69DQWqnr2kJpVW0rlKyFhgXI/0ASAkkIyes900hs3aSeZOXuYv/87LM2NGN09QBXuo/j3gifzu7w8fQ7Wt/66A499B5CdO5dXPRt9H6F6s5Hu6OjdT7A++MbtC91ue+o+7vJEtrQjAR2emvg6OsPfDi5wbt2V6An12NcK+CVAncGNm7HES77c3y+GKB19hNHyudLV1c+gfjdK3HacrnEeDzCaPSIIAiwXq+xWq2QZRskcYyy3KLa7ZBtNqjrCnVV4e9Vqbuq2sk/AbquK7AkSVAUBfK8UOdQgVOkysJwgZ2CvmVpURQJcLFYIE1TUeh5Pp6eDEwmE0ynU1iWJf+pPFaq6dfsN0p5Y3meQ2vIdV2/SN/b4SrLUuCmacJxHAkkgNBXCt9SBhNQJdsThqEoLApCM1Wdp3qdgJXyXmsegf1jCdzneSYqmm+arqV0qiOQMVRo265S/luUz+dzgWqe58EwDHEmNMsypSQWR/bW9wMVaP/RBraH9s9HoYImY2N8VcuyJSsT+b6P2Wwm4KY0VnJoFEOOKGQ5DG5em0EMJphnx9mPFfcM2rfjtXHkNGbXdV0ycNY4vCzZNGcvCl1RuN1uD4b4//YMI+eMUuiUSB0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%202.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%202.png&quot;
        src=&quot;/static/368156e2d36870af0b991651cc93224c/e9beb/200524-3.png&quot;
        srcset=&quot;/static/368156e2d36870af0b991651cc93224c/5a46d/200524-3.png 300w,
/static/368156e2d36870af0b991651cc93224c/0a47e/200524-3.png 600w,
/static/368156e2d36870af0b991651cc93224c/e9beb/200524-3.png 730w&quot;
        sizes=&quot;(max-width: 730px) 100vw, 730px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;반복-불가능-읽기non-repeatable-read&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B0%98%EB%B3%B5-%EB%B6%88%EA%B0%80%EB%8A%A5-%EC%9D%BD%EA%B8%B0non-repeatable-read&quot; aria-label=&quot;반복 불가능 읽기non repeatable read permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;반복 불가능 읽기(Non-repeatable Read)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;T2가 값을 고치고&lt;/li&gt;
&lt;li&gt;T1이 값을 읽었는데, 이전에 읽은 값과 값이 달라지는 현상&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 808px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAAB3UlEQVQoz41SYVObQBC9//9DOtMP2uqMo9NWG41O2toWE8lMMSQkQIAECBwEkCTwvD2DNbbjeDNv2N1b9t6+XfZdC9HuB7js+zg472Pvyw3en1zj49dbGWsLtLouzhT70e652D/tYv+si3dHHRy0VLRVHxfqXIIpdzN01CnOf+k4PP2BD5862Du+xFHrN656Jm6GIZSBj59/PKiTBN9UC5+vbnFyoeBYoHWtQdED9IwI3dECzJ/PMBjcwbZMZMsllgJ5nqEocuGnqKo16mqDQsSEIVDj5amrSuYQmDebwfd9BEGALKNCBcpyJfwQSZKKBzJpr1YrvOWwOI6xWCzAOd8WzGWB0ciAYRgwTRPT6VTmEHueJDI3jrn8NsiyXJJhtWihQSWoNxCNPL26Xq9lcU3TYFmWLE6grsIwlHZZlvI/9hr9eqsXJY7HY1ksiiKhcS7kSLYPv2j5OcP/gc5ms4Gu6xgOh1IWYkyaNvfP89lbhKZEYti0SOyoYBxxoa8j/SiKpZaMnDRNdwQm8SlOE6b2qE3XdXeGR/H5PJBDs20bnueJ+wiMJkgO/UCFaQc5T8WUx5hMTDiOK+921+avHP9o6DiOWOzB0w7e3xeSHa0T5/F2RR5Xi1hR3mt4ADiIjb0cg2X2AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%203.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%203.png&quot;
        src=&quot;/static/502c52f6c96b810892cee6264364604c/3534c/200524-4.png&quot;
        srcset=&quot;/static/502c52f6c96b810892cee6264364604c/5a46d/200524-4.png 300w,
/static/502c52f6c96b810892cee6264364604c/0a47e/200524-4.png 600w,
/static/502c52f6c96b810892cee6264364604c/3534c/200524-4.png 808w&quot;
        sizes=&quot;(max-width: 808px) 100vw, 808px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;유령데이터-읽기phantom-read&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9C%A0%EB%A0%B9%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9D%BD%EA%B8%B0phantom-read&quot; aria-label=&quot;유령데이터 읽기phantom read permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;유령데이터 읽기(Phantom Read)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;T2가 새로운 값을 삽입하여&lt;/li&gt;
&lt;li&gt;T1이 이전에 없던 새로운 값을 읽게 되는 현상&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 814px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAAB70lEQVQ4y42SS2/aQBSF/f//RldtpEZRF30Q0tA2sKgKpECyAIxtDBiPg8HmYZvHyZyLBlG6yUif5n3uuXfGqvdj3LcUfnZecP29jfdf65o/uLpt6vUQFU25McZt3UelrXDXnOBDqYGrUhPvPtVwfd/BD71ebgZo9GewOnaIasvDQ3OAj19+4aZUw823Kj5X6njsKTx5Czz2FRrdEM/DBL+ffNzV2ihX/woPjR7aTozWIMYgSGG9RArOwIbrDKBUiDzbHMkzHPZbAAdsi1zWOD5y0Q77E5ZSCuPxWPA8D2EYIk1T5EVxOr/dbnWA/Hj3cPiXC20ryzIRWC6Xx361xGQSwHU9LBYJZrNYMwPPnQvudrsTDEg4tgrthNHPmc8TnX6EKIpENEkSOI4j9Ho96YMgkKx4hsEI71p4Q2Nk3/cxGo2kp2NmRFarlbg7pfxfTS4wNXRdF8PhEOv1WqDYZrMRQToz59/kcL/fi+B0OhWHhKlSzAQ9OeRhAzfZm0KzvuzpKI5jeTTWM0lSpMtU13EqD8g6c5+uLRaW0Vlo27alTvP5XDaZCkXphHMT5Bio0I6V/mpDccvvx2AWJ91uVyZGiJtcp0CW5SJYnP3L81IwGzMmFl2YJzdfKAwj7diVT05hwnT5COZRCOfna7z7Cm983QSjis+qAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%204.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%204.png&quot;
        src=&quot;/static/a61e37a0fc65d9370f386c3dd30f0eba/a4262/200524-5.png&quot;
        srcset=&quot;/static/a61e37a0fc65d9370f386c3dd30f0eba/5a46d/200524-5.png 300w,
/static/a61e37a0fc65d9370f386c3dd30f0eba/0a47e/200524-5.png 600w,
/static/a61e37a0fc65d9370f386c3dd30f0eba/a4262/200524-5.png 814w&quot;
        sizes=&quot;(max-width: 814px) 100vw, 814px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;t1과-t2가-값을-쓸때&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#t1%EA%B3%BC-t2%EA%B0%80-%EA%B0%92%EC%9D%84-%EC%93%B8%EB%95%8C&quot; aria-label=&quot;t1과 t2가 값을 쓸때 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;T1과 T2가 값을 쓸때&lt;/h2&gt;
&lt;h3 id=&quot;갱신-손실lost-update&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%B1%EC%8B%A0-%EC%86%90%EC%8B%A4lost-update&quot; aria-label=&quot;갱신 손실lost update permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;갱신 손실(Lost Update)&lt;/h3&gt;
&lt;p&gt;:T1의 갱신한 값을 T2가 덮어써서 T1의 갱신이 손실됨&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 693px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAACbklEQVQoz3WS208TURCH+++KMfHJB33QxGfxkhgIgkYNUROCBA02iFJFQ1thCy3l1tv23m1L6fayt3b3c3YBMUZO8tuTk535Zn7nTGg9UeTRUornq4c8/Zhm8n2KB4tJFjaOiW/lWFxO8mFlj5iS41k4zWz4gJlP+zyUnCfLexKfJFNu4y/X8wi9XT/k5myc+28S3Hrxi2tTUa5PR3m8tEN4NcX03CZzL+OsrCW5/SrO3fkEd15vMyExN2ZiTExtohzVzoCuAD13jD400A2bgenLCs6mbeOOHXoDg4Gc3fGI8cjBNE0sy2Lk2IEc28JnSHP4n5DWd0hUenxPqaIiO2WddMMgUR1gWDaV5pDWqREkXbU8AXkBEULqqSWQPhHlmEgiK3uGRKGNUhnSF+B+vku50Zf7cSlKrNq1UU9tSrpDQc5V3T6HnUFDo7FHtWdT6znUpNvyqRnI71xuhZ/JJnnpumM6xApdNrYO+BrfRzmukdMG4m5Ax3D+dBoyRy4lqZRv9VHbQ8pdSyRWRT4wHK2SznXoOyNiqs5Wps52vkVkt8BOSWe3YWOMLu2HKtJyXALXtjN8SeRQil1StSGbao+xN2YhUiKabgbBujWmI3W6AtCNE6pahlY7S/cki9Y4wLZahPzZaQ0d0YjmQHaRJuoEZT3mVnL8SGpYrsu23LWSrRM7qlPRCjTrKTLFQyq1Y7T6AZYpQD/p6uUxuXDI560qjjxKtKizkS4RSaoopQ57mimWLfn3l+WztH/knZcRy/fm93j3rXjFuFwW9qcgeBTbcYJB/Z9MY0j9pE+72xc7/kDbZ/v5cF/IZ1y88m+FiHcB2CaCpQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%205.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%205.png&quot;
        src=&quot;/static/34ab51fdffe8d6aabf629735374ffd25/61c63/200524-6.png&quot;
        srcset=&quot;/static/34ab51fdffe8d6aabf629735374ffd25/5a46d/200524-6.png 300w,
/static/34ab51fdffe8d6aabf629735374ffd25/0a47e/200524-6.png 600w,
/static/34ab51fdffe8d6aabf629735374ffd25/61c63/200524-6.png 693w&quot;
        sizes=&quot;(max-width: 693px) 100vw, 693px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;모순성inconsistency&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AA%A8%EC%88%9C%EC%84%B1inconsistency&quot; aria-label=&quot;모순성inconsistency permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;모순성(Inconsistency)&lt;/h3&gt;
&lt;p&gt;:T1이 x, y를 각각 갱신하는 사이에 T2가 값을 갱신하여, 어떤 값은 갱신 전의 값을, 다른 값은 갱신 후의 값을 읽어 데이터가 불일치 하는 현상&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 700px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 77%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsSAAALEgHS3X78AAADBUlEQVQ4y4WTy28bVRSH/b/xWLAFCQmJPWLNjkWphEBIUBCbIrVI7YJNF10U0iYKTaLYTv2YeJLY8St+xOPH+JGXPU+PZ+bjzHUKCInW0vG9c+/RN7/zO2dSxarBR9/t8fkvBT79KcsHX+/xzp0d3v1ql0cvDnnwMM2db3b4/ucM9378k0cbGh//kOGz+3k+uZfl/bs7vHd3lw+/3aFY7ZOyHJeCQPOn6yhIJBe5isHk4oaeMeGk0qMs5632iPHsWt29zlUh+ZqEZbukIGYZhnhhTAAsY3CDECdYqTWOZfVX2F5yGxJFEd4qxP93/irJDwlkTXmriPS5xcvKkGe5Ohtai9z5nLzhkDMWRGFAf+LQM215d8hwviTdXbB7OuT3QpPnWpuiYbHfmdO99knZy5Bj06XWGZHRTskfN8kdNSi3Ruo8FGDTmFPr3iiFxo1PY+pRk/LThbLKb/SmtGY+nUsvAa7QBg563WA7e0T6sM5Je0xjOJdzmzhacdS8QqtdCDBSwOrEo1TvSb5ORm/QGVvUxi6dKwGKBVRnS1HjoQ9t9IHF6TTgeOxzduEqVQflKfv6hMTv10BdgM/38mxnDmmZC2pypoCuPcaxRliLEY5t4jljrPkA30sUoXx7qZls5oZr4PW65KqUfFCqKXDTmP1T8nknx6hfpNd9hTksYZwXaJ9luLlsrIGi8I+DAU/3DQUciMK8YZOtSVMOKmxpZ5xIZbnegu6VNCUZi/rMojMdUTUvKZvSAHkuiy/JGxPfnuz2+G27q4BBGDFzAi7ckCs/4tILmdmBiuROmhKhDcWTRp+t9CHpknS4O6NpWhT6lgI+3urwYKOlgHEc86Zfyrkdm2p7qMZFq7R5pdc5bvY5Ml0F/PVFi/vPmmsDojX0/yKVfA3ZnkW6KoOdrbApnhyKMn3oqsFGxubLxyd88VCXIV+R6HuTylTyd+2tbj2JxZNI+TGxllh+qICbJZON4mgNjN+iMAgCGRGX5W0Evvf3Pjm3bVuYvopk77oujuOoSPb/ff4LHFBLgbHg06AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%206.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%206.png&quot;
        src=&quot;/static/19fd6cd82a493ec0c6af0b880d6f26e9/8c557/200524-7.png&quot;
        srcset=&quot;/static/19fd6cd82a493ec0c6af0b880d6f26e9/5a46d/200524-7.png 300w,
/static/19fd6cd82a493ec0c6af0b880d6f26e9/0a47e/200524-7.png 600w,
/static/19fd6cd82a493ec0c6af0b880d6f26e9/8c557/200524-7.png 700w&quot;
        sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;연쇄-복귀cascading-rollback&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%97%B0%EC%87%84-%EB%B3%B5%EA%B7%80cascading-rollback&quot; aria-label=&quot;연쇄 복귀cascading rollback permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;연쇄 복귀(Cascading Rollback)&lt;/h3&gt;
&lt;p&gt;:T1이 x를 수정하고, 이를 롤백하려 하는데, 그 사이에 T2가 x를 또 다시 갱신해버려 T1의 롤백이 불가능한 상태&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 586px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAAC7ElEQVQ4y22SW28bVRSF/U+ReOCJB3iiUoWEVAmpog+UCkEFVUUpaqviqGkqXqCX2E5jx3EcTxzfxtfYY8fOeDye+3jG/ti2Q5EQWzpas8/ZZ80+a+3E76kad3ZKfLer8PWzIreennD7eZFCucvznQLJ3VN2ZGUKKt++KHFP6r5Jnm7qbj0p8LrQZh3L5WqDiR9flfjilxO+fHzCp/dzfPJ9ls9+yvEmW+f+zwc8fHzMg4c59t4q3HhU4OavRT5/kOfje4eb2mSq/oFwtVqRWIQhE9PGcHxM18ewHKaWTRwtcD2XmZx5gpHkjmPjuja+57AIXTz5DgNPyKIN2aZDbR5S7M/J1jWyjSHVsYdy6aHNA3w/pC95EC7kUswyusTQK1yNy4y0Ep7Tlj2NKLwQtLaEbSOg0jfZz5Z4X6yRP2tS7k3pmgts6VpRZ3hCzGrJIrggk0qSepckvb9DWfmLRj1D4DXleM66yURLCEu9GW+zCpliA6U1pjyw6MwCTMsjXRzjeOFaJcEhE11F16sMhmcMRxUsU8jioUhkbzuceRHViUf9yqM2cVGngeQ+VhgznbnsZQbbp5sBR705B9U+ufMqpb7BydBlMPeFJv5XQz7Eiv/GSLf57c+OmBLSMXyqQ5sjRSV1XKVYu6ApP25N/e3t1bXLUbzC8GLmEZjhiql0rLuLTZE2sflhVxVnA5HApzRwRIIGb44qKB2d8sinqW8Jr8eQRHcWku8avD6us6+0KWsWp5qDZoVCaHH7SUW09LHDiPrEpDuz6F4NBee0DBmpONw8GdaTEJBYa1boGLx6l+ePdJHseY90uS8uhwzGFl89OsPY6CQtyIgML/JovTwdNUO/k6N2vk+9mqYve/FCI6G7EZWxS/XSoTKyqY0dFOnSjZaU21M+upOjN9466Hs9socvOXy/R1M9oN06RG1khDBFUzCSsUr8nxn/RGdkcvdlg4m4LbMhA6wT+iN8V5NT43rNZJkbjBdT/gZ7D7RTMO4C5gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%207.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%207.png&quot;
        src=&quot;/static/66334ee9cc78e1a3e5b59e9824b6e731/a76f4/200524-8.png&quot;
        srcset=&quot;/static/66334ee9cc78e1a3e5b59e9824b6e731/5a46d/200524-8.png 300w,
/static/66334ee9cc78e1a3e5b59e9824b6e731/a76f4/200524-8.png 586w&quot;
        sizes=&quot;(max-width: 586px) 100vw, 586px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;락lock&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%9D%BDlock&quot; aria-label=&quot;락lock permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;락(Lock)&lt;/h1&gt;
&lt;p&gt;:Optimistic Lock(비선점 락? 낙관적 락?)과 Pessimistic Lock(선점 락? 비관적 락?)&lt;/p&gt;
&lt;h2 id=&quot;락킹-단위locking-granularity&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%9D%BD%ED%82%B9-%EB%8B%A8%EC%9C%84locking-granularity&quot; aria-label=&quot;락킹 단위locking granularity permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;락킹 단위(Locking Granularity)&lt;/h2&gt;
&lt;p&gt;:잠금의 대상이 되는 객체의 크기&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 43.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAABn0lEQVQoz31SXW/TMBTtL+cX8MDv4IUXHia2abxM06igqhhdx0bWjzShTRo7dpw68cfh2qF0SIgrndjHHyf33OuR9x7OuYi+t2CMQ+sOxzgcDuB1DaVU5NZacM6gmoYY3SUuRE13dNwfhU8Q60hE6xKNSnDQK3QdGwTinobpTz8xxsN6nLgjjcg9RnmaRvW+Nyh2Y+TJObaLC0h+B9sItFmG8voG1ecJuqqEayV8X8OpnFDCUHau3dNaM2RYlmUUNM5g83SN6vIC7OoSIp1CzScQ3z5i9/4V9ldv0MzHUI9TiOUHVJ9eQ83e0doM8utb6Gz8t+Xe9MgWt9ien0Xw/H6woyTU0x3a5Xe8cPnPCP0YHZsSatUWK/CHL2APE6ifK9i6IksMppEEARM439O4h5MsInJWwMqh5lEwIIRaJxDJHGa3QZ8voVNqUPoDek0I4yaJa132jO1sguJ+SvMF7T+S5cXJ8lGwpCfzvFqDCYnOuv/aK+hsmm/BZQPz0jJ+iw2iPkxgjYljIwQy6nKeZ/HtxXNUmoBjhHfonf2T1C8cmbGS/AMZKgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%208.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%208.png&quot;
        src=&quot;/static/95d271d5daa2e65098d55a89bb3b2564/c1b63/200524-9.png&quot;
        srcset=&quot;/static/95d271d5daa2e65098d55a89bb3b2564/5a46d/200524-9.png 300w,
/static/95d271d5daa2e65098d55a89bb3b2564/0a47e/200524-9.png 600w,
/static/95d271d5daa2e65098d55a89bb3b2564/c1b63/200524-9.png 1200w,
/static/95d271d5daa2e65098d55a89bb3b2564/f87c7/200524-9.png 1247w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;optimistic-lock&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#optimistic-lock&quot; aria-label=&quot;optimistic lock permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Optimistic Lock&lt;/h2&gt;
&lt;p&gt;:트랜잭션 대부분 충돌이 발생하지 않을 때 사용하는 방법&lt;/p&gt;
&lt;p&gt;→ 자원을 선점하지 말자, 충돌이 일어날 때만 적절히 대응하자&lt;/p&gt;
&lt;p&gt;→ 엔티티에 version을 담아두고, 수정할 때마다 version을 +1씩 업데이트 한다&lt;/p&gt;
&lt;p&gt;→ 엔티티를 가져와서 값을 수정하고 다시 저장하려고 하는데 갖고 있는 version과 DB의 version이 다르면 rollback!&lt;/p&gt;
&lt;h2 id=&quot;pessimistic-lock&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pessimistic-lock&quot; aria-label=&quot;pessimistic lock permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pessimistic Lock&lt;/h2&gt;
&lt;p&gt;:트랜잭션이 데이터에 접근하는 동안 그 데이터를 선점&lt;/p&gt;
&lt;p&gt;다시 공유락(LS, Shared Lock)과 배타락(LX, Exclusive Lock)으로 나뉨&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;공유락) T1이 X에 대해 공유락을 걸면&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;T1과 T2 모두 X를 읽기만 할 수 있음&lt;/li&gt;
&lt;li&gt;T2가 동시에 X에 대해 또 다시 공유락을 걸 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;배타락) T1이 X에 대해 배타락을 걸면&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;T1은 X에 대해 읽기/쓰기를 모두 할 수 있지만&lt;/li&gt;
&lt;li&gt;T2는 아무것도 할 수 없음&lt;/li&gt;
&lt;li&gt;락을 허용받지 못한 T2는 대기 상태가 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2단계-락킹2plp-2-phase-locking-protocol&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2%EB%8B%A8%EA%B3%84-%EB%9D%BD%ED%82%B92plp-2-phase-locking-protocol&quot; aria-label=&quot;2단계 락킹2plp 2 phase locking protocol permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2단계 락킹(2PLP: 2-Phase Locking Protocol)&lt;/h2&gt;
&lt;p&gt;: 트랜잭션들이 Lock하는 시간과 Unlock하는 시간을 구분하여 수행&lt;/p&gt;
&lt;p&gt;→ 직렬 가능한 스케쥴을 항상 보장한다는 것에 의의가 있다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;확장단계(growing phase): 트랜잭션이 Lock 연산만 할 수 있고, Unlock은 할 수 없음&lt;/li&gt;
&lt;li&gt;축소단계(shrinking phase): 트랜잭션이 Unlock 연산만 할 수 있고, Lock은 할 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 연쇄 복귀 문제에 빠질 수 있다&lt;/p&gt;
&lt;p&gt;→ 이는 모든 unlock연산을 트랜잭션이 완전히 완료된 후에 실행하도록 하는 엄격한 2단계 잠금(strict 2-Phase Locking Protocol)을 통해 해결 가능하다&lt;/p&gt;
&lt;h1 id=&quot;교착상태deadlock&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9Cdeadlock&quot; aria-label=&quot;교착상태deadlock permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;교착상태(Deadlock)&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 849px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 45.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAABrElEQVQoz2WR3W7aQBBG8/4P0V5Vvel1olaoUS6KGgSEKoWAYzABjLEx2AEbbO/aJ2PzW3WkT+ud2Tn77fgGiYntU2+ZPLZNnrtjOs8WjaZBvdFn6b9ziifD4/bxjZ+tCfeiu99jepZf1YqiqHRTbszBG7VvNeoPHZp/hjQ7Q+rNVx5+dVm4wbEh53tjytcfBp9v+3y66/OlNuT+yf4fGEcbRq99yeqDFdkTXZzJSVQOOkvZO5asyaUkyoviDK2AURAyf3kh2UZoSXqjEf5gQK40Os/PjeF2h+u6rLd7VmEMKiNKdFUrjtCDw+0W2zRJ45iyfT2b8T4ey9V5BdQ6J96nxIk6PCDVWAOT2J7Qnbp0rDnDxeoCDIMAo9djF0UVMJtOKcQhWUYqLjsjm9bIwZh65CufzS4l8Ddyzsbd7AmjvVyWXYBqvUa12xTlKta1gEp3+VGZQMv8Lk7Y/TWYeysca0Zi2WRcj/o4w6Js1DIv0QmilKpU5opjrgwtYwmDNZu1PFGpf/5w5fD0cR1KHM5tG8dxGMssFwuH5dLH930mMl/P8wjC8Ay7hn4AgI+t5R0RV70AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%209.png&quot;
        title=&quot;200524%20Transaction%201a6758c01e984b0a8c427bac6ea41fc4/Untitled%209.png&quot;
        src=&quot;/static/822c2ad6f01de55baa419d9465fe58b3/f96df/200524-10.png&quot;
        srcset=&quot;/static/822c2ad6f01de55baa419d9465fe58b3/5a46d/200524-10.png 300w,
/static/822c2ad6f01de55baa419d9465fe58b3/0a47e/200524-10.png 600w,
/static/822c2ad6f01de55baa419d9465fe58b3/f96df/200524-10.png 849w&quot;
        sizes=&quot;(max-width: 849px) 100vw, 849px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;→ 두 트랜잭션의 서로의 Unlock연산만 기다리고 대기상태에 들어가게 됨&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SOLID]]></title><description><![CDATA[이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다. SOLID: 객체지향설계…]]></description><link>https://junbyeol.github.io/language/200207-SOLID/</link><guid isPermaLink="false">https://junbyeol.github.io/language/200207-SOLID/</guid><pubDate>Fri, 07 Feb 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;SOLID: 객체지향설계 5대 원칙&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cheese10yun.github.io/spring-solid-dip/&quot;&gt;Spring 예제로 보는 SOLID DIP - Yun Blog | 기술 블로그&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;ocp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ocp&quot; aria-label=&quot;ocp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OCP&lt;/h1&gt;
&lt;p&gt;: Open/Closed Principle, 개방-폐쇄 원칙&lt;/p&gt;
&lt;p&gt;: 확장에 대해서는 개방 되어 있어야 하지만, 변경에 대해서는 폐쇄되어야 한다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;확장? → 새로운 타입을 추가함으로써 새로운 기능을 구현한다&lt;/li&gt;
&lt;li&gt;변경? → 확장이 발생했을 때, 해당 코드를 호출하는 쪽에서 변경이 발생하지 않아야 변경에 대해 닫혀있는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ocp-실패-사례&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ocp-%EC%8B%A4%ED%8C%A8-%EC%82%AC%EB%A1%80&quot; aria-label=&quot;ocp 실패 사례 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OCP 실패 사례&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 511px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAAA/klEQVQoz5VS14rEMAz0/39e8pBOXkJ6732W0eJjOQK3JxBykWZGstV93/jGaYzTNKEoCuR5LjHLMvG2bXGeJxT+YcdxCJBlWXAcR5xr27YRxzHWdYVi0jiOwpamqbAlSYKmaTDPs7AOw4BlWeQuCAI5fyJjjiIYF1EUwfM8KXBdF3Vdo+97aYXMNAJt2/aoft/3t0Kt4sl4R2Zt13WJcpJ9Os/KsnwDcsgsYrJ2TcBWu6772TOyG9/3YRgGTNOUyDlytlSvKJVtE/jJSUZQJldVhTAMRRXBWUvX85MZ/vWy/CosIACBOVP9jX4/irT87R/ULVM1lXx2wVmTjIAvYda5/2Pr7E8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled.png&quot;
        title=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled.png&quot;
        src=&quot;/static/1c4cd304ee435e91674bfc27e9cd5159/92e00/200207-1.png&quot;
        srcset=&quot;/static/1c4cd304ee435e91674bfc27e9cd5159/5a46d/200207-1.png 300w,
/static/1c4cd304ee435e91674bfc27e9cd5159/92e00/200207-1.png 511w&quot;
        sizes=&quot;(max-width: 511px) 100vw, 511px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;신한카드 결제만 있었던 시스템에, 우리은행 결제가 추가되어야 한다!&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/ocp/anti/payment/shinhan&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; method &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RequestMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestBody&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ShinhanCardDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    shinhanCardPaymentService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/ocp/anti/payment/woori&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; method &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RequestMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestBody&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WooriCardDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    wooriCardPaymentService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⇒ 앞으로 카드가 추가될 때마다, 새로운 API를 계속 만들어야함&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentRequest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; cardNumber&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; csv&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardType&lt;/span&gt; type&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 컨트롤러&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/ocp/anti/payment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; method &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RequestMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestBody&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;SHINHAN&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        shinhanCardPaymentService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;WOORI&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        wooriCardPaymentService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 그 해당 카드 이외의 타입이 들어오면 예외처리는 어떻게??...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⇒ API 면에서 보았을 때, DIP의 개념 준수&lt;/p&gt;
&lt;p&gt;⇒ Request값을 통일하여 추상화의 기초가 됨&lt;/p&gt;
&lt;p&gt;⇒ 카드가 추가될 때마다 if문이 추가되어야 함 == 컨트롤러 계층이 너무 많은 책임을 갖는것&lt;/p&gt;
&lt;p&gt;⇒ 확장이 발생했을 때, 해당 코드를 호출하는 쪽에서 코드의 변경이 일어나므로 OCP 실패&lt;/p&gt;
&lt;h3 id=&quot;ocp-성공&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ocp-%EC%84%B1%EA%B3%B5&quot; aria-label=&quot;ocp 성공 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OCP 성공&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABJUlEQVQoz22S3Y6CQAyFef+n4gX0RjExQgTCHTEq/4jQzdfkmHF3m5Qy7emZ05mJXq+X9X1vt9vt4/f73YZhsGVZDBvH0Z1c0zSOV27bNscoRhS7rrMsy+xyuViaplYUhTdTm+fZ6zTvdjuL49j2+73Xyb/f729CCuu62m8D+Hw+nfR6vbpyyKdpcqeHmnr/KJQiXLvTiHEEj8fDVUIqLOOHhHjEBzVyAOSIctaohYh/ImuRSJ0r/G9ULgolugAIdFZSg3qmoN627eeConAHQGVZ2uFwsCRJ3I/Ho+V57o3asK5rO5/PXj+dTh8MqqPwQGmqqsqfi8YmskaBCMGgDtOxYEzyRUhCNxieKeNLIeSMGGKEY5MvQikJHzJR71GKlFcM/38AtJYH9kCEk9gAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%201.png&quot;
        title=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%201.png&quot;
        src=&quot;/static/9487389af4d08a4a5bcf6fda92404492/17d73/200207-2.png&quot;
        srcset=&quot;/static/9487389af4d08a4a5bcf6fda92404492/5a46d/200207-2.png 300w,
/static/9487389af4d08a4a5bcf6fda92404492/17d73/200207-2.png 571w&quot;
        sizes=&quot;(max-width: 571px) 100vw, 571px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/payment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; method &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RequestMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestBody&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; cardPaymentService &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cardPaymentFactory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        cardPaymentService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ShinhanCardPaymentService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ShinhanCardDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; paymentRequest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;buildPayment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        shinhanCardApi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paymentRequest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WooriCardPaymentService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;    
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WooriCardDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; paymentRequest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;buildPayment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        wooriCardApi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paymentRequest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⇒ 새로운 카드 결제가 추가되어도 Controller의 수정이 필요없음(cardPaymentFactory 클래스의 수정이 일어나기는 함)&lt;/p&gt;
&lt;h1 id=&quot;dip&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dip&quot; aria-label=&quot;dip permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DIP&lt;/h1&gt;
&lt;p&gt;: Dependency Inversion Principle, 의존관계 역전 원칙&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;상위 모듈이 하위 모듈에 의존해서는 안된다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dip-실패사례&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dip-%EC%8B%A4%ED%8C%A8%EC%82%AC%EB%A1%80&quot; aria-label=&quot;dip 실패사례 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DIP 실패사례&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 521px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 29.333333333333332%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAAArklEQVQY03VRyw6EIBDz/38O8YAnvRkPHkSMD/DR3ZIMccnapAGmnUmBAl+c54nrupBD6vd9J7L2D9ToLWiY5xl936MsS2itUVUV6rqGcw7Lsvw0sWaMST72KKXQti3WdUVxHEdsklW4bRtCCJimKWqiN02DruuiLl4Okn0cSPEN1tqoe+8xjiOGYXi9ckwoV2bDvu+JPNNACvhGkjz3poQ05oYnn5/y9OYBSIb7AIQK0a9qW0iAAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%202.png&quot;
        title=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%202.png&quot;
        src=&quot;/static/c2ce9a9a8d747155d792483e97c3337d/bb9c5/200207-3.png&quot;
        srcset=&quot;/static/c2ce9a9a8d747155d792483e97c3337d/5a46d/200207-3.png 300w,
/static/c2ce9a9a8d747155d792483e97c3337d/bb9c5/200207-3.png 521w&quot;
        sizes=&quot;(max-width: 521px) 100vw, 521px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;상위모듈(PaymentController)이 하위모듈(ShinhanPaymentService)에 의존하고 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/dip/anti/payment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; method &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RequestMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestBody&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ShinhanCardDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        shinhanCardPaymentService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;   
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ShinhanCardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ShinhanCardDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        shinhanCardApi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;   
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⇒ RequestBody의 키값 하나만 바뀌어도, 컨트롤러, 서비스, 심지어 프론트엔드까지 영향을 미침&lt;/p&gt;
&lt;p&gt;⇒ 확장에 유연하지 못함(OCP 실패)&lt;/p&gt;
&lt;h3 id=&quot;dip-성공&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dip-%EC%84%B1%EA%B3%B5&quot; aria-label=&quot;dip 성공 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DIP 성공&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABJUlEQVQoz22S3Y6CQAyFef+n4gX0RjExQgTCHTEq/4jQzdfkmHF3m5Qy7emZ05mJXq+X9X1vt9vt4/f73YZhsGVZDBvH0Z1c0zSOV27bNscoRhS7rrMsy+xyuViaplYUhTdTm+fZ6zTvdjuL49j2+73Xyb/f729CCuu62m8D+Hw+nfR6vbpyyKdpcqeHmnr/KJQiXLvTiHEEj8fDVUIqLOOHhHjEBzVyAOSIctaohYh/ImuRSJ0r/G9ULgolugAIdFZSg3qmoN627eeConAHQGVZ2uFwsCRJ3I/Ho+V57o3asK5rO5/PXj+dTh8MqqPwQGmqqsqfi8YmskaBCMGgDtOxYEzyRUhCNxieKeNLIeSMGGKEY5MvQikJHzJR71GKlFcM/38AtJYH9kCEk9gAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%203.png&quot;
        title=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%203.png&quot;
        src=&quot;/static/9487389af4d08a4a5bcf6fda92404492/17d73/200207-4.png&quot;
        srcset=&quot;/static/9487389af4d08a4a5bcf6fda92404492/5a46d/200207-4.png 300w,
/static/9487389af4d08a4a5bcf6fda92404492/17d73/200207-4.png 571w&quot;
        sizes=&quot;(max-width: 571px) 100vw, 571px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/payment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; method &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RequestMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestBody&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; cardPaymentService &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cardPaymentFactory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        cardPaymentService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ShinhanCardPaymentService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        shinhanCardApi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⇒ 상위모듈(PaymentController)이 PaymentService 인터페이스를 바라보며 하위모듈(ShinhanCardPaymentService)에 의존하지 않음&lt;/p&gt;
&lt;h1 id=&quot;srp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#srp&quot; aria-label=&quot;srp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SRP&lt;/h1&gt;
&lt;p&gt;: Single Responsibility Principle, 단일 책임 원칙&lt;/p&gt;
&lt;p&gt;: 클래스나 메소드는 하나의 역할만을 하며, 한가지 책임만을 진다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클래스는 단 한개의 책임을 가져야 한다&lt;/li&gt;
&lt;li&gt;누가 해당 메소드의 변경을 유발하는 사용자(Actor)인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;srp-실패-사례&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#srp-%EC%8B%A4%ED%8C%A8-%EC%82%AC%EB%A1%80&quot; aria-label=&quot;srp 실패 사례 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SRP 실패 사례&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;신한카드에 해외결제 기능을 추가하고, 우리은행은 해외 결제가 되지 않는다면?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAACPUlEQVQoz4VTS2saURSeSDUKrU2hi1IIzT9ol10UCm6Khag02Srdaighi278A+4EcZelbhQ3IhQURNGFbyVR8RGN8T3WR+pbidXb797G0nTTA2fOzJxvvnPud85wl5eXL2q1miocDitCoRDzRCKhbDQah5FIZI+D5XK5V8B8arVaimKxqCiVSopOp6Os1+sf7Xa7mGLcbjfHrFqtqggMH5CbmxuCZ8LzPJnP5ySZTL6lGOS+UAzNoQhBcTIej8lqtZq5XK59iolGozuMEFUZ4b+2Xq9JMBh8RzEg+drv98lgMCCz2YwSMczd3d3M4/Ewwlgs9puwXC5/mEwmfQDb0+mUOo/773jXzGazbyjm6upKDWkmmUyGv76+bi8WC4q5BaaEo76kmIuLCwGk4DiHwyHwer0Sv98v8fl84kAgIMzn88JUKiXk7g2dcYVC4YnRaHyOxkQGg0Esk8meWSyWXe5/ZrVad09OTsRarVaiVqv3dDqdVK/XS5F6tMXYbDbh6empRC6XPz47O5NqNJqnJpNJihOIOFyoCygQE96H8BUcj0+n003EJjqt4Zg/MNFjikGXom63+w0d3yJXB6aBWMVAJ+1228AqQvyd+9EfVCqVn8vl8o/wWwPJZ4pxOp0iTD35d26z2bA4Go3OGSH0Y4RYgQN0s8bkCfbsASGqM8J4PC7CAJI0j64fFIbW59sOWcSAJL1e73A4HKqwJkoQK0FEl/wIErD1MJvNAiz+ezwf0R8AElGMAn4MGV7/AsSV7r/OLta+AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%204.png&quot;
        title=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%204.png&quot;
        src=&quot;/static/c90975142672138e75ea67e66a67d23e/17d73/200207-5.png&quot;
        srcset=&quot;/static/c90975142672138e75ea67e66a67d23e/5a46d/200207-5.png 300w,
/static/c90975142672138e75ea67e66a67d23e/17d73/200207-5.png 571w&quot;
        sizes=&quot;(max-width: 571px) 100vw, 571px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;payOverseas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ShinhanCardPaymentService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;payOverseas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// .. 신한 카드 해외 결제 로직..&lt;/span&gt;
        shinhanCardApi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paymentRequest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WooriCardPaymentService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;payOverseas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 우리 카드 결제는 해외 결제 기능이 없음...&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⇒ 하나의 클래스에 해외결제/국내결제를 하고자 하는 두 명의 Actor가 존재 == 두 개의 책임이 존재&lt;/p&gt;
&lt;p&gt;⇒ 만일 모든 클래스가 모두 해외결제/국내결제를 지원한다면, 그것은 카드결제를 하는 큰 한 명의 Actor만이 있다라고 볼 수 있다 == 큰 하나의 책임으로 묶을 수 있음&lt;/p&gt;
&lt;h3 id=&quot;srp-성공&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#srp-%EC%84%B1%EA%B3%B5&quot; aria-label=&quot;srp 성공 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SRP 성공&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 107%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsSAAALEgHS3X78AAAC/UlEQVQ4y61USUxTURT9/RSHxMTEGCIhjSEmJpoukJVsim6MS4fIRhNi3LNg09KKCxWWwAJdkoBJS6OJbbW0CAmLIkNTKdCRDmBLB6B0sHQMw/O8T3/DogyNvuTmvvx3/nn33OExzBmXw+EQlLwIlgqFQiQQCHDm9/tJOp2m+ydn5WPsdjtHOD8/L4pGo39IhbW+vv70RBKFQsF5qVTKmM1mjnBubq4e0VhyudzvnZ0dL8yXyWQ88CGv1/vgREJcynsBjKVms9lqent7hVqttra9vf1CQ0ODsK2tTSCRSNiWlpbTpSIa5r+tra0tlvpIJPJ8Y2NDD9nqsbGxz5OTk19WVlaMOH/PK7FYLMzy8jLD4IAJh8MsQJxNTEywMzMzbDweZ5FkIf0BmI+FQoGAgMRiMbK5uUn29/dJMpm08oSjo6OnR9jR0XGOeiT7Q6Wq4pIFnlCtVpf76/Lq6mqzSqVqwi13lEplk8FgaEYkYplMdolisL+fSqV6EOFr7Lup397efgdlL3nCoaGhQ0KQPT44OCDBYJAz2qiJRII2aravr+/WaSr4TigvNOmjSnL29vbSg4OD1ROura09RJPGkY8ILEp9sViMZbNZF/Jyg2Ig7xUa96fVajX+wDKZTEaoMOH7AE86PDx8SKjT6c5PT0/Xo7LXjlg9Rqyuv7//4tGioPIE7UOgilOBSxeqqjKdDOo9Hk/FKkPZL55wZGTkUD6iY9xut8DpdApQFBZFEUKSEI0qRKS19AdE1YqKvvX5fF2Q2gmcHC9MD16cFzhm0fg1mOcapEVwfHL/ZeFp4nvyKqZChvGi1qXX6+Uw6dLSkgIRXqcYl8t1BRF2Tk1NdY+Pj8uNRqMMmC4ofAMFNzkizCBbeprEdLyQGzoFJJ/Pc1Z66+5RzOLiYiNSkN/d3S2fU3wJ84wpJZ0jnJ2dFZNjFvLVSjFonUbMcu4YTJmQSyaKIMJtGiRYiwRrqGGvwSPwDa1zm2Lw4tRhij6hZb4fwXyFN4DnblVFOQvmL2ZR/jnEKS9IAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%205.png&quot;
        title=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%205.png&quot;
        src=&quot;/static/64a7bc858b5f1b282f9b7dc8aa7bb054/17d73/200207-6.png&quot;
        srcset=&quot;/static/64a7bc858b5f1b282f9b7dc8aa7bb054/5a46d/200207-6.png 300w,
/static/64a7bc858b5f1b282f9b7dc8aa7bb054/17d73/200207-6.png 571w&quot;
        sizes=&quot;(max-width: 571px) 100vw, 571px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;⇒ &lt;/p&gt;
&lt;h1 id=&quot;isp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#isp&quot; aria-label=&quot;isp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ISP&lt;/h1&gt;
&lt;p&gt;: Interface Segregation Principle, 인터페이스 분리 원칙&lt;/p&gt;
&lt;p&gt;: 클라이언트가 자신이 이용하지 않는 메소드에 의존하면 안된다&lt;/p&gt;
&lt;h3 id=&quot;isp-실패-사례&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#isp-%EC%8B%A4%ED%8C%A8-%EC%82%AC%EB%A1%80&quot; aria-label=&quot;isp 실패 사례 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ISP 실패 사례&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAACPUlEQVQoz4VTS2saURSeSDUKrU2hi1IIzT9ol10UCm6Khag02Srdaighi278A+4EcZelbhQ3IhQURNGFbyVR8RGN8T3WR+pbidXb797G0nTTA2fOzJxvvnPud85wl5eXL2q1miocDitCoRDzRCKhbDQah5FIZI+D5XK5V8B8arVaimKxqCiVSopOp6Os1+sf7Xa7mGLcbjfHrFqtqggMH5CbmxuCZ8LzPJnP5ySZTL6lGOS+UAzNoQhBcTIej8lqtZq5XK59iolGozuMEFUZ4b+2Xq9JMBh8RzEg+drv98lgMCCz2YwSMczd3d3M4/Ewwlgs9puwXC5/mEwmfQDb0+mUOo/773jXzGazbyjm6upKDWkmmUyGv76+bi8WC4q5BaaEo76kmIuLCwGk4DiHwyHwer0Sv98v8fl84kAgIMzn88JUKiXk7g2dcYVC4YnRaHyOxkQGg0Esk8meWSyWXe5/ZrVad09OTsRarVaiVqv3dDqdVK/XS5F6tMXYbDbh6empRC6XPz47O5NqNJqnJpNJihOIOFyoCygQE96H8BUcj0+n003EJjqt4Zg/MNFjikGXom63+w0d3yJXB6aBWMVAJ+1228AqQvyd+9EfVCqVn8vl8o/wWwPJZ4pxOp0iTD35d26z2bA4Go3OGSH0Y4RYgQN0s8bkCfbsASGqM8J4PC7CAJI0j64fFIbW59sOWcSAJL1e73A4HKqwJkoQK0FEl/wIErD1MJvNAiz+ezwf0R8AElGMAn4MGV7/AsSV7r/OLta+AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%204.png&quot;
        title=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%204.png&quot;
        src=&quot;/static/c90975142672138e75ea67e66a67d23e/17d73/200207-5.png&quot;
        srcset=&quot;/static/c90975142672138e75ea67e66a67d23e/5a46d/200207-5.png 300w,
/static/c90975142672138e75ea67e66a67d23e/17d73/200207-5.png 571w&quot;
        sizes=&quot;(max-width: 571px) 100vw, 571px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;우리은행은 payOverseas를 이용하지 않는데, paymentService에 의존하고 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;payOverseas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ShinhanCardPaymentService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;payOverseas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// .. 신한 카드 해외 결제 로직..&lt;/span&gt;
        shinhanCardApi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paymentRequest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WooriCardPaymentService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CardPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;payOverseas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 우리 카드 결제는 해외 결제 기능이 없음...&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;isp-성공&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#isp-%EC%84%B1%EA%B3%B5&quot; aria-label=&quot;isp 성공 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ISP 성공&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 107%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsSAAALEgHS3X78AAAC/UlEQVQ4y61USUxTURT9/RSHxMTEGCIhjSEmJpoukJVsim6MS4fIRhNi3LNg09KKCxWWwAJdkoBJS6OJbbW0CAmLIkNTKdCRDmBLB6B0sHQMw/O8T3/DogyNvuTmvvx3/nn33OExzBmXw+EQlLwIlgqFQiQQCHDm9/tJOp2m+ydn5WPsdjtHOD8/L4pGo39IhbW+vv70RBKFQsF5qVTKmM1mjnBubq4e0VhyudzvnZ0dL8yXyWQ88CGv1/vgREJcynsBjKVms9lqent7hVqttra9vf1CQ0ODsK2tTSCRSNiWlpbTpSIa5r+tra0tlvpIJPJ8Y2NDD9nqsbGxz5OTk19WVlaMOH/PK7FYLMzy8jLD4IAJh8MsQJxNTEywMzMzbDweZ5FkIf0BmI+FQoGAgMRiMbK5uUn29/dJMpm08oSjo6OnR9jR0XGOeiT7Q6Wq4pIFnlCtVpf76/Lq6mqzSqVqwi13lEplk8FgaEYkYplMdolisL+fSqV6EOFr7Lup397efgdlL3nCoaGhQ0KQPT44OCDBYJAz2qiJRII2aravr+/WaSr4TigvNOmjSnL29vbSg4OD1ROura09RJPGkY8ILEp9sViMZbNZF/Jyg2Ig7xUa96fVajX+wDKZTEaoMOH7AE86PDx8SKjT6c5PT0/Xo7LXjlg9Rqyuv7//4tGioPIE7UOgilOBSxeqqjKdDOo9Hk/FKkPZL55wZGTkUD6iY9xut8DpdApQFBZFEUKSEI0qRKS19AdE1YqKvvX5fF2Q2gmcHC9MD16cFzhm0fg1mOcapEVwfHL/ZeFp4nvyKqZChvGi1qXX6+Uw6dLSkgIRXqcYl8t1BRF2Tk1NdY+Pj8uNRqMMmC4ofAMFNzkizCBbeprEdLyQGzoFJJ/Pc1Z66+5RzOLiYiNSkN/d3S2fU3wJ84wpJZ0jnJ2dFZNjFvLVSjFonUbMcu4YTJmQSyaKIMJtGiRYiwRrqGGvwSPwDa1zm2Lw4tRhij6hZb4fwXyFN4DnblVFOQvmL2ZR/jnEKS9IAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%205.png&quot;
        title=&quot;200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%205.png&quot;
        src=&quot;/static/64a7bc858b5f1b282f9b7dc8aa7bb054/17d73/200207-6.png&quot;
        srcset=&quot;/static/64a7bc858b5f1b282f9b7dc8aa7bb054/5a46d/200207-6.png 300w,
/static/64a7bc858b5f1b282f9b7dc8aa7bb054/17d73/200207-6.png 571w&quot;
        sizes=&quot;(max-width: 571px) 100vw, 571px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OverseasPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;payOverseas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ShinhanCardPaymentService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OverseasPaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;payOverseas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// .. 신한 카드 해외 결제 로직..&lt;/span&gt;
        shinhanCardApi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paymentRequest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WooriCardPaymentService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;payOverseas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CardPaymentDto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PaymentRequest&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 우리 카드 결제는 해외 결제 기능이 없음...&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id=&quot;lsp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lsp&quot; aria-label=&quot;lsp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;LSP&lt;/h1&gt;
&lt;p&gt;: Liskov Substitution principle, 리스코프 치환 원칙&lt;/p&gt;
&lt;p&gt;: 자식 클래스는 언제나 자신의 부모 클래스를 교체할 수 있다&lt;/p&gt;
&lt;p&gt;( 부모 클래스의 명세를 따라야 한다, 부모 클래스가 하는 일을 다 충실히 수행해야 한다 )&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Rectangle&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; height&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setWidth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;width &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setHeight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;height &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; height&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;//getter&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Rectangle&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setWidth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWidth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHeight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 

	&lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setHeight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWidth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHeight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;//getter&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calculateAreaTest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Rectangle&lt;/span&gt; rectangle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	rectangle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWidth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	rectangle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHeight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;assert&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getWidth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;printError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⇒ rectangle에 Rectangle()과 Square()을 넣었을 때의 결과가 달라진다&lt;/p&gt;
&lt;p&gt;⇒ Rectangle 객체에서 작동하는 것이 Square에서 작동하지 않으므로 LSP 위반&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Docker]]></title><description><![CDATA[…]]></description><link>https://junbyeol.github.io/infra/200716-Docker/</link><guid isPermaLink="false">https://junbyeol.github.io/infra/200716-Docker/</guid><pubDate>Fri, 07 Feb 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;: 컨테이너 기반의 오픈소스 가상화 플랫폼&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html#%EC%A0%95%EB%A6%AC&quot;&gt;초보를 위한 도커 안내서 - 도커란 무엇인가?&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;가상화&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%80%EC%83%81%ED%99%94&quot; aria-label=&quot;가상화 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;가상화&lt;/h3&gt;
&lt;p&gt;: Hypervisor를 이용, 하나의 물리적 머신에 다수의 가상 머신을 만드는 기술&lt;/p&gt;
&lt;h1 id=&quot;컨테이너&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88&quot; aria-label=&quot;컨테이너 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;컨테이너&lt;/h1&gt;
&lt;p&gt;: 가상화 기술의 하나로써, 격리된 공간에서 프로세스가 동작하는 기술&lt;/p&gt;
&lt;h3 id=&quot;탄생-배경&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%83%84%EC%83%9D-%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot;탄생 배경 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;탄생 배경&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAAC00lEQVQoz3WSaU8TURSG+7/85gej0WCUqERUNBqVGDSicQFxF3cRMUrELSogrlVQoyKo0HYo0BakQDfojFPaMqUFSm2hy+MtdcEPnuRN5tx7z3Pee+bqEJHJZEgLZSMxO4vb4yGVTs/nmV8Sh+bPZSMt9hRFwev1Eo/H+c3Ihu73x58Q+ZjPB6lkDpVJ52ALirJAVVWRZZlEIvEvMHvYKjbah4cxuFy0OZz4gh4i2pAA2wkGBolF5D8OMwuc/vXwd12XXWix27krSTyxWKg1SFjdvSgTDno9NhzjDiYnR3JO/xML8bpUNIqpu5tWk4nPXRLvDUYc/SZG7SaG+0y4Bs2E3VbSsRmmxXwjsdi8psXs5uJTpOMRmJ0i9WOCdDKObi4YxO2VGZAVhsSgBxSV4LiPyUgATfMRCgf4Ma4w4/fxUDSul7po7O7hXsdXUdeD+7sF66CB0e9mZiZlAQxpDKs++sb8DPj9WD2jYnYjhEMKQQHToiESUwFigTFe2qzoLT3orRaeSQZktQ+v5sKhDqIE7cSn1RzQ7vJgGnJgFuo2SrikThSbJJ6GE1lxEVY9zIib1Pc5abI5edrvotFix+zsp/ObmdZeI59tRnEbvwBqGp/aO3j4opmmV295/ekrLSLXf2jjsb6FB8/0dElmouMhSr5oFL5V2dMe4FBHgNI2lbIOPztbx1jbrNDqjaJLhifQP2qg5nI1N67W0HDnPvqGJu7X3ubm1etUX6qi7VUzMdF459GzFO4to2h/Bfsqqyi/coPiiko2iXx18T4+dkq5Z1N+spIlq9aSV7CJdVu2U1RcwuoNW1i5vojFefnU1NYxN5ckf/M2luQXsHTNetZt3UHhjl0sL9jICqFFy/J4/e59Dlj3qJHSY6c4ePocJ4XTGuGy4vxlDp85z54jJ3j+5h3JVIrjF6s4IJpnde7aTapv3eWwqCk7c4HdZccwir//EwWPL522o6hhAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;200716%20Docker%20624974caa13940a79420267d34712318/Untitled.png&quot;
        title=&quot;200716%20Docker%20624974caa13940a79420267d34712318/Untitled.png&quot;
        src=&quot;/static/02b42c622f5f4cea6104bf2e89152e8f/c1b63/200716-1.png&quot;
        srcset=&quot;/static/02b42c622f5f4cea6104bf2e89152e8f/5a46d/200716-1.png 300w,
/static/02b42c622f5f4cea6104bf2e89152e8f/0a47e/200716-1.png 600w,
/static/02b42c622f5f4cea6104bf2e89152e8f/c1b63/200716-1.png 1200w,
/static/02b42c622f5f4cea6104bf2e89152e8f/7a18f/200716-1.png 1284w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;VMware, VirtualBox&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OS를 가상화&lt;/li&gt;
&lt;li&gt;호스트 OS 위에 게스트 OS를 구동시킴&lt;/li&gt;
&lt;li&gt;간단하지만 오버헤드 심함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;KVM(Kernel-based Virtual Machine)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU를 가상화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Xen&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;반가상화(Paravirtualization)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 하지만 근본적으로 모두 추가적인 OS 설치가 필요! 성능문제 여전&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;→ 프로세스를 격리하자!&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;이미지image&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EB%AF%B8%EC%A7%80image&quot; aria-label=&quot;이미지image permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;이미지(image)&lt;/h1&gt;
&lt;p&gt;: 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 밑그림&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;컨테이너를 실행하기 위한 모오오오오든 것을 가지고 있어 의존성 관리가 매우 편리하다!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dockerfile-작성하기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dockerfile-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0&quot; aria-label=&quot;dockerfile 작성하기 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DockerFile 작성하기&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dockerfile은 image를 생성하기 위한 일련의 instruction 집합!&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub에 Dockerfile을 올려두면&lt;/p&gt;
&lt;p&gt;→ 다른 개발자들은 그걸 받아 이미지로 뜨고&lt;/p&gt;
&lt;p&gt;→ 컨테이너를 만들기만 하면 모든 개발자가 같은 세팅에서 작업 가능!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;docker&quot;&gt;&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#baseImage는 가벼울수록 좋다!&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#ubuntu를 사용하면 유사시에 컨테이너에 직접 접근해서 컨트롤하기가 용이&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#무거운 ubuntu대신 alpine 등 경량화된 이미지용 OS(?)도 있다.&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; ubuntu:xenial-20191024 &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;LABEL&lt;/span&gt; maintainer=&lt;span class=&quot;token string&quot;&gt;&quot;web@devsisters.com&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; apt-get -yqq update&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; apt-get install -y --no-install-recommends curl ca-certificates build-essential&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;#nodejs의 버전관리&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; curl -SL https://deb.nodesource.com/setup_12.x | bash - &amp;amp;&amp;amp;&lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
  apt-get -yqq update &amp;amp;&amp;amp;&lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
  apt-get install -y nodejs &amp;amp;&amp;amp;&lt;span class=&quot;token operator&quot;&gt;\&lt;/span&gt;
  rm -rf /var/lib/apt/lists/*&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 마지막 과정은 apt-get이 만드는 메타데이터들을 삭제하여 이미지의 크기를 줄인다&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; package*.json ./&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; npm install --production --silent&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; . .&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#위의 package*.json 을 COPY하는 과정은 이 과정에서도 한번 더 일어나는데?&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#cache에 관한 문제를 해결하기 위함 &lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; npm start&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;EXPOSE&lt;/span&gt; 8000&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/heowc/programming-study/issues/90&quot;&gt;[docker] 헷갈리는 Dockerfile 명령어 · Issue #90 · heowc/programming-study&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Kubernetes]]></title><description><![CDATA[…]]></description><link>https://junbyeol.github.io/infra/201008-Kubernetes/</link><guid isPermaLink="false">https://junbyeol.github.io/infra/201008-Kubernetes/</guid><pubDate>Fri, 07 Feb 2020 12:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.
기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;: 컨테이너 오케스트레이션 툴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;툴마다 다르지만 컨테이너의 배포나 관리를 도와주는 녀석!&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;스케쥴링&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;적당한 서버에 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;클러스터링&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;여러 개의 서버를 하나의 서버처럼 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;서비스 디스커버리&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;key value에 저장할 필요 없이 바로 가져올 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;로깅, 모니터링으로 중앙에서 관리 가능&lt;/li&gt;
&lt;li&gt;비슷한 툴로는 Docker Swarm, Apache Mesos 가 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;쿠버네티스-오브젝트&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8&quot; aria-label=&quot;쿠버네티스 오브젝트 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;쿠버네티스 오브젝트&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://subicura.com/2019/05/19/kubernetes-basic-1.html#%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90&quot;&gt;쿠버네티스 시작하기 - Kubernetes란 무엇인가?&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;pod&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pod&quot; aria-label=&quot;pod permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pod&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;쿠버네티스에 배포 가능한 가장 작은 단위&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;한 개 이상의 컨테이너와 스토리지, 네트워크 속성으로 구성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pod내의 컨테이너들은 스토리지를 공유한다!&lt;/li&gt;
&lt;li&gt;pod내의 컨테이너들은 서로 localhost로 접근할 수 있다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컨테이너를 하나만 사용하더라도 Pod로 반드시 감싸야함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 958px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABq0lEQVQoz32STUvDQBCG/XMieBUUK4igoIgiXvwExYt6VfTWixcv/gKvihdFvFk8pLTGNm2TNN/ZTbLp6+yW1rZWN1mYnZl9ZnZmJjCyOp1OX3YyjjoPEYlUbYNkO2VD/pxz5HnevzsxCOrBLBbhpVLG+6eOesNEFMVgjMNomijpOp7LGpqhr3yDIEAYhuOBoJ/i4aFUwszyDuZW9zFV2MTu6RXOr28wOb+Bwvohphe2cPf4pO4xCiah44G04o7Am6ZhceMIi1vHmF3dw9lFEZfFW8ys7GBp+wTzawe4f36V8RWwl6Fcv4BuwtCIAljtADo9t1xr4aPhQzMjkk2la1oudN8DyzMFbDsOarUafN//G5jTUcgSCKDiJKi6CZjo6qTtK/D7QMd1YNu2yvQX0OExDFlwOmZCIE1TWFYLjaaBJEkgSCdtX75Dnc/AGfv/yRmNQIWc64GHlC6QgUApYuqyTE0GMUIPmmt3a0jAsU0ZncE2ZSrBZvwTXY6T1Nk86us8z6Oxiv7u8uA89iBVglSDLnzQT70oy4Z0YzMchQoqQ5aLIT/1Dfj05G9S50CeYVco4gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled.png&quot;
        title=&quot;201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled.png&quot;
        src=&quot;/static/7c05efcd3aabe857fe6ae351358fec32/b97f6/201008-1.png&quot;
        srcset=&quot;/static/7c05efcd3aabe857fe6ae351358fec32/5a46d/201008-1.png 300w,
/static/7c05efcd3aabe857fe6ae351358fec32/0a47e/201008-1.png 600w,
/static/7c05efcd3aabe857fe6ae351358fec32/b97f6/201008-1.png 958w&quot;
        sizes=&quot;(max-width: 958px) 100vw, 958px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;쿠버네티스-아키텍쳐&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90&quot; aria-label=&quot;쿠버네티스 아키텍쳐 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;쿠버네티스 아키텍쳐&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 26.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAA9ElEQVQY01WQwUoDMRCG+87ePfsWgkefwKOHHjwIwqK2yyKLHlyk3dI1m9mdSSa/k7SlNfCTBGY+5psF7KSUcDr5nX86EcJPV+4UApQ8kghy6dhPmJ1Ao0KmgDDHErEsTjBV/Q8eHVK/hQ77A4gZ4NkgByDtZzDJsTchZjiFM7Cua1RVBSKCz9n1GGbG5voK7v4OuZXdAO8mKCKWt694uHkGRcLLtoNXs7icsG1bNE1TJo05NiGbard8xG79DrW6rM/WlFU/376xevoovV/9xmoFkfUMLLu7VM478yOCQYPpqvs1bVNWlP0FCRAW07TdeQEf8wdOWYIjzkIA6QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled%201.png&quot;
        title=&quot;201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled%201.png&quot;
        src=&quot;/static/0a0c8626a4486488a70b204ffb66bfee/c1b63/201008-2.png&quot;
        srcset=&quot;/static/0a0c8626a4486488a70b204ffb66bfee/5a46d/201008-2.png 300w,
/static/0a0c8626a4486488a70b204ffb66bfee/0a47e/201008-2.png 600w,
/static/0a0c8626a4486488a70b204ffb66bfee/c1b63/201008-2.png 1200w,
/static/0a0c8626a4486488a70b204ffb66bfee/7e21b/201008-2.png 1626w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;튜토리얼-정리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-%EC%A0%95%EB%A6%AC&quot; aria-label=&quot;튜토리얼 정리 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;튜토리얼 정리&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/ko/docs/tutorials/&quot;&gt;튜토리얼&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;1-쿠버네티스-클러스터-생성하기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0&quot; aria-label=&quot;1 쿠버네티스 클러스터 생성하기 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 쿠버네티스 클러스터 생성하기&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;클러스터는 마스터 + 노드&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;마스터&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클러스터를 관리, 컨트롤&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;노드&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션 구동한다&lt;/li&gt;
&lt;li&gt;Kubelet은 마스터와 통신하고 노드를 관리한다&lt;/li&gt;
&lt;li&gt;컨테이너 운영을 담당하는 Docker나 rkt같은 툴을 갖는다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1002px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 71.33333333333334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsSAAALEgHS3X78AAAB+0lEQVQ4y32Tu4/UMBjE9/+v6GkoqCjoKI4CGkSDdEJCAnSA9jb7iJNsHs7DrzgZJomS2+weWLJix84v883Ym77vMTY+hvEyZ9NtB9X6ZX6953Lv3DbzwuWiISiuLETNrixibaG8J2/+eb98cw3fXL7UtsO5cghSg1NmcSzYS4uwcNhLg8QR3Htc67oUs5kn3vcQ/PBAUFZNZcZ5i11sx7F1PbZFg9Ap2tCi73pE5xSyqm8VzupE7nAkMC1bfPnR4PWHM168jfHpW4VKewSVRuQ1qs6Nfmpj4VyLS9sWYKn8WGZUOjwmBq/ep/j8UONroPDuPsdDonD2XPcGsnc3Jd8oHFSFBAppkdQOddcib/yoPJCa/mmEmt0qxK2G7zokaY40K1bgMWVPP0TmELLkiMBDbnB3L/H9oLHnT3YECm0gDJ8ER62C6TzqRkGWFUs3sNY9HZtuMDifgCcmGxL+5mOBl3cxdoVCNChT7AOQCgWDsQRKWUHE57FnuVyXbFy3pFw2U8oBEw4KHhdL7xhA7CYPh6PzXFtKnqGNYTA5S06npIeAREOInoDCGZR+ner1Ab+5KVK1ONHHE4GC48SwW8KdQ9a65bb86/pt1gvT9qw22CcFlUoqLnGkPxEPsO//D1spXJXO9H7+2uL3NsDj/og/fEY0/qbUZ3z8CyNrQFlrVaPQAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled%202.png&quot;
        title=&quot;201008%20Kubernetes%200e62d7c92ca641789f8fee08e65fae0c/Untitled%202.png&quot;
        src=&quot;/static/83b5e2cf0b23b579a7a11a6529395e7e/d69c4/201008-3.png&quot;
        srcset=&quot;/static/83b5e2cf0b23b579a7a11a6529395e7e/5a46d/201008-3.png 300w,
/static/83b5e2cf0b23b579a7a11a6529395e7e/0a47e/201008-3.png 600w,
/static/83b5e2cf0b23b579a7a11a6529395e7e/d69c4/201008-3.png 1002w&quot;
        sizes=&quot;(max-width: 1002px) 100vw, 1002px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#클러스터 정보 보기&lt;/span&gt;
kubectl cluster-info
&lt;span class=&quot;token comment&quot;&gt;#node들 정보 보기&lt;/span&gt;
kubectl get nodes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;2-앱-배포하기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%EC%95%B1-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0&quot; aria-label=&quot;2 앱 배포하기 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 앱 배포하기&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;쿠버네티스 Deployment 설정을 만들어야한다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인스턴스를 어떻게 생성할지&lt;/li&gt;
&lt;li&gt;어떻게 업데이트할지&lt;/li&gt;
&lt;li&gt;이 정보를 통해, 마스터는 클러스터의 노드에서 앱이 배포되도록 스케쥴한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;쿠버네티스 Deployment 컨트롤러는 노드가 다운/삭제 되었을때 노드를 교체해주는 self-healing도 제공한다!&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#deployment 생성&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#kubectl create deployment&lt;/span&gt;
kubectl create deployment kubernetes-bootcamp --image&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;gcr.io/googkle-samples/kubernetes-booycamp:v1

&lt;span class=&quot;token comment&quot;&gt;#deploymeny 확인&lt;/span&gt;
kubectl get deployments

&lt;span class=&quot;token comment&quot;&gt;#proxy 시작&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#curl http://localhost:8001/version(예시)로 확인해보자!&lt;/span&gt;
kubectl proxy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;3-파드와-노드-보기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-%ED%8C%8C%EB%93%9C%EC%99%80-%EB%85%B8%EB%93%9C-%EB%B3%B4%EA%B8%B0&quot; aria-label=&quot;3 파드와 노드 보기 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. 파드와 노드 보기&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# pods 정보보기&lt;/span&gt;
kubectl get pods

&lt;span class=&quot;token comment&quot;&gt;# pods에 속한 container들 등 보기&lt;/span&gt;
kubectl describe pods

&lt;span class=&quot;token comment&quot;&gt;#$POD_NAME의 컨테이너 접속해서 명령실행하기&lt;/span&gt;
kubectl &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; -it &lt;span class=&quot;token variable&quot;&gt;$POD_NAME&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;4-앱-외부로-노출하기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-%EC%95%B1-%EC%99%B8%EB%B6%80%EB%A1%9C-%EB%85%B8%EC%B6%9C%ED%95%98%EA%B8%B0&quot; aria-label=&quot;4 앱 외부로 노출하기 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. 앱 외부로 노출하기&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;service: 비슷한 기능을 하는 파드들의 모음!&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# services 정보보기&lt;/span&gt;
kubectl get services

&lt;span class=&quot;token comment&quot;&gt;# 새로운 service 포트 할당하기&lt;/span&gt;
kubectl expose deploment/kubernetes-bootcamp --type&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;NodePort&quot;&lt;/span&gt; --port &lt;span class=&quot;token number&quot;&gt;8080&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 열린 포트 번호 등 정보 보기&lt;/span&gt;
kubectl describe services
kubectl describe services/&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;서비스 이름&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# service로 필터링(run=kubernetes-bootcamp라는 라벨이 붙은 것)하기&lt;/span&gt;
kubectl get pods -l &lt;span class=&quot;token assign-left variable&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
kubectl get services -l &lt;span class=&quot;token assign-left variable&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp

&lt;span class=&quot;token comment&quot;&gt;# (app=v1이라는)라벨링하기&lt;/span&gt;
kubectl label pod &lt;span class=&quot;token variable&quot;&gt;$POD_NAME&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;v1

kubectl get pods -l &lt;span class=&quot;token assign-left variable&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;v1

&lt;span class=&quot;token comment&quot;&gt;# 서비스 배포 중단하기&lt;/span&gt;
kubectl delete &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; -l &lt;span class=&quot;token assign-left variable&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
&lt;span class=&quot;token comment&quot;&gt;# 외부에 공개되던 것이 중단될 뿐, 실제로 kubectl delete를 해도 pod에서 server는 계속 구동중이다&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# curl $(ip):$NODE_PORT로 하면 접근이 거부되지만&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# kubectl exec -it $POD_NAME curl localhost:8080으로는 server가 작동됨을 확인 가능&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;k8s-secret&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#k8s-secret&quot; aria-label=&quot;k8s secret permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;k8s Secret&lt;/h2&gt;
&lt;p&gt;비밀번호, 토큰, 키 등을 secret에 저장하자!&lt;/p&gt;
&lt;p&gt;파드가 시크릿을 참조하는 방법은 3가지가 있다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;하나 이상의 컨테이너에 마운트된 볼륨 내의 파일로써 사용&lt;/li&gt;
&lt;li&gt;컨테이너의 환경변수로써 사용&lt;/li&gt;
&lt;li&gt;파드의 이미지를 가져올 때 kubelet에 의해 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;시크릿-생성하기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8B%9C%ED%81%AC%EB%A6%BF-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0&quot; aria-label=&quot;시크릿 생성하기 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;시크릿 생성하기&lt;/h2&gt;
&lt;h3 id=&quot;kubectl-이용&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kubectl-%EC%9D%B4%EC%9A%A9&quot; aria-label=&quot;kubectl 이용 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;kubectl 이용&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 각각 username, password 이라는 키명으로 username.txt, password.txt.에서 값 가져오기&lt;/span&gt;
kubectl create secret generic db-user-pass --from-file&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;username&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;./username.txt --from-file&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;password&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;./password.txt

&lt;span class=&quot;token comment&quot;&gt;# 생성된 시크릿 확인&lt;/span&gt;
kubectl get secrets
kubectl describe secrets/db-user-pass&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;yaml로-직접-작성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#yaml%EB%A1%9C-%EC%A7%81%EC%A0%91-%EC%9E%91%EC%84%B1&quot; aria-label=&quot;yaml로 직접 작성 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;yaml로 직접 작성&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; -n &lt;span class=&quot;token string&quot;&gt;&apos;admin&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; base64
&lt;span class=&quot;token comment&quot;&gt;# YWRtaW4=&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; -n &lt;span class=&quot;token string&quot;&gt;&apos;1f2d1e2e67df&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; base64
&lt;span class=&quot;token comment&quot;&gt;# MWYyZDFlMmU2N2Rm&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;일 때 시크릿을 아래와 같이 작성하고&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: &lt;span class=&quot;token assign-left variable&quot;&gt;YWRtaW4&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
  password: MWYyZDFlMmU2N2Rm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;kubectl apply -f ./secret.yaml&lt;/code&gt; 로 시크릿을 생성할 수 있다. 하지만, 이 방법은 base64로 인코딩 하는 과정을 거치는 방법이다. base64로 인코딩되지 않은 문자열을 시크릿에 직접 넣을 수도 있다. 애플리케이션이 다음 구성 파일을 사용할 때,&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;apiUrl: &lt;span class=&quot;token string&quot;&gt;&quot;https://my.api.com/api/v1&quot;&lt;/span&gt;
username: &lt;span class=&quot;token string&quot;&gt;&quot;user&quot;&lt;/span&gt;
password: &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[about]]></title><description><![CDATA[본 이력서는 이 링크에서 더 잘 읽힙니다. 윤준성 | Junsung Yoon Node.js 기반의 백엔드 개발에 능숙하며 프론트, DevOps 업무 경험이 있습니다. 데브시스터즈에서…]]></description><link>https://junbyeol.github.io/resume-ko/</link><guid isPermaLink="false">https://junbyeol.github.io/resume-ko/</guid><pubDate>Sun, 27 Jan 2019 16:21:13 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;본 이력서는 &lt;a href=&quot;https://www.notion.so/Junsung-Yoon-fb07f70750b447818af8236ddfc8cfb9&quot;&gt;이 링크&lt;/a&gt;에서 더 잘 읽힙니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;윤준성--junsung-yoon&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9C%A4%EC%A4%80%EC%84%B1--junsung-yoon&quot; aria-label=&quot;윤준성  junsung yoon permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;윤준성 | Junsung Yoon&lt;/h1&gt;
&lt;p&gt;Node.js 기반의 &lt;strong&gt;백엔드 개발&lt;/strong&gt;에 능숙하며 프론트, DevOps 업무 경험이 있습니다.&lt;/p&gt;
&lt;p&gt;데브시스터즈에서 2년 이상 근무하며 다양하고 새로운 프로젝트들을 킥오프하고 리드해본 경험이 있습니다.&lt;/p&gt;
&lt;p&gt;현재 &lt;strong&gt;현역 IT 산업기능요원&lt;/strong&gt;으로 복무중입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;☎️ | +82 10-6641-1621&lt;/p&gt;
&lt;p&gt;✉️ | yoonjs0510@kaist.ac.kr&lt;/p&gt;
&lt;p&gt;💻 | &lt;a href=&quot;https://github.com/junbyeol&quot;&gt;https://github.com/junbyeol&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📚 | &lt;a href=&quot;https://junbyeol.github.io&quot;&gt;https://junbyeol.github.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last Updated: &lt;code class=&quot;language-text&quot;&gt;2023.02.06&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&quot;skills&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#skills&quot; aria-label=&quot;skills permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SKILLS&lt;/h1&gt;
&lt;p&gt;⭐️⭐️ Production에 당장 능숙하게 사용가능한 기술
⭐️ Production에 활용할 수 있거나, 한 적 있는 기술&lt;/p&gt;
&lt;h3 id=&quot;backend&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#backend&quot; aria-label=&quot;backend permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Backend&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Node.js ⭐️⭐️&lt;/li&gt;
&lt;li&gt;Typescript ⭐️⭐️&lt;/li&gt;
&lt;li&gt;Fastify ⭐️⭐️&lt;/li&gt;
&lt;li&gt;Java ⭐️&lt;/li&gt;
&lt;li&gt;Kotlin ⭐️&lt;/li&gt;
&lt;li&gt;Spring Framework ⭐️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;database&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#database&quot; aria-label=&quot;database permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Database&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MySQL ⭐️⭐️&lt;/li&gt;
&lt;li&gt;Redis ⭐️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;webhttp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#webhttp&quot; aria-label=&quot;webhttp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Web/HTTP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;React ⭐️⭐️&lt;/li&gt;
&lt;li&gt;GraphQL ⭐️⭐️&lt;/li&gt;
&lt;li&gt;websocket ⭐️⭐️&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;devops&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#devops&quot; aria-label=&quot;devops permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DevOps&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Docker ⭐️⭐️&lt;/li&gt;
&lt;li&gt;Terraform ⭐️&lt;/li&gt;
&lt;li&gt;kubernetes ⭐️&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;s3, ecr, rds, medialive 등 다수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;experiences&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#experiences&quot; aria-label=&quot;experiences permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;EXPERIENCES&lt;/h1&gt;
&lt;h2 id=&quot;202007&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202007&quot; aria-label=&quot;202007 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2020.07&lt;/h2&gt;
&lt;p&gt;~현재&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;1년 10개월 이상&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;데브시스터즈&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8D%B0%EB%B8%8C%EC%8B%9C%EC%8A%A4%ED%84%B0%EC%A6%88&quot; aria-label=&quot;데브시스터즈 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;데브시스터즈&lt;/h2&gt;
&lt;p&gt;웹서비스셀 백엔드 개발자&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;NodeJS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Typescript&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;GraphQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;MySQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Docker&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;AWS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Terraform&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;k8s&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;websocket&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Redis&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;쿠키런 IP를 활용한 게임회사&lt;/li&gt;
&lt;li&gt;팀 전체 4~10명, 개발인원 3~5명&lt;/li&gt;
&lt;li&gt;게임 소개/이벤트 진행용 사이트들의 GraphQL 서버 로직 구현 및 배포&lt;/li&gt;
&lt;li&gt;전사 회의용 스트리밍 및 슈퍼챗 서버 구현 및 배포&lt;/li&gt;
&lt;li&gt;Document성 사이트들의 CMS 구축 및 배포 자동화&lt;/li&gt;
&lt;li&gt;채용 설명회 참여, 기술블로그 글 작성, 사내 세미나 발표 경험 등&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;202001&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202001&quot; aria-label=&quot;202001 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2020.01&lt;/h2&gt;
&lt;p&gt;~2020.06&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;6개월&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;셀렉트스타&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%85%80%EB%A0%89%ED%8A%B8%EC%8A%A4%ED%83%80&quot; aria-label=&quot;셀렉트스타 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;셀렉트스타&lt;/h2&gt;
&lt;p&gt;개발팀 백엔드 개발자/백오피스 개발자&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Kotlin&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Spring Framework&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;MySQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;React&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Nginx&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Jenkins&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;크라우드소싱 플랫폼 개발 스타트업&lt;/li&gt;
&lt;li&gt;회사 전체 20~40명, 개발인원 5~6명&lt;/li&gt;
&lt;li&gt;크라우드소싱 플랫폼 캐시미션의 RESTful 서버 로직 구현&lt;/li&gt;
&lt;li&gt;캐시미션 어드민 사이트의 프론트/백엔드 구현&lt;/li&gt;
&lt;li&gt;근태관리용 Slack 챗봇 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;projects&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#projects&quot; aria-label=&quot;projects permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PROJECTS&lt;/h1&gt;
&lt;h2 id=&quot;202110&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202110&quot; aria-label=&quot;202110 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2021.10&lt;/h2&gt;
&lt;p&gt;~ 현재&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;데브시스터즈&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;사내-스트리밍-및-슈퍼챗-서버&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%82%AC%EB%82%B4-%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D-%EB%B0%8F-%EC%8A%88%ED%8D%BC%EC%B1%97-%EC%84%9C%EB%B2%84&quot; aria-label=&quot;사내 스트리밍 및 슈퍼챗 서버 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;사내 스트리밍 및 슈퍼챗 서버&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;전사 회의 시에 사용하는 스트리밍 시스템, &lt;strong&gt;데브라이브&lt;/strong&gt;를 개발&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;스튜디오에서 OBS(Open Broadcast Software)를 이용,  AWS Medialive로 HLS 스트림 생성 후, 뷰어 페이지에서 시청할 수 있도록 세팅&lt;/li&gt;
&lt;li&gt;슬랙을 통해 질문 수집, 수집된 질문은 유튜브 슈퍼챗 처럼, 스트리밍 되는 화면 위에 노출됨&lt;/li&gt;
&lt;li&gt;이 사항들(스트림 생성, 질문 관리)을 방송 스탭들이 쉽게 관리할 수 있도록 어드민 페이지 제작&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;NodeJS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Typescript&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;websocket&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;MySQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Docker&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Terraform&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;k8s&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;AWS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Redis&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;키워드: &lt;code class=&quot;language-text&quot;&gt;websocket&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Redis&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;AWS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;기여 범위: 서버 전체 및 인프라 유지보수, 리드 포지션으로 실시간 모니터링 주도&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;202102&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202102&quot; aria-label=&quot;202102 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2021.02&lt;/h2&gt;
&lt;p&gt;~ 현재&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;데브시스터즈&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;웹서비스셀-cmscontent-management-system&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4%EC%85%80-cmscontent-management-system&quot; aria-label=&quot;웹서비스셀 cmscontent management system permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;웹서비스셀 CMS(Content Management System)&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;NodeJS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Javascript&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;GraphQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;MySQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Docker&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;AWS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Terraform&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;k8s&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;react&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.devsisters.com&quot;&gt;공식사이트&lt;/a&gt;, &lt;a href=&quot;https://game.devsisters.com/ko/cookierun/&quot;&gt;게임사이트&lt;/a&gt; 등 수동으로 관리되던 컨텐츠들의 관리와 배포를 &lt;strong&gt;자동화&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;높은 커스텀 자유도를 가진 오픈소스 Headless CMS &lt;strong&gt;Strapi&lt;/strong&gt;를 이용, 다양한 기능들을 추가함&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;유튜브에 업로드 되는 컨텐츠들을 cronjob으로 매번 업데이트&lt;/li&gt;
&lt;li&gt;사용자들이 쉽게 &lt;strong&gt;원하는 환경&lt;/strong&gt;(preview, production)에서 컨텐츠들을 배포할 수 있게끔 개발(서버, 프론트 모두 개발)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;키워드: &lt;code class=&quot;language-text&quot;&gt;Headless CMS&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;react&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;기여 범위: 서버 및 어드민 페이지 프론트 전체&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;202104&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202104&quot; aria-label=&quot;202104 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2021.04&lt;/h2&gt;
&lt;p&gt;~ 2021.05&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;데브시스터즈&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;쿠키런킹덤-10억감사제-당첨자-조회-서버&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BF%A0%ED%82%A4%EB%9F%B0%ED%82%B9%EB%8D%A4-10%EC%96%B5%EA%B0%90%EC%82%AC%EC%A0%9C-%EB%8B%B9%EC%B2%A8%EC%9E%90-%EC%A1%B0%ED%9A%8C-%EC%84%9C%EB%B2%84&quot; aria-label=&quot;쿠키런킹덤 10억감사제 당첨자 조회 서버 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;쿠키런:킹덤 10억감사제 당첨자 조회 서버&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;사은품 추첨 결과 조회 및 당첨자의 정보 수집용 사이트의 서버&lt;/li&gt;
&lt;li&gt;당첨자 정보 수집 후 유관 부서에 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;NodeJS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Typescript&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;GraphQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;MySQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Docker&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;AWS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Terraform&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;k8s&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;키워드: &lt;code class=&quot;language-text&quot;&gt;GraphQL&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;커뮤니케이션&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;기여 범위: 서버 전체 및 수집 데이터 관련 커뮤니케이션/전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 114.00000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAAACXBIWXMAAAsSAAALEgHS3X78AAADtElEQVQ4y5WVW28bVRDH++F4Lg/wFVBFU1QheKiQUKsWtcBDiJBaIfGCxKVCQlAaCGqTxnEax7k0F9txfF/biS+78XW9tne9690fZ49jJy1OKlYazZzZmf85c+ZyriA+z4OBZWFZJqbZF9ySXMqnfKQ3z+lNufbJcRxcd+hDcWUE6GHbtvwxJl/nf67gvuS6riROZcc5s7ftgVy/BjgcDidOvlw9yrG/HiCfjBPZCJKMbHOsZNgPBwRPSOeRj3cx4Jh80GI2TXR9gVL2FdHwAqm9ZUq5XRK7QRSxiTcBdN8GKO5DWLvGApnw50SXZ0m8vM/2wl1iL76gsH0Lt7vC0GVkexmgDFeAmY1NlKWrJEJzHIZ/IbPxkMO170iEfyC1dp/80rvYRmq0sUjGdEAfzO6P7saqY7YKchO9pdLvd2g3VbpGE8d2MJtZHKsl7+8/gONs9oRj8ukDDjcXaTY7NGoa6egmK09/EslZZO2fX1md/1nqalpVgIzC9d2nAnb1Oskfr7H55HsymSotLc9JSUEtpmioRzS1kpDT1Mp5Kkoc2+zIiKyezmBgnQ/Zk7sMnQHdWpq+odJrl+h3KpJbXVU4afT0stBVMY0qlrDR6wodQVZXEye0piXFFndXpVmJkNxZQIm9IB8PkN57xlFqjZxYZ6NLHKdDUi4cBmlUogzNynRAX+HZDXAaOH0Vu69JGvYrwknFtYRsVsWF1XB6FWFXF45NPKf1RsjeKGTXbtOI3KK88RGl8E06sU8w4p+SWr6OsnqDXHCG+PMPSQdmhG6GxNJ1Eosf0IzdwRm0BeDwdcChrdNOznISeUD94Gss5Ruc/By59Xtk1++ihO+RXL1NJnRH8oQvr91GzzwSgPo5wMkdulLZ7RooOYWDeJzdwxgnjRPGX7F4RFb8U/J50ukM3d6obt/I8lmnOAOTQlHh2e9/k9gJ8tXzFeZD236p0zG6AiRNtVKlUq5QyBc4Pj6W7XdxL4tsKcUCod8eU34Z5ObDCn8uR4WFX8TQ0ltEcwfsZfYp18qi1C7pZT9cb2gRSWZZmbuB+u0s711VePzHljzhYCBaTgzTumgAtanR7uqTgXIhoOuYxJIZnnx5jeRn7/PxO4+Y/yskT1gWoaaSKbY2twgsB9h5tSNDNgzjdNhOCdkvULNvoJ3UOCqX0LSCGAhteQLfsdVqoqoqpVKJWq2GruvyuXjrgAVvktnxBB8NgjO9X2vjCX/5PDwHfH6CT9NfOrHlC3b6yv1fMs3e5NX7F/k1u3mHauDlAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;쿠키런:킹덤 10억감사제 당첨자 조회 사이트의 모습&quot;
        title=&quot;쿠키런:킹덤 10억감사제 당첨자 조회 사이트의 모습&quot;
        src=&quot;/static/2d32e3b1c1908b38cd10efffb8212aac/c1b63/image-2.png&quot;
        srcset=&quot;/static/2d32e3b1c1908b38cd10efffb8212aac/5a46d/image-2.png 300w,
/static/2d32e3b1c1908b38cd10efffb8212aac/0a47e/image-2.png 600w,
/static/2d32e3b1c1908b38cd10efffb8212aac/c1b63/image-2.png 1200w,
/static/2d32e3b1c1908b38cd10efffb8212aac/844cc/image-2.png 1306w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;쿠키런:킹덤 10억감사제 당첨자 조회 사이트의 모습&lt;/p&gt;
&lt;h2 id=&quot;202007-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202007-1&quot; aria-label=&quot;202007 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2020.07&lt;/h2&gt;
&lt;p&gt;~2021.06&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;데브시스터즈&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;신규게임-사전예약-및-이벤트-서버&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8B%A0%EA%B7%9C%EA%B2%8C%EC%9E%84-%EC%82%AC%EC%A0%84%EC%98%88%EC%95%BD-%EB%B0%8F-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%84%9C%EB%B2%84&quot; aria-label=&quot;신규게임 사전예약 및 이벤트 서버 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;신규게임 사전예약 및 이벤트 서버&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;신규게임들(쿠키런: 킹덤, &lt;a href=&quot;https://www.playbrixity.com/ko/&quot;&gt;브릭시티&lt;/a&gt;)의 &lt;strong&gt;사전예약&lt;/strong&gt;을 받고, 관련 이벤트 등을 진행하기 위한 서버&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사전예약자들의 이메일, 전화번호 등 개인정보를 global하게 수집&lt;/li&gt;
&lt;li&gt;사전예약자들에게 &lt;strong&gt;node-canvas로 생성&lt;/strong&gt;된 시민권 이미지를 발급하는 이벤트 등이 있었고, 관련 &lt;strong&gt;프로파일링&lt;/strong&gt; 경험을 &lt;a href=&quot;https://tech.devsisters.com/posts/perf-citizen-card/&quot;&gt;기술블로그&lt;/a&gt;에 공유&lt;/li&gt;
&lt;li&gt;sendinblue(메일링 관리 솔루션)과 사전예약자 DB 연동, AWS SES 활용 메일링 등의 메일링 관련 작업도 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;NodeJS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Typescript&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;GraphQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;MySQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Docker&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;AWS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Terraform&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;k8s&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;키워드: &lt;code class=&quot;language-text&quot;&gt;node-canvas&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;GraphQL&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;profiling&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;기여도: 시민권 이미지 생성 서버 전체 및 사전예약 서버 일부&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 40.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAACeklEQVQozx2PW0hTcQCH99BjGRrRSCg10c2VLprNy9zGcfNs3qdOnW7Ts+V2Np3O4+Xs7D4t6CZE1EMvSZDhQz0UUYQQhD6kIF2MzR6igiDoPcKzzv+X9vCD7+Hjg5+swUD90RmpvElVJJqVR0TL2UKRVh0V9WWHxCaVfK/O0Ix6g2mn3kDtNBqbYaqW75krD4vWc0X/Z9png/KYqNUZ81q96beM5TN/J/kEWqqPw2tVQ2DaEB3tAO+g0KVTkNTCFUQSqZxvLrXLxRfR2VhOgr11CNn1mBo0IthRhTZNMYRYEtFkWpR5uHi+vccBfXkB6dHKiddSSW6ODZClSSfppdRSSMhggPFkXRMzuY7BMfhbFdKy6zy5ZlGQJF1JbjmqSKhbSXzTcQx6vaKMi6fz3X1tcDefIhmXGhx9Gpy1HHxfBYYtNZJvLg1PWMjOJDI5+1A/BE+T9Gsrgp8fl7G79Qjftx/g6mwXGWY5jM3G94PRdJ4Zn8Fi4CJ5lW7Dyo0wVib78TRhhuA3Skw4AZZPZaejqRw7EwPP1ErfXnbjx4fb+PLuHr5uRLDI1pLhwDwCkYwoY7m5vMN9CUuxFrJ+14PV6zGsxvxYu+NEkm2UbHQ77O7xbGCWz/kmJmEzqqRRcwkYa+XBK4xQJ9GpOUF6aRr9rsB+kE/l3YFphBxa8vnTOjZfP8PO9jrevnkMF1Uq2TQVYJiRLCtczrEcj1azWTIFHkLXv4DyMi2UajvqFGWkV1MCt3NIlPnnU3nvlABbQzHZeEJj83k33q/14MV9AzrrS6XxkB9MOJxl59O5IJ9Gq/aMRCkL4WzRwE1fgLGiAHSNnASD3gNP/AebHFCerPmJ5AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;쿠키런:킹덤 사전예약 사이트 중 시민권 발급 이벤트의 모습&quot;
        title=&quot;쿠키런:킹덤 사전예약 사이트 중 시민권 발급 이벤트의 모습&quot;
        src=&quot;/static/3bbdfd207c66f5d3418a1fecf2811186/c1b63/image-3.png&quot;
        srcset=&quot;/static/3bbdfd207c66f5d3418a1fecf2811186/5a46d/image-3.png 300w,
/static/3bbdfd207c66f5d3418a1fecf2811186/0a47e/image-3.png 600w,
/static/3bbdfd207c66f5d3418a1fecf2811186/c1b63/image-3.png 1200w,
/static/3bbdfd207c66f5d3418a1fecf2811186/6c86f/image-3.png 1720w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;쿠키런:킹덤 사전예약 사이트 중 시민권 발급 이벤트의 모습&lt;/p&gt;
&lt;h2 id=&quot;202003&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202003&quot; aria-label=&quot;202003 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2020.03&lt;/h2&gt;
&lt;p&gt;~2020.06&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;셀렉트스타&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;근태관리용-slack-챗봇-너굴&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B7%BC%ED%83%9C%EA%B4%80%EB%A6%AC%EC%9A%A9-slack-%EC%B1%97%EB%B4%87-%EB%84%88%EA%B5%B4&quot; aria-label=&quot;근태관리용 slack 챗봇 너굴 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;근태관리용 Slack 챗봇 ‘너굴’&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;슬랙 명령어를 통해, 사원들의 출퇴근 및 월간 근무시간 관리 등을 담당하는 챗봇을 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Spring Framework&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Kotlin&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Jenkins&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;키워드: &lt;code class=&quot;language-text&quot;&gt;REST api&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Spring Framework&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Kotlin&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Slack API&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;기여 범위: 서버 전체&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 492px;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 86%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsSAAALEgHS3X78AAACnElEQVQ4y42Uy2sTURTGs9diNO/MTDJ5zSS2ad7JJJNMZpK0tVBwUagPUBHdaPFR00WF0mJ9FVcuCoLg/+DGvVv3Cl2IG0EU1+Ly85zbNLYhaBYf5947d373O+fcGVcsoiAUCMA9NQX3yRMI01gOBRHweqCEQ1AVGVFZEvFfOtzjCgcD6Fl1bD3s49H2NmyzhmI+j3Pzc5hO60PoJDCOrjNuN3a3+vj15T1+f/uAnc0HmOt2sXbvLsqFPCQ6UFWUyR36PB6sr17D643z+PjuCdZvX0BaS+OsnhIwLglvniRtAQz6vLh66SKW7CpebK7h8soKQn4fkjFVQDjloyn9FxiRZOjJABxThVkOQYv5kNF0ZMghQzNaCgk1OpE7AXSfkvHqmYIf+7fwfb+P5xsyFhaWceP6FXTsNpYWF5GKx6j7fijUfXmMuDQcB02RsPc0gq+fHuPn5z283CFXehGWaWAmkxaNaTbqaJkNNGpVNOuGiCyjUoZJc8s0US0VDxz6vSGs3szhzXIXb3f7uH+ngcJsCV3bgmnUYLea6LQtIceyYDVNetYW6jk27TFQokMLs9kDYFSREJMi0E57MJ1QEY+q4mGlWBBu6tUKDBLD2VExnxNu23RQg9by2axo4jBlVabuETQSVaBIYVoMo0ywOqXE7rrsgsAMa1HqDGGX7WZTQDO6dqz7ruFE/tsp3uhQihxtqyXG7IqhvY4j5lzXXHZmeL2GX8robeeLzC9wodkF147rNd/tiAPaXENybVQqiFBGrGNfyiiQVSuXBJDlkEO71RLpMsgZOGZno7CxQI7syKIUrUHxubvcUa4rO+bxIv08uFGjP4+xQD2ZgJaII0XiqNGc1/iCs7TBOo9HP0fXuF/QYW0m0dFS8fgP3/oLqm2mRA8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;당시 개발한 슬랙 챗봇 ‘너굴’의 후신 ‘덕비스’, 본 이미지의 대사와 기능은 ‘너굴’과 동일
출처) [셀렉트스타 블로그](https://blog.selectstar.ai/ko/welfare)&quot;
        title=&quot;당시 개발한 슬랙 챗봇 ‘너굴’의 후신 ‘덕비스’, 본 이미지의 대사와 기능은 ‘너굴’과 동일
출처) [셀렉트스타 블로그](https://blog.selectstar.ai/ko/welfare)&quot;
        src=&quot;/static/497e353b515611a4652ab7d64053ff42/5c6e9/image-4.png&quot;
        srcset=&quot;/static/497e353b515611a4652ab7d64053ff42/5a46d/image-4.png 300w,
/static/497e353b515611a4652ab7d64053ff42/5c6e9/image-4.png 492w&quot;
        sizes=&quot;(max-width: 492px) 100vw, 492px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;당시 개발한 슬랙 챗봇 ‘너굴’의 후신 ‘덕비스’, 본 이미지의 대사와 기능은 ‘너굴’과 동일
출처) &lt;a href=&quot;https://blog.selectstar.ai/ko/welfare&quot;&gt;셀렉트스타 블로그&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;202003-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202003-1&quot; aria-label=&quot;202003 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2020.03&lt;/h2&gt;
&lt;p&gt;~2020.08&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;개인&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;kaist-총학생회-사이트&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kaist-%EC%B4%9D%ED%95%99%EC%83%9D%ED%9A%8C-%EC%82%AC%EC%9D%B4%ED%8A%B8&quot; aria-label=&quot;kaist 총학생회 사이트 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;KAIST 총학생회 사이트&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://student.kaist.ac.kr/web/main&quot;&gt;KAIST 총학생회 사이트&lt;/a&gt;의 초기 서버와 프론트 개발 (2인)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;NodeJS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Koa&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Sequelize&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;MySQL&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;Nginx&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;React&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;키워드: &lt;code class=&quot;language-text&quot;&gt;NodeJS&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;React&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;기여도: 서버와 프론트 각각 일부분&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;education&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#education&quot; aria-label=&quot;education permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;EDUCATION&lt;/h1&gt;
&lt;h3 id=&quot;201803&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#201803&quot; aria-label=&quot;201803 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2018.03&lt;/h3&gt;
&lt;p&gt;~ 2019.12&lt;/p&gt;
&lt;h3 id=&quot;kaist&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kaist&quot; aria-label=&quot;kaist permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;KAIST&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;전산학부 4학기 재학(현 휴학)&lt;/li&gt;
&lt;li&gt;웹 개발 동아리 SPARCS 활동(2학기)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://student.kaist.ac.kr/&quot;&gt;카이스트 총학생회 웹페이지&lt;/a&gt; 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;201503&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#201503&quot; aria-label=&quot;201503 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2015.03&lt;/h3&gt;
&lt;p&gt;~ 2018.02&lt;/p&gt;
&lt;h3 id=&quot;경기과학고등학교&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B2%BD%EA%B8%B0%EA%B3%BC%ED%95%99%EA%B3%A0%EB%93%B1%ED%95%99%EA%B5%90&quot; aria-label=&quot;경기과학고등학교 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;경기과학고등학교&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;정보올림피아드 동상(경기도 지역) 수상&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;activites&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#activites&quot; aria-label=&quot;activites permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ACTIVITES&lt;/h1&gt;
&lt;h3 id=&quot;202102-데브시스터즈-기술블로그-글-기고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202102-%EB%8D%B0%EB%B8%8C%EC%8B%9C%EC%8A%A4%ED%84%B0%EC%A6%88-%EA%B8%B0%EC%88%A0%EB%B8%94%EB%A1%9C%EA%B7%B8-%EA%B8%80-%EA%B8%B0%EA%B3%A0&quot; aria-label=&quot;202102 데브시스터즈 기술블로그 글 기고 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2021.02 데브시스터즈 기술블로그 글 기고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://tech.devsisters.com/posts/perf-citizen-card/&quot;&gt;사전예약 서버 프로파일링으로 서버 병목찾아 개선하기&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;202112-데브시스터즈-kaist-전산학부-기업체-탐방-행사-패널-참여&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202112-%EB%8D%B0%EB%B8%8C%EC%8B%9C%EC%8A%A4%ED%84%B0%EC%A6%88-kaist-%EC%A0%84%EC%82%B0%ED%95%99%EB%B6%80-%EA%B8%B0%EC%97%85%EC%B2%B4-%ED%83%90%EB%B0%A9-%ED%96%89%EC%82%AC-%ED%8C%A8%EB%84%90-%EC%B0%B8%EC%97%AC&quot; aria-label=&quot;202112 데브시스터즈 kaist 전산학부 기업체 탐방 행사 패널 참여 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2021.12 데브시스터즈-KAIST 전산학부 기업체 탐방 행사, 패널 참여&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;“데브시스터즈 입사꿀팁” 실시간 발표, Q&amp;#x26;A 진행(3명, 30분)&lt;/li&gt;
&lt;li&gt;“신입개발자”를 테마로 재학생 20~30여명과 실시간 Q&amp;#x26;A 진행(2명, 60분)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;202202-사내-서버개발자-모임-월간-서버에서-발표&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#202202-%EC%82%AC%EB%82%B4-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%AA%A8%EC%9E%84-%EC%9B%94%EA%B0%84-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EB%B0%9C%ED%91%9C&quot; aria-label=&quot;202202 사내 서버개발자 모임 월간 서버에서 발표 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2022.02 사내 서버개발자 모임 “월간 서버”에서 발표&lt;/h3&gt;
&lt;p&gt;제목: 데브라이브 인프라 개발기&lt;/p&gt;</content:encoded></item></channel></rss>