<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>spurdev</title>
    <link>https://spurdev.tistory.com/</link>
    <description> IT기술을 공부하고 기록하기 위한 공간</description>
    <language>ko</language>
    <pubDate>Sat, 4 Jul 2026 00:23:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>spurdev</managingEditor>
    <item>
      <title>[Spring] AOP(Aspect-oriented programming)</title>
      <link>https://spurdev.tistory.com/21</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;AOP? 관점 지향 프로그래밍?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Aspect Oriented Programming은 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법을 말한다. AOP는 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통 관심 사항을 기준으로 프로그래밍 함으로써 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 도와준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;583&quot; data-filename=&quot;module.png&quot; width=&quot;543&quot; height=&quot;231&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0TPvm/btq8W7Ey8t6/1uvktZVotum2NCRdz2h0S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0TPvm/btq8W7Ey8t6/1uvktZVotum2NCRdz2h0S0/img.png&quot; data-alt=&quot;공통 관심 사항을 모듈화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0TPvm/btq8W7Ey8t6/1uvktZVotum2NCRdz2h0S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0TPvm%2Fbtq8W7Ey8t6%2F1uvktZVotum2NCRdz2h0S0%2Fimg.png&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;583&quot; data-filename=&quot;module.png&quot; width=&quot;543&quot; height=&quot;231&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공통 관심 사항을 모듈화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;342&quot; data-filename=&quot;AOP삽입.png&quot; width=&quot;500&quot; height=&quot;150&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmnNJu/btq8ZIRvhUu/TPK8quZLOIsufEANfFiK10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmnNJu/btq8ZIRvhUu/TPK8quZLOIsufEANfFiK10/img.png&quot; data-alt=&quot;AOP에서 공통 기능을 구현한 코드가 핵심로직에 삽입되어 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmnNJu/btq8ZIRvhUu/TPK8quZLOIsufEANfFiK10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmnNJu%2Fbtq8ZIRvhUu%2FTPK8quZLOIsufEANfFiK10%2Fimg.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;342&quot; data-filename=&quot;AOP삽입.png&quot; width=&quot;500&quot; height=&quot;150&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AOP에서 공통 기능을 구현한 코드가 핵심로직에 삽입되어 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AOP 기법에서는 핵심 로직을 구현한 코드에서 공통 기능을 직접적으로 호출하지 않는다. 핵심 로직을 구현한 코드를 컴파일하거나, 컴파일 된 클래스를 로딩하거나, 또는 로딩한 클래스의 객체를 생성할 때 AOP가 적용되어 핵심 로직 구현 코드안에 공통 기능이 삽입된다. (공통 기능이 변경되더라도 핵심 로직을 구현한 코드를 변경할 필요가 없다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;AOP 주요 용어&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 120px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style10&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 23.0232%; height: 20px;&quot;&gt;용어&lt;/td&gt;
&lt;td style=&quot;width: 76.9768%; height: 20px;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 23.0232%; height: 20px;&quot;&gt;Joinpoint&lt;/td&gt;
&lt;td style=&quot;width: 76.9768%; height: 20px;&quot;&gt;Advice를 적용 가능한 지점을 의미한다. 메서드 호출, 필드 값 변경 등이 Joinpoint에 해당한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 23.0232%; height: 20px;&quot;&gt;Pointcut&lt;/td&gt;
&lt;td style=&quot;width: 76.9768%; height: 20px;&quot;&gt;Joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 Joinpoint를 나타낸다. 스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Pointcut을 정의할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 23.0232%; height: 20px;&quot;&gt;Advice&lt;/td&gt;
&lt;td style=&quot;width: 76.9768%; height: 20px;&quot;&gt;언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다. 예를 들어, '메서드를 호출하기 전'(언제)에 '트랜잭션 시작'(공통 기능) 기능을 적용한다는 것을 정의하고 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 23.0232%; height: 20px;&quot;&gt;Weaving&lt;/td&gt;
&lt;td style=&quot;width: 76.9768%; height: 20px;&quot;&gt;Advice를 핵심 로직 코드에 적용하는 것을 weaving이라고 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 23.0232%; height: 20px;&quot;&gt;Aspect&lt;/td&gt;
&lt;td style=&quot;width: 76.9768%; height: 20px;&quot;&gt;여러 객체에 공통으로 적용되는 기능을 Aspect라고 한다. 트랜잭션이나 보안등이 Aspect의 좋은 예이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스프링에서의 AOP&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링으 자체적으로 프록시 기반의 AOP를 지원하고 있다. 따라서, 스프링 AOP는 메서드 호출 Joinpoint만을 지원한다. 필드 값 변경과 같은 Joinpoint를 사요하고 싶다면 AspectJ와 같이 다양한 Joinpoint를 지원하는 AOP도구를 사용해야 한다. 스프링 AOP는 자반 기반이기 때문에 AspectJ처럼 Aspect를 위한 별도의 문법을 익힐 필요없이 자바 언어만을 이용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링은 세 가지 방식으로 AOP를 구현할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;XML 스키마 기반의 POJO 클래스를 이용한 AOP 구현&lt;/li&gt;
&lt;li&gt;AspectJ에서 정의한 @Aspect 어노테이션 기반의 AOP 구현&lt;/li&gt;
&lt;li&gt;스프링 API를 이용한 AOP 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;웹 개발자를 위한 Spring 4.0 프로그래밍(최범균/가메출판사)&lt;/blockquote&gt;</description>
      <category>프로그래밍/Spring</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/21</guid>
      <comments>https://spurdev.tistory.com/21#entry21comment</comments>
      <pubDate>Wed, 7 Jul 2021 09:59:45 +0900</pubDate>
    </item>
    <item>
      <title>[Web] REST(Representational State Transfer) API</title>
      <link>https://spurdev.tistory.com/20</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;REST(Representational State Transfer)?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REST&lt;span style=&quot;color: #202122;&quot;&gt;(Representational State Transfer)는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;월드 와이드 웹&lt;span style=&quot;color: #202122;&quot;&gt;과 같은 분산&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;하이퍼미디어&lt;span style=&quot;color: #202122;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;시스템을 위한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;소프트웨어 아키텍처&lt;span style=&quot;color: #202122;&quot;&gt;의 한 형식으로 자원의 상태 전달을 위한 아주 간단한 인터페이스를 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #202122;&quot;&gt;REST 아키텍처에 적용되는 6가지 제한조건&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #202122;&quot;&gt;다음 제한 조건을 준수하는 한 개별 컴포넌트는 자유롭게 구현할 수 있다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Client, Server: 클라이언트와 서버가 서로 독립적으로 분리되어 있어야 한다.&lt;/li&gt;
&lt;li&gt;Stateless: 요청에 대해서 클라이언트의 상태를 서버에 저장하지 않는다.&lt;/li&gt;
&lt;li&gt;Cache: 클라이언트는 서버의 응답을 임시저장할 수 있어야 하며 클라이언트가 cache를 통해 응답을 재사용할 수 있어야한다. 이를 통해 서버의 부하를 낮춘다.&lt;/li&gt;
&lt;li&gt;계층화(Layered System): 서버와 클라이언트 사이에 방화벽, 게이트웨이, 프록시 등 다양한 계층 형태로 구성이 가능해야&amp;nbsp;하며,&amp;nbsp;이를&amp;nbsp;확장&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;한다.&lt;/li&gt;
&lt;li&gt;인터페이스 일관성: 인터페이스의 일관성을 지키고 아키텍처를 단순화시켜 작은 단위로 분리하여 클라이언트,&amp;nbsp;서버가&amp;nbsp;독립적으로&amp;nbsp;개선&amp;nbsp;될수&amp;nbsp;있어야&amp;nbsp;한다.&lt;/li&gt;
&lt;li&gt;Code on Demand(Optional): 자바 애플릿, 자바스크립트, 플래시 등 특정한 기능을 서버로부터 전달받아&amp;nbsp;클라이언트가&amp;nbsp;코드를&amp;nbsp;실행&amp;nbsp;할수&amp;nbsp;있어야&amp;nbsp;한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;REST 인터페이스 일관성을 위한 가이드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자원의 식별&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 기반의 REST에서는 리소스 접근을 할때 URI를 사용한다. &lt;/p&gt;
&lt;pre id=&quot;code_1624901950099&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://example.com/user/123
Resource: user
식별자: 123
의미: 123번째 user&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메시지를 통한 리소스 조작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹에서는 HTML, XML, JSON, TEXT 등 다양한 방식으로 데이터를 전달할 수 있다. 이 중에서 어떠한 타입의 데이터인지를 알려주기 위해서 HTTP Header의 content-type을 통해서 데이터의&amp;nbsp;타입을&amp;nbsp;지정해&amp;nbsp;줄수&amp;nbsp;있다.&amp;nbsp;또한,&amp;nbsp;리소스&amp;nbsp;조작을&amp;nbsp;위해서&amp;nbsp;데이터&amp;nbsp;전체를&amp;nbsp;전달하지&amp;nbsp;않고,&amp;nbsp;메시지로&amp;nbsp;전달해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) user의 정보에서 이름을 name으로 사용하다 서버에서 리소스를 변경하여 user-name이라고 했을때 클라이언트는 name으로 알고 있기 때문에 에러가 발생한다. 이를 방지하기 위해 서버와 클라이언트는 약속된 메시지 형태로 데이터를 주고받으면서 독립적&amp;nbsp;확장이&amp;nbsp;가능하도록&amp;nbsp;해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자기서술적&lt;/b&gt; &lt;br /&gt;요청하는 데이터가 어떻게 처리 되어져야 하는지 충분한 데이터를 포함 할수 있어야 한다. HTTP기반의 REST에서는 HTTP Method와 Header정보 그리고 URI의 포함되는 정보로 표현 할수 있다. &lt;/p&gt;
&lt;pre id=&quot;code_1624901712404&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET	:	https://example.com/user/1	, 사용자의 정보 요청
POST  	:	https://example.com/user	, 사용자 정보 생성
PUT   	:	https://example.com/user	, 사용자 정보 수정
DELETE	:	https://example.com/user/1	, 사용자 정보 삭제&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Application 상태에 대한 엔진으로써 하이퍼미디어&lt;/b&gt; &lt;br /&gt;REST&amp;nbsp;API를&amp;nbsp;개발할&amp;nbsp;때&amp;nbsp;단순히&amp;nbsp;Client&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;데이터만&amp;nbsp;응답&amp;nbsp;해주는&amp;nbsp;것이&amp;nbsp;아닌&amp;nbsp;관련된 &lt;br /&gt;리소스에&amp;nbsp;대한&amp;nbsp;Link&amp;nbsp;정보까지&amp;nbsp;같이&amp;nbsp;포함&amp;nbsp;되어져야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;반드시는 아니지만 위와 같은 조건이 충족되었을때 REST ful 하다고 표현하며, 이를 REST API라고 한다.&lt;/p&gt;</description>
      <category>프로그래밍/Web</category>
      <category>REST API</category>
      <category>REST ful</category>
      <category>Web</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/20</guid>
      <comments>https://spurdev.tistory.com/20#entry20comment</comments>
      <pubDate>Tue, 29 Jun 2021 09:21:52 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] JPA(Java Persistence API)란?</title>
      <link>https://spurdev.tistory.com/19</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ORM(Object-Relational Mapping)?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법으로 객체와 데이터베이스 테이블을 매핑해서 패러다임의 불일치 문제를 대신 해결해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;JPA?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA는 자바 ORM 기술에 대한 API 표준 명세로 인터페이스의 모음이다. 그렇기 때문에 JPA를 사용하기 위해서는 JPA를 구현한 ORM 프레임워크를 통해야 하며, 하이버네이트(Hibernate)가 가장 대중적인 프레임워크로 사용되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;JPA를 사용해야 하는 이유&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생산성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;JPA를 사용하면 자바 컬렉션에 객체를 저장하듯이 JPA에게 객체를 전달하기만 하면 된다. 데이터베이스에 객체를 저장하기 위해 개발자는 CRUD용 SQL을 작성하고 JDBC API를 사용하는 반복작업을 수행해야 했다. 하지만 JPA를 사용하면 이런 반복적인 작업은 JPA가 대신하게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유지보수&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;SQL을 직접 다루면 엔티티에 필드를 하나만 추가해도 관련된 SQL과 결과를 매핑하기 위한 API 코드를 모두 변경해야 한다. 반면에 JPA를 사용하면 이런 과정을 JPA가 대신 처리해주므로 필드를 추가하거나 삭제해도 수정해야 할 코드가 줄어든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패러다임의 불일치 해결&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치를 해결해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성능&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기회를 제공한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 접근 추상화와 벤더 독립성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;관계형 데이터베이스는 같은 기능도 벤더마다 사용법이 다른 경우가 많다. JPA는 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공하여 특정 데이터베이스 기술에 종속되지 않도록 해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/JPA</category>
      <category>java persistence api</category>
      <category>JPA</category>
      <category>ORM</category>
      <category>하이버네이트</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/19</guid>
      <comments>https://spurdev.tistory.com/19#entry19comment</comments>
      <pubDate>Sun, 27 Jun 2021 13:35:51 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 접근 제어자(Access modifier)</title>
      <link>https://spurdev.tistory.com/18</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;접근 제어자란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근&amp;nbsp;제어자는&amp;nbsp;멤버&amp;nbsp;또는&amp;nbsp;클래스에&amp;nbsp;사용되어,&amp;nbsp;해당하는&amp;nbsp;멤버&amp;nbsp;또는&amp;nbsp;클래스를&amp;nbsp;외부에서&amp;nbsp;접근하지&amp;nbsp;못하도록 &lt;br /&gt;제한하는 역할을 한다. Java에서 기본 접근 제어자는 defualt이며 클래스나 멤버 변수, 메서드, 생성자에 접근 제어자가 지정되어 있지 않다면, 접근&amp;nbsp;제어자가&amp;nbsp;default임을&amp;nbsp;뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;접근 제어자 종류와 범위&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근 제어자는 클래스, 멤버변수, 메서드, 생성자에 사용되며 특정 접근 제어자를 사용하여 접근 제한할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;private&lt;/b&gt;: 외부 접근이 불가능하며 같은 클래스 내에서만 접근이 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;default&lt;/b&gt;: 같은 패키지 내에서만 접근이 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;protected&lt;/b&gt;: 같은 패키지이거나 다른 패키지이더라도 상속관계라면 접근이 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;public&lt;/b&gt;: 접근 제한이 전혀 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근 범위가 넓은 쪽에서 좁은 쪽의 순으로 왼쪽부터 나열한다면, &lt;b&gt;public &amp;gt; protected &amp;gt; default &amp;gt; private&lt;/b&gt; 순이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;접근 제어자를 사용하는 이유&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스의 내부에 선언된 데이터를 보호하기 위해서이다. 중요 데이터를 저장하고 있는 변수에 외부에서 함부로 접근하여 변경하면 데이터는 유효한 값을 유지할 수 없을 것이다. 이를 방지하고 데이터가 유효한 값을 유지할 수 있도록 접근 제어자를 통해 데이터 접근을 제한한다.(데이터 감추기, 객체지향의 캡슐화) 또 다른 이유는 클래스의 내부 작업을 위해 사용되는 멤버 변수나 메서드를 감추기 위해서이다. 외부에서 접근할 필요가 없는 멤버들을 private로 노출되지 않도록 하여 복잡성을 줄일 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부로부터 데이터를 보호하기 위해서&lt;/li&gt;
&lt;li&gt;내부적으로만 사용되어 외부에서 접근할 필요가 없는 부분을 감추기 위해서&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/Java</category>
      <category>Access Modifier</category>
      <category>default</category>
      <category>Private</category>
      <category>Protected</category>
      <category>Public</category>
      <category>접근제어자</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/18</guid>
      <comments>https://spurdev.tistory.com/18#entry18comment</comments>
      <pubDate>Fri, 25 Jun 2021 10:41:51 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래밍] 디자인 패턴 개념과 종류</title>
      <link>https://spurdev.tistory.com/17</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;디자인 패턴이란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴은 자주 접하는 설계 문제를 해결해주는 증명된 솔루션을 체계적으로 정리한 것으로, 다양한 분야의 객체지향 프로그램을 설계하는 과정에서 자주 반복되는 설계 문제를 해결해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Gof(Gang of Four) 디자인 패턴&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 경험은 소프트웨어를 설계할때 매우 중요한 역할을 한다. 하지만 모든 사람들이 다양한 경험을 가지고 있을수는 없기 때문에 이러한 지식을 공유하기 위해 나온것이 Gof 디자인 패턴이다. Gof 디자인 패턴은 총 23가지 디자인 패턴을 정리하고 생성, 구조, 행위 3가지로 분류하였다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style7&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;생성 패턴&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;구조 패턴&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;행위 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;- Factory Method&lt;br /&gt;- Singleton&lt;br /&gt;- Prototype&lt;br /&gt;- Builder&lt;br /&gt;- Abstract Factory&lt;br /&gt;- Chaining&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;- Adapter&lt;br /&gt;- Composite&lt;br /&gt;- Bridge&lt;br /&gt;- Decorator&lt;br /&gt;- Facade&lt;br /&gt;- Flyweight&lt;br /&gt;- Proxy&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;- Template Method&lt;br /&gt;- Interpreter&lt;br /&gt;- Iterator&lt;br /&gt;- Observer&lt;br /&gt;- Strategy&lt;br /&gt;- Visitor&lt;br /&gt;- Chain of responsibility&lt;br /&gt;- Command&lt;br /&gt;- Mediator&lt;br /&gt;- State&lt;br /&gt;- Memento&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Gof 디자인 패턴의 3가지 분류&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생성 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;객체를 생성하는 것과 관련된 패턴으로 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화하고 코드의 유연성을 높여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구조 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;더 큰 구조를 형성하기 위해 클래스, 객체들을 어떻게 구성하고 합성할지 정하는데 활용할수 있는 패턴으로 복잡한 구조를 개발과 유지보수를 쉽게 만들어 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;행위 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;반복적으로 사용되는 객체들의 상호작용을 패턴화한 것으로, 객체나 클래스의 유형을 정의하는 것이 아니라 클래스 사이의 책임과 협력에 대한 유형을 제시한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 디자인 패턴&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;싱글톤(Singleton) 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;어떠한 객체(클래스)가 유일하게 1개만 존재해야 할때 사용하는 패턴이다. 서로 자원을 공유 해야할때 사용되며 TCP Socket 통신이나 DB 접속을 위해 사용하는 connect 객체에 주로 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어댑터(Adapter) 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용 할 수 있도록 하는 패턴.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프록시(Proxy) 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;복잡하거나 생성하는 데 시간이 오래 걸리는 객체를 좀 더 간단한 객체로 표현하기 위해 그 객체가 필요할 때까지 생성을 보류하는 디자인 패턴. 프록시 클래스가 대리인 역할로 대신 일을 처리하며 해당 객체가 필요할 때까지 생성을 지연시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데코레이터(Decorator) 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기존 구조는 유지하면서 기능을 추가하거나 필요한 형태로 꾸밀 때 사용하는 패턴으로 확장이 필요한 경우 상속의 대안으로 사용되기도 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵저버(Observer) 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;특정 데이터나 객체를 모니터링하고 있다가 변화가 발생하면 시스템에 이를 알리고 연관된 객체들이 변화에 대응하는 작업을 실행하도록 만드는 패턴이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파사드(Facade) 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;서브시스템 내부가 복잡하여 클라이언트 코드를 사용하기 힘들때 사용하는 디자인 패턴으로 간단한 인터페이스만 알아도 서브시스템의 주요 기능을 사용할 수 있도록 해주는 역할을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전략 패턴(Strategy) 패턴&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;유사한 행위들을 캡슐화하여 객체의 행위를 바꾸고 싶은 경우 직접 변경하는 것이 아닌 전략만 변경하여 유연하게 확장하는 디자인 패턴.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>프로그래밍</category>
      <category>Adapter</category>
      <category>Design Pattern</category>
      <category>GOF</category>
      <category>observer</category>
      <category>singleton</category>
      <category>디자인 패턴</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/17</guid>
      <comments>https://spurdev.tistory.com/17#entry17comment</comments>
      <pubDate>Thu, 24 Jun 2021 10:28:57 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 객체지향 이란?</title>
      <link>https://spurdev.tistory.com/16</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;객체지향? OOP(Object-Oriented Programming)?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향이란 현실에 존재하는 사물을 있는 그대로 모델링하여, 행위와 속성을 정의하고 절차적이 아닌 객체가 중심이 되어 실제 사물이 동작하는 방식으로 설계하기 위해 등장한 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사물에 대해서는 객체 Object라 부르며 해당 사물이 하는 행위를 Method로 정의하고 해당 사물이 가지는 속성을 변수 Variable라고 정의 한다. 실제 사물을 중심으로 설계하기 때문에 기존의 절차지향 보다는 조금 더 편리하게 설계가 가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;객체지향 4가지 핵심요소&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;캡슐화(Encapsulation)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;캡슐화는 객체의 속성(Variable)을 보호하기 위함이다.&lt;/li&gt;
&lt;li&gt;특정 속성에 직접 접근이 아닌 Method를 통해 접근할 수 있도록 한다.&lt;/li&gt;
&lt;li&gt;속성이 선언되었으나 상태를 변경하는 Method가 없다면 잘못 선언된 속성이며 자신이 가지고 있는 속성에 대해서는 상태를 변경하는 기능을 제공해야 한다.&lt;/li&gt;
&lt;li&gt;객체지향의 패러다임 중 하나인 추상화를 제공하고 재 사용성을 향상시킨다.(유지보수 효율 향상)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상속(&lt;span style=&quot;color: #4d5156;&quot;&gt;Inheritance)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;객체지향에서의 상속은 속성의 상속이 아닌 하위로 내려가면서 구체화 시키는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;최상위 클래스의 구조를 보고 하위 클래스의 동작을 이해할수 있기 때문에 프로그램 구조 이해가 용이하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;상속을 이용하여 해당 클래스에서 필요한 속성과 메소드를 모두 정의하지 않고 상속을 받아 사용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;일관된 형태의 클래스 객체를 추가 할 수 있어 확장이 용이하고 유지보수서이 향상된다&lt;/span&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;다형성&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;다형성은 하나의 개체가 여러 개의 형태로 변화 하는것을 말한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;자바의 오버라이딩을 통해 구현한다.&lt;/span&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;추상화&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;추상화는 객체지향에서 모델링을 말한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;구체적으로 공통적인 부분과 특성을 분리해서 재조합 하는 부분이 추상화이다.&lt;/span&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;객체지향 설계 5원칙(SOLID)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;좋은 소프트웨 설계를 위해서는 &lt;b&gt;결합도(coupling)&lt;/b&gt;를 낮추고 &lt;b&gt;응집도(cohesion)&lt;/b&gt;를 높여야 한다.&lt;/span&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;&lt;b&gt;결합도&lt;/b&gt;는 클래스간의 상호 의존 정도를 나타내는 것으로 결합도가 낮으면 상호 의존성이 줄어들어 객체의 재사용 및 유지보수가 유리하다.&lt;/span&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;&lt;b&gt;응집도&lt;/b&gt;는 클래스 내부에 존재하는 구성 요소들의 기능적 관련성으로 응집도가 높은 클래스는 하나의 책임에 집중하고 독립성이 높아져 재사용 및 유지보수가 용이하다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;단일 책임 원칙(SRP - Single Responsibility Principle)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;어떠한 클래스를 변경해야 하는 이유는 한가지 뿐이어야 한다.&lt;/li&gt;
&lt;li&gt;하나의 역할에 집중하여 변경시 연쇄 변경이 일어나지 않도록 해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;개방 폐쇄 원칙(OCP - Open Closed Principle)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자신의 확장에는 열려있고 수정에 대해서는 닫혀 있어야 한다.&lt;/li&gt;
&lt;li&gt;상위 클래스 또는 인터페이스를 중간에 둠으로써, 자신의 변화에는 폐쇄적이지만 인터페이스는 외부의 변화에 대해서 확장을 개방해 줄수있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리스코프 치환 윈칙(LSP - Liskov Substitution Principle)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;서브 타입은 언제나 자신의 상위 타입으로 교체 할 수 있어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터페이스 분리 원칙(ISP - Interface Segregation Principle)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;의존 역전 원칙(DIP - Dependency Inversion Principle)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자신보다 변하기 쉬운 것에 의존하지 말아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/Java</category>
      <category>java</category>
      <category>OOP</category>
      <category>Solid</category>
      <category>객체지향</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/16</guid>
      <comments>https://spurdev.tistory.com/16#entry16comment</comments>
      <pubDate>Tue, 22 Jun 2021 09:12:36 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] Websocket(웹소켓)이란?</title>
      <link>https://spurdev.tistory.com/15</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Websocket, 웹소켓?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹소켓은 하나의 TCP 접속에 전이중 통신 채널을 제공하는 통신 프로토콜이다. &lt;span style=&quot;color: #202122;&quot;&gt;클라이언트 애플리케이션과&lt;span&gt; 웹 서버&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #202122;&quot;&gt;간의 통신을 가능케 하며, 서버와의 실시간 데이터 전송을 용이케 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #202122;&quot;&gt;등장 배경&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #202122;&quot;&gt;웹 환경에서 통신이라면 가장 먼저 떠오르는것은? 바로 HTTP이다. 90년대 처음 등장한 이후로 HTTP는 웹 환경에서는 뗄수 없는 존재가 되었다. 하지만 HTTP는 클라이언트가 요청을 보내고 응답을 받으면 연결을 끊는 방식이기 때문에 서버가 변경 사항이 발생했을때 클라이언트에 변경사항을 알릴 방법이 없어 실시간 서비스에 적합하지 않다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #202122;&quot;&gt;물론, Polling과 Long Polling이라는 개념(주기적으로 클라이언트가 요청을 보내 변경사항을 가져오는 것)이 존재하지만 잦은 요청은 불필요한 트래픽을 발생시키고 연결/해제를 위해 반복적으로 Header 데이터가 발생하는 것은 효율적이지 못하다. 그래서 이런점을 보완하기 위해 등장한것이 Websocket이다. Websocket은 최초 접속시 서버와 연결하고 연결을 유지하여 변경되는 데이터를 실시간으로 반영할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1817&quot; data-origin-height=&quot;342&quot; data-filename=&quot;websocket.png&quot; width=&quot;695&quot; height=&quot;131&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfTqtT/btq6MS2tMFL/vegJ3I6zkJAz9hiohsAzeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfTqtT/btq6MS2tMFL/vegJ3I6zkJAz9hiohsAzeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfTqtT/btq6MS2tMFL/vegJ3I6zkJAz9hiohsAzeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfTqtT%2Fbtq6MS2tMFL%2FvegJ3I6zkJAz9hiohsAzeK%2Fimg.png&quot; data-origin-width=&quot;1817&quot; data-origin-height=&quot;342&quot; data-filename=&quot;websocket.png&quot; width=&quot;695&quot; height=&quot;131&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #202122;&quot;&gt;Websocket 연결&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;837&quot; data-filename=&quot;WebSockets-Diagram.png&quot; width=&quot;443&quot; height=&quot;399&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQLuLx/btq6Jyxk7uH/mSFO0aX0ZthKDq1iZvKVzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQLuLx/btq6Jyxk7uH/mSFO0aX0ZthKDq1iZvKVzk/img.png&quot; data-alt=&quot;Websocket 연결 (이미지 출처:PubNub.com )&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQLuLx/btq6Jyxk7uH/mSFO0aX0ZthKDq1iZvKVzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQLuLx%2Fbtq6Jyxk7uH%2FmSFO0aX0ZthKDq1iZvKVzk%2Fimg.png&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;837&quot; data-filename=&quot;WebSockets-Diagram.png&quot; width=&quot;443&quot; height=&quot;399&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Websocket 연결 (이미지 출처:PubNub.com )&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #202122;&quot;&gt;WebSocket 연결을 설정하기 위해 클라이언트는 WebSocket 핸드셰이크 요청을 전송한다.이 요청에 대해 서버는 아래와 같이 WebSocket 핸드셰이크 응답을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #202122;&quot;&gt;클라이언트 요청:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623076924732&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 응답:&lt;/p&gt;
&lt;pre id=&quot;code_1623076945739&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸드셰이크는 HTTP 요청/응답으로 시작하고 서버가 동일한 포트에서 WebSocket 연결뿐만 아니라 HTTP 연결을 처리 할 수 ​​있도록한다. 그리고&lt;span&gt;&amp;nbsp;&lt;/span&gt;연결이 설정되면 통신은 HTTP 프로토콜을 따르지 않는 양방향 바이너리 프로토콜로 전환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Websocket 사용시 장단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;양방향 통신이 가능해지며 클라이언트/서버가 서로에게 메시지를 보낼수 있다.&lt;/li&gt;
&lt;li&gt;설계와 구현이 간단(Polling, Long-Polling에 비해)하고 통신 효율을 높일수 있다.&lt;/li&gt;
&lt;li&gt;한번의 통신으로 클라이언트와 서버의 연결을 유지할수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IE9 포함 이전 버전은 지원하지 않는다.&lt;/li&gt;
&lt;li&gt;비정상적으로 연결이 끊어졌을때 적절하게 대응할수 있어야 한다.&lt;/li&gt;
&lt;li&gt;HTTP에 비하면 코드나 설계가 복잡하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/WebSocket&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/WebSocket&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1623076704754&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;WebSocket - Wikipedia&quot; data-og-description=&quot;From Wikipedia, the free encyclopedia Jump to navigation Jump to search Computer network protocol WebSocket is a computer communications protocol, providing full-duplex communication channels over a single TCP connection. The WebSocket protocol was standar&quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/WebSocket&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/WebSocket&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2ZWmt/hyKuydurTg/Hiv3rIZDRZVYklpKcPzT11/img.png?width=249&amp;amp;height=229&amp;amp;face=0_0_249_229,https://scrap.kakaocdn.net/dn/df1tdL/hyKuzDtv8X/ldyJrpfOq9odKnVsdiBWyk/img.png?width=220&amp;amp;height=202&amp;amp;face=0_0_220_202&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/WebSocket&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/WebSocket&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2ZWmt/hyKuydurTg/Hiv3rIZDRZVYklpKcPzT11/img.png?width=249&amp;amp;height=229&amp;amp;face=0_0_249_229,https://scrap.kakaocdn.net/dn/df1tdL/hyKuzDtv8X/ldyJrpfOq9odKnVsdiBWyk/img.png?width=220&amp;amp;height=202&amp;amp;face=0_0_220_202');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;WebSocket - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;From Wikipedia, the free encyclopedia Jump to navigation Jump to search Computer network protocol WebSocket is a computer communications protocol, providing full-duplex communication channels over a single TCP connection. The WebSocket protocol was standar&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;en.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터공학/네트워크</category>
      <category>full duplex</category>
      <category>http</category>
      <category>Realtime</category>
      <category>websocket</category>
      <category>네트워크</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/15</guid>
      <comments>https://spurdev.tistory.com/15#entry15comment</comments>
      <pubDate>Tue, 8 Jun 2021 10:26:18 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] DI(Dependency Injection)와 스프링</title>
      <link>https://spurdev.tistory.com/14</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스프링에서 DI(Dependency Injection)는?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DI는 Dependency Injection의 약자로 우리말로 해석하며 '의존성 주입'이라는 뜻이 된다. DI는 의존을 처리하는 방법에 대한 내용이며 스프링은 DI를 기반으로 동작하기 때문에 DI에 대한 이해가 필수적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;의존(Dependency)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1622902507273&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class TestDependency{
    private StringBuilder sb = new StringBuilder();
    public void insert(String str){
    	sb.append(str);	
    }    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 TestDependency 클래스는 내부에서 StringBuilder 클래스 객체를 사용하여 insert 메서드를 구현하였다. 특정 기능을 위해 다른 클래스를 필요로 할 때 &lt;b&gt;의존&lt;/b&gt;한다고 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DI는 외부로부터 객체를 전달받는 것&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1622903583574&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class TestDI{
    private StringBuilder sb;     
    public TestDI(StringBuilder sb){
    	this.sb = sb;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드의 클래스는 직접 객체를 생성하지 않고 외부로부터 StringBuilder 객체를 전달받아 사용한다. 이렇게 클래스가 스스로 의존하는 객체를 생성하지 않고 외부의 누군가가 의존하는 객체를 넣어준다는 의미로 Dependency Injection이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;누가 DI를 하는가?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DI가 무엇인지는 대충 이해했지만 궁금증이 생긴다. 그럼, 누가 객체를 생성하고 주입해주는가? 그 역할을 하는것이 바로 스프링이고 DI는 스프링의 핵심 기능 중 하나이다. 스프링은 객체를 생성하고 각 객체를 연결해주는 조립기 역할을 한다.&lt;/p&gt;</description>
      <category>프로그래밍/Spring</category>
      <category>Dependency Injection</category>
      <category>DI</category>
      <category>Spring</category>
      <category>스프링</category>
      <category>의존성 주입</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/14</guid>
      <comments>https://spurdev.tistory.com/14#entry14comment</comments>
      <pubDate>Sun, 6 Jun 2021 09:52:30 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] Context Switch(문맥 교환)이란?</title>
      <link>https://spurdev.tistory.com/13</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Context Switch(문맥 교환)?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU가 현재 작업 중인 프로세스에서 다른 프로세스로 넘어갈 때 지금까지의 프로세스의 상태를 저장하고, 새 프로세스의 저장된 상태를 다시 적재하는 작업을 Context Switch(문맥 교환)이라 한다. (프로세스의 정보는 PCB에 저장된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;언제 발생하는가?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context Switch가 발생하는 경우는 멀티태스킹, 인터럽트 핸들링, 사용자 모드와 커널 모드 간의 전환까지, 크게 3가지가 존재한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티태스킹(&lt;span&gt;Multitasking)&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span&gt;실행 가능한 프로세스들이 운영체제의 스케줄러에 의해 조금씩 번갈아가며 수행되는 것을 말한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;번갈아 가며 프로세스가 CPU를 할당 받는데 이때 Context Switching 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사용자가 체감하기 힘든 속도로 Context Switching되며 프로세스가 처리되기 때문에 동시에 처리되는 것처럼 느껴진다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터럽트 핸들링(&lt;span&gt;Interrupt handling)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span&gt;인터럽트란 컴퓨터 시스템에서 예외 상황이 발생했을때 CPU에게 알려 처리할 수 있도록 하는 것을 말한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;인터럽트가 발생하면 Context Switching한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;I/O request&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 입출력 요청&lt;/li&gt;
&lt;li&gt;time slice expired&lt;span&gt;&amp;nbsp;&lt;/span&gt;: CPU 사용시간이 만료&lt;/li&gt;
&lt;li&gt;fork a child&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 자식 프로세스 생성&lt;/li&gt;
&lt;li&gt;wait for an interrupt&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 인터럽트 처리 대기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용자와 커널 모드 전환(&lt;span&gt;User and kernel mode switching&lt;/span&gt;)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사용자와 커널 모드 전환은 Context Switch가 필수는 아니지만 운영체제에 따라 발생할수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Context Switching 과정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;365&quot; data-filename=&quot;문맥교환.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLs4ee/btq6zCgeEaS/eMkhgp9failtca7VYSgbkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLs4ee/btq6zCgeEaS/eMkhgp9failtca7VYSgbkk/img.png&quot; data-alt=&quot;Operating System Concepts&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLs4ee/btq6zCgeEaS/eMkhgp9failtca7VYSgbkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLs4ee%2Fbtq6zCgeEaS%2FeMkhgp9failtca7VYSgbkk%2Fimg.png&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;365&quot; data-filename=&quot;문맥교환.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Operating System Concepts&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;요청 발생: 인터럽트 또는 트랩에 의한 요청이 발생.(트랩은 소프트웨어 인터럽트)&lt;/li&gt;
&lt;li&gt;PCB에 저장: 운영체제는 현재 실행중인 프로세스(P0)의 정보를 PCB에 저장.&lt;/li&gt;
&lt;li&gt;CPU 할당: 운영체제는 다음 프로세스(P1)의 정보를 PCB에서 가져와 CPU를 할당.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정을 반복적으로 수행한다. Context Switching하는 동안 CPU는 아무일도 하지않는 시간이 발생하는데 이를 오버헤드(Overhead)라 하고 오버헤드가 잦아지면 성능이 떨어질수 있다.&lt;/p&gt;</description>
      <category>컴퓨터공학/운영체제</category>
      <category>Context Switch</category>
      <category>context switching</category>
      <category>operating syatem</category>
      <category>os</category>
      <category>문맥교환</category>
      <category>운영체제</category>
      <category>컴퓨터공학</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/13</guid>
      <comments>https://spurdev.tistory.com/13#entry13comment</comments>
      <pubDate>Sat, 5 Jun 2021 19:40:26 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 프로세스(Process)와 스레드(Thread)</title>
      <link>https://spurdev.tistory.com/12</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프로세스(Process)란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램으로 운영체제에의해 디스크에서 메모리로 적재되어 CPU의 자원을 할당받을 수 있는 것을 말한다. 프로세스 정보는 PCB로 관리한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프로세스의 구조&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스는 크게 네가지의 영역으로 나뉜다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;693&quot; data-filename=&quot;프로세스.png&quot; width=&quot;264&quot; height=&quot;422&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MCK0w/btq6htKfStF/mRmv0fL0PNyEOnKQhcUFl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MCK0w/btq6htKfStF/mRmv0fL0PNyEOnKQhcUFl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MCK0w/btq6htKfStF/mRmv0fL0PNyEOnKQhcUFl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMCK0w%2Fbtq6htKfStF%2FmRmv0fL0PNyEOnKQhcUFl0%2Fimg.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;693&quot; data-filename=&quot;프로세스.png&quot; width=&quot;264&quot; height=&quot;422&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 코드: 프로그래밍 코드 텍스트 영역&lt;/li&gt;
&lt;li&gt;데이터(data): 전역 변수들을 저장&lt;/li&gt;
&lt;li&gt;스택(stack): 지역 변수 및 함수의 매개변수를 저장&lt;/li&gt;
&lt;li&gt;힙(heap): 동적 메모리 할당 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스레드(Thread)란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스레드의 구조&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;693&quot; data-filename=&quot;스레드.png&quot; width=&quot;454&quot; height=&quot;298&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uyI8b/btq6hemvNQP/bValVVimIheOteMwuewK8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uyI8b/btq6hemvNQP/bValVVimIheOteMwuewK8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uyI8b/btq6hemvNQP/bValVVimIheOteMwuewK8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuyI8b%2Fbtq6hemvNQP%2FbValVVimIheOteMwuewK8k%2Fimg.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;693&quot; data-filename=&quot;스레드.png&quot; width=&quot;454&quot; height=&quot;298&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 여러개의 스레드를 가진다면 동시에 하나 이상의 작업들을 수행할 수 있으며 같은 프로세스에 속한 스레드들은 프로세스의 코드, 데이터, 파일 등을 공휴할수 있다.&lt;/li&gt;
&lt;li&gt;각 스레드는 각자 레지스터 집합(PC 레지스터 포함)과 스택을 가진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;멀티 프로세스 vs 멀티 스레드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티 프로세스는 각 프로세스가 독립적인 공간을 사용하기 때문에 하나의 프로세스가 오류로 인해 종료되더라도 다른 프로세스에 영향을 주지 않는다. 하지만 멀티 프로세스를 구현하기 위해서는 IPC를 이용해야 하므로 추가적인 자원을 사용한다는 단점이 있다. 반면에, 멀티 스레드는 같은 프로세스 내의 스레드와 자원을 공유하기 때문에 별도의 추가 자원이 필요하지 않고 문맥전환이 빠르다는 장점이있다. 그러나 멀티 스레드는 하나의 스레드에 오류가 생겨 종료되었을 경우 다른 스레드에 영향을 줄수 있으며 같은 공간을 사용하기 때문에 동기화의 문제가 발생할 수 있다. 따라서, 시스템의 특징과 상황을 고려하여 두가지 방법중 하나를 선택해야 한다.&lt;/p&gt;</description>
      <category>컴퓨터공학/운영체제</category>
      <category>멀티스레드</category>
      <category>멀티프로세스</category>
      <category>스레드</category>
      <category>운영체제</category>
      <category>프로세스</category>
      <author>spurdev</author>
      <guid isPermaLink="true">https://spurdev.tistory.com/12</guid>
      <comments>https://spurdev.tistory.com/12#entry12comment</comments>
      <pubDate>Wed, 2 Jun 2021 09:13:43 +0900</pubDate>
    </item>
  </channel>
</rss>