<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Legday</title>
    <link>https://jadev97.tistory.com/</link>
    <description>웹개발자 지망생입니다</description>
    <language>ko</language>
    <pubDate>Wed, 9 Sep 2026 13:51:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Legday</managingEditor>
    <item>
      <title>DI 컨테이너란 ?</title>
      <link>https://jadev97.tistory.com/114</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;DI 컨테이너를 알기전에 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;IoC(Inversion of control)&lt;/span&gt;&lt;/b&gt;를 알아야 한다!&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;제어의 역전 IoC(Inversion of Control)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프로그램의 제어 흐름&lt;/b&gt;을 개발자가 직접 제어하는 것이 아니라 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;외부에서 관리하는것을 제어의 역전(IoC)&lt;/b&gt;&lt;/span&gt;라 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp; 프레임워크(Framework) 와 라이브러리(Library)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 프레임워크는 사용자가 작성한 코드를 제어하고, 실행한다(예: Junit)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 라이브러리는 개발자가 작성한 코드를 개발자가 제어하고, 흐름을 담당한다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;의존관계 주입 DI(Dependency Injection)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션 실행 시점(런타임)에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 &lt;b&gt;클라이언트와 서버의 실제 의존관계가 연결 되는 것을 의존관계 주입이라 한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의존관계 주입을 사용하면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경&lt;/span&gt;할 수 있다.&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;IoC 컨테이너 == DI 컨테이너&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AppConfig 처럼 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;객체를 생성하고 관리하면서 의존관계를 연결해 주는 컨테이너&lt;/b&gt;&lt;/span&gt;를 뜻한다.&lt;/li&gt;
&lt;li&gt;IoC컨테이너나 DI컨테이너나 똑같은 뜻이다.&lt;/li&gt;
&lt;li&gt;최근에는 주로 DI컨테이너라고 부른다.&lt;/li&gt;
&lt;li&gt;스프링의 강력한 기능이다&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Spring&amp;amp;Springboot/Spring(인프런강의 공부)</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/114</guid>
      <comments>https://jadev97.tistory.com/114#entry114comment</comments>
      <pubDate>Mon, 15 May 2023 18:31:43 +0900</pubDate>
    </item>
    <item>
      <title>스프링(Spring)의 역사</title>
      <link>https://jadev97.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682419548805&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;스프링 핵심 원리 - 기본편 - 인프런 | 강의&quot; data-og-description=&quot;스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard&quot; data-og-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cS93C4/hySpBZLgNc/oz0Ma8sGjG1vwTYkElzkiK/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/bQjJd0/hySouupng8/k0Hgc5DK2lYRIcKssW3gYk/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/dc0EHN/hySpCYFqdv/wLV68Wb4H4Tw6YhixUU9Gk/img.png?width=1805&amp;amp;height=1044&amp;amp;face=0_0_1805_1044&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cS93C4/hySpBZLgNc/oz0Ma8sGjG1vwTYkElzkiK/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/bQjJd0/hySouupng8/k0Hgc5DK2lYRIcKssW3gYk/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/dc0EHN/hySpCYFqdv/wLV68Wb4H4Tw6YhixUU9Gk/img.png?width=1805&amp;amp;height=1044&amp;amp;face=0_0_1805_1044');&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;스프링 핵심 원리 - 기본편 - 인프런 | 강의&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;인프런 사이트에서 공부하면서 정리한 글입니다 !! 틀린게 있으면 댓글 부탁드립니다&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;스프링 역사&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;스프링의 이름은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;J2EE(EJB)라는 겨울을 넘어 새로운 시작&lt;/b&gt;&lt;/span&gt;이라는 뜻이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;스프링 이전에는 EJB , Hibernate 를 썻다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;스프링의 종류&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;스프링은 필수부분과 선택할 수 있는 부분이 있습니다.&lt;/blockquote&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;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;스프링 프레임워크&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;스프링 부트&lt;/b&gt;&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;- 스프링 데이터(JPA)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스프링 세션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스프링 시큐리티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스프링 RestDocs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스프링 배치&lt;/p&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;스프링 프레임워크&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 핵심 기술 : &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;스프링 DI 컨테이너&lt;/b&gt;&lt;/span&gt;, AOP(관점지향 프로그래밍) , 이벤트, 기타&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹 기술 : &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;스프링 MVC&lt;/b&gt;&lt;/span&gt; , 스프링 WebFlux&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 접근 기술 : Transaction, JDBC, ORM 지원, XML 지원&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스프링 부트(Spring boot)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c4ff99;&quot;&gt;스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Tomcat을 내장&lt;/b&gt;&lt;/span&gt;하기 때문에 별도의 웹서버를 설치하지 않아도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 손쉬운 빌드 구성을 위한 starter 종속성 제공 -&amp;gt; 라이브러리를 가져올 때 관련된 것을 한꺼번에 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 3rd parth(외부) 라이브러리 자동 구성 -&amp;gt; &lt;b&gt;&lt;span style=&quot;background-color: #c4ff99;&quot;&gt;스프링 버전 별로 필요한 라이브러리를 자동으로 가져온다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Spring을 왜 만들었을까 ?&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;- &lt;b&gt;객체 지향 언어가 가진 강력한 특징을 살려주는 프레임워크&lt;/b&gt;&lt;/p&gt;</description>
      <category>Spring&amp;amp;Springboot/Spring(인프런강의 공부)</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/113</guid>
      <comments>https://jadev97.tistory.com/113#entry113comment</comments>
      <pubDate>Tue, 25 Apr 2023 20:02:42 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] 도커(Docker) 란 ?</title>
      <link>https://jadev97.tistory.com/112</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  어떠한 프로그램을 다운로드 하는 과정에서 서버, 패키지 버전, os등등에 문제로 에러가 많이 나는 경우가 있다.&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 도커(Docker)를 사용하면 에러가 덜 나고 간단하게 프로그램을 다운받을 수 있다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;도커(Docker)란 ?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;컨테이너 기반&lt;/span&gt;&lt;/i&gt;의 오픈소스 가상화 플랫폼이며 생태계이다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Docker 컨테이너 내에 다양한 프로그램(웹서버, DB 등)을 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;i&gt;컨테이너로 추상화하고 프로그램의 배포 및 관리를 단순&lt;/i&gt;&lt;/span&gt;하게 해준다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;도커(Docker) 이미지란 ?&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 &lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;응용 프로그램을 실행하는 데 필요한 모든것&lt;/span&gt;&lt;/i&gt;을 포함한 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;소프트웨어 패키지&lt;/i&gt;&lt;/span&gt;이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;도커(Docker) 컨테이너란 ?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도커 컨테이너는 도커 이미지에 의해 생성이되며, &lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;프로그램을 실행하는 이미지의 인스턴스&lt;/span&gt;&lt;/i&gt;라고 생각하면 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;도커(Docker)의 간단한 흐름&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;도커(Docker)는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;도커 클라이언트(CLI)&lt;/span&gt;와 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;도커 서버(Daemon)&lt;/span&gt;사이에서 명령어를 주고받으면서 동작한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;도커 클라이언트가 요청을 하면 도커서버는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;우선적으로 로컬에 이미지 Cache에 요청파일이 있는지 확인&lt;/span&gt;하고 없다면 &lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;도커허브(Docker Hub)에서 가져온다.&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;도커(Docker) 이미지 생성방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  도커 이미지는 응용 프로그램을 실행하는데 필요한 모든 것을 포함하고 있다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;응용 프로그램을 실행하는데 필요한 것은 &lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;실행명령어&lt;/span&gt;&lt;/i&gt;와 , &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;파일 스냅샷&lt;/i&gt;&lt;/span&gt;이다.&lt;/b&gt;&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;&lt;b&gt;&amp;nbsp; &amp;nbsp; 명령어 : docker run kakaotalk&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 파일 스냅숏 : 디렉토리나 파일을 카피한 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이미지로 컨테이너 만드는 순서&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Docker 클라이언트에 명령어 입력&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;docekr run &amp;lt;이미지&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Docker 이미지에 있는 파일 스냅샷을 컨테이너 하드 디스크에 옮겨준다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이미지에서 가지고 있는 명령어(컨테이너가 실행될 때 사용될 명령어)를 이용해서 컨테이너에서 카카오톡을 실행한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Docker</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/112</guid>
      <comments>https://jadev97.tistory.com/112#entry112comment</comments>
      <pubDate>Thu, 22 Dec 2022 23:29:38 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] HTTP 메시지 컨버터</title>
      <link>https://jadev97.tistory.com/111</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt; HTTP API 처럼 JSON 데이터를 HTTP메시지 바디에 넣어서 보내거나 읽어들일때 HTTP 메시지 컨버터를 사용하면 편리하다&lt;/b&gt;&lt;br /&gt;&lt;b&gt;  HttpMessageConverter 는 인터페이스이다. String, Json 등등의 타입으로 변환하기 떄문에 인터페이스로 구현되어 있다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;스프링 MVC에서 HTTP 메시지 컨버터 적용방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. HTTP 요청 : @RequestBody, HttpEntity(RequestEntity)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. HTTP 응답 : @ResponseBody, HttpEntity(ResponseEntity)&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 메시지 컨버터 작동원리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP 요청이 오면 스프링 내장 톰캣서버를 거쳐서 스프링 컨테이너로 HTTP 메시지가 들어온다. 이때 &lt;span style=&quot;color: #ee2323;&quot;&gt;@RequestBody&lt;/span&gt;를 사용하여 HTTP의 BODY에 데이터를 읽어 데이터 종류에 따라 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;HTTP 메시지 컨버터가 자동으로 변환&lt;/span&gt;해주는 역할을 한다&lt;/b&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;b&gt;요청을 예로 들었을 때 데이터가 들어오면 HTTP 메시지 컨버터의 canRead() 클래스가 동작하여 정해진 우선순위에 메시지 컨버터가 해당 클래스, 미디어타입을 지원하는지 체크한다.&lt;/b&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;b&gt;지원하지 않는다면 다음 우선순위의 메시지 컨버터를 체크하고 지원한다면 read() 메서드를 호출해서 객체를 생성하고, 반환한다.&lt;/b&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;b&gt;우선순위는 아래와 같다. 가독성을 위해 3개만 적었다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671633758294&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;```
// 숫자는 우선순위
0 = ByteArrayHttpMessageConverter
1 = StringHttpMessageConverter
2 = MappingJackson2HttpMessageConverter
```&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주요 메시지 컨버터&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ByteArrayHttpMessageConverter : &lt;span style=&quot;color: #ee2323;&quot;&gt;byte[] 데이터&lt;/span&gt;를 처리한다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스타입 : btye[] , 미디어타입: * / *&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요청 예) @RequestBody byte[] data&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;응답 예) @ResponseBody return byte[] , 쓰기 미디어타입 : application/octet-stream&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;StringHttpMessageConverter : &lt;span style=&quot;color: #ee2323;&quot;&gt;String 문자&lt;/span&gt;로 데이터를 처리한다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스타입 : String , 미디어타입 : * / *&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요청 예) @RequestBody String data&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;응답 예) @ResponseBody return &amp;ldquo;ok&amp;rdquo; 쓰기 미디어타입 : text/plain&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MappingJackson2HttpMessageConverter : &lt;span style=&quot;color: #ee2323;&quot;&gt;application/json&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스타입 : 객체 또는 &amp;lsquo;HashMap&amp;rsquo; , 미디어타입 : application/json 관련&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요청 예) @RequestBody HelloData data&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;응답 예) @ResponseBody return helloData , 쓰기미디어타입 : application/json 관련&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring&amp;amp;Springboot/Spring(개인공부용)</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/111</guid>
      <comments>https://jadev97.tistory.com/111#entry111comment</comments>
      <pubDate>Wed, 21 Dec 2022 23:53:03 +0900</pubDate>
    </item>
    <item>
      <title>[Spring]HTTP 응답메시지 데이터 다루는 방법</title>
      <link>https://jadev97.tistory.com/110</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  스프링에서 응답데이터를 다루는 방법은 3가지가 있다&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1. 정적 리소스뷰&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2. 템플릿 사용&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;3. HTTP 메시지 사용&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 정적 리소스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;스프링 부트는 /resources 경로 안에서 정적 리소스를 관리&lt;/span&gt;한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;/static 경로나 /public 등의 클래스패스에서 정적 리소스를 제공하고 모든 루트 경로는 /resources 이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정적 리소스는 html, css, 이미지 등의 정적인 파일을 말하는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 뷰 템플릿(템플릿 엔진)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;뷰 템플릿은 HTML 을 동적으로 생성하는 용도이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;뷰 템플릿을 거쳐서 HTML 이 생성되고, 뷰가 응답을 만들어서 전달한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;스프링 부트는 뷰 템플릿 경로를 /resources/templates&lt;/span&gt; 로 지정된다.&lt;/b&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;b&gt;ModelAndView 방식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671632491679&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequestMapping(&quot;/response-view-v1&quot;)
public ModelAndView responseViewV1(){
    ModelAndView mav = new ModelAndView(&quot;response/hello&quot;).addObject(&quot;data&quot;, &quot;hello!&quot;);

    return mav;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Model 객체 사용방식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스프링부트에서 타임리프 주입받으면 뷰 리졸버 경로를 자동으로 설정해준다. 즉 리턴값에 경로만 적어주면 된다.(/resources/templates ~~~ .html 경로가 지정되기 때문에 파일명만 리턴해주면 된다)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671632673883&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequestMapping(&quot;/response-view-v2&quot;)
public String responseViewV2(Model model) {
    model.addAttribute(&quot;data&quot;,&quot;Cristiano Ronaldo&quot;);

    return &quot;response/hello&quot;;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Spring&amp;amp;Springboot/Spring(개인공부용)</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/110</guid>
      <comments>https://jadev97.tistory.com/110#entry110comment</comments>
      <pubDate>Wed, 21 Dec 2022 23:26:34 +0900</pubDate>
    </item>
    <item>
      <title>[Spring]HTTP 요청메시지가 JSON 일 때</title>
      <link>https://jadev97.tistory.com/109</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  JSON 객체를 자바 Object로 변환하기 위해서 클래스 상단에 코드한줄을 적어주자 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private ObjectMapper objectMapper = new ObjectMapper();&lt;/b&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HttpServletRequest,Response를 이용&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;servlet를 이용한 방법 코드가 상당히 더럽고 길다&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1671631953722&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/request-body-json-v1&quot;)
    public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ServletInputStream inputStream = request.getInputStream();

        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        log.info(&quot;messageBody={}&quot;,messageBody);

        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
        log.info(&quot;username={}, age={}&quot;,helloData.getUsername(),helloData.getAge());

        response.getWriter().write(&quot;ok&quot;);

    }&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;@ResponseBody, @RequestBody를 이용한 방법&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@ResponseBody를 이용하기 때문에 데이터를 view에 응답할 수 있고&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@RequestBody를 이용하기 때문에 메세지바디 데이터를 가져와서 사용이 가능하다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1671631986136&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@ResponseBody
    @PostMapping(&quot;/request-body-json-v2&quot;)
    public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {


        log.info(&quot;messageBody={}&quot;,messageBody);

        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
        log.info(&quot;username={}, age={}&quot;,helloData.getUsername(),helloData.getAge());

        return &quot;ok&quot;;

    }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@RequestBody 객체 파라미터 방법&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Http메세지 컨버터를 이용해서 HttpEntity&amp;lt;객체&amp;gt; 로 사용가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;objectMapper를 사용하지 않아도 자동으로 json을 객체로 변환해 준다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1671632012853&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@ResponseBody
    @PostMapping(&quot;/request-body-json-v3&quot;)
    public String requestBodyJsonV3(@RequestBody HelloData helloData) {

        log.info(&quot;username={}, age={}&quot;,helloData.getUsername(),helloData.getAge());

        return &quot;ok&quot;;

    }&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  @RequestBody를 생략하면 자동으로 @ModelAttribute가 붙기 때문에 생략하면 안된다!!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;  Spring은 @ModelAttrbute , @RequestParam 생략 시 다음과 같이 자동으로 적용한다&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; String, int, Integer 과 같은 단순타입은 @RequestParam 자동적용&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 그 외 @ModelAttribute 자동 적용&lt;/b&gt;&lt;/blockquote&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;객체 파라미터를 직접 반환했을때&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;json 형식으로 브라우저에 출력된다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;d&quot;&gt;&lt;code&gt;@ResponseBody
    @PostMapping(&quot;/request-body-json-v5&quot;)
    public HelloData requestBodyJsonV5(HttpEntity&amp;lt;HelloData&amp;gt; helloData) {

        HelloData body = helloData.getBody();
        log.info(&quot;username={}, age={}&quot;,body.getUsername(),body.getAge());

        return body;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK1TLi/btrUfQpousB/tEknPqQpkGa0hGWvoj2BQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK1TLi/btrUfQpousB/tEknPqQpkGa0hGWvoj2BQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK1TLi/btrUfQpousB/tEknPqQpkGa0hGWvoj2BQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK1TLi%2FbtrUfQpousB%2FtEknPqQpkGa0hGWvoj2BQK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;481&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Spring&amp;amp;Springboot/Spring(개인공부용)</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/109</guid>
      <comments>https://jadev97.tistory.com/109#entry109comment</comments>
      <pubDate>Wed, 21 Dec 2022 23:14:18 +0900</pubDate>
    </item>
    <item>
      <title>[Spring]HTTP요청메시지가 단순텍스트일때 읽는방법</title>
      <link>https://jadev97.tistory.com/108</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. InputStream 사용법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서블릿을 이용한 방법이고 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;i&gt;HttpServletRequest, HttpServletResponse 객체&lt;/i&gt;&lt;/span&gt;를 이용하여 HTTP 메시지 바디를 읽는 방법이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671631209114&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/request-body-string-v1&quot;)
    public void requestBodyString(HttpServletRequest requset, HttpServletResponse response) throws IOException {
        ServletInputStream inputStream = requset.getInputStream();

        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        log.info(&quot;messageBody={}&quot;,messageBody);

        response.getWriter().write(&quot;ok&quot;);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;스프링 MVC 는 InputStream(Reader), OutputStream(Writer)를 지원한다&lt;/b&gt;&lt;br /&gt;&lt;b&gt;InputStream(Reader) : HTTP 요청 메시지 바디를 직접 조회합니다&lt;/b&gt;&lt;br /&gt;&lt;b&gt;OutputStream(Writer) : HTTP 응답 메시지 바디를 직접 출력합니다&lt;/b&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. HttpEntity 사용법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP 메시지 컨버를 사용하여 메시지 바디를 읽는다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HttpServletRequest, HttpServletResponse 객체를 사용할 떄 보다 코드가 간결하고 보기편하다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671631426183&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/request-body-string-v3&quot;)
    public HttpEntity&amp;lt;String&amp;gt; requestBodyStringV3(HttpEntity&amp;lt;String&amp;gt; httpEntity) throws IOException {
        // 스프링은 HTTP Message Convertor 를 제공
        String messageBody = httpEntity.getBody();

        log.info(&quot;messageBody={}&quot;,messageBody);

        return new HttpEntity&amp;lt;&amp;gt;(&quot;ok&quot;);
    }&lt;/code&gt;&lt;/pre&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;&lt;b&gt;HttpEntity를 상속받는 RequestEntity&amp;lt;&amp;gt;, ResponseEntity&amp;lt;&amp;gt;사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671631532410&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/http-message-converter&quot;)
    public HttpEntity&amp;lt;String&amp;gt; httpMessageConverter(RequestEntity&amp;lt;String&amp;gt; httpEntity) throws IOException{
        String messageBody = httpEntity.getBody();
        HttpMethod method = httpEntity.getMethod();
        URI url = httpEntity.getUrl();
        HttpHeaders headers = httpEntity.getHeaders();
        Type type = httpEntity.getType();
        log.info(&quot;method={}&quot;,method.toString());
        log.info(&quot;messageBody={}&quot;,messageBody);
        log.info(&quot;url={}&quot;,url.toString());
        log.info(&quot;headers={}&quot;,headers.toString());
        log.info(&quot;type={}&quot;,type.getTypeName());

        return new ResponseEntity&amp;lt;String&amp;gt;(&quot;ok&quot;, HttpStatus.CREATED);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfOHcp/btrUfwdFtdZ/sIIh8TbuQnaELQkKQ9mk20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfOHcp/btrUfwdFtdZ/sIIh8TbuQnaELQkKQ9mk20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfOHcp/btrUfwdFtdZ/sIIh8TbuQnaELQkKQ9mk20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfOHcp%2FbtrUfwdFtdZ%2FsIIh8TbuQnaELQkKQ9mk20%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1021&quot; height=&quot;99&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Spring&amp;amp;Springboot/Spring(개인공부용)</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/108</guid>
      <comments>https://jadev97.tistory.com/108#entry108comment</comments>
      <pubDate>Wed, 21 Dec 2022 23:06:42 +0900</pubDate>
    </item>
    <item>
      <title>[Spring]HTTP 요청 파라미터 - @RequestParam</title>
      <link>https://jadev97.tistory.com/107</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. @RequestParam(&amp;rdquo;key&amp;rdquo;)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿼리스트링에 있는 파라미터명을 key로 받아서 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@RequestMapping(&quot;/request-param-v2&quot;)
    public String requestParamV2(
            @RequestParam(&quot;username&quot;) String memberName,
            @RequestParam(&quot;age&quot;) int memberAge){

        log.info(&quot;username={}, age={}&quot;, memberName, memberAge);

        return &quot;ok&quot;;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파라미터명과 변수명이 같다면 key 생략 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;@RequestMapping(&quot;/request-param-v3&quot;)
    public String requestParamV3(
            @RequestParam String username,
            @RequestParam int age){

        log.info(&quot;username={}, age={}&quot;, username, age);

        return &quot;ok&quot;;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. @RequestParam - required , defalutValue 속성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;null 값을 받지 못하게 required 속성을 줄 수 있다.( defalut 값은 true이다)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;@RequestMapping(&quot;/request-param-required&quot;)
    public String requestParamRequired(
            @RequestParam(required = true) String username, //쿼리스트링에서 username은 필수로 입력해야한다.
            @RequestParam(required = false) int age){
        log.info(&quot;username={}, age={}&quot;, username, age);

        return &quot;ok&quot;;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단, 빈값은 허용하게 된다.( null 과 빈값은 엄연히 다르다!! )&lt;/li&gt;
&lt;li&gt;빈값이 왔을때 defalut 값을 지정할 수 있다. 이때 쓰는 속성이 defalutValue 이다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@RequestMapping(&quot;/request-param-defalut&quot;)
    public String requestParamDefalut(
            @RequestParam(defaultValue = &quot;guest&quot;) String username, //빈값이 들어올때 기본값을 정해줌.
            @RequestParam(defaultValue = &quot;-1&quot;) int age){ // defalutValue 를 쓰면 required 속성을 안써도된다.
        log.info(&quot;username={}, age={}&quot;, username, age);

        return &quot;ok&quot;;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Map 을 이용하여 하나로 통일&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Map 을 이용하여 @RequestParam 을 1번만 쓸 수 있다&lt;/li&gt;
&lt;li&gt;단, 2개인 경우만 Map 이고 , 하나의 키값으로 여러개를 받을 경우 MultiValueMap사용가능&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Spring&amp;amp;Springboot/Spring(개인공부용)</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/107</guid>
      <comments>https://jadev97.tistory.com/107#entry107comment</comments>
      <pubDate>Thu, 15 Dec 2022 00:28:54 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] 필드와 컬럼매핑</title>
      <link>https://jadev97.tistory.com/106</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;매핑 어노테이션 종류&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;@Column : 컬럼매핑&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Temporal : 날짜 타입 매핑&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Enumerated : enum 타입 매핑&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Lob : BLOB, CLOB 매핑&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;@Column 매핑 속성&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;name : 필드와 매핑할 DB컬럼 이름&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;nullable(DDL) : &lt;span style=&quot;color: #ee2323;&quot;&gt;null값의 허용 여부&lt;/span&gt;, true가 디폴트값&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;unique(DDL) : &lt;span style=&quot;background-color: #f6e199;&quot;&gt;한 개의 컬럼에만 간단한 유니크 제약조건&lt;/span&gt;을 적용할 때&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;length(DDL) : 문자 길이 제약조건, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;String 타입에만 사용가능&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;@Enumerated 매핑 속성&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;value&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Enumerated.ORDINAL : enum 순서를 DB에 저장(0,1,2...) // &lt;u&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;이방법은 좋지 않은 방법이다&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Enumerated.STRING : &lt;span style=&quot;color: #ee2323;&quot;&gt;enum 이름을 DB에 저장&lt;/span&gt; &amp;lt;- 이 방법이 좋다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;br /&gt;@Lob&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Lob타입은 속성이 없다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;매핑하는 필드 타입에 따라 CLOB, BLOB 매핑이 자동으로 적용&lt;/span&gt;된다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CLOB : String, char[], java.sql.CLOB&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BLOB : byte[], java.sql.BLOB&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>JPA</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/106</guid>
      <comments>https://jadev97.tistory.com/106#entry106comment</comments>
      <pubDate>Thu, 15 Dec 2022 00:27:41 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] 엔티티 매핑</title>
      <link>https://jadev97.tistory.com/105</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  엔티티 매핑 종류&lt;b&gt; &lt;/b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;객체와 테이블 매핑 : @Entity, @Table&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;필드와 컬럼 매핑 : @Column&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;기본 키 매핑 : @Id&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;연관관게 매핑 : @ManyToOne, @JoinColumn &lt;/b&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;@Entity&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@Entity 어노테이션이 붙은 클래스는 &lt;span style=&quot;color: #ee2323;&quot;&gt;JPA에 의해 관리&lt;/span&gt;된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;기본생성자는 필수&lt;/span&gt;로 있어야 한다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;name 이라는 속성을 이용하여 엔티티명을 따로 정할 수 있다. 디폴트값은 클래스명이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;데이터베이스 스키마 자동생성&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DDL을 애플리케이션 실행 시점에 자동 생성한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;DB방언을 활용하여 DB에 맞는 적절한 DDL 생성한다.(옵션값을 DB에 맞게 설정 가능)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;생성된 DDL은 개발 단계에서만 사용해야 한다!&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;application.properties 파일에서 한 줄 만 추가해주면 된다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1671030669808&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;property name=&quot;hibernate.hbm2ddl.auto&quot; value=&quot;create&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;value로 들어갈 수 있는 옵션&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;create : 기존 테이블 삭제 후 다시 생성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;create-drop : created와 같으나 종료시점에 삭제(테스트케이스 사용시 좋음)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;update : 변경부분만 반영(&lt;span style=&quot;color: #ee2323;&quot;&gt;절대 운영DB에서 사용하면 안된다!!!!!&lt;/span&gt;), &lt;span style=&quot;background-color: #f6e199;&quot;&gt;지운부분은 반영안되고 추가한 부분만 반영&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;validate : 엔티티와 DB테이블이 정상 매핑되었는지 확인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;none : 사용하지 않음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;데이터베이스 스키마 자동생성 주의점!!&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;&lt;/b&gt;운영 장비에는 절대 create, create-drop, update 사용하면 안된다!!&lt;b&gt;&lt;b&gt; &lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개발초기 단계는 create 또는 update&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트 서버는 update 또는 vaildate&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스테이징과 운영 서버는 validate 또는 none&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>JPA</category>
      <author>Legday</author>
      <guid isPermaLink="true">https://jadev97.tistory.com/105</guid>
      <comments>https://jadev97.tistory.com/105#entry105comment</comments>
      <pubDate>Thu, 15 Dec 2022 00:14:30 +0900</pubDate>
    </item>
  </channel>
</rss>