<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>가지가지 하는중</title>
    <link>https://gajy.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 06:31:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>gajy</managingEditor>
    <image>
      <title>가지가지 하는중</title>
      <url>https://tistory1.daumcdn.net/tistory/4367955/attach/ad699d6277bc41398065fbfb293639e6</url>
      <link>https://gajy.tistory.com</link>
    </image>
    <item>
      <title>[프로그래머스] 올바른 괄호</title>
      <link>https://gajy.tistory.com/91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12909&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12909&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1667398661555&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;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12909&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIqxhW/hyQqTWO2UW/KKPJDfonEOjTm9PKimKy51/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/07Svu/hyQqP7XolY/STVEdKz3nYGioiK4TaHKoK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12909&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12909&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIqxhW/hyQqTWO2UW/KKPJDfonEOjTm9PKimKy51/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/07Svu/hyQqP7XolY/STVEdKz3nYGioiK4TaHKoK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[for 문 사용]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Point. 괄호 개수를 세는 것이 아니라 (는 count +1, )는 count -1 의 개념으로 접근한다. 마지막 count는 항상 0이고, count가 마이너스가 되는 순가 무조건 틀린답이다.&lt;/p&gt;
&lt;pre id=&quot;code_1667398782956&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {  
    boolean solution(String s) {
        int count = 0;
        for(int i = 0; i &amp;lt; s.length(); i++) {
            if(s.charAt(i) == '(') {
                count ++;
            }

            if(s.charAt(i) == ')') {
                count --;
            }

            if(count &amp;lt; 0) {
                return false;
            }
        }

        if(count != 0) {
            return false;
        }

        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Stack 사용]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Point. 동일하게 개수가 아닌 pop, push를 사용하되, empty를 이용한다. 마지막은 항상 empty이고, for문 도중 empty가 되는 것은 틀린답이다.&lt;/p&gt;
&lt;pre id=&quot;code_1667399177410&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Stack;

class Solution {  
    boolean solution(String s) {
        Stack&amp;lt;Integer&amp;gt; stack = new Stack&amp;lt;&amp;gt;();
        for(int i = 0; i &amp;lt; s.length(); i++) {
            if(s.charAt(i) == '(') {
                stack.push(i);
            }

            if(s.charAt(i) == ')') {
                if(stack.isEmpty()) {
                    return false;
                }else {
                    stack.pop();
                }
            }
        }

        if(!stack.isEmpty()) {
            return false;
        }

        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코딩테스트</category>
      <category>올바른괄호</category>
      <category>코딩테스트</category>
      <category>프로그래머스</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/91</guid>
      <comments>https://gajy.tistory.com/91#entry91comment</comments>
      <pubDate>Wed, 2 Nov 2022 23:27:39 +0900</pubDate>
    </item>
    <item>
      <title>Function Package는 왜 많은 인터페이스를 가지고 있을까?</title>
      <link>https://gajy.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Function Package에는 비슷한 인터페이스가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, Function&amp;lt;T,R&amp;gt;도 있지만, ToDoubleFunction&amp;lt;T&amp;gt;, ToIntFunction&amp;lt;T&amp;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;i&gt;&lt;b&gt;이유는, Function&amp;lt;T,R&amp;gt;로 처리 할 때에 T, R이 박스 형태(Integer와 같이)이기 때문에 메모리를 많이 차지한다.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 원시타입을 사용하여 메모리를 아낄 수 있도록 추가 인터페이스들이 만들어졌다.&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>function</category>
      <category>Interface</category>
      <category>Java</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/90</guid>
      <comments>https://gajy.tistory.com/90#entry90comment</comments>
      <pubDate>Mon, 31 Oct 2022 22:38:57 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 기존 프로젝트 연결하기</title>
      <link>https://gajy.tistory.com/89</link>
      <description>&lt;pre id=&quot;code_1666712792668&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git init //git 초기화
$ git remote add origin MY_URL.git //repo 연결
$ git remote -v //repo 연결 확인
$ git pull origin master //pull 받기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>환경</category>
      <category>Git</category>
      <category>INIT</category>
      <category>Pull</category>
      <category>Remote</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/89</guid>
      <comments>https://gajy.tistory.com/89#entry89comment</comments>
      <pubDate>Wed, 26 Oct 2022 00:46:45 +0900</pubDate>
    </item>
    <item>
      <title>CreationTimestamp, UpdateTimestamp vs CreatedDate, LastModifiedBy</title>
      <link>https://gajy.tistory.com/88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CreationTimestamp, UpdateTimestamp vs CreatedDate, LastModifiedBy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Entity에서 시간을 나타낼 때 자주 사용하는 어노테이션이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;두 그룹간 무슨 차이가 있고, 무엇을 써야할까?&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&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;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 43.2558%;&quot;&gt;CreationTimestamp, UpdateTimestamp&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%;&quot;&gt;CreatedDate, LastModifiedBy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 43.2558%;&quot;&gt;- Hibernate 어노테이션&lt;br /&gt;&lt;b&gt;- ZoneDateTime 지원&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%;&quot;&gt;- Spring어노테이션&lt;br /&gt;- Spring Auditing&lt;br /&gt;- @EnableJpaAuditing, @EntityListeners 어노테이션과 함께 사용됨&lt;br /&gt;&lt;b&gt;- ZoneDateTime 미지원&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 어떤것을 사용하던 큰 차이가 없지만, 개인적으로 ZoneDateTime을 지원하는 CreationTimestamp, UpdateTimestamp를 더 자주 사용하는 편이다.&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 data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/66149224/whats-the-difference-between-creationtimestamp-and-createddate-in-spring-boot&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/66149224/whats-the-difference-between-creationtimestamp-and-createddate-in-spring-boot&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://logical-code.tistory.com/173&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://logical-code.tistory.com/173&lt;/a&gt;&lt;/p&gt;</description>
      <category>Spring</category>
      <category>createdDate</category>
      <category>CreationTimestamp</category>
      <category>LastModifiedBy</category>
      <category>UpdateTimestamp</category>
      <category>ZoneDateTime</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/88</guid>
      <comments>https://gajy.tistory.com/88#entry88comment</comments>
      <pubDate>Wed, 26 Oct 2022 00:43:04 +0900</pubDate>
    </item>
    <item>
      <title>[주문, 선물 서비스] 프로젝트 결과 테스트</title>
      <link>https://gajy.tistory.com/87</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;여러 예외 케이스들이 있겠으나, 일단 성공 케이스를 중심으로 기록하였다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파트너&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 파트너 등록&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;POST http://localhost:8000/api/v1/partners
Content-Type: application/json

{
  &quot;partnerName&quot;: &quot;정가지&quot;,
  &quot;businessNo&quot;: &quot;1234123456&quot;,
  &quot;email&quot;: &quot;gajy@gmail.com&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: {
        &quot;partnerToken&quot;: &quot;pnt_PyGlEFPaBdiWDbMBPxGR&quot;,
        &quot;partnerName&quot;: &quot;정가지&quot;,
        &quot;businessNo&quot;: &quot;1234123456&quot;,
        &quot;email&quot;: &quot;gajy@gmail.com&quot;,
        &quot;status&quot;: &quot;ENABLE&quot;
    },
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;아이템&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 아이템 등록&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;POST http://localhost:8000/api/v1/items
Content-Type: application/json

{
  &quot;partnerToken&quot;: &quot;pnt_PoHkBfNBJdydYiq7wobN&quot;,
  &quot;itemName&quot;: &quot;원피스&quot;,
  &quot;itemPrice&quot;: 50000,
  &quot;itemOptionGroupList&quot;: [
    {
      &quot;ordering&quot;: &quot;1&quot;,
      &quot;itemOptionGroupName&quot;: &quot;사이즈&quot;,
      &quot;itemOptionList&quot;: [
        {
          &quot;ordering&quot;: 1,
          &quot;itemOptionName&quot;: &quot;SMALL&quot;,
          &quot;itemOptionPrice&quot;: 0
        },
        {
          &quot;ordering&quot;: 2,
          &quot;itemOptionName&quot;: &quot;MEDIUM&quot;,
          &quot;itemOptionPrice&quot;: 0
        },
        {
          &quot;ordering&quot;: 3,
          &quot;itemOptionName&quot;: &quot;LARGE&quot;,
          &quot;itemOptionPrice&quot;: 0
        }
      ]

    },
    {
      &quot;ordering&quot;: &quot;2&quot;,
      &quot;itemOptionGroupName&quot;: &quot;컬러&quot;,
      &quot;itemOptionList&quot;: [
        {
          &quot;ordering&quot;: 1,
          &quot;itemOptionName&quot;: &quot;RED&quot;,
          &quot;itemOptionPrice&quot;: 0
        },
        {
          &quot;ordering&quot;: 2,
          &quot;itemOptionName&quot;: &quot;BLUE&quot;,
          &quot;itemOptionPrice&quot;: 0
        }
      ]
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: {
        &quot;itemToken&quot;: &quot;item_yuAzfZSNySTHIZRwRYxe&quot;
    },
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 아이템 활성화&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;POST http://localhost:8000/api/v1/items/change-on-sales
Content-Type: application/json

{
  &quot;itemToken&quot;: &quot;item_yuAzfZSNySTHIZRwRYxe&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: {
        &quot;itemToken&quot;: &quot;item_VxQylTtlXEPvewrUhkpr&quot;
    },
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 아이템 조회&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;GET http://localhost:8000/api/v1/items/item_yuAzfZSNySTHIZRwRYxe
Content-Type: application/json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: {
        &quot;itemToken&quot;: &quot;item_yuAzfZSNySTHIZRwRYxe&quot;,
        &quot;partnerId&quot;: 6,
        &quot;itemName&quot;: &quot;원피스&quot;,
        &quot;itemPrice&quot;: 50000,
        &quot;status&quot;: &quot;PREPARE&quot;,
        &quot;itemOptionGroupList&quot;: [
            {
                &quot;ordering&quot;: 1,
                &quot;itemOptionGroupName&quot;: &quot;사이즈&quot;,
                &quot;itemOptionList&quot;: [
                    {
                        &quot;ordering&quot;: 1,
                        &quot;itemOptionName&quot;: &quot;SMALL&quot;,
                        &quot;itemOptionPrice&quot;: 0
                    },
                    {
                        &quot;ordering&quot;: 2,
                        &quot;itemOptionName&quot;: &quot;MEDIUM&quot;,
                        &quot;itemOptionPrice&quot;: 0
                    },
                    {
                        &quot;ordering&quot;: 3,
                        &quot;itemOptionName&quot;: &quot;LARGE&quot;,
                        &quot;itemOptionPrice&quot;: 0
                    }
                ]
            },
            {
                &quot;ordering&quot;: 2,
                &quot;itemOptionGroupName&quot;: &quot;컬러&quot;,
                &quot;itemOptionList&quot;: [
                    {
                        &quot;ordering&quot;: 1,
                        &quot;itemOptionName&quot;: &quot;RED&quot;,
                        &quot;itemOptionPrice&quot;: 0
                    },
                    {
                        &quot;ordering&quot;: 2,
                        &quot;itemOptionName&quot;: &quot;BLUE&quot;,
                        &quot;itemOptionPrice&quot;: 0
                    }
                ]
            }
        ]
    },
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;주문&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 주문&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;POST http://localhost:8000/api/v1/orders/init
Content-Type: application/json

{
  &quot;userId&quot;: &quot;7&quot;,
  &quot;payMethod&quot;: &quot;CARD&quot;,
  &quot;receiverName&quot;: &quot;정선주&quot;,
  &quot;receiverPhone&quot;: &quot;01000001234&quot;,
  &quot;receiverZipcode&quot;: &quot;12345&quot;,
  &quot;receiverAddress1&quot;: &quot;서울시 송파구&quot;,
  &quot;receiverAddress2&quot;: &quot;우리집&quot;,
  &quot;etcMessage&quot;: &quot;감사합니다&quot;,
  &quot;orderItemList&quot;: [
    {
      &quot;orderCount&quot;: 2,
      &quot;itemToken&quot;: &quot;item_yuAzfZSNySTHIZRwRYxe&quot;,
      &quot;itemName&quot;: &quot;원피스&quot;,
      &quot;itemPrice&quot;: &quot;50000&quot;,
      &quot;orderItemOptionGroupList&quot;: [
        {
          &quot;ordering&quot;: 1,
          &quot;itemOptionGroupName&quot;: &quot;사이즈&quot;,
          &quot;orderItemOptionList&quot;: [
            {
              &quot;ordering&quot;: 1,
              &quot;itemOptionName&quot;: &quot;MEDIUM&quot;,
              &quot;itemOptionPrice&quot;: 0
            }
          ]
        },
        {
          &quot;ordering&quot;: 2,
          &quot;itemOptionGroupName&quot;: &quot;컬러&quot;,
          &quot;orderItemOptionList&quot;: [
            {
              &quot;ordering&quot;: 1,
              &quot;itemOptionName&quot;: &quot;RED&quot;,
              &quot;itemOptionPrice&quot;: 0
            }
          ]
        }
      ]
    },
    {
      &quot;orderCount&quot;: 1,
      &quot;itemToken&quot;: &quot;item_VxQylTtlXEPvewrUhkpr&quot;,
      &quot;itemName&quot;: &quot;목걸이&quot;,
      &quot;itemPrice&quot;: &quot;70000&quot;,
      &quot;orderItemOptionGroupList&quot;: [
        {
          &quot;ordering&quot;: 1,
          &quot;itemOptionGroupName&quot;: &quot;종류&quot;,
          &quot;orderItemOptionList&quot;: [
            {
              &quot;ordering&quot;: 1,
              &quot;itemOptionName&quot;: &quot;GOLD&quot;,
              &quot;itemOptionPrice&quot;: 10000
            }
          ]
        }
      ]
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: {
        &quot;orderToken&quot;: &quot;ord_TIYDORKJyKEefNBnFoGf&quot;
    },
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 결제&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;POST http://localhost:8000/api/v1/orders/payment-order
Content-Type: application/json

{
  &quot;orderToken&quot;: &quot;ord_TIYDORKJyKEefNBnFoGf&quot;,
  &quot;payMethod&quot;: &quot;CARD&quot;,
  &quot;amount&quot;: &quot;180000&quot;,
  &quot;orderDescription&quot;: &quot;주문테스트&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: &quot;OK&quot;,
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. 주문 조회&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;GET http://localhost:8000/api/v1/orders/ord_TIYDORKJyKEefNBnFoGf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: {
        &quot;orderToken&quot;: &quot;ord_TIYDORKJyKEefNBnFoGf&quot;,
        &quot;userId&quot;: 7,
        &quot;payMethod&quot;: &quot;CARD&quot;,
        &quot;totalAmount&quot;: 180000,
        &quot;deliveryInfo&quot;: {
            &quot;receiverName&quot;: &quot;정선주&quot;,
            &quot;receiverPhone&quot;: &quot;01000001234&quot;,
            &quot;receiverZipcode&quot;: &quot;12345&quot;,
            &quot;receiverAddress1&quot;: &quot;서울시 송파구&quot;,
            &quot;receiverAddress2&quot;: &quot;우리집&quot;,
            &quot;etcMessage&quot;: &quot;감사합니다&quot;
        },
        &quot;orderedAt&quot;: &quot;2022-10-25 23:46:51&quot;,
        &quot;status&quot;: &quot;ORDER_COMPLETE&quot;,
        &quot;statusDescription&quot;: &quot;주문완료&quot;,
        &quot;orderItemList&quot;: [
            {
                &quot;orderCount&quot;: 2,
                &quot;partnerId&quot;: 6,
                &quot;itemId&quot;: 3,
                &quot;itemName&quot;: &quot;원피스&quot;,
                &quot;totalAmount&quot;: 100000,
                &quot;itemPrice&quot;: 50000,
                &quot;deliveryStatus&quot;: &quot;BEFORE_DELIVERY&quot;,
                &quot;deliveryStatusDescription&quot;: &quot;배송전&quot;,
                &quot;orderItemOptionGroupList&quot;: [
                    {
                        &quot;ordering&quot;: 1,
                        &quot;itemOptionGroupName&quot;: &quot;사이즈&quot;,
                        &quot;orderItemOptionList&quot;: [
                            {
                                &quot;ordering&quot;: 1,
                                &quot;itemOptionName&quot;: &quot;MEDIUM&quot;,
                                &quot;itemOptionPrice&quot;: 0
                            }
                        ]
                    },
                    {
                        &quot;ordering&quot;: 2,
                        &quot;itemOptionGroupName&quot;: &quot;컬러&quot;,
                        &quot;orderItemOptionList&quot;: [
                            {
                                &quot;ordering&quot;: 1,
                                &quot;itemOptionName&quot;: &quot;RED&quot;,
                                &quot;itemOptionPrice&quot;: 0
                            }
                        ]
                    }
                ]
            },
            {
                &quot;orderCount&quot;: 1,
                &quot;partnerId&quot;: 6,
                &quot;itemId&quot;: 4,
                &quot;itemName&quot;: &quot;목걸이&quot;,
                &quot;totalAmount&quot;: 80000,
                &quot;itemPrice&quot;: 70000,
                &quot;deliveryStatus&quot;: &quot;BEFORE_DELIVERY&quot;,
                &quot;deliveryStatusDescription&quot;: &quot;배송전&quot;,
                &quot;orderItemOptionGroupList&quot;: [
                    {
                        &quot;ordering&quot;: 1,
                        &quot;itemOptionGroupName&quot;: &quot;종류&quot;,
                        &quot;orderItemOptionList&quot;: [
                            {
                                &quot;ordering&quot;: 1,
                                &quot;itemOptionName&quot;: &quot;GOLD&quot;,
                                &quot;itemOptionPrice&quot;: 10000
                            }
                        ]
                    }
                ]
            }
        ]
    },
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;선물하기&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. 선물하기&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;POST http://localhost:18080/api/v1/gifts/register
Content-Type: application/json

{
  &quot;buyerUserId&quot;: &quot;6&quot;,
  &quot;payMethod&quot;: &quot;CARD&quot;,
  &quot;pushType&quot;: &quot;KAKAO&quot;,
  &quot;giftReceiverName&quot;: &quot;정가지&quot;,
  &quot;giftReceiverPhone&quot;: &quot;01000001111&quot;,
  &quot;giftMessage&quot;: &quot;축하한다 가지야~&quot;,
  &quot;orderItemList&quot;: [
    {
      &quot;orderCount&quot;: 2,
      &quot;itemToken&quot;: &quot;item_yuAzfZSNySTHIZRwRYxe&quot;,
      &quot;itemName&quot;: &quot;원피스&quot;,
      &quot;itemPrice&quot;: &quot;50000&quot;,
      &quot;orderItemOptionGroupList&quot;: [
        {
          &quot;ordering&quot;: 1,
          &quot;itemOptionGroupName&quot;: &quot;사이즈&quot;,
          &quot;orderItemOptionList&quot;: [
            {
              &quot;ordering&quot;: 1,
              &quot;itemOptionName&quot;: &quot;MEDIUM&quot;,
              &quot;itemOptionPrice&quot;: 0
            }
          ]
        },
        {
          &quot;ordering&quot;: 2,
          &quot;itemOptionGroupName&quot;: &quot;컬러&quot;,
          &quot;orderItemOptionList&quot;: [
            {
              &quot;ordering&quot;: 1,
              &quot;itemOptionName&quot;: &quot;RED&quot;,
              &quot;itemOptionPrice&quot;: 0
            }
          ]
        }
      ]
    },
    {
      &quot;orderCount&quot;: 1,
      &quot;itemToken&quot;: &quot;item_VxQylTtlXEPvewrUhkpr&quot;,
      &quot;itemName&quot;: &quot;목걸이&quot;,
      &quot;itemPrice&quot;: &quot;70000&quot;,
      &quot;orderItemOptionGroupList&quot;: [
        {
          &quot;ordering&quot;: 1,
          &quot;itemOptionGroupName&quot;: &quot;종류&quot;,
          &quot;orderItemOptionList&quot;: [
            {
              &quot;ordering&quot;: 1,
              &quot;itemOptionName&quot;: &quot;GOLD&quot;,
              &quot;itemOptionPrice&quot;: 10000
            }
          ]
        }
      ]
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: {
        &quot;orderToken&quot;: &quot;ord_BTnBgipngJkwlOAgMKvz&quot;,
        &quot;giftToken&quot;: &quot;gt_OzJZCQheAJYVxXQWkriB&quot;
    },
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9. 선물하기 상품 결제중으로 변경&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;POST http://localhost:18080/api/v1/gifts/gt_OzJZCQheAJYVxXQWkriB/payment-processing
Content-Type: application/json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: &quot;OK&quot;,
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;10. 선물하기 상품 결제 처리&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;orderToken&quot;: &quot;ord_BTnBgipngJkwlOAgMKvz&quot;,
  &quot;payMethod&quot;: &quot;CARD&quot;,
  &quot;amount&quot;: &quot;180000&quot;,
  &quot;orderDescription&quot;: &quot;선물하기 주문&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: &quot;OK&quot;,
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kafka Message&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{&quot;orderToken&quot;:&quot;ord_BTnBgipngJkwlOAgMKvz&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제 결과 데이터 확인 (STATUS = ORDER_COMPLETE)&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9U82h/btrPyMkKrw3/kr0joJfBEL5iS734yRrfak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9U82h/btrPyMkKrw3/kr0joJfBEL5iS734yRrfak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9U82h/btrPyMkKrw3/kr0joJfBEL5iS734yRrfak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9U82h%2FbtrPyMkKrw3%2Fkr0joJfBEL5iS734yRrfak%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;692&quot; height=&quot;64&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;11. 선물하기 수락&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;POST http://localhost:18080/api/v1/gifts/gt_OzJZCQheAJYVxXQWkriB/accept-gift
Content-Type: application/json

{
  &quot;receiverName&quot;: &quot;정가지&quot;,
  &quot;receiverPhone&quot;: &quot;01000001111&quot;,
  &quot;receiverZipcode&quot;: &quot;123123&quot;,
  &quot;receiverAddress1&quot;: &quot;서울시 송파구&quot;,
  &quot;receiverAddress2&quot;: &quot;가지의 집&quot;,
  &quot;etcMessage&quot;: &quot;감사합니다!&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: &quot;OK&quot;,
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;12. 선물하기 조회&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;GET http://localhost:18080/api/v1/gifts/gt_OzJZCQheAJYVxXQWkriB
Content-Type: application/json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;result&quot;: &quot;SUCCESS&quot;,
    &quot;data&quot;: {
        &quot;orderToken&quot;: &quot;ord_BTnBgipngJkwlOAgMKvz&quot;,
        &quot;giftToken&quot;: &quot;gt_OzJZCQheAJYVxXQWkriB&quot;,
        &quot;pushType&quot;: &quot;KAKAO&quot;,
        &quot;giftReceiverName&quot;: &quot;정가지&quot;,
        &quot;giftReceiverPhone&quot;: &quot;01000001111&quot;,
        &quot;giftMessage&quot;: &quot;축하한다 가지야~&quot;
    },
    &quot;message&quot;: null,
    &quot;errorCode&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&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;a href=&quot;https://fastcampus.co.kr/dev_red_lhc&quot;&gt;https://fastcampus.co.kr/dev_red_lhc&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666707459686&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;The RED : 비즈니스 성공을 위한 Java/Spring 기반 서비스 개발과 MSA 구축 by 이희창 | 패스트캠퍼스&quot; data-og-description=&quot;쿠팡, 토스를 거친 29CM의 개발 디렉터 이희창이 주문하기, 선물하기 기능 개발 경험을 토대로 MSA 구축 실무 프로젝트를 위주로 구성한 강의 입니다. 잘 짜여진 코드와 MSA 전환에 필요한 이론 뿐&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://fastcampus.co.kr/dev_red_lhc&quot; data-og-url=&quot;https://fastcampus.co.kr/dev_red_lhc&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbk4VD/hyQlAh5D78/8i5q4m1j5Zrnz2HWeWabNk/img.png?width=600&amp;amp;height=315&amp;amp;face=442_36_508_108,https://scrap.kakaocdn.net/dn/c2ARdI/hyQlxyUylI/kd8gT7fAlazXkeHKBVzcwk/img.jpg?width=1440&amp;amp;height=1751&amp;amp;face=766_358_1124_749,https://scrap.kakaocdn.net/dn/blKKPQ/hyQlBuwXDk/w53I0fHSby1iwgzFcKmZ01/img.png?width=1920&amp;amp;height=700&amp;amp;face=0_0_1920_700&quot;&gt;&lt;a href=&quot;https://fastcampus.co.kr/dev_red_lhc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fastcampus.co.kr/dev_red_lhc&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbk4VD/hyQlAh5D78/8i5q4m1j5Zrnz2HWeWabNk/img.png?width=600&amp;amp;height=315&amp;amp;face=442_36_508_108,https://scrap.kakaocdn.net/dn/c2ARdI/hyQlxyUylI/kd8gT7fAlazXkeHKBVzcwk/img.jpg?width=1440&amp;amp;height=1751&amp;amp;face=766_358_1124_749,https://scrap.kakaocdn.net/dn/blKKPQ/hyQlBuwXDk/w53I0fHSby1iwgzFcKmZ01/img.png?width=1920&amp;amp;height=700&amp;amp;face=0_0_1920_700');&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;The RED : 비즈니스 성공을 위한 Java/Spring 기반 서비스 개발과 MSA 구축 by 이희창 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;쿠팡, 토스를 거친 29CM의 개발 디렉터 이희창이 주문하기, 선물하기 기능 개발 경험을 토대로 MSA 구축 실무 프로젝트를 위주로 구성한 강의 입니다. 잘 짜여진 코드와 MSA 전환에 필요한 이론 뿐&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>Project</category>
      <category>fastcampus</category>
      <category>MSA</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/87</guid>
      <comments>https://gajy.tistory.com/87#entry87comment</comments>
      <pubDate>Wed, 26 Oct 2022 00:12:22 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Servlet 생명주기 및 동작과정</title>
      <link>https://gajy.tistory.com/85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;&lt;b&gt;1. Servlet 메서드&lt;/b&gt; : jvax.servlet.Servlet인터페이스에 정의된 메서드는 init(), service(), destroy(),getServletInfo(), getServletConfig()가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;SE-5ecad733-1930-4407-afe2-dfe208ea43a2&quot; data-compid=&quot;SE-5ecad733-1930-4407-afe2-dfe208ea43a2&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-5ecad733-1930-4407-afe2-dfe208ea43a2&quot; data-direction=&quot;top&quot;&gt;
&lt;div id=&quot;SE-598ec7c2-3a6d-40c7-b775-e7d2a5d499dd&quot;&gt;
&lt;p id=&quot;SE-a2f493b9-27fb-470e-b3ab-2b7bab4e80cf&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이중 생명주기와 관련된 메서드는 init(), service(), destroy()이다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;SE-376599ce-9c75-454b-8d7d-fc50419e5db4&quot;&gt;init() : 서블릿 컨테이너가 서블릿을 생성한 후 초기화 작업을 수행하기위해 호출. 서블릿이 클아이언트의 요청을 처리하기 전에 준비할 작업이 있다면 이 메서드에 작성한다. (예) 디비연결, 외부 스토리지 서버와 연결 등...&lt;/li&gt;
&lt;li id=&quot;SE-a8dc2f07-2e72-4f1d-8bce-878cb48d3c06&quot;&gt;service() : 클라이언트가 요청할 때 마다 호출되는 메서드. 서블릿이 해야할 일을 작성하면 된다.&lt;/li&gt;
&lt;li id=&quot;SE-b68bbc7e-23b5-4210-a563-3d5f749c426a&quot;&gt;destroy() : 서블릿 컨테이너가 종료되거나 웹 애플리케이션이 멈출 때 호출. 서비스 수행을 위해 확보했던 자원을 해제한다거나 데이터를 저장하는 등의 마무리 작업을 하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p id=&quot;SE-42a89311-7e78-47a7-a6d0-0d45106a923f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 동작 과정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-58aab34f-466a-45f0-bf29-7ee07a9b8055&quot; data-compid=&quot;SE-58aab34f-466a-45f0-bf29-7ee07a9b8055&quot; data-a11y-title=&quot;사진&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-58aab34f-466a-45f0-bf29-7ee07a9b8055&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-58aab34f-466a-45f0-bf29-7ee07a9b8055&quot;&gt;
&lt;div data-unitid=&quot;SE-58aab34f-466a-45f0-bf29-7ee07a9b8055&quot; data-compid=&quot;&quot; data-direction=&quot;top&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVfIzz/btrPuOWwD23/p5os0y8GVuaVLctmHs2uP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVfIzz/btrPuOWwD23/p5os0y8GVuaVLctmHs2uP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVfIzz/btrPuOWwD23/p5os0y8GVuaVLctmHs2uP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVfIzz%2FbtrPuOWwD23%2Fp5os0y8GVuaVLctmHs2uP1%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;519&quot; height=&quot;271&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-086c8fb4-947d-4ab2-93df-4d3110261623&quot; data-compid=&quot;SE-086c8fb4-947d-4ab2-93df-4d3110261623&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-086c8fb4-947d-4ab2-93df-4d3110261623&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-584b1216-d5b8-4e6c-b053-fd16d0b63200&quot;&gt;
&lt;p id=&quot;SE-8a218016-ae06-4ffc-bca3-a31c548647b9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;①&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트가 웹 브라우저에 URL을 입력하면 해당하는 HTTP Request를 해당하는 서버의 Servlet Container에 보낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-50f1b3af-b187-4c84-8630-01d4435828b5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;②&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-77614703-a26b-4639-8c47-ee3834ff70d8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;③&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클라이언트가 요청한 URL을 DD(배포서술자, Deplyment Descriptor)를 참조해서 분석하여 어느 서블릿에 대한 요청인지 찾는다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5b3e6047-def8-4687-84bf-492ef5c5c3a6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;④&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Servlet Container는 service() 메소드를 호출하며, POST, GET여부에 따라 doGet() 또는 doPost()가 호출된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-56e78734-ed64-4fdb-9e80-d1f7abe45682&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⑤&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;doGet() 또는 doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e44918c5-6869-4cc6-84ee-3064799ae68f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⑥&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f3fb22ae-33b5-4390-a42e-065f1e266b22&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p id=&quot;SE-316debee-8ccf-41b4-ab0c-320237dcf7a8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DD(Deployment Descriptor : 배포 서술자)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ba7dfb20-49c1-44db-81f7-eef00c271102&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 컨테이너에게 사용자가 지금 접근한 URL 주소가 서블릿 요청임을 인식하고 그 서블릿 클래스의 위치는 어디에 있다고&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4c501cea-de05-41d2-a8ea-3ca907b3c6f9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;알려주기 위해 필요한 정보들이 적혀 있는 파일이다. 주로 프로젝트의 WebContent/WEB-INF/web.xml 파일에 작성된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2cb0bf57-0fd5-492c-8567-824cb200ddc2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-33780981-903f-42ea-a2cc-2a3b36d23c05&quot; data-compid=&quot;SE-33780981-903f-42ea-a2cc-2a3b36d23c05&quot; data-a11y-title=&quot;코드&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-33780981-903f-42ea-a2cc-2a3b36d23c05&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;  &amp;lt;servlet&amp;gt; 
  	&amp;lt;servlet-name&amp;gt;PaymentFrontController&amp;lt;/servlet-name&amp;gt;  &amp;lt;!-- 서블릿 별명  --&amp;gt;
  	&amp;lt;servlet-class&amp;gt;web.payment.action.PaymentFrontController&amp;lt;/servlet-class&amp;gt; &amp;lt;!-- 패키지를 포함한 서블릿 클래스명  --&amp;gt;
  &amp;lt;/servlet&amp;gt; 
  &amp;lt;servlet-mapping&amp;gt; 
  	&amp;lt;servlet-name&amp;gt;PaymentFrontController&amp;lt;/servlet-name&amp;gt; &amp;lt;!-- servlet에서 정의한 서블릿 별명  --&amp;gt;
  	&amp;lt;url-pattern&amp;gt;*.pa&amp;lt;/url-pattern&amp;gt; &amp;lt;!-- 서블릿을 요청할 때 클라이언트가 사용할 URL --&amp;gt;
  &amp;lt;/servlet-mapping&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-676b2f14-9ddd-4580-a3fb-d5cd0fd2d86a&quot; data-compid=&quot;SE-676b2f14-9ddd-4580-a3fb-d5cd0fd2d86a&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-676b2f14-9ddd-4580-a3fb-d5cd0fd2d86a&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-22236ebf-e5dd-4ebd-ac0a-a49b6cf65561&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p id=&quot;SE-97293c2f-61dd-4780-b274-68dbf6b4a789&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 생명주기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-060097d7-fbce-4092-abf0-081c346af371&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;① 클라이언트 요청이 들어오면 서블릿 컨테이너는 서블릿을 찾는다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-89868c87-6ed8-412f-9e25-830ea57ad191&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;②서블릿이 없다면 서블릿 클래스를 로딩하고 인스턴스를 준비한 후 생성자를 호출한다. 그리고 서블릿 초기화 메서드인 init()호출.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-41982127-45cb-4cf4-9852-fa20a58f6cdf&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;③클라이언트 요청을 처리하는 service()메서드 호출. GET, POST여부에 따라 실행된다. 여러 클아이언트가 동시에 요청을 하더라도 쓰레드가 생성되므로 동시에 service가 실행되기 때문에 수행 속도가 빠르다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b512fbc9-96a2-446f-a81f-eb95cceb98fd&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;④service()메서드의 결과를 HTTP 프로토콜에 맞추어 클라이언트에 응답하는 것으로 요청처리 끝!&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-053041e4-60c4-4336-bc3d-68461c16ed26&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⑤시스템 운영자가 컨테이너를 종료하려고 함.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-90f154a2-bc20-4aa7-9ea4-982e641ecfec&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⑥생성된 모든 서블릿에 대해 destroy()메서드 호출&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2ab312b0-12ec-427f-b519-31794fd33e90&quot; data-compid=&quot;SE-2ab312b0-12ec-427f-b519-31794fd33e90&quot; data-a11y-title=&quot;사진&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-2ab312b0-12ec-427f-b519-31794fd33e90&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-2ab312b0-12ec-427f-b519-31794fd33e90&quot;&gt;
&lt;div data-unitid=&quot;SE-2ab312b0-12ec-427f-b519-31794fd33e90&quot; data-compid=&quot;&quot; data-direction=&quot;top&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z3avT/btrPvjIOACz/p4wKB9QnA9UOvrXRIkYaC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z3avT/btrPvjIOACz/p4wKB9QnA9UOvrXRIkYaC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z3avT/btrPvjIOACz/p4wKB9QnA9UOvrXRIkYaC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ3avT%2FbtrPvjIOACz%2Fp4wKB9QnA9UOvrXRIkYaC0%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;520&quot; height=&quot;459&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-05f8967d-4e66-4f97-ad43-9d3778c1e989&quot; data-compid=&quot;SE-05f8967d-4e66-4f97-ad43-9d3778c1e989&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-05f8967d-4e66-4f97-ad43-9d3778c1e989&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-cc0deebc-9c70-452a-916e-8e1dd588fca5&quot;&gt;
&lt;p id=&quot;SE-2709ea7a-2b99-499f-ae47-f6fd74df34f2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;**서블릿 인스턴스는 하나만 생성되어 웹 애플리케이션이 종료될 때 까지 사용된다. 따라서 인스턴스 변수에 특정 사용자를 위한 데이터를 보관하거나 클라이언트가 보낸 데이터를 일시적으로 보관하기 위해 서블릿의 인스턴스 변수를 사용하면 안된다. (Singleton Pattern)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-13b63cd7-e490-40a4-8a0d-ed10eefaed33&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-38a74304-4b5f-4b10-891d-825a13ce7866&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-17f6a442-e0ce-4cdb-9a7a-6f8cab27b70b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #434a54;&quot;&gt;출처:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-href=&quot;http://hackersstudy.tistory.com/72&quot;&gt;&lt;a href=&quot;http://hackersstudy.tistory.com/72&quot;&gt;http://hackersstudy.tistory.com/72&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #434a54;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[공대인들이 직접쓰는 컴퓨터공부방]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/원리</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/85</guid>
      <comments>https://gajy.tistory.com/85#entry85comment</comments>
      <pubDate>Mon, 24 Oct 2022 23:47:20 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] web.xml, servlet-context.xml, context-*.xml</title>
      <link>https://gajy.tistory.com/84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-e71f40f2-21dc-4b1e-b89d-2479094aac94&quot; data-compid=&quot;SE-e71f40f2-21dc-4b1e-b89d-2479094aac94&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-e71f40f2-21dc-4b1e-b89d-2479094aac94&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-a44848c3-e1b5-4d96-af79-97d2edefd235&quot;&gt;
&lt;p id=&quot;SE-8347efc6-b08c-45be-bb66-4bbfb1ac004c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. web.xml&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 설정을 위한 설정파일이다. 배포 기술자로써 영어로는 DD(Deployment Descriptor) 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7d3574ec-7be1-4484-ab3b-7fc88ba5abe2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 파일은 WAS(Web Application Server)가 최초 구동될 때 즉 톰켓이 최초 구동될 때 web.xml을 읽고 그에 해당하는 설정을 구성한다. 즉 각종 설정을 위한 설정파일이라고 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d6178c5f-bdd5-4e90-b715-bea7e6835d71&quot; data-compid=&quot;SE-d6178c5f-bdd5-4e90-b715-bea7e6835d71&quot; data-a11y-title=&quot;코드&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-d6178c5f-bdd5-4e90-b715-bea7e6835d71&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;web-app xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
    xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;
    version=&quot;2.5&quot;&amp;gt;
	&amp;lt;distributable/&amp;gt;

    &amp;lt;filter&amp;gt;
        &amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt;
        &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;
        &amp;lt;init-param&amp;gt;
            &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;
            &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;
        &amp;lt;/init-param&amp;gt;
    &amp;lt;/filter&amp;gt;
    &amp;lt;filter-mapping&amp;gt;
        &amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;*.do&amp;lt;/url-pattern&amp;gt;
        &amp;lt;url-pattern&amp;gt;*.json&amp;lt;/url-pattern&amp;gt;
        &amp;lt;url-pattern&amp;gt;/cgi-bin/cert-seal4&amp;lt;/url-pattern&amp;gt;
    &amp;lt;/filter-mapping&amp;gt;

    &amp;lt;!-- spring context loading --&amp;gt;
    &amp;lt;context-param&amp;gt;
        &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;classpath*:spring/context/context-*.xml&amp;lt;/param-value&amp;gt;
    &amp;lt;/context-param&amp;gt;
    &amp;lt;listener&amp;gt;
        &amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;
    &amp;lt;/listener&amp;gt;

    &amp;lt;!-- servlet context loading --&amp;gt;
    &amp;lt;servlet&amp;gt;
        &amp;lt;servlet-name&amp;gt;dispatcher&amp;lt;/servlet-name&amp;gt;
        &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;
        &amp;lt;init-param&amp;gt;
            &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
            &amp;lt;param-value&amp;gt;classpath:spring/servlet/servlet-context.xml&amp;lt;/param-value&amp;gt;
        &amp;lt;/init-param&amp;gt;
        &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;
    &amp;lt;/servlet&amp;gt;
    &amp;lt;servlet-mapping&amp;gt;
        &amp;lt;servlet-name&amp;gt;dispatcher&amp;lt;/servlet-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;*.do&amp;lt;/url-pattern&amp;gt;
        &amp;lt;url-pattern&amp;gt;*.json&amp;lt;/url-pattern&amp;gt;
        &amp;lt;url-pattern&amp;gt;/cgi-bin/cert-seal4&amp;lt;/url-pattern&amp;gt;
    &amp;lt;/servlet-mapping&amp;gt;

    &amp;lt;session-config&amp;gt;
        &amp;lt;session-timeout&amp;gt;360&amp;lt;/session-timeout&amp;gt;
    &amp;lt;/session-config&amp;gt;

    &amp;lt;welcome-file-list&amp;gt;
        &amp;lt;welcome-file&amp;gt;/index.jsp&amp;lt;/welcome-file&amp;gt;
    &amp;lt;/welcome-file-list&amp;gt;

   &amp;lt;error-page&amp;gt;
        &amp;lt;exception-type&amp;gt;java.lang.Throwable&amp;lt;/exception-type&amp;gt;
        &amp;lt;location&amp;gt;/error.sg&amp;lt;/location&amp;gt;
    &amp;lt;/error-page&amp;gt;

    &amp;lt;security-constraint&amp;gt;
        &amp;lt;web-resource-collection&amp;gt;
            &amp;lt;web-resource-name&amp;gt;NoAccess&amp;lt;/web-resource-name&amp;gt;
            &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
              &amp;lt;http-method&amp;gt;HEAD&amp;lt;/http-method&amp;gt;
              &amp;lt;http-method&amp;gt;PUT&amp;lt;/http-method&amp;gt;
              &amp;lt;http-method&amp;gt;DELETE&amp;lt;/http-method&amp;gt;
              &amp;lt;http-method&amp;gt;TRACE&amp;lt;/http-method&amp;gt;
              &amp;lt;http-method&amp;gt;OPTIONS&amp;lt;/http-method&amp;gt;
              &amp;lt;http-method&amp;gt;PATCH&amp;lt;/http-method&amp;gt;
        &amp;lt;/web-resource-collection&amp;gt;
        &amp;lt;auth-constraint/&amp;gt;
    &amp;lt;/security-constraint&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-734a1c2e-1d2d-4e62-ad60-d98c7a82deb7&quot; data-compid=&quot;SE-734a1c2e-1d2d-4e62-ad60-d98c7a82deb7&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-734a1c2e-1d2d-4e62-ad60-d98c7a82deb7&quot; data-direction=&quot;top&quot;&gt;
&lt;div id=&quot;SE-70619560-1147-457c-b8f6-c602a5d7f6b3&quot;&gt;
&lt;p id=&quot;SE-eec854e9-5dca-400d-917f-882031d0c824&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1) ContextLoaderListener에 의해서 만들어지는 Root WebApplicationContext&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9c5d7043-096f-4ed6-96ba-eaf5a255d005&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2) DispatcherServlet에 의해서 만들어지는 WebApplicationContext&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4a7c9598-2b28-4686-87ba-95f573d1aac2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Root WebApplicationContext 이름 그대로 최상단에 위치한 Context 이다&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0568ab9b-a785-4235-8c1d-b55e8f910bb3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 서비스 계층이나 DAO를 포함한, 웹 환경에 독립적인 빈들을 담아둔다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f77d9db7-bd55-4b67-bf24-284e61241b8b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 서로 다른 서블릿컨텍스트에서 공유해야 하는 빈들을 등록해놓고 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a8cfb9d4-d8ef-43cd-a606-ca42e07cc067&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Servlet context에 등록된 빈들을 이용 불가능하고 servlet context와 공통된 빈이 있다면 servlet context 빈이 우선된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-383ab6e9-ec37-4604-8f0a-6fa7a17d0653&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- WebApplication 전체에 사용가능한 DB연결, 로깅 기능들이 이용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-614631d0-b869-4c3a-a52a-f2ca8646008b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- ContextLoaderListener: 스프링의 root WebApplicationContext를 시작 시키기 위한 Bootstrap listener&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7f36854d-bbc3-41c7-b580-a8eeb77d2988&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-DispatcherServlet 은 각가 별도의 webapplicationcontext를 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9b557583-bc31-44b2-a49f-f96201c813d1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- ContextLoaderListener 와 DispatcherServlet 은 각각 webapplicationcontext 를 생성하는데&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3dc7d94c-79d9-4871-8d9a-ab4011712968&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ContextLoaderListener 가 생성한 컨텍스트가 root 컨텍스트가 되고 DispatcherServlet 생성한 인스턴스는&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dadac160-15aa-4af0-b598-6824eca0491c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;root 컨텍스트를 부모로 하는 자식 컨텍스트가 된다.&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;i&gt;&amp;gt;&amp;gt; 참고 할 자료&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gajy.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2022.10.24 - [[공부] 원리] - [Spring] 컨테이너&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666622596233&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 컨테이너&quot; data-og-description=&quot;1. 컨테이너: 특정 객체의 생성과 관리를 담당하며 객체 운용에 필요한 기능을 제공 (스프링도 일종의 컨테이너) ​ 2. 스프링 컨테이너 종류 BeanFactory: applicationContext.xml에 등록된 bean객체를 생성,&quot; data-og-host=&quot;gajy.tistory.com&quot; data-og-source-url=&quot;https://gajy.tistory.com/82&quot; data-og-url=&quot;https://gajy.tistory.com/82&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jnQaN/hyQlv8il9P/lm6YEKFKEstXZoQ3JK7GaK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/l9eLq/hyQhuJ0MuO/kRMx1cxnAncNkiqHWmTB50/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://gajy.tistory.com/82&quot; data-source-url=&quot;https://gajy.tistory.com/82&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jnQaN/hyQlv8il9P/lm6YEKFKEstXZoQ3JK7GaK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/l9eLq/hyQhuJ0MuO/kRMx1cxnAncNkiqHWmTB50/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[Spring] 컨테이너&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 컨테이너: 특정 객체의 생성과 관리를 담당하며 객체 운용에 필요한 기능을 제공 (스프링도 일종의 컨테이너) ​ 2. 스프링 컨테이너 종류 BeanFactory: applicationContext.xml에 등록된 bean객체를 생성,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gajy.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p id=&quot;SE-15c49e94-04f8-4921-a295-5292ddfc8d09&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-5347d655-362f-49b3-99d6-7995864dc147&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;servlet-context.xml&lt;/b&gt; : &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;DispatcherServlet&lt;/span&gt;과 관련된 설정을 한다.&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ViewResolver, HanderMapping, Controllers 등이 생성된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a0512ff7-8111-4b5a-a408-ee692f53cfe5&quot; data-compid=&quot;SE-a0512ff7-8111-4b5a-a408-ee692f53cfe5&quot; data-a11y-title=&quot;코드&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-a0512ff7-8111-4b5a-a408-ee692f53cfe5&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:mvc=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xmlns:tx=&quot;http://www.springframework.org/schema/tx&quot;
    xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;
    xsi:schemaLocation=&quot;
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd&quot;&amp;gt;

    &amp;lt;mvc:annotation-driven/&amp;gt;

    &amp;lt;mvc:default-servlet-handler/&amp;gt;

    &amp;lt;mvc:resources location=&quot;/favicon.ico&quot; mapping=&quot;/favicon.ico&quot;/&amp;gt;

    &amp;lt;context:component-scan base-package=&quot;com.test.service.test.controller&quot; /&amp;gt;
    &amp;lt;context:component-scan base-package=&quot;com.test.service.common.handler&quot; /&amp;gt;

    &amp;lt;!-- Resolver setting --&amp;gt;
    &amp;lt;!-- tiles Resolver--&amp;gt;
    &amp;lt;bean id=&quot;tilesviewResolver&quot; class=&quot;org.springframework.web.servlet.view.tiles3.TilesViewResolver&quot;&amp;gt;
        &amp;lt;property name=&quot;order&quot; value=&quot;0&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;bean id=&quot;tilesConfigurer&quot; class=&quot;org.springframework.web.servlet.view.tiles3.TilesConfigurer&quot;&amp;gt;
        &amp;lt;property name=&quot;definitions&quot;&amp;gt;
            &amp;lt;list&amp;gt;
                &amp;lt;value&amp;gt;/WEB-INF/tiles/layout.xml&amp;lt;/value&amp;gt;
            &amp;lt;/list&amp;gt;
        &amp;lt;/property&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;!-- BeanName Resolver --&amp;gt;
    &amp;lt;bean class=&quot;org.springframework.web.servlet.view.BeanNameViewResolver&quot;&amp;gt;
        &amp;lt;property name=&quot;order&quot; value=&quot;1&quot;/&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;!-- jsp Resolver --&amp;gt;
    &amp;lt;bean id=&quot;viewResolver&quot; class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&amp;gt;
        &amp;lt;property name=&quot;order&quot; value=&quot;2&quot; /&amp;gt;
        &amp;lt;property name=&quot;viewClass&quot; value=&quot;org.springframework.web.servlet.view.JstlView&quot; /&amp;gt;
        &amp;lt;property name=&quot;prefix&quot; value=&quot;/WEB-INF/view/&quot; /&amp;gt;
        &amp;lt;property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;!-- FileUpload Resolver --&amp;gt;
    &amp;lt;bean id=&quot;multipartResolver&quot; class=&quot;org.springframework.web.multipart.commons.CommonsMultipartResolver&quot;&amp;gt;
        &amp;lt;property name=&quot;maxUploadSize&quot; value=&quot;10000000&quot; /&amp;gt;
        &amp;lt;property name=&quot;defaultEncoding&quot; value=&quot;utf-8&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;
    &amp;lt;!-- Resolver setting --&amp;gt;

    &amp;lt;!-- FileDownload View --&amp;gt;
    &amp;lt;bean id=&quot;fileDownloadView&quot; class=&quot;com.test.service.common.view.FileDownloadView&quot; /&amp;gt;

    &amp;lt;!-- ExcelDownload View  --&amp;gt;
    &amp;lt;bean id=&quot;excelDownloadView&quot; class=&quot;com.test.service.common.view.ExcelDownloadView&quot; /&amp;gt;

    &amp;lt;!-- StreamDownload View --&amp;gt;
    &amp;lt;bean id=&quot;streamDownloadView&quot; class=&quot;com.test.service.common.view.StreamDownloadView&quot; /&amp;gt;

    &amp;lt;mvc:interceptors&amp;gt;
        &amp;lt;bean id=&quot;webContentInterceptor&quot; class=&quot;org.springframework.web.servlet.mvc.WebContentInterceptor&quot;&amp;gt;
            &amp;lt;property name=&quot;cacheSeconds&quot; value=&quot;0&quot; /&amp;gt;
            &amp;lt;property name=&quot;useExpiresHeader&quot; value=&quot;true&quot; /&amp;gt;
            &amp;lt;property name=&quot;useCacheControlHeader&quot; value=&quot;true&quot; /&amp;gt;
            &amp;lt;property name=&quot;useCacheControlNoStore&quot; value=&quot;true&quot; /&amp;gt;
        &amp;lt;/bean&amp;gt;
        &amp;lt;mvc:interceptor&amp;gt;
            &amp;lt;mvc:mapping path=&quot;/**&quot;/&amp;gt;
            &amp;lt;mvc:exclude-mapping path=&quot;/error*&quot; /&amp;gt;
            &amp;lt;mvc:exclude-mapping path=&quot;/login/**&quot; /&amp;gt;
            &amp;lt;bean class=&quot;com.kica.ssl.common.interceptor.LoginCheckInterceptor&quot; /&amp;gt;
        &amp;lt;/mvc:interceptor&amp;gt;
        &amp;lt;bean class=&quot;com.test.service.common.interceptor.ParameterLogInterceptor&quot; /&amp;gt;
        &amp;lt;bean class=&quot;com.test.service.common.interceptor.CsrfInterceptor&quot; /&amp;gt;
    &amp;lt;/mvc:interceptors&amp;gt;
&amp;lt;/beans&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c5d2db5d-ae31-4c9c-95c1-7c86353141b8&quot; data-compid=&quot;SE-c5d2db5d-ae31-4c9c-95c1-7c86353141b8&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-c5d2db5d-ae31-4c9c-95c1-7c86353141b8&quot; data-direction=&quot;top&quot;&gt;
&lt;div id=&quot;SE-0109d871-0c86-4357-8c8e-9e4e9103c138&quot;&gt;
&lt;p id=&quot;SE-b0201e8a-c5aa-4f70-9c67-534773344392&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. context-*.xml:&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ContextLoaderListener 와 DispatcherServlet 은 각각 webapplicationcontext 를 생성하는데&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b0346028-ab6e-4e0f-9b11-2a9e8202a8dc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ContextLoaderListener 가 생성한 컨텍스트가 root 컨텍스트가 되고 DispatcherServlet 생성한 인스턴스는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;root 컨텍스트를 부모로 하는 자식 컨텍스트가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f4120ef7-0b55-446e-ba87-f3b7dcbdc007&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자식 컨텍스트들은 root 컨텍스트의 설정 빈을 사용 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0854de28-2654-429c-9454-0b8817fba5b9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러기에 ContextLoaderListener 을 이용 공통빈 설정 가능.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-88669804-b867-40ed-90f5-fdab5757f322&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어 DispatcherServlet을 두개를 사용하고, 같은 service, dao를 사용가능.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fa965dca-a0f9-4cef-bf92-c0dd08f6222b&quot; data-compid=&quot;SE-fa965dca-a0f9-4cef-bf92-c0dd08f6222b&quot; data-a11y-title=&quot;코드&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-fa965dca-a0f9-4cef-bf92-c0dd08f6222b&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xmlns:util=&quot;http://www.springframework.org/schema/util&quot;
    xsi:schemaLocation=&quot;
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd&quot;&amp;gt;

    &amp;lt;context:component-scan base-package=&quot;com.test.service.partner.service&quot; /&amp;gt;
    &amp;lt;context:component-scan base-package=&quot;com.est.service.partner.dao.common&quot; /&amp;gt;
    &amp;lt;context:component-scan base-package=&quot;com.est.service.common.component&quot; /&amp;gt;

    &amp;lt;!-- propeti util --&amp;gt;
    &amp;lt;util:properties id=&quot;common&quot; location=&quot;classpath:/property/common.properties&quot; /&amp;gt;
    &amp;lt;util:properties id=&quot;mail&quot; location=&quot;classpath:/property/mail.properties&quot; /&amp;gt;
    &amp;lt;util:properties id=&quot;payment&quot; location=&quot;classpath:/property/payment.properties&quot; /&amp;gt;
&amp;lt;/beans&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-939fffd8-f17b-430d-b04f-4722bed5ab8f&quot; data-compid=&quot;SE-939fffd8-f17b-430d-b04f-4722bed5ab8f&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-939fffd8-f17b-430d-b04f-4722bed5ab8f&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-05b5aef0-e461-4bb2-bc4e-a2f4cc979982&quot;&gt;
&lt;p id=&quot;SE-b34d2d11-61d4-4989-ab04-abc8e9e51718&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/원리</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/84</guid>
      <comments>https://gajy.tistory.com/84#entry84comment</comments>
      <pubDate>Mon, 24 Oct 2022 23:43:47 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Filter, Interceptor, AOP 차이</title>
      <link>https://gajy.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;1. Filter: 정제역할, 예) XSS filter&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div id=&quot;SE-2b31d3de-64d0-4e8e-9b38-224cd870e8a0&quot; data-compid=&quot;SE-2b31d3de-64d0-4e8e-9b38-224cd870e8a0&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-2b31d3de-64d0-4e8e-9b38-224cd870e8a0&quot; data-direction=&quot;top&quot;&gt;
&lt;div id=&quot;SE-56a66587-9060-44e3-8e48-85bc26803f46&quot;&gt;
&lt;p id=&quot;SE-b396ecb5-4231-45ff-b7a6-c022f8db5f6e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. Interceptor: 가로채기 예) 권한관리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-57329609-7a3b-4712-a57a-5cdbca2d4d66&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. AOP: 관점 지향 프로그래밍 예) 로깅, 트랜젝션, 에러처리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f4cd7405-3cb2-45e5-897b-eb63bc6d3f4e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 프로그래밍을 하다보면 공통적인 기능이 많이 발생합니다. 이러한 공통 기능은 상속을 통해서 모든 모듈에 적용을 시켜줄 수 있지만 몇 가지 문제가 있지요. 우선 JAVA에서는 다중 상속이 불가능하기 때문에 한계가 있고, 기능을 구현하는 부분에 핵심 기능 코드와 공통 기능 코드가 섞여 있어서 효율이 떨어집니다. 이러한 문제점때문에 핵심 기능과 공통 기능을 분리 시켜놓고, 공통 기능을 필요로 하는 핵심 기능들에서 사용하는 방식의 AOP가 등장을 하게 되었습니다. 스프링은 자체적으로 프록시 기반의 AOP를 지원하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-125836b7-1bd8-4713-9aed-cc995c518bb3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* proxy: 타겟을 감싸서 요청을 대신 받아주는 랩핑 클래스. Weaving을 통해서 Proxy 객체를 생성하며 Spring AOP Proxy는 CGLIB Proxy, JDK Dynamic Proxy를 사용한다. 스프링의 AOP는 이 프록시 객체를 통해 작동하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-78866280-b157-4c9d-ae5c-795880e7a5b6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Aspect : 공통 기능&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3835c0a2-9c13-4f91-bf71-c0d797f1af93&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Advice : Aspect의 기능 자체&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(Aspect를 공통 기능이라고 크게 묶었으면 Advice는 그 안의 세부적인, 주요 기능이라고 생각하시면 됩니다.)&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3c452c99-494d-430f-9d61-4b9c1b978592&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Joinpoint : Advice를 적용해야 되는 부분(ex 필드, 메소드 - 스프링에서는 메소드만 해당)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2f9afd86-7546-4c69-a237-4b2b1f8a03b1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Pointcut : Joinpoint의 부분으로 실제로 Advice가 적용된 부분&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f4fea229-b6d8-4b55-ae6c-1b689aaacd9a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Weaving : Advice를 핵심 기능에 적용 하는 행위&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f07084d3-9473-4149-bce1-0ee620d6c6b6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-ae1b1584-89b1-4139-a2ce-1e1dad234185&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;예) 배치 트랜젝션 관리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-15a735d8-7e2d-4aeb-aa0a-0f4ac11ee0bb&quot; data-compid=&quot;SE-15a735d8-7e2d-4aeb-aa0a-0f4ac11ee0bb&quot; data-a11y-title=&quot;코드&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-15a735d8-7e2d-4aeb-aa0a-0f4ac11ee0bb&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;
    xmlns:tx=&quot;http://www.springframework.org/schema/tx&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
                        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd&quot;&amp;gt;

    &amp;lt;!-- default txManager --&amp;gt;
    &amp;lt;bean id=&quot;txManager&quot; class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;&amp;gt;
        &amp;lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;/&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;!-- Annotation 을 사용한 트랜잭션 사용시 활성화 --&amp;gt;
    &amp;lt;tx:annotation-driven transaction-manager=&quot;txManager&quot; /&amp;gt;

    &amp;lt;!-- PostgreSQL txAdvice --&amp;gt;
    &amp;lt;tx:advice id=&quot;txAdvice&quot; transaction-manager=&quot;txManager&quot;&amp;gt;
       &amp;lt;tx:attributes&amp;gt;
            &amp;lt;tx:method name=&quot;get*&quot; read-only=&quot;true&quot; /&amp;gt;
            &amp;lt;tx:method name=&quot;*&quot; propagation=&quot;REQUIRED&quot; rollback-for=&quot;Exception&quot;/&amp;gt;
        &amp;lt;/tx:attributes&amp;gt;
    &amp;lt;/tx:advice&amp;gt;

    &amp;lt;aop:config&amp;gt;
        &amp;lt;aop:pointcut id=&quot;requiredTx&quot; expression=&quot;execution(* com.test.service.testone..*ServiceImpl.*(..)) and !execution(* com.test.service.testone.service.common.impl.MailServiceImpl.*(..))&quot;/&amp;gt;
        &amp;lt;aop:advisor advice-ref=&quot;txAdvice&quot; pointcut-ref=&quot;requiredTx&quot; /&amp;gt;
    &amp;lt;/aop:config&amp;gt;

&amp;lt;/beans&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-be82caec-5496-4d49-9b7b-d677afa972bd&quot; data-compid=&quot;SE-be82caec-5496-4d49-9b7b-d677afa972bd&quot; data-a11y-title=&quot;사진&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-be82caec-5496-4d49-9b7b-d677afa972bd&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-be82caec-5496-4d49-9b7b-d677afa972bd&quot;&gt;
&lt;div data-unitid=&quot;SE-be82caec-5496-4d49-9b7b-d677afa972bd&quot; data-compid=&quot;&quot; data-direction=&quot;top&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bobzUS/btrPvvCpze5/Nod1yHqCAu1HBkdpZb9fmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bobzUS/btrPvvCpze5/Nod1yHqCAu1HBkdpZb9fmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bobzUS/btrPvvCpze5/Nod1yHqCAu1HBkdpZb9fmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbobzUS%2FbtrPvvCpze5%2FNod1yHqCAu1HBkdpZb9fmk%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;519&quot; height=&quot;421&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-68141b75-f164-4555-8536-15d81fbcf652&quot; data-compid=&quot;SE-68141b75-f164-4555-8536-15d81fbcf652&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-68141b75-f164-4555-8536-15d81fbcf652&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-0870a8ad-38e5-4282-92b5-24d0ac3c1adb&quot;&gt;
&lt;p id=&quot;SE-851251eb-4a14-41f3-ac1d-445bfc381fd1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;&lt;b&gt;Filter &amp;rarr; Interceptor &amp;rarr; AOP &amp;rarr; Interceptor &amp;rarr; Filter 순&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f7cfa297-a1dc-472e-b332-055a72a7815e&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-9ef1f03f-32b3-433e-a20f-5811f81e38a1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-9286a807-01ce-42fe-b605-df358bd96960&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-8cb94b49-f514-480c-a30e-bb8cdc0f2297&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-a5c5dec5-3db8-4e1b-81e1-f49963dc4dd3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-href=&quot;https://goddaehee.tistory.com/154&quot;&gt;&lt;a href=&quot;https://goddaehee.tistory.com/154&quot;&gt;https://goddaehee.tistory.com/154&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d3a463b3-cd18-45af-bfc9-647b2661f466&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/원리</category>
      <category>AOP</category>
      <category>Filter</category>
      <category>Interceptor</category>
      <category>Spring</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/83</guid>
      <comments>https://gajy.tistory.com/83#entry83comment</comments>
      <pubDate>Mon, 24 Oct 2022 23:36:28 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 컨테이너</title>
      <link>https://gajy.tistory.com/82</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 컨테이너: 특정 객체의 생성과 관리를 담당하며 객체 운용에 필요한 기능을 제공 (스프링도 일종의 컨테이너)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b2b61d2f-9c51-4cee-9be0-90d449d4fbcd&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0b6b5462-de72-4a3f-87b0-fa39a79a573a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. 스프링 컨테이너 종류&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;SE-2744c803-f414-40b1-bd33-a7f8bca460b4&quot;&gt;BeanFactory: applicationContext.xml에 등록된 bean객체를 생성, 관리하는 기본적인 기능만 제공. 컨테이너가 구동될 때 객체를 생성하는 것이 아니라 클라이언트로부터 요청(getBean)에 의해서만 객체를 생성 (lazy loading)&lt;/li&gt;
&lt;li id=&quot;SE-9d24f652-a561-4c9f-9a7b-db9d7d88bb9d&quot;&gt;ApplicationContext: 이를 확장한 것. 트랜잭션관리나 메시지 기반의 다국어 처리 등 다양한 기능 제공. 클래스들을 객체화하는 즉시(context를 시작시킬때 singleton bean)) 로딩 방식으로 동작.&lt;/li&gt;
&lt;li id=&quot;SE-12c6cbf8-4783-4c7c-93a2-6f17d12d98dc&quot;&gt;ClassPathXmlApplicationContext: 클래스패스로 된 설정파일 위치를 파라미터로 받는다. 아래와 같이 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1666621777857&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private ApplicationContext apiContext = new ClassPathXmlApplicationContext(&quot;api/spring/context/context-*.xml&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/원리</category>
      <category>ApplicationContext</category>
      <category>bean</category>
      <category>BeanFactory</category>
      <category>classpathxmlapplicationcontext</category>
      <category>container</category>
      <category>Spring</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/82</guid>
      <comments>https://gajy.tistory.com/82#entry82comment</comments>
      <pubDate>Mon, 24 Oct 2022 23:30:26 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 시작부터 응답까지 흐름 분석</title>
      <link>https://gajy.tistory.com/81</link>
      <description>&lt;div id=&quot;SE-fa03d208-dbf5-4af9-bd38-ca7a96fde4ea&quot; data-compid=&quot;SE-fa03d208-dbf5-4af9-bd38-ca7a96fde4ea&quot; data-a11y-title=&quot;사진&quot;&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-fa03d208-dbf5-4af9-bd38-ca7a96fde4ea&quot; data-direction=&quot;top&quot;&gt;
&lt;div id=&quot;SE-fa03d208-dbf5-4af9-bd38-ca7a96fde4ea&quot;&gt;
&lt;div data-unitid=&quot;SE-fa03d208-dbf5-4af9-bd38-ca7a96fde4ea&quot; data-compid=&quot;&quot; data-direction=&quot;top&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvSU6t/btrPuPOEPeH/SvhYr5KJIkdlbPkdmuH8gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvSU6t/btrPuPOEPeH/SvhYr5KJIkdlbPkdmuH8gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvSU6t/btrPuPOEPeH/SvhYr5KJIkdlbPkdmuH8gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvSU6t%2FbtrPuPOEPeH%2FSvhYr5KJIkdlbPkdmuH8gK%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;643&quot; height=&quot;379&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-52e065a3-3104-4a04-a0b0-fa3446bce918&quot; data-compid=&quot;SE-52e065a3-3104-4a04-a0b0-fa3446bce918&quot; data-a11y-title=&quot;사진&quot;&gt;
&lt;div&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-52e065a3-3104-4a04-a0b0-fa3446bce918&quot; data-direction=&quot;top&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-52e065a3-3104-4a04-a0b0-fa3446bce918&quot;&gt;
&lt;div data-unitid=&quot;SE-52e065a3-3104-4a04-a0b0-fa3446bce918&quot; data-compid=&quot;&quot; data-direction=&quot;top&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m2fI8/btrPp4tm7ke/8xSJKxm0q5Ho7qRMBIHdy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m2fI8/btrPp4tm7ke/8xSJKxm0q5Ho7qRMBIHdy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m2fI8/btrPp4tm7ke/8xSJKxm0q5Ho7qRMBIHdy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm2fI8%2FbtrPp4tm7ke%2F8xSJKxm0q5Ho7qRMBIHdy1%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;519&quot; height=&quot;522&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c4f65845-31f9-4e28-be65-90973f65129f&quot; data-compid=&quot;SE-c4f65845-31f9-4e28-be65-90973f65129f&quot; data-a11y-title=&quot;본문&quot;&gt;
&lt;div data-unitid=&quot;&quot; data-compid=&quot;SE-c4f65845-31f9-4e28-be65-90973f65129f&quot; data-direction=&quot;top&quot;&gt;
&lt;div id=&quot;SE-5dc46e54-c0ce-46e0-a572-8d9e7522e8b6&quot;&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;서비스 기동 시작&lt;/blockquote&gt;
&lt;p id=&quot;SE-edf4fead-6dd8-4ecd-8290-fcc382772843&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. WAS가 구동되면서 web.xml이 로딩&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-714e59d2-a502-47c4-9579-253e52736506&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. web.xml에 등록되어 있는 ContextLoaderListener가 생성된다. ContextLoaderListener 클래스는 ServletContextListener 인터페이스를 구현하고 있으며, ApplicationContext를 생성하는 역할을 수행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7371dfc9-fbc6-486d-bc72-03f7ab151bde&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 생성된 ContextLoaderListener는 root-context.xml을 loading한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-af1a8a69-625d-405f-b89b-dae20f516e5a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. root-context.xml에 등록되어 있는 Spring Container가 구동된다. @Service, @Repository와 같은 어노테이션이나 DB관련 객체, DAO, VO 객체들이 생성된다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;서비스 기동 끝 &amp;amp; 요청 시작&lt;/blockquote&gt;
&lt;p id=&quot;SE-118a464e-b3d8-4b72-a4bf-d791749dfa29&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 클라이언트로부터 웹 애플리케이션이 요청이 온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. Filter 처리&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7e7bf457-a8ff-4a67-a76d-51608344e708&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7. DispatcherServlet(Servlet)이 생성하고(재사용), &lt;span style=&quot;color: #000000;&quot;&gt;servlet-context.xml을 loading 한다.&lt;span&gt; ViewResolver, HanderMapping, Controllers가 생성된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;8. interceptor 처리&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;9. AOP 처리&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2ff91146-dadc-4605-9dee-7c945608b234&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10. DispatcherServlet은 HandlerMapping을 통해 Controller로 위임처리한다.&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(service() 메소드 실행)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11. 처리 후 controller는 view이름을 리턴&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;요청 끝 &amp;amp; 응답 시작&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;12. &lt;span style=&quot;color: #000000;&quot;&gt;AOP 처리&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;13. &lt;span style=&quot;color: #000000;&quot;&gt;interceptor 처리&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;14. &lt;span style=&quot;color: #000000;&quot;&gt;Filter 처리&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;12. viewResoler를 통해 사용자에게 보여준다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&amp;gt;&amp;gt; 참고 할 다른 글&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://gajy.tistory.com/82&quot;&gt;2022.10.24 - [[공부] 원리] - [Spring] 컨테이너&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1666622252963&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 컨테이너&quot; data-og-description=&quot;1. 컨테이너: 특정 객체의 생성과 관리를 담당하며 객체 운용에 필요한 기능을 제공 (스프링도 일종의 컨테이너) ​ 2. 스프링 컨테이너 종류 BeanFactory: applicationContext.xml에 등록된 bean객체를 생성,&quot; data-og-host=&quot;gajy.tistory.com&quot; data-og-source-url=&quot;https://gajy.tistory.com/82&quot; data-og-url=&quot;https://gajy.tistory.com/82&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jnQaN/hyQlv8il9P/lm6YEKFKEstXZoQ3JK7GaK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/l9eLq/hyQhuJ0MuO/kRMx1cxnAncNkiqHWmTB50/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://gajy.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gajy.tistory.com/82&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jnQaN/hyQlv8il9P/lm6YEKFKEstXZoQ3JK7GaK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/l9eLq/hyQhuJ0MuO/kRMx1cxnAncNkiqHWmTB50/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[Spring] 컨테이너&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 컨테이너: 특정 객체의 생성과 관리를 담당하며 객체 운용에 필요한 기능을 제공 (스프링도 일종의 컨테이너) ​ 2. 스프링 컨테이너 종류 BeanFactory: applicationContext.xml에 등록된 bean객체를 생성,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gajy.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gajy.tistory.com/83&quot;&gt;2022.10.24 - [[공부] 원리] - [Spring] Filter, Interceptor, AOP 차이&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666622260357&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Filter, Interceptor, AOP 차이&quot; data-og-description=&quot;1. Filter: 정제역할, 예) XSS filter 2. Interceptor: 가로채기 예) 권한관리 3. AOP: 관점 지향 프로그래밍 예) 로깅, 트랜젝션, 에러처리 -&amp;gt; 프로그래밍을 하다보면 공통적인 기능이 많이 발생합니다. 이러&quot; data-og-host=&quot;gajy.tistory.com&quot; data-og-source-url=&quot;https://gajy.tistory.com/83&quot; data-og-url=&quot;https://gajy.tistory.com/83&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dVSoUv/hyQlv8ilFf/1YKXzKDGVMdKc0JCatMDT1/img.png?width=800&amp;amp;height=405&amp;amp;face=0_0_800_405,https://scrap.kakaocdn.net/dn/bSBfn9/hyQhDtokuR/iK5Sn6t5821uEGukAnjQF1/img.png?width=800&amp;amp;height=405&amp;amp;face=0_0_800_405,https://scrap.kakaocdn.net/dn/bJAIIu/hyQlxLOrV9/FibYVK4ycqo51dt8kXWPKk/img.png?width=830&amp;amp;height=421&amp;amp;face=0_0_830_421&quot;&gt;&lt;a href=&quot;https://gajy.tistory.com/83&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gajy.tistory.com/83&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dVSoUv/hyQlv8ilFf/1YKXzKDGVMdKc0JCatMDT1/img.png?width=800&amp;amp;height=405&amp;amp;face=0_0_800_405,https://scrap.kakaocdn.net/dn/bSBfn9/hyQhDtokuR/iK5Sn6t5821uEGukAnjQF1/img.png?width=800&amp;amp;height=405&amp;amp;face=0_0_800_405,https://scrap.kakaocdn.net/dn/bJAIIu/hyQlxLOrV9/FibYVK4ycqo51dt8kXWPKk/img.png?width=830&amp;amp;height=421&amp;amp;face=0_0_830_421');&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;[Spring] Filter, Interceptor, AOP 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Filter: 정제역할, 예) XSS filter 2. Interceptor: 가로채기 예) 권한관리 3. AOP: 관점 지향 프로그래밍 예) 로깅, 트랜젝션, 에러처리 -&amp;gt; 프로그래밍을 하다보면 공통적인 기능이 많이 발생합니다. 이러&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gajy.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gajy.tistory.com/84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2022.10.24 - [[공부] 원리] - [Spring] web.xml, servlet-context.xml, context-*.xml&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666622661709&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] web.xml, servlet-context.xml, context-*.xml&quot; data-og-description=&quot;1. web.xml&amp;nbsp;: 설정을 위한 설정파일이다. 배포 기술자로써 영어로는 DD(Deployment Descriptor) 이다. 이 파일은 WAS(Web Application Server)가 최초 구동될 때 즉 톰켓이 최초 구동될 때 web.xml을 읽고 그에..&quot; data-og-host=&quot;gajy.tistory.com&quot; data-og-source-url=&quot;https://gajy.tistory.com/84&quot; data-og-url=&quot;https://gajy.tistory.com/84&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bc6b5w/hyQlzv5ZtA/kjx57MkRIdJad8SRBkI3KK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bozNyA/hyQhDUts3G/0fi1YzDQ0dgmdN0nL6JjdK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://gajy.tistory.com/84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gajy.tistory.com/84&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bc6b5w/hyQlzv5ZtA/kjx57MkRIdJad8SRBkI3KK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bozNyA/hyQhDUts3G/0fi1YzDQ0dgmdN0nL6JjdK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[Spring] web.xml, servlet-context.xml, context-*.xml&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. web.xml&amp;nbsp;: 설정을 위한 설정파일이다. 배포 기술자로써 영어로는 DD(Deployment Descriptor) 이다. 이 파일은 WAS(Web Application Server)가 최초 구동될 때 즉 톰켓이 최초 구동될 때 web.xml을 읽고 그에..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gajy.tistory.com&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;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고 자료:&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-55656dc0-31eb-4ae5-b351-f0e7abaec899&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-href=&quot;https://doublesprogramming.tistory.com/84&quot;&gt;&lt;a href=&quot;https://doublesprogramming.tistory.com/84&quot;&gt;https://doublesprogramming.tistory.com/84&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dff179b7-f770-4b8d-bce5-295bf9381c05&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-href=&quot;https://minwan1.github.io/2017/10/08/2017-10-08-Spring-Container,Servlet-Container/&quot;&gt;&lt;a href=&quot;https://minwan1.github.io/2017/10/08/2017-10-08-Spring-Container,Servlet-Container/&quot;&gt;https://minwan1.github.io/2017/10/08/2017-10-08-Spring-Container,Servlet-Container/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부/원리</category>
      <category>ContextLoaderListener</category>
      <category>DispatcherServlet</category>
      <category>Spring</category>
      <category>web.xml</category>
      <category>원리</category>
      <category>흐름</category>
      <author>gajy</author>
      <guid isPermaLink="true">https://gajy.tistory.com/81</guid>
      <comments>https://gajy.tistory.com/81#entry81comment</comments>
      <pubDate>Mon, 24 Oct 2022 23:26:30 +0900</pubDate>
    </item>
  </channel>
</rss>