<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>H_Develop</title>
    <link>https://h-develop.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 28 May 2026 14:05:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>H_Develop</managingEditor>
    <item>
      <title>NCloud 후기 (feat : 비사이드)</title>
      <link>https://h-develop.tistory.com/227</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Q. 프로젝트를 소개해 주세요. (100자 이상)&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;비사이드라는&lt;span&gt; 프로그램에 참여하게 되었고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기획자 디자이너 프론트엔드 백엔드 이렇게 팀을 구성하여 진행하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(저는 백엔드로 참여하였습니다 !)&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;떡볶이를 먹고 싶은데, 요새는 종류 맛 너무 다양해서 어떤 가게에 시킬지, 어떤 메뉴를 시킬지 고민이 한~참 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 사용자가 원하는 떡볶이 재료와 맛 등을 선택하여 떡볶이 가게와 메뉴를 추천해주는 서비스를 만들게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적인 기능으로 사용자에게 자주 추천된 메뉴를 다시 확인하여 내 입맛에 따른 떡볶이를 다시 찾아볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 경험한 떡볶이를 다른 사람에게 추천할 수도 있구요 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 취향에 따른 칭호도 획득하고 컬렉션으로 모을 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 재밌는 요소도 많이 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 여유롭게 클라우드를 이용할 수 있었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.utteok.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://www.utteok.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714664689350&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;어떡&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.utteok.com&quot; data-og-source-url=&quot;http://www.utteok.com/&quot; data-og-url=&quot;http://www.utteok.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://www.utteok.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.utteok.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.utteok.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://github.com/Utteok/Type-of-Tteokbokki_Back&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/Utteok/Type-of-Tteokbokki_Back&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q.&amp;nbsp;Ncloud에서&amp;nbsp;어떤&amp;nbsp;서비스를&amp;nbsp;활용하셨나요? &lt;br /&gt;-&amp;nbsp;활용한&amp;nbsp;서비스를&amp;nbsp;가급적&amp;nbsp;모두&amp;nbsp;적어주세요. &lt;br /&gt;-&amp;nbsp;전체&amp;nbsp;서비스&amp;nbsp;보기&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://www.ncloud.com/product&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ncloud.com/product&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714665040883&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;NAVER CLOUD PLATFORM&quot; data-og-description=&quot;cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification&quot; data-og-host=&quot;www.ncloud.com&quot; data-og-source-url=&quot;https://www.ncloud.com/product&quot; data-og-url=&quot;https://www.ncloud.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nOz9f/hyVZgyhpEa/dVdyw3eavQDVIMWU3s7iq0/img.jpg?width=526&amp;amp;height=274&amp;amp;face=0_0_526_274,https://scrap.kakaocdn.net/dn/fJOFV/hyVVy8p4Vu/lRqdxiQKgPbqUUxdXT6LaK/img.png?width=1600&amp;amp;height=720&amp;amp;face=0_0_1600_720,https://scrap.kakaocdn.net/dn/bDJIjC/hyVZemXdk5/OVeLrgkgnJlDkZpgDspJT1/img.png?width=780&amp;amp;height=1120&amp;amp;face=0_0_780_1120&quot;&gt;&lt;a href=&quot;https://www.ncloud.com/product&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ncloud.com/product&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nOz9f/hyVZgyhpEa/dVdyw3eavQDVIMWU3s7iq0/img.jpg?width=526&amp;amp;height=274&amp;amp;face=0_0_526_274,https://scrap.kakaocdn.net/dn/fJOFV/hyVVy8p4Vu/lRqdxiQKgPbqUUxdXT6LaK/img.png?width=1600&amp;amp;height=720&amp;amp;face=0_0_1600_720,https://scrap.kakaocdn.net/dn/bDJIjC/hyVZemXdk5/OVeLrgkgnJlDkZpgDspJT1/img.png?width=780&amp;amp;height=1120&amp;amp;face=0_0_780_1120');&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;NAVER CLOUD PLATFORM&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ncloud.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;p data-ke-size=&quot;size16&quot;&gt;[Standard]&amp;nbsp;2vCPU,&amp;nbsp;4GB&amp;nbsp;Mem&amp;nbsp;[g1]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: center;&quot;&gt;Global DNS, &lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: center;&quot;&gt;Public IP&lt;/span&gt; &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;Q.&amp;nbsp;Ncloud&amp;nbsp;서비스를&amp;nbsp;어떻게&amp;nbsp;적용&amp;nbsp;하였나요?&amp;nbsp;(100자&amp;nbsp;이상) &lt;br /&gt;-&amp;nbsp;아키텍처,&amp;nbsp;IA&amp;nbsp;(Information&amp;nbsp;Architecture)&amp;nbsp;등&amp;nbsp;구조도를&amp;nbsp;활용하여&amp;nbsp;Ncloud를&amp;nbsp;어떻게&amp;nbsp;적용하였는지&amp;nbsp;구체적으로&amp;nbsp;설명해&amp;nbsp;주세요. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;architecture.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxrzBX/btsG7ATNOL7/nPjfKQ1svrgtp3B67tKqZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxrzBX/btsG7ATNOL7/nPjfKQ1svrgtp3B67tKqZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxrzBX/btsG7ATNOL7/nPjfKQ1svrgtp3B67tKqZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxrzBX%2FbtsG7ATNOL7%2FnPjfKQ1svrgtp3B67tKqZK%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;1154&quot; height=&quot;535&quot; data-filename=&quot;architecture.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Q.&amp;nbsp;Ncloud&amp;nbsp;사용&amp;nbsp;중&amp;nbsp;특히&amp;nbsp;만족했던&amp;nbsp;점과,&amp;nbsp;아쉬웠던&amp;nbsp;점은&amp;nbsp;무엇인가요?&amp;nbsp;(100자&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;/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;Dashboard에서 필요한 네트워크 이용내역과 CPU Mem 현황을 실시간으로 확인할 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Global DNS 서비스에서 모니터링을 지원하여 트래픽을 그래픽으로 확인할 수 있어서 좋았습니다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비사이드 참여하며 열흘이라는 기간안에 모든것을 완수해야하다보니 한번쯤 고객센터에 연락을 하게되었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 5가지 확인해 보아야 할 부분에서 4가지만 확인했던 상황에서, 직원분이 확인 안해보셨죠 ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 답변해주시니 주니어 입장에서 대선배님께 괜한 질문을 한 느낌이여서 황송할 따름이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Q.&amp;nbsp;Green&amp;nbsp;Developers&amp;nbsp;프로그램&amp;nbsp;참여&amp;nbsp;소감&amp;nbsp;말씀&amp;nbsp;부탁&amp;nbsp;드립니다.&amp;nbsp;(50자&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 서비스를 이용할지 고민하던 순간에는 요금을 계산하여 계획할 수 있는 점도 정말 좋았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 추후 클라우드가 필요하다면 다시 이용해볼 생각입니다 !&lt;br /&gt;&lt;br /&gt;Q.&amp;nbsp;마지막&amp;nbsp;한&amp;nbsp;말씀&amp;nbsp;부탁&amp;nbsp;드립니다. &lt;br /&gt;프로젝트를&amp;nbsp;진행하며&amp;nbsp;흥미롭거나&amp;nbsp;어려웠던&amp;nbsp;기억,&amp;nbsp;향후&amp;nbsp;Ncloud&amp;nbsp;활용&amp;nbsp;계획,&amp;nbsp;Green&amp;nbsp;Developers&amp;nbsp;프로그램에&amp;nbsp;대한&amp;nbsp;피드백&amp;nbsp;등&amp;nbsp;여러분의&amp;nbsp;생각을&amp;nbsp;공유해&amp;nbsp;주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점진적으로 NCloud 사용률이 높아져 AWS 보다 많이 사용되었으면 좋겠습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1714664726528&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;NAVER CLOUD PLATFORM&quot; data-og-description=&quot;cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification&quot; data-og-host=&quot;www.ncloud.com&quot; data-og-source-url=&quot;https://www.ncloud.com/product&quot; data-og-url=&quot;https://www.ncloud.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nOz9f/hyVZgyhpEa/dVdyw3eavQDVIMWU3s7iq0/img.jpg?width=526&amp;amp;height=274&amp;amp;face=0_0_526_274,https://scrap.kakaocdn.net/dn/fJOFV/hyVVy8p4Vu/lRqdxiQKgPbqUUxdXT6LaK/img.png?width=1600&amp;amp;height=720&amp;amp;face=0_0_1600_720,https://scrap.kakaocdn.net/dn/bDJIjC/hyVZemXdk5/OVeLrgkgnJlDkZpgDspJT1/img.png?width=780&amp;amp;height=1120&amp;amp;face=0_0_780_1120&quot;&gt;&lt;a href=&quot;https://www.ncloud.com/product&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ncloud.com/product&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nOz9f/hyVZgyhpEa/dVdyw3eavQDVIMWU3s7iq0/img.jpg?width=526&amp;amp;height=274&amp;amp;face=0_0_526_274,https://scrap.kakaocdn.net/dn/fJOFV/hyVVy8p4Vu/lRqdxiQKgPbqUUxdXT6LaK/img.png?width=1600&amp;amp;height=720&amp;amp;face=0_0_1600_720,https://scrap.kakaocdn.net/dn/bDJIjC/hyVZemXdk5/OVeLrgkgnJlDkZpgDspJT1/img.png?width=780&amp;amp;height=1120&amp;amp;face=0_0_780_1120');&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;NAVER CLOUD PLATFORM&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ncloud.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;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;&amp;nbsp;&lt;/p&gt;</description>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/227</guid>
      <comments>https://h-develop.tistory.com/227#entry227comment</comments>
      <pubDate>Fri, 3 May 2024 01:05:51 +0900</pubDate>
    </item>
    <item>
      <title>url을 통한 파일 다운로드</title>
      <link>https://h-develop.tistory.com/226</link>
      <description>&lt;pre id=&quot;code_1696394532922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try {
    FileOutputStream fos = new FileOutputStream(&quot;C:\\Users\\user\\Desktop\\HTY\\Copy3.pdf&quot;);
    is = conn.getInputStream();
    byte[] buffer = new byte[1024];
    int readBytes;

    while ((readBytes = is.read(buffer)) != -1) {

        fos.write(buffer, 0, readBytes);
    }
    fos.close();
    System.out.println(&quot;파일 다운완료&quot;);

} catch (Exception e) {
    e.printStackTrace();
}&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;
&lt;p style=&quot;background-color: #e8f2fe;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;FileOutputStream() 안에 다운로드 받을 위치를 지정해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #e8f2fe;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;</description>
      <category>BackEnd/JAVA</category>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/226</guid>
      <comments>https://h-develop.tistory.com/226#entry226comment</comments>
      <pubDate>Wed, 4 Oct 2023 13:44:02 +0900</pubDate>
    </item>
    <item>
      <title>controller 아닌 class에서 service 호출 하기.</title>
      <link>https://h-develop.tistory.com/225</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;this.service is null 계속 이 오류가 떳다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;ioc컨테이너에 있어야하며 빈 객체로 되어 있어야 service를 호출이 가능하다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Component @Configuration 등 빈 객체로 만들어 주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;service를 @Autowired @Resource를 줘도 안됬다.&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;/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/19896870/why-is-my-spring-autowired-field-null&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695603047491&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;Why is my Spring @Autowired field null?&quot; data-og-description=&quot;Note: This is intended to be a canonical answer for a common problem. I have a Spring @Service class (MileageFeeCalculator) that has an @Autowired field (rateService), but the field is null when I...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null&quot; data-og-url=&quot;https://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJMKjF/hyT2DaMosR/MSssRXEvklqQRZWxueLlr0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJMKjF/hyT2DaMosR/MSssRXEvklqQRZWxueLlr0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&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;Why is my Spring @Autowired field null?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Note: This is intended to be a canonical answer for a common problem. I have a Spring @Service class (MileageFeeCalculator) that has an @Autowired field (rateService), but the field is null when I...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는&lt;span&gt;&amp;nbsp;&lt;/span&gt;applicationContext이 빈에 Spring을 주입하도록 한다:&lt;/p&gt;
&lt;pre id=&quot;code_1695603074876&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class SpringUtils {

    public static ApplicationContext ctx;

    /**
     * Make Spring inject the application context
     * and save it on a static variable,
     * so that it can be accessed from any point in the application. 
     */
    @Autowired
    private void setApplicationContext(ApplicationContext applicationContext) {
        ctx = applicationContext;       
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 경우 이 코드를 기본 애플리케이션 클래스에도 넣을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #232629; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다른 클래스에서는 다음과 같이 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1695603091867&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyBean myBean = (MyBean)SpringUtils.ctx.getBean(MyBean.class);
// Service service = (Service) SpringUtils.ctx.getBean(Service.class);
// get을 만들어 줄 경우, (Service) SpringUtils.get().getBean(Service.class);&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한&lt;span&gt;&amp;nbsp;&lt;/span&gt;방식으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;애플리케이션의&lt;span&gt;&amp;nbsp;&lt;/span&gt;모든 객체&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;( 로 인스턴스화됨&lt;span&gt;&amp;nbsp;&lt;/span&gt;new) 에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;정적 방식으로&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모든&lt;span&gt;&amp;nbsp;&lt;/span&gt;Bean을 얻을 수 있습니다 .&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #232629; text-align: left;&quot;&gt;
&lt;div data-post-id=&quot;30237725&quot; data-post-type-id=&quot;2&quot;&gt;
&lt;div&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;드디어 됬다.&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;이 방식으로 Service.class의 빈을 얻어 사용하면 된다.&lt;/p&gt;</description>
      <category>Framework/Spring</category>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/225</guid>
      <comments>https://h-develop.tistory.com/225#entry225comment</comments>
      <pubDate>Mon, 25 Sep 2023 09:58:52 +0900</pubDate>
    </item>
    <item>
      <title>카카오, 라인, 네이버 인앱 url 외부 브라우저 연결</title>
      <link>https://h-develop.tistory.com/224</link>
      <description>&lt;pre id=&quot;code_1694768378504&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	//카카오톡 외부 브라우저 접근
 	var inappdeny_exec_vanillajs = (callback) =&amp;gt; {
		if(document.readyState != 'loading'){
			callback();
		}else{
			document.addEventListener('DOMContentLoaded', callback);
		} 
	};
	inappdeny_exec_vanillajs(() =&amp;gt; { 
		/* Do things after DOM has fully loaded */ 
		function copytoclipboard(val){
			var t = document.createElement(&quot;textarea&quot;);
			document.body.appendChild(t);
			t.value = val;
			t.select();
			document.execCommand('copy');
			document.body.removeChild(t);
		};
		function inappbrowserout(){
			copytoclipboard(window.location.href);
			alert('URL주소가 복사되었습니다.\n\nSafari가 열리면 주소창을 길게 터치한 뒤, &quot;붙여놓기 및 이동&quot;를 누르면 정상적으로 이용하실 수 있습니다.');
			location.href='x-web-search://?';
		};

		var useragt = navigator.userAgent.toLowerCase();
		var target_url = location.href;
		
		if(useragt.match(/kakaotalk/i)){
			
			//window.location.href = (/iPad|iPhone|iPod/.test(_ua)) ? &quot;kakaoweb://closeBrowser&quot; : &quot;kakaotalk://inappbrowser/close&quot;;
			window.location.href = &quot;kakaotalk://inappbrowser/close&quot;;
			//카카오톡 외부브라우저로 호출
			location.href = 'kakaotalk://web/openExternal?url='+encodeURIComponent(target_url);
			
		}else if(useragt.match(/line/i)){
			
			//라인 외부브라우저로 호출
			if(target_url.indexOf('?') !== -1){
				location.href = target_url+'&amp;amp;openExternalBrowser=1';
			}else{
				location.href = target_url+'?openExternalBrowser=1';
			}
		}else if(useragt.match(/inapp|naver|snapchat|wirtschaftswoche|thunderbird|instagram|everytimeapp|whatsApp|electron|wadiz|aliapp|zumapp|iphone(.*)whale|android(.*)whale|kakaostory|band|twitter|DaumApps|DaumDevice\/mobile|FB_IAB|FB4A|FBAN|FBIOS|FBSS|SamsungBrowser\/[^1]/i)){
			
			//그외 다른 인앱들
			if(useragt.match(/iphone|ipad|ipod/i)){
				
				//아이폰은 강제로 사파리를 실행할 수 없다 ㅠㅠ
				//모바일대응뷰포트강제설정
				var mobile = document.createElement('meta');
				mobile.name = 'viewport';
				mobile.content = &quot;width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no, minimal-ui&quot;;
				document.getElementsByTagName('head')[0].appendChild(mobile);
				//노토산스폰트강제설정
				var fonts = document.createElement('link');
				fonts.href = 'https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&amp;amp;display=swap';
				document.getElementsByTagName('head')[0].appendChild(fonts);
				document.body.innerHTML = &quot;&amp;lt;style&amp;gt;body{margin:0;padding:0;font-family: 'Noto Sans KR', sans-serif;overflow: hidden;height: 100%;}&amp;lt;/style&amp;gt;&amp;lt;h2 style='padding-top:50px; text-align:center;font-family: 'Noto Sans KR', sans-serif;'&amp;gt;인앱브라우저 호환문제로 인해&amp;lt;br /&amp;gt;Safari로 접속해야합니다.&amp;lt;/h2&amp;gt;&amp;lt;article style='text-align:center; font-size:17px; word-break:keep-all;color:#999;'&amp;gt;아래 버튼을 눌러 Safari를 실행해주세요&amp;lt;br /&amp;gt;Safari가 열리면, 주소창을 길게 터치한 뒤,&amp;lt;br /&amp;gt;'붙여놓기 및 이동'을 누르면&amp;lt;br /&amp;gt;정상적으로 이용할 수 있습니다.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;button onclick='inappbrowserout();' style='min-width:180px;margin-top:10px;height:54px;font-weight: 700;background-color:#31408E;color:#fff;border-radius: 4px;font-size:17px;border:0;'&amp;gt;Safari로 열기&amp;lt;/button&amp;gt;&amp;lt;/article&amp;gt;&amp;lt;img style='width:70%;margin:50px 15% 0 15%' src='https://tistory3.daumcdn.net/tistory/1893869/skin/images/inappbrowserout.jpeg' /&amp;gt;&quot;;
			
			}else{
				self.close()
				//안드로이드는 Chrome이 설치되어있음으로 강제로 스킴실행한다.
				location.href='intent://'+target_url.replace(/https?:\/\//i,'')+'#Intent;scheme=http;package=com.android.chrome;end';
			}
		}
	});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://burndogfather.com/271&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://burndogfather.com/271&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694768407162&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;카카오톡/라인 인앱브라우저에서 외부브라우저 띄우기 (2023.05.04 최신 - inapp browser bypassing)&quot; data-og-description=&quot;이전부터 카카오톡 등과 같은 메신저에서 인앱브라우저를 강제하는 불합리한 조치를 우회하기위해 다양한 방법을 이 블로그에 포스팅해왔었다. ftp프로토콜을 활용한 우회방법 : https://burndogfath&quot; data-og-host=&quot;burndogfather.com&quot; data-og-source-url=&quot;https://burndogfather.com/271&quot; data-og-url=&quot;https://burndogfather.com/271&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNja88/hyTVZFH8Go/z35ISaI8WogZboS8stSos1/img.jpg?width=800&amp;amp;height=709&amp;amp;face=512_295_703_502,https://scrap.kakaocdn.net/dn/brPOOz/hyTV0q5bE0/xYHy3I4dHxPxasEy0TVKYk/img.jpg?width=800&amp;amp;height=709&amp;amp;face=512_295_703_502,https://scrap.kakaocdn.net/dn/qaIk8/hyTVROs6xq/69mqdT2ACGFlx3CBIgbrd1/img.jpg?width=1920&amp;amp;height=1920&amp;amp;face=957_330_1683_1122&quot;&gt;&lt;a href=&quot;https://burndogfather.com/271&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://burndogfather.com/271&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNja88/hyTVZFH8Go/z35ISaI8WogZboS8stSos1/img.jpg?width=800&amp;amp;height=709&amp;amp;face=512_295_703_502,https://scrap.kakaocdn.net/dn/brPOOz/hyTV0q5bE0/xYHy3I4dHxPxasEy0TVKYk/img.jpg?width=800&amp;amp;height=709&amp;amp;face=512_295_703_502,https://scrap.kakaocdn.net/dn/qaIk8/hyTVROs6xq/69mqdT2ACGFlx3CBIgbrd1/img.jpg?width=1920&amp;amp;height=1920&amp;amp;face=957_330_1683_1122');&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;카카오톡/라인 인앱브라우저에서 외부브라우저 띄우기 (2023.05.04 최신 - inapp browser bypassing)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이전부터 카카오톡 등과 같은 메신저에서 인앱브라우저를 강제하는 불합리한 조치를 우회하기위해 다양한 방법을 이 블로그에 포스팅해왔었다. ftp프로토콜을 활용한 우회방법 : https://burndogfath&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;burndogfather.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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FrontEnd/JavaScript</category>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/224</guid>
      <comments>https://h-develop.tistory.com/224#entry224comment</comments>
      <pubDate>Fri, 15 Sep 2023 18:00:12 +0900</pubDate>
    </item>
    <item>
      <title>같은 인스턴스 호출 시, 캐시에 담아 부담을 덜 수 있다.</title>
      <link>https://h-develop.tistory.com/223</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;aop xml transaction 설정할 때, 이 방법도 있어 설정을 하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;유튜브에 GIS DEVELOPER 유튜버님의 디자인 패턴을 공부하던 중에&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;Facade 패턴보다가 방법이 생각났다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;Facade 패턴은 코드를 한곳에 다 쓰면 유지보수와 코드 읽기가 힘들어 분리시켜두는 방법이라고 이해하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;이분은 DB에서 조회하여 데이터를 Cache에 저장하고 다음 같은 DB를 조회 시, Cache에서 가져와 출력을 하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;
&lt;p style=&quot;background-color: #e8f2fe;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Cache.java&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1694692154278&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Cache {
	public static String value;
	public static List&amp;lt;?&amp;gt; uploadListA = new ArrayList&amp;lt;&amp;gt;();
	public static List&amp;lt;?&amp;gt; uploadListB = new ArrayList&amp;lt;&amp;gt;();

}&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;
&lt;p style=&quot;background-color: #e8f2fe;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Controller.java&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1694692423030&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (ObjectUtils.isEmpty(Cache.uploadListA) || ObjectUtils.isEmpty(Cache.uploadListB)
        || !i_accnum.equals(Cache.value)){
    uploadListA = archiveViewItemService.getUploadListSomethingOne(key);
    uploadListB = archiveViewItemService.getUploadListSomethingTwo(key);
    if(ObjectUtils.isEmpty(Cache.uploadListA) &amp;amp;&amp;amp; ObjectUtils.isEmpty(Cache.uploadListB) ) {
        // 캐시에 저장
        Cache.value = i_accnum;
        Cache.uploadListA = uploadListA; 
        Cache.uploadListB = uploadListB; 
    }
} else {
    uploadListA = Cache.uploadListA;
    uploadListB = Cache.uploadListB;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이, static에 담아주고 final도 생각했지만 다른 페이지에서는 다른값을 가져와야 하기에 final은 참아주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 캐시에 데이터가 없고 그전에 읽었던 값이랑 다르면(Cache.value로 그 전의 값을 저장했다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트를 저장하고 캐시에도 저장해준다.(그 전과 다른 값이면 값을 덮어준다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니면 캐시의 데이터를 넣어준다.&lt;/p&gt;</description>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/223</guid>
      <comments>https://h-develop.tistory.com/223#entry223comment</comments>
      <pubDate>Thu, 14 Sep 2023 20:53:52 +0900</pubDate>
    </item>
    <item>
      <title>aop xml transaction 설정</title>
      <link>https://h-develop.tistory.com/222</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 발단은 한 페이지에서 동영상 파일을 업로드 할 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔루션에서 제공하는 퍼센트 숫자가 계속 바뀌어지기에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setInterval() 함수로 컨트롤러를 계속 요청해서 문제가 되었다.&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://granya.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://granya.tistory.com/43&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694691291559&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- web.xml 

&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;
		/WEB-INF/spring/root-context.xml
		, /WEB-INF/spring/context-datasource.xml
		, /WEB-INF/spring/context-transaction.xml
	&amp;lt;/param-value&amp;gt;
&amp;lt;/context-param&amp;gt;
위와 같은 설정파일 추가 및 수정예정

- servlet-context.xml

&amp;lt;context:component-scan base-package=&quot;com.x.y&quot;&amp;gt;
	&amp;lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Controller&quot; /&amp;gt;
	&amp;lt;context:exclude-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Service&quot; /&amp;gt;
	&amp;lt;context:exclude-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Repository&quot; /&amp;gt;
&amp;lt;/context:component-scan&amp;gt;
context:component-scan에 Controller만 스캔함

- root-context.xml

&amp;lt;context:component-scan base-package=&quot;com.x.y&quot;&amp;gt;
	&amp;lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Service&quot;/&amp;gt;
	&amp;lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Repository&quot;/&amp;gt;
	&amp;lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Component&quot; /&amp;gt;
	&amp;lt;context:exclude-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Controller&quot; /&amp;gt;
&amp;lt;/context:component-scan&amp;gt;
context:component-scan에 Controller를 제외한 Service등 스캔함

- context-datasource.xml

&amp;lt;bean id=&quot;dataSource&quot;  class=&quot;org.apache.commons.dbcp.BasicDataSource&quot; destroy-method=&quot;close&quot;
	p:driverClassName=&quot;oracle.jdbc.driver.OracleDriver&quot;
	p:url=&quot;jdbc:oracle:thin:@192.168.0.111:1521:test&quot;
	p:username=&quot;test&quot;
	p:password=&quot;test#123&quot; /&amp;gt;
jdbc 설정

- context-transaction.xml

&amp;lt;bean id=&quot;txManager&quot; class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot; p:dataSource-ref=&quot;dataSource&quot; /&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;insert*&quot; timeout=&quot;600&quot; rollback-for=&quot;Exception&quot; /&amp;gt;
		&amp;lt;tx:method name=&quot;update*&quot; timeout=&quot;600&quot; rollback-for=&quot;Exception&quot; /&amp;gt;
		&amp;lt;tx:method name=&quot;delete*&quot; timeout=&quot;600&quot; rollback-for=&quot;Exception&quot; /&amp;gt;
		&amp;lt;tx:method name=&quot;*&quot; read-only=&quot;true&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;txPointcut&quot; expression=&quot;execution(* com.x.y.*.service..impl.*Impl.*(..))&quot; /&amp;gt;
	&amp;lt;aop:advisor advice-ref=&quot;txAdvice&quot; pointcut-ref=&quot;txPointcut&quot; /&amp;gt;
&amp;lt;/aop:config&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 보고, transactionManager를 설정해준다&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;pre id=&quot;code_1694691517256&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&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;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;*&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;txPointcut&quot; expression=&quot;execution(* 경로.filename1..*Impl.*(..)) or
												  execution(* 경로.filename2..*Impl.*(..))&quot;/&amp;gt;
		&amp;lt;aop:advisor advice-ref=&quot;txAdvice&quot; pointcut-ref=&quot;txPointcut&quot; /&amp;gt;
	&amp;lt;/aop:config&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 aop 설정을 마치면 모든 impl이 붙은 폴더 안의 파일들이 트렌젝션이 설정되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exception이 나면 롤백이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694691653719&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;bean id=&quot;txManager&quot; class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot; p:dataSource-ref=&quot;dataSource&quot; /&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;insert*&quot; timeout=&quot;600&quot; rollback-for=&quot;Exception&quot; /&amp;gt;
		&amp;lt;tx:method name=&quot;update*&quot; timeout=&quot;600&quot; rollback-for=&quot;Exception&quot; /&amp;gt;
		&amp;lt;tx:method name=&quot;delete*&quot; timeout=&quot;600&quot; rollback-for=&quot;Exception&quot; /&amp;gt;
		&amp;lt;tx:method name=&quot;*&quot; read-only=&quot;true&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;txPointcut&quot; expression=&quot;execution(* com.x.y.*.service..impl.*Impl.*(..))&quot; /&amp;gt;
	&amp;lt;aop:advisor advice-ref=&quot;txAdvice&quot; pointcut-ref=&quot;txPointcut&quot; /&amp;gt;
&amp;lt;/aop:config&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면, Service의 메서드명이 insert, update, delete로 시작하는 Service를 실행할 때 Exception이 나면 롤백하게 설정 그외 나머지는 read-only=&quot;true&quot; 속성으로 select만 가능하게 설정된다.&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;&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;&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;&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Framework/Spring</category>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/222</guid>
      <comments>https://h-develop.tistory.com/222#entry222comment</comments>
      <pubDate>Thu, 14 Sep 2023 20:41:15 +0900</pubDate>
    </item>
    <item>
      <title>db에 저장된 데이터가 서버에 파일이 있는지 확인 shell 사용</title>
      <link>https://h-develop.tistory.com/221</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;touch cat 명령어를 사용하면 파일을 만들 수 있다.&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;touch db.txt 를 만들고 데이터를 붙여넣은 다음,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;read.sh을 만들어서&lt;/p&gt;
&lt;pre id=&quot;code_1691569764345&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#! bin/bash

while read db; do
#       if [ -z &quot;$db&quot; ]; then continue; fi
#       echo &quot;$db&quot;
#done &amp;lt; data.txt

#if [[ -e $db ]]; then
#       echo &quot;FIle Exists&quot;
#fi

#file = &quot;/Vdrive/archive2020/item/2021/11/정사각형1(0).jpg&quot;
if [[ ! -e $db ]]; then
        echo $db &quot; File Does not Exists&quot;
fi
done &amp;lt; db.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넣었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 db.txt의 글을 한줄씩 읽는 것으로 짰고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 한줄씩 파일을 찾는 것으로 짰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while read db; do&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- db는 변수다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;done &amp;lt; db.text&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;-e 명령어로 파일을 찾고 !를 붙여서 없는 파일을 찾는 코드를 짠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo&amp;nbsp;$db&amp;nbsp;&quot;&amp;nbsp;File&amp;nbsp;Does&amp;nbsp;not&amp;nbsp;Exists&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- while read db; do 에서 만든 변수 $db를 넣어 db.txt의 한줄을 가져오고 &amp;nbsp;&quot; File Does not Exists&quot; 글귀를 추가한다.&lt;/p&gt;</description>
      <category>DataBase/Linux, MySQL</category>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/221</guid>
      <comments>https://h-develop.tistory.com/221#entry221comment</comments>
      <pubDate>Wed, 9 Aug 2023 17:32:13 +0900</pubDate>
    </item>
    <item>
      <title>maven build 시, package does not exist</title>
      <link>https://h-develop.tistory.com/220</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 프로젝트가 오래된 라이브러리를 사용해서인지 pom.xml에 없고 라이브러리를 따로 관리해서 연결해 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mvnrepository.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mvnrepository.com/&lt;/a&gt;에도 찾아보니 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 라이브러리 파일을 빌드패스에서 연결해두었는데, 왜 maven install 할 때, 에러가 나고 war파일 생성이 안되는지 이해를 할 수 없었다.&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;maven build 시, 얘가 받아들이는 것은 pom.xml에 작성해둔 dependencies만 받아들이는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따로 빌드 패스에 연결해둔 것은 인지하지 못하는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결방법은 maven에서 resource file 경로를 지정해주는 것이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;lt;build&amp;gt; 세션의 &amp;lt;sourceDirectory&amp;gt;, &amp;lt;outputDirectory&amp;gt;, &amp;lt;resources&amp;gt; 엘리먼트를 사용하여 source 디렉토리와 target 디렉토리를 설정 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1691371707373&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;build&amp;gt;		
  &amp;lt;sourceDirectory&amp;gt;${basedir}/src/main/java&amp;lt;/sourceDirectory&amp;gt;
  &amp;lt;outputDirectory&amp;gt;webapps/WEB-INF/classes&amp;lt;/outputDirectory&amp;gt;
  &amp;lt;resources&amp;gt;		    
    &amp;lt;resource&amp;gt;      
      &amp;lt;directory&amp;gt;${basedir}/src/main/resources&amp;lt;/directory&amp;gt;
    &amp;lt;/resource&amp;gt;
    &amp;lt;resource&amp;gt;			    
      &amp;lt;directory&amp;gt;${basedir}/src/main/resources-${env}&amp;lt;/directory&amp;gt;
    &amp;lt;/resource&amp;gt;
  &amp;lt;/resources&amp;gt;
  &amp;lt;testSourceDirectory&amp;gt;${basedir}/src/test/java&amp;lt;/testSourceDirectory&amp;gt;
  &amp;lt;testOutputDirectory&amp;gt;${basedir}/target/test-classes&amp;lt;/testOutputDirectory&amp;gt;
  &amp;lt;testResources&amp;gt;
    &amp;lt;testResource&amp;gt;
      &amp;lt;directory&amp;gt;${basedir}/src/test/resources&amp;lt;/directory&amp;gt;
    &amp;lt;/testResource&amp;gt;
  &amp;lt;/testResources&amp;gt;
  ...
  &amp;lt;plugins&amp;gt;
  ...
  &amp;lt;/plugins&amp;gt;
&amp;lt;/build&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://wiki.gurubee.net/pages/viewpage.action?pageId=2457625&lt;/p&gt;</description>
      <category>Framework/Spring</category>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/220</guid>
      <comments>https://h-develop.tistory.com/220#entry220comment</comments>
      <pubDate>Mon, 7 Aug 2023 10:28:35 +0900</pubDate>
    </item>
    <item>
      <title>JAR WAR 차이점</title>
      <link>https://h-develop.tistory.com/219</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현 직장에서 배포를 젠킨스로 자동화시키고 싶어서 작업 중,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAR와 JAR로 배포할 수 있는데 정확한 개념이 없어서 찾아보게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;|&amp;nbsp;&lt;/span&gt;JAR ( Java Archive )&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fffaa5;&quot;&gt;.jar&lt;/span&gt;&amp;nbsp;확장자 파일에는 Class와 같은 Java 리소스와 속성 파일,&amp;nbsp; 라이브러리 및 액세서리 파일이 포함되어 있습니다.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;쉽게 JAVA 어플리케이션이 동작할 수 있도록&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;자바 프로젝트를 압축한 파일&lt;/b&gt;로 생각하시면 되겠네요. 실제로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;JAR 파일은 플랫폼에 귀속되는 점만 제외하면 WIN ZIP파일과 동일한 구조&lt;/span&gt;입니다.&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;JAR 파일은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;원하는 구조로 구성이 가능&lt;/span&gt;하며 JDK(Java Development Kit)에 포함하고 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;JRE(Java Runtime Environment)만 가지고도 실행이 가능&lt;/span&gt;합니다.&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- spring boot는 내장 톰켓이 있기에 JAR 로 배포해도 괜찮다&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;|&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;WAR ( Web Application Archive )&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fffaa5;&quot;&gt;.war&lt;/span&gt;&lt;span&gt;&amp;nbsp;확장자 파일은&amp;nbsp; servlet / jsp 컨테이너에 배치 할 수 있는&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;웹 어플리케이션(Web Application) 압축 파일 포맷&lt;/span&gt;&lt;span&gt;입니다.&amp;nbsp; JSP,&amp;nbsp; SERVLET, JAR, CLASS, XML, HTML, JAVASCRIPT 등&amp;nbsp; Servlet Context 관련 파일들로 패키징 되어있습니다. WAR는 웹 응용 프로그램를 위한 포맷이기 때문에&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;웹 관련 자원만 포함하고 있으며&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&amp;nbsp;이를 사용하면 웹 어플리케이션을 쉽게 배포&lt;/b&gt;하고 테스트 할 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span&gt;원하는 구성을 할 수 있는 JAR 포맷과 달리 WAR은 WEB-INF 및 META-INF 디렉토리로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;사전 정의 된 구조를 사용&lt;/b&gt;하며&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;WAR파일을 실행하려면 Tomcat, Weblogic, Websphere 등의 웹 서버 (WEB)또는 웹 컨테이너(WAS)가 필요&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span style=&quot;color: #2d4fc9;&quot;&gt;WAR 파일도 JAVA의 JAR 옵션( java - jar)을 이용해 생성하는 JAR파일의 일종&lt;/span&gt;&lt;span&gt;으로 웹어플리케이션 전체를 패키징하기 위한 JAR파일로 생각하시면 될 것 같습니다.&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;&lt;span&gt;출처 :&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://ifuwanna.tistory.com/224&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ifuwanna.tistory.com/224&lt;/a&gt;&lt;/div&gt;</description>
      <category>개념정리</category>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/219</guid>
      <comments>https://h-develop.tistory.com/219#entry219comment</comments>
      <pubDate>Thu, 3 Aug 2023 13:54:30 +0900</pubDate>
    </item>
    <item>
      <title>Session 로그인 처리</title>
      <link>https://h-develop.tistory.com/218</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@chang626/%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%B2%98%EB%A6%AC-1-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-2&quot;&gt;https://velog.io/@chang626/%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%B2%98%EB%A6%AC-1-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-2&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689151646235&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;로그인 처리 1 - 쿠키, 세션 2&quot; data-og-description=&quot;'스프링 MVC 2편 - 백엔드 웹 개발 활용 기술' 수업을 듣고 정리한 내용입니다.&amp;nbsp;  목표앞서 쿠키에 중요한 정보를 보관하는 방법은 여러가지 보안 이슈가 있었다. 이 문제를 해결하려면 결국 중&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@chang626/%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%B2%98%EB%A6%AC-1-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-2&quot; data-og-url=&quot;https://velog.io/@chang626/로그인-처리-1-쿠키-세션-2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OunZN/hyTfsbYbFH/AQkA7SZruoBI9miyFgRZOK/img.png?width=2640&amp;amp;height=936&amp;amp;face=0_0_2640_936,https://scrap.kakaocdn.net/dn/ZCdbQ/hyTgOEmQF4/mvS25g91p5unicBlwOt2P0/img.png?width=2640&amp;amp;height=936&amp;amp;face=0_0_2640_936,https://scrap.kakaocdn.net/dn/eB47R/hyTfthC2wd/4Oq9Wr1Ao0szUglkftCRvk/img.png?width=3238&amp;amp;height=1814&amp;amp;face=0_0_3238_1814&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://velog.io/@chang626/%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%B2%98%EB%A6%AC-1-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-2&quot; data-source-url=&quot;https://velog.io/@chang626/%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%B2%98%EB%A6%AC-1-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OunZN/hyTfsbYbFH/AQkA7SZruoBI9miyFgRZOK/img.png?width=2640&amp;amp;height=936&amp;amp;face=0_0_2640_936,https://scrap.kakaocdn.net/dn/ZCdbQ/hyTgOEmQF4/mvS25g91p5unicBlwOt2P0/img.png?width=2640&amp;amp;height=936&amp;amp;face=0_0_2640_936,https://scrap.kakaocdn.net/dn/eB47R/hyTfthC2wd/4Oq9Wr1Ao0szUglkftCRvk/img.png?width=3238&amp;amp;height=1814&amp;amp;face=0_0_3238_1814');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;로그인 처리 1 - 쿠키, 세션 2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;'스프링 MVC 2편 - 백엔드 웹 개발 활용 기술' 수업을 듣고 정리한 내용입니다.&amp;nbsp;  목표앞서 쿠키에 중요한 정보를 보관하는 방법은 여러가지 보안 이슈가 있었다. 이 문제를 해결하려면 결국 중&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 가져왔다 설명 짱잘되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법 1&lt;/p&gt;
&lt;pre id=&quot;code_1689151646237&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @PostMapping(&quot;login&quot;)
    public String loginV2(@Valid @RequestBody LG0010VO form,
        BindingResult bindingResult, HttpServletResponse response, HttpServletRequest request) {

        if (bindingResult.hasErrors()) {
            return &quot;login/loginForm&quot;;
        }
        
        LG0010VO loginMember = LG0010Service.login(form);
        if (ObjectUtils.isEmpty(loginMember)) {
            bindingResult.reject(&quot;loginFail&quot;, &quot;아이디 또는 비밀번호가 맞지 않습니다.&quot;);
            return &quot;login/loginForm&quot;;
        }

        //로그인 성공 처리
        // 세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성
        HttpSession session = request.getSession();
        // 세션에 로그인 회원 정보 보관
        session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

        return &quot;redirect:/&quot;;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 아이디 비밀번호 확인해서 Session 생성으로 로그인 처리를 하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f06431;&quot;&gt;HttpSession&lt;/span&gt;&lt;span style=&quot;color: #d3af86;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dc3958;&quot;&gt;session&lt;/span&gt;&lt;span style=&quot;color: #d3af86;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dc3958;&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: #d3af86;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #8ab1b0;&quot;&gt;getSession&lt;/span&gt;&lt;span style=&quot;color: #d3af86;&quot;&gt;();&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;세션을 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dc3958;&quot;&gt;session&lt;/span&gt;&lt;span style=&quot;color: #d3af86;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #8ab1b0;&quot;&gt;setAttribute&lt;/span&gt;&lt;span style=&quot;color: #d3af86;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f06431;&quot;&gt;SessionConst&lt;/span&gt;&lt;span style=&quot;color: #d3af86;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dc3958;&quot;&gt;LOGIN_MEMBER&lt;/span&gt;&lt;span style=&quot;color: #d3af86;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dc3958;&quot;&gt;loginMember&lt;/span&gt;&lt;span style=&quot;color: #d3af86;&quot;&gt;);&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;setAttribute로 세션에 로그인 정보를 담는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689151646241&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        LG0010VO loginMember = (LG0010VO)session.getAttribute(SessionConst.LOGIN_MEMBER);
        model.addAttribute(&quot;member&quot;, loginMember);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러에서 세션을 불러올 때,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getAttribute로 key값인 sessionConst.LOGIN.MEMBER를 불러와 사용한다. ( loginMember.getLoginId() )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689151646241&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SessionConst {
    public static String LOGIN_MEMBER = &quot;loginMember&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key값은 상수로 따로 Class를 만들어 주었다.&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;방법 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #e9ecef; color: #212529; text-align: start;&quot;&gt;@SessionAttribute&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;session을 가져올 때만 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689151646242&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/&quot;)
public String homeLoginV3Spring(
        @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) {


    // 세션에 회원 데이터가 없으면 home
    if (loginMember == null) {
        return &quot;home&quot;;
    }

    // 세션이 유지되면 로그인으로 이동
    model.addAttribute(&quot;member&quot;, loginMember);
    return &quot;loginHome&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@SessionAttribute에 미리 key값으로 정의해둔 LOGIN_MEMBER를 가져와서 member에 담아 사용한다.&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;&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;&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;&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;&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>BackEnd/project</category>
      <author>H_Develop</author>
      <guid isPermaLink="true">https://h-develop.tistory.com/218</guid>
      <comments>https://h-develop.tistory.com/218#entry218comment</comments>
      <pubDate>Mon, 10 Jul 2023 10:09:19 +0900</pubDate>
    </item>
  </channel>
</rss>