<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>혼자 깨닫기 위함</title>
    <link>https://twoline.tistory.com/</link>
    <description>JAVA 를 이용해 Web 개발에 관한 혼자 정리한 블로그입니다. </description>
    <language>ko</language>
    <pubDate>Wed, 19 Aug 2026 11:00:46 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>선이데이</managingEditor>
    <item>
      <title>[SAP] fieldcatalog | 필드 카탈로그 옵션 보는 방법</title>
      <link>https://twoline.tistory.com/182</link>
      <description>&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;span&gt;fieldcatalog 더블 클릭&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RAqgG/btsMKfCzHfU/Fycb0rCkV6eKaX0eJd6e6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RAqgG/btsMKfCzHfU/Fycb0rCkV6eKaX0eJd6e6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RAqgG/btsMKfCzHfU/Fycb0rCkV6eKaX0eJd6e6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRAqgG%2FbtsMKfCzHfU%2FFycb0rCkV6eKaX0eJd6e6K%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;246&quot; height=&quot;114&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;114&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;slis_t_fieldcat_alv 타입 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tzIWY/btsMKCYzRyw/zC0yjnfpfIo74Xs89LS1mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tzIWY/btsMKCYzRyw/zC0yjnfpfIo74Xs89LS1mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tzIWY/btsMKCYzRyw/zC0yjnfpfIo74Xs89LS1mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtzIWY%2FbtsMKCYzRyw%2FzC0yjnfpfIo74Xs89LS1mk%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;620&quot; height=&quot;28&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;28&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;slis_fieldcat_alv 타입 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvKjrS/btsMJHsOiwX/ZXG3KIF0fUT9sNQXYo2KfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvKjrS/btsMJHsOiwX/ZXG3KIF0fUT9sNQXYo2KfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvKjrS/btsMJHsOiwX/ZXG3KIF0fUT9sNQXYo2KfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvKjrS%2FbtsMJHsOiwX%2FZXG3KIF0fUT9sNQXYo2KfK%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;605&quot; height=&quot;41&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;41&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;slis_fieldcat_main&lt;span&gt;. 클릭&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/52ZWo/btsMKv6d7ZS/KXLjpjx0M7tWLBCDuOYqHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/52ZWo/btsMKv6d7ZS/KXLjpjx0M7tWLBCDuOYqHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/52ZWo/btsMKv6d7ZS/KXLjpjx0M7tWLBCDuOYqHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F52ZWo%2FbtsMKv6d7ZS%2FKXLjpjx0M7tWLBCDuOYqHK%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;401&quot; height=&quot;98&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;98&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;slis_fieldcat_main0&lt;span&gt;. 클릭 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/teHja/btsMJJKUR3C/YQeS7a2OnVoqQkURNkSIOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/teHja/btsMJJKUR3C/YQeS7a2OnVoqQkURNkSIOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/teHja/btsMJJKUR3C/YQeS7a2OnVoqQkURNkSIOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FteHja%2FbtsMJJKUR3C%2FYQeS7a2OnVoqQkURNkSIOK%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;385&quot; height=&quot;92&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;92&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 타입타고 들어오면 옵션 리스트들이 나온다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BS6AK/btsMKGs80N6/MaqPj7fwmpa3WS7JFKk88k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BS6AK/btsMKGs80N6/MaqPj7fwmpa3WS7JFKk88k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BS6AK/btsMKGs80N6/MaqPj7fwmpa3WS7JFKk88k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBS6AK%2FbtsMKGs80N6%2FMaqPj7fwmpa3WS7JFKk88k%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;455&quot; height=&quot;577&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;577&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SAP ERP 개발</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/182</guid>
      <comments>https://twoline.tistory.com/182#entry182comment</comments>
      <pubDate>Thu, 13 Mar 2025 20:33:34 +0900</pubDate>
    </item>
    <item>
      <title>[SAP] 프로그램 직접 만들어 'SPFLI 테이블'을 이용해 ALV 출력해보기</title>
      <link>https://twoline.tistory.com/181</link>
      <description>&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;size18&quot;&gt;1. &lt;b&gt;/ose11&lt;/b&gt; 검색해서 se11 실행하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;/o&lt;/b&gt; : 새 창 띄우기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/se11&lt;/b&gt; : ABAP Dictionary 화면 열기&lt;/li&gt;
&lt;li&gt;&lt;b&gt; ABAP Dictionary&lt;/b&gt; 란? SAP 시스템에서 데이터를 저장하는 데이터베이스 테이블, 뷰, 데이터 타입 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. SPFLI 테이블 검색하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- display 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjGAuM/btsMKuzkIkx/xTtzZZPmnC50huMgwa4qk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjGAuM/btsMKuzkIkx/xTtzZZPmnC50huMgwa4qk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjGAuM/btsMKuzkIkx/xTtzZZPmnC50huMgwa4qk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjGAuM%2FbtsMKuzkIkx%2FxTtzZZPmnC50huMgwa4qk0%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;587&quot; height=&quot;541&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;541&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;&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;SPFLI 테이블의 필드 정보, 데이터 타입 등 정보들이 나온다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r7Koh/btsMKilCWRn/7V7axJLI3guEYZK4q5nTck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r7Koh/btsMKilCWRn/7V7axJLI3guEYZK4q5nTck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r7Koh/btsMKilCWRn/7V7axJLI3guEYZK4q5nTck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr7Koh%2FbtsMKilCWRn%2F7V7axJLI3guEYZK4q5nTck%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;1040&quot; height=&quot;742&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;742&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;&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;size18&quot;&gt;3. SPFLI 테이블의 ALV 출력해서 데이터 보기&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;상단에 Contents 버튼 클릭 &amp;gt; Execute 버튼 차례로 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PoXwc/btsMKprgYCk/hGcTuDbVEfW6MKh4xfFgv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PoXwc/btsMKprgYCk/hGcTuDbVEfW6MKh4xfFgv0/img.png&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;71&quot; data-is-animation=&quot;false&quot; style=&quot;width: 61.4308%; margin-right: 10px;&quot; data-widthpercent=&quot;62.15&quot; id=&quot;kEditorPhotosEditingImage-2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PoXwc/btsMKprgYCk/hGcTuDbVEfW6MKh4xfFgv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPoXwc%2FbtsMKprgYCk%2FhGcTuDbVEfW6MKh4xfFgv0%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;212&quot; height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lzV7F/btsMKep2a1p/xffD1lsTwhaJpoaUKAONY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lzV7F/btsMKep2a1p/xffD1lsTwhaJpoaUKAONY0/img.png&quot; data-origin-width=&quot;120&quot; data-origin-height=&quot;66&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.4064%;&quot; data-widthpercent=&quot;37.85&quot; id=&quot;kEditorPhotosEditingImage-3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lzV7F/btsMKep2a1p/xffD1lsTwhaJpoaUKAONY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlzV7F%2FbtsMKep2a1p%2FxffD1lsTwhaJpoaUKAONY0%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;120&quot; height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPFLI 테이블의 실제 데이터들을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;gt; SPFLI&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 테이블은 항공편 정보를 담고 있어서 항공편 정보 데이터들이 조회가 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7N0dr/btsMJNlUxYC/VsP20jW5j3c2TNArRcv80K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7N0dr/btsMJNlUxYC/VsP20jW5j3c2TNArRcv80K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7N0dr/btsMJNlUxYC/VsP20jW5j3c2TNArRcv80K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7N0dr%2FbtsMJNlUxYC%2FVsP20jW5j3c2TNArRcv80K%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;1497&quot; height=&quot;482&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;482&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;639&quot; data-start=&quot;617&quot;&gt;&lt;b&gt;CONNID:&lt;/b&gt; 항공편 번호&lt;/li&gt;
&lt;li data-end=&quot;682&quot; data-start=&quot;640&quot;&gt;&lt;b&gt;CARRID:&lt;/b&gt; 항공사 코드&lt;/li&gt;
&lt;li data-end=&quot;682&quot; data-start=&quot;640&quot;&gt;&lt;b&gt;CITYFROM / CITYTO:&lt;/b&gt; 출발지 &amp;amp; 도착지&lt;/li&gt;
&lt;li data-end=&quot;682&quot; data-start=&quot;640&quot;&gt;&lt;b&gt;FLTIME:&lt;/b&gt; 비행 시간&lt;/li&gt;
&lt;li data-end=&quot;682&quot; data-start=&quot;640&quot;&gt;.....&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;이제 내가 프로그램을 직접 생성해서 SPFLI 테이블의 데이터를 직접 코드를 만들고 ALV를 출력해보자&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;size18&quot;&gt;1. SE80 검색 후 프로그램 생성하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2025-03-13 183759.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kwyf9/btsMJLaARK9/lKi0pFE8L8drGhtOTpOIDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kwyf9/btsMJLaARK9/lKi0pFE8L8drGhtOTpOIDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kwyf9/btsMJLaARK9/lKi0pFE8L8drGhtOTpOIDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkwyf9%2FbtsMJLaARK9%2FlKi0pFE8L8drGhtOTpOIDk%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;1208&quot; height=&quot;811&quot; data-filename=&quot;화면 캡처 2025-03-13 183759.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;811&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;&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;size18&quot;&gt;2. 우측 코드 수정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;abap alv example 구글링하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;*첫번째 링크에 들어가서 맨 아래 두번째 코드 참조했음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://community.sap.com/t5/application-development-discussions/sample-alv-program-using-reuse-alv-grid-display/m-p/3647449&quot;&gt;https://community.sap.com/t5/application-development-discussions/sample-alv-program-using-reuse-alv-grid-display/m-p/3647449&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741864379232&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;Sample ALV program using REUSE_ALV_GRID_DISPLAY&quot; data-og-description=&quot;Hi, I need a sample alv program using REUSE_ALV_GRID_DISPLAY. I want to know how to populate the the fieldcatalog and the layout... Thanks a lot!&quot; data-og-host=&quot;community.sap.com&quot; data-og-source-url=&quot;https://community.sap.com/t5/application-development-discussions/sample-alv-program-using-reuse-alv-grid-display/m-p/3647449&quot; data-og-url=&quot;https://community.sap.com/t5/application-development-discussions/sample-alv-program-using-reuse-alv-grid-display/m-p/3647449#M878414&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pnzGk/hyYrUsPRZu/lRoKWRd0hDPzsjwckufwx1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://community.sap.com/t5/application-development-discussions/sample-alv-program-using-reuse-alv-grid-display/m-p/3647449&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://community.sap.com/t5/application-development-discussions/sample-alv-program-using-reuse-alv-grid-display/m-p/3647449&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pnzGk/hyYrUsPRZu/lRoKWRd0hDPzsjwckufwx1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&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;Sample ALV program using REUSE_ALV_GRID_DISPLAY&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Hi, I need a sample alv program using REUSE_ALV_GRID_DISPLAY. I want to know how to populate the the fieldcatalog and the layout... Thanks a lot!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;community.sap.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;▼ 코드&lt;/p&gt;
&lt;pre id=&quot;code_1741859085929&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Report Z2WEEK_ALV11
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;
*&amp;amp;---------------------------------------------------------------------*
REPORT Z2WEEK_ALV02.


TABLES: SPFLI    .

TYPE-POOLS: slis.                                 &quot;ALV Declarations

*Data Declaration
*----------------
TYPES: BEGIN OF t_spfli,
  mandt TYPE spfli-mandt,
  carrid TYPE spfli-carrid,
  CONNID TYPE spfli-CONNID,
  COUNTRYFR TYPE spfli-COUNTRYFR,
  CITYFROM TYPE spfli-CITYFROM,
  AIRPFROM TYPE spfli-AIRPFROM,
  COUNTRYTO TYPE spfli-COUNTRYTO,
  CITYTO TYPE spfli-CITYTO,
  AIRPTO TYPE spfli-AIRPTO,
  FLTIME TYPE spfli-FLTIME,
  DEPTIME TYPE spfli-DEPTIME,
  ARRTIME TYPE spfli-ARRTIME,
  DISTANCE TYPE spfli-DISTANCE,
  DISTID TYPE spfli-DISTID,
  FLTYPE TYPE spfli-FLTYPE,
  PERIOD TYPE spfli-PERIOD,
 END OF t_spfli.

DATA: it_spfli TYPE STANDARD TABLE OF t_spfli INITIAL SIZE 0,
      wa_spfli TYPE t_spfli.

*ALV data declarations
DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      gd_tab_group TYPE slis_t_sp_group_alv,
      gd_layout    TYPE slis_layout_alv,
      gd_repid     LIKE sy-repid.


DATA : t TYPE slis_t_sp_group_alv .
************************************************************************
*Start-of-selection.
START-OF-SELECTION.

  PERFORM data_retrieval.
  PERFORM build_fieldcatalog.
  PERFORM build_layout.
  PERFORM display_alv_report.


*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  BUILD_FIELDCATALOG
*&amp;amp;---------------------------------------------------------------------*
*       Build Fieldcatalog for ALV Report
*----------------------------------------------------------------------*
FORM build_fieldcatalog.

  fieldcatalog-fieldname   = 'MANDT'.
  fieldcatalog-seltext_m   = 'Client'.
  fieldcatalog-col_pos     = 0.
  fieldcatalog-outputlen   = 10.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'CARRID'.
  fieldcatalog-seltext_m   = 'Airline Code'.
  fieldcatalog-col_pos     = 1.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'CONNID'.
  fieldcatalog-seltext_m   = 'Flight Connection Number'.
  fieldcatalog-col_pos     = 2.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'COUNTRYFR'.
  fieldcatalog-seltext_m   = 'Country Key'.
  fieldcatalog-col_pos     = 3.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'CITYFROM'.
  fieldcatalog-seltext_m   = 'Departure city'.
  fieldcatalog-col_pos     = 4.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'AIRPFROM'.
  fieldcatalog-seltext_m   = 'Departure airport'.
  fieldcatalog-col_pos     = 5.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'COUNTRYTO'.
  fieldcatalog-seltext_m   = 'Country Key'.
  fieldcatalog-col_pos     = 6.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'CITYTO'.
  fieldcatalog-seltext_m   = 'Arrival city'.
  fieldcatalog-col_pos     = 7.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'AIRPTO'.
  fieldcatalog-seltext_m   = 'Destination airport'.
  fieldcatalog-col_pos     = 8.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'FLTIME'.
  fieldcatalog-seltext_m   = 'Flight time'.
  fieldcatalog-col_pos     = 9.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'DEPTIME'.
  fieldcatalog-seltext_m   = 'Departure time'.
  fieldcatalog-col_pos     = 10.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ARRTIME'.
  fieldcatalog-seltext_m   = 'Arrival time'.
  fieldcatalog-col_pos     = 11.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'DISTANCE'.
  fieldcatalog-seltext_m   = 'Distance'.
  fieldcatalog-col_pos     = 12.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'DISTID'.
  fieldcatalog-seltext_m   = 'Mass unit of distance (kms, miles)'.
  fieldcatalog-col_pos     = 13.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'FLTYPE'.
  fieldcatalog-seltext_m   = 'Flight type'.
  fieldcatalog-col_pos     = 14.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'PERIOD'.
  fieldcatalog-seltext_m   = 'Arrival n day(s) later'.
  fieldcatalog-col_pos     = 15.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.



ENDFORM.                    &quot; BUILD_FIELDCATALOG


*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  BUILD_LAYOUT
*&amp;amp;---------------------------------------------------------------------*
*       Build layout for ALV grid report
*----------------------------------------------------------------------*
FORM build_layout.

  gd_layout-no_input          = 'X'.
  gd_layout-colwidth_optimize = 'X'.
  gd_layout-zebra = 'X'.
*  gd_layout-info_fieldname =      'LINE_COLOR'.
*  gd_layout-def_status = 'A'.

ENDFORM.                    &quot; BUILD_LAYOUT


*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  DISPLAY_ALV_REPORT
*&amp;amp;---------------------------------------------------------------------*
*       Display report using ALV grid
*----------------------------------------------------------------------*
FORM display_alv_report.
  gd_repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = gd_repid
      is_layout          = gd_layout
      it_fieldcat        = fieldcatalog[]
      i_save             = 'X'
    TABLES
      t_outtab           = it_spfli
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc &amp;lt;&amp;gt; 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


ENDFORM.                    &quot; DISPLAY_ALV_REPORT


*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  DATA_RETRIEVAL
*&amp;amp;---------------------------------------------------------------------*
*       Retrieve data form EKPO table and populate itab it_ekko
*----------------------------------------------------------------------*
FORM data_retrieval.
  DATA: ld_color(1) TYPE c.

  SELECT mandt carrid CONNID COUNTRYFR CITYFROM AIRPFROM COUNTRYTO CITYTO AIRPTO FLTIME DEPTIME ARRTIME DISTANCE DISTID FLTYPE PERIOD
*   UP TO 10 ROWS
    FROM spfli
    INTO TABLE it_spfli.

ENDFORM.                    &quot; DATA_RETRIEVAL&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;&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;SPFLI로&lt;span&gt;&amp;nbsp;다 수정하고 &lt;/span&gt;&lt;/span&gt;SPFLI 테이블의 필드와 설명란 그대로 복붙해서 수정하면된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwDsMJ/btsMJ2i3UN8/GdYPFINvmTmQOsZ0UKkDTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwDsMJ/btsMJ2i3UN8/GdYPFINvmTmQOsZ0UKkDTK/img.png&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;407&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.7837%; margin-right: 10px;&quot; data-widthpercent=&quot;40.25&quot; id=&quot;kEditorPhotosEditingImage-6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwDsMJ/btsMJ2i3UN8/GdYPFINvmTmQOsZ0UKkDTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwDsMJ%2FbtsMJ2i3UN8%2FGdYPFINvmTmQOsZ0UKkDTK%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;192&quot; height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z0txf/btsMKBFjZ0Z/CxKEG0hNSv7zULJE2LkfMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z0txf/btsMKBFjZ0Z/CxKEG0hNSv7zULJE2LkfMK/img.png&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;417&quot; data-is-animation=&quot;false&quot; style=&quot;width: 59.0535%;&quot; data-widthpercent=&quot;59.75&quot; id=&quot;kEditorPhotosEditingImage-7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z0txf/btsMKBFjZ0Z/CxKEG0hNSv7zULJE2LkfMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz0txf%2FbtsMKBFjZ0Z%2FCxKEG0hNSv7zULJE2LkfMK%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;292&quot; height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ 마지막엔 필드 나열하기&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;SELECT&amp;nbsp;mandt&amp;nbsp;carrid&amp;nbsp;CONNID&amp;nbsp;COUNTRYFR&amp;nbsp;CITYFROM&amp;nbsp;AIRPFROM&amp;nbsp;COUNTRYTO&amp;nbsp;CITYTO&amp;nbsp;AIRPTO&amp;nbsp;FLTIME&amp;nbsp;DEPTIME&amp;nbsp;ARRTIME&amp;nbsp;DISTANCE&amp;nbsp;DISTID&amp;nbsp;FLTYPE&amp;nbsp;PERIOD&lt;br /&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;UP&amp;nbsp;TO&amp;nbsp;10&amp;nbsp;ROWS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM&amp;nbsp;spfli&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTO&amp;nbsp;TABLE&amp;nbsp;it_spfli.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;코드 수정했으면 &lt;b&gt;Active &amp;gt; DIRECT PROCESSING 버튼&lt;/b&gt; 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;76&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kU8g1/btsMKs2FV5l/ObnM6ZSryWuf4AtyYyMhwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kU8g1/btsMKs2FV5l/ObnM6ZSryWuf4AtyYyMhwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kU8g1/btsMKs2FV5l/ObnM6ZSryWuf4AtyYyMhwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkU8g1%2FbtsMKs2FV5l%2FObnM6ZSryWuf4AtyYyMhwk%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;76&quot; height=&quot;47&quot; data-origin-width=&quot;76&quot; data-origin-height=&quot;47&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;&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;size18&quot;&gt;4. 내가 생성한 &lt;b&gt;SPFLI 테이블의 데이터를 ALV 형태로 출력한 결과&lt;/b&gt;를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfqrpd/btsMIqZMxlh/jrwFNSU5lejkQ9t4sLzEbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfqrpd/btsMIqZMxlh/jrwFNSU5lejkQ9t4sLzEbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfqrpd/btsMIqZMxlh/jrwFNSU5lejkQ9t4sLzEbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfqrpd%2FbtsMIqZMxlh%2FjrwFNSU5lejkQ9t4sLzEbk%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;1582&quot; height=&quot;491&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;491&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이것을 처음에 se11 검색했을때 &lt;b&gt;SPFLI 테이블과 비교하면 다른점이 있다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;다른부분 3가지&lt;/b&gt;&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&gt;&lt;b&gt;CONNID 앞에 빈 자리수 00으로 채우기&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Flight time &lt;/b&gt;&lt;b&gt;정수부분으로 바꾸기&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Distance 소수점을 없애기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; fieldcatalog (필드 카탈로그) 옵션&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;CONNID앞에 00이 나오게 하는 방법&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. &lt;b&gt;fieldcatalog-datatype =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;'CHAR'&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자인 CONNID 를 CHAR 문자열로 바꾸면 0 으로 채워진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;fieldcatalog-fieldname&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;'CONNID'.&lt;br /&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-seltext_m&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;'Flight&amp;nbsp;Connection&amp;nbsp;Number'.&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-datatype = &lt;span&gt;&lt;span&gt;'CHAR'&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-col_pos&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;2.&lt;br /&gt;&amp;nbsp;&amp;nbsp;APPEND&amp;nbsp;fieldcatalog&amp;nbsp;TO&amp;nbsp;fieldcatalog.&lt;br /&gt;&amp;nbsp;&amp;nbsp;CLEAR&amp;nbsp;&amp;nbsp;fieldcatalog.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;fieldcatalog&lt;span&gt;-&lt;/span&gt;inttype&amp;nbsp;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;'c'&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;fieldcatalog&lt;span&gt;-&lt;/span&gt;LZERO&amp;nbsp;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;'X'&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&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;LZERO : 선행에 0 출력 여부&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;= ' ' 만 하면 0이 출력 안되고 X를 해야 0이 출력 (&lt;span style=&quot;background-color: #ffffff;&quot;&gt;alv 출력에만 영향을 준다.)&lt;/span&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;b&gt;&lt;span&gt;&amp;gt; NUMC 필드를 위한 옵션이라 LZERO 옵션을 가장 많이 쓴다.&lt;/span&gt;&lt;/b&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;&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o1dh3/btsMKaOOz63/PKF1HxbXskKsObuV6ZkTKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o1dh3/btsMKaOOz63/PKF1HxbXskKsObuV6ZkTKk/img.png&quot; data-origin-width=&quot;141&quot; data-origin-height=&quot;326&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.4875%; margin-right: 10px;&quot; data-widthpercent=&quot;48.05&quot; id=&quot;kEditorPhotosEditingImage-10&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o1dh3/btsMKaOOz63/PKF1HxbXskKsObuV6ZkTKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo1dh3%2FbtsMKaOOz63%2FPKF1HxbXskKsObuV6ZkTKk%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;141&quot; height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2e1CM/btsMJdlnEgi/6CIDzRgc0puTkoS28AXTYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2e1CM/btsMJdlnEgi/6CIDzRgc0puTkoS28AXTYk/img.png&quot; data-origin-width=&quot;152&quot; data-origin-height=&quot;325&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;51.95&quot; style=&quot;width: 51.3497%;&quot; id=&quot;kEditorPhotosEditingImage-11&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2e1CM/btsMJdlnEgi/6CIDzRgc0puTkoS28AXTYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2e1CM%2FbtsMJdlnEgi%2F6CIDzRgc0puTkoS28AXTYk%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;152&quot; height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;nbsp; 숫자 0 으로 채워짐&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;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;정수로 변환&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;fieldcatalog-edit_mask&amp;nbsp;&amp;nbsp;=&amp;nbsp;'__________'.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-fieldname&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;'FLTIME'.&lt;br /&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-seltext_m&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;'Flight&amp;nbsp;time'.&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-edit_mask&amp;nbsp;&amp;nbsp;=&amp;nbsp;'__________'.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-col_pos&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;9.&lt;br /&gt;&amp;nbsp;&amp;nbsp;APPEND&amp;nbsp;fieldcatalog&amp;nbsp;TO&amp;nbsp;fieldcatalog.&lt;br /&gt;&amp;nbsp;&amp;nbsp;CLEAR&amp;nbsp;&amp;nbsp;fieldcatalog.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'_' 언더바를 10자리로 하는 이유?&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;최대 10자리까지 들어갈 수 있어서 10자리 수 언더바를 쓴다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dd8rKK/btsMKCdd6oS/S5GRsK95HztWnVRHF5fTak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dd8rKK/btsMKCdd6oS/S5GRsK95HztWnVRHF5fTak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dd8rKK/btsMKCdd6oS/S5GRsK95HztWnVRHF5fTak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdd8rKK%2FbtsMKCdd6oS%2FS5GRsK95HztWnVRHF5fTak%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;590&quot; height=&quot;32&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;32&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;&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8Ts5X/btsMKdSj9DG/bQRM9b00Wrvgmu1UmnBPOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8Ts5X/btsMKdSj9DG/bQRM9b00Wrvgmu1UmnBPOK/img.png&quot; style=&quot;width: 50.5012%; margin-right: 10px;&quot; data-widthpercent=&quot;51.1&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;317&quot; data-origin-width=&quot;72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8Ts5X/btsMKdSj9DG/bQRM9b00Wrvgmu1UmnBPOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8Ts5X%2FbtsMKdSj9DG%2FbQRM9b00Wrvgmu1UmnBPOK%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;72&quot; height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz6ORY/btsMKByBTd8/chG5uzntA7mcxacChl0AlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz6ORY/btsMKByBTd8/chG5uzntA7mcxacChl0AlK/img.png&quot; id=&quot;kEditorPhotosEditingImage-15&quot; style=&quot;width: 48.336%;&quot; data-widthpercent=&quot;48.9&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;322&quot; data-origin-width=&quot;70&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz6ORY/btsMKByBTd8/chG5uzntA7mcxacChl0AlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz6ORY%2FbtsMKByBTd8%2FchG5uzntA7mcxacChl0AlK%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;70&quot; height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;blockquote data-ke-style=&quot;style2&quot;&gt;소수점 없애기&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;fieldcatalog&lt;span&gt;-&lt;/span&gt;decimals_out&amp;nbsp;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;'0'&lt;/span&gt;&lt;span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-fieldname&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;'DISTANCE'.&lt;br /&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-seltext_m&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;'Distance'.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;fieldcatalog-decimals_out&amp;nbsp;=&amp;nbsp;'0'.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;fieldcatalog-col_pos&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;12.&lt;br /&gt;&amp;nbsp;&amp;nbsp;APPEND&amp;nbsp;fieldcatalog&amp;nbsp;TO&amp;nbsp;fieldcatalog.&lt;br /&gt;&amp;nbsp;&amp;nbsp;CLEAR&amp;nbsp;&amp;nbsp;fieldcatalog.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJXZIP/btsMKxXg2jb/gJgDuEL7g3iKyYhkxIlTk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJXZIP/btsMKxXg2jb/gJgDuEL7g3iKyYhkxIlTk0/img.png&quot; data-origin-width=&quot;95&quot; data-origin-height=&quot;320&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;60.51&quot; id=&quot;kEditorPhotosEditingImage-13&quot; style=&quot;width: 59.806%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJXZIP/btsMKxXg2jb/gJgDuEL7g3iKyYhkxIlTk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJXZIP%2FbtsMKxXg2jb%2FgJgDuEL7g3iKyYhkxIlTk0%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;95&quot; height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rZD9i/btsMKg2ylzg/WvgJFIZNuT2msFXcaGbIX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rZD9i/btsMKg2ylzg/WvgJFIZNuT2msFXcaGbIX1/img.png&quot; data-origin-width=&quot;62&quot; data-origin-height=&quot;320&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;39.49&quot; id=&quot;kEditorPhotosEditingImage-12&quot; style=&quot;width: 39.0313%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rZD9i/btsMKg2ylzg/WvgJFIZNuT2msFXcaGbIX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrZD9i%2FbtsMKg2ylzg%2FWvgJFIZNuT2msFXcaGbIX1%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;62&quot; height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;h3 data-ke-size=&quot;size23&quot;&gt;결과물&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biGwDM/btsMKwYlWnU/5tCdRegGscqBUdaK88MK71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biGwDM/btsMKwYlWnU/5tCdRegGscqBUdaK88MK71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biGwDM/btsMKwYlWnU/5tCdRegGscqBUdaK88MK71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiGwDM%2FbtsMKwYlWnU%2F5tCdRegGscqBUdaK88MK71%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;1542&quot; height=&quot;407&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;407&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>SAP ERP 개발</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/181</guid>
      <comments>https://twoline.tistory.com/181#entry181comment</comments>
      <pubDate>Thu, 13 Mar 2025 20:20:51 +0900</pubDate>
    </item>
    <item>
      <title>[SAP] 서버 라이센스, DB 라이센스 갱신하는 방법 | sap Logon 비밀번호 잠금해제</title>
      <link>https://twoline.tistory.com/179</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;라이센스&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;sap서버 라이센스&lt;/b&gt;와 &lt;b&gt;DB라이센스&lt;/b&gt; 두 개가 있다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;두 라이센스 갱신하는 법&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SAP 서버 라이센스는&amp;nbsp;SAP LOGON 프로그램에서 3개월마다 갱신 해야한다&lt;/li&gt;
&lt;li&gt;DB라이선스는 (ABAP사이트에서 재다운)&amp;nbsp; Win SCP 프로그램에서 2년 마다 갱신을 해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;color: #333333;&quot;&gt;먼저 서버를 올린 후에 WinSCP 프로그램 접속한다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mFzRr/btsMyUrM94q/Mtk8xqJVO6JbTa1jZy6dU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mFzRr/btsMyUrM94q/Mtk8xqJVO6JbTa1jZy6dU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mFzRr/btsMyUrM94q/Mtk8xqJVO6JbTa1jZy6dU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmFzRr%2FbtsMyUrM94q%2FMtk8xqJVO6JbTa1jZy6dU1%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;725&quot; height=&quot;531&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;531&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;span style=&quot;color: #333333;&quot;&gt;아래처럼 차례로 치기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;sudo -i&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;비밀번호 치기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;su npladm&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;startsap all&amp;nbsp;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;WinSCP 프로그램&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;root 사용자로 로그인 하기&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pIEqh/btsMzRuCg1v/TAG2Z8KHlgurbxtkZ3k8xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pIEqh/btsMzRuCg1v/TAG2Z8KHlgurbxtkZ3k8xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pIEqh/btsMzRuCg1v/TAG2Z8KHlgurbxtkZ3k8xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpIEqh%2FbtsMzRuCg1v%2FTAG2Z8KHlgurbxtkZ3k8xk%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;455&quot; height=&quot;111&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yf6iX/btsMzq4Zygy/aqlp8BHiBZeM93h6FUrNL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yf6iX/btsMzq4Zygy/aqlp8BHiBZeM93h6FUrNL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yf6iX/btsMzq4Zygy/aqlp8BHiBZeM93h6FUrNL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyf6iX%2FbtsMzq4Zygy%2Faqlp8BHiBZeM93h6FUrNL1%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;1340&quot; height=&quot;817&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;817&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;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;호스트 이름 : 127.0.0.1&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;포트번호 : 22&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;사용자이름 : root&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;비밀번호 : Down1oad &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;로그인&lt;/b&gt;&amp;nbsp;버튼&amp;nbsp;클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTp9R/btsMxnaXZ2W/xONzIfZ9O0VQHTLkbR5r3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTp9R/btsMxnaXZ2W/xONzIfZ9O0VQHTLkbR5r3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTp9R/btsMxnaXZ2W/xONzIfZ9O0VQHTLkbR5r3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTp9R%2FbtsMxnaXZ2W%2FxONzIfZ9O0VQHTLkbR5r3k%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;206&quot; height=&quot;142&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;hostname, hosts 이름 수정하는 법!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;etc 폴더 &amp;gt; hostname, hosts&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/owrpS/btsMy3hY6BO/jxv9PVCFRfG2JeKtP5T6s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/owrpS/btsMy3hY6BO/jxv9PVCFRfG2JeKtP5T6s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/owrpS/btsMy3hY6BO/jxv9PVCFRfG2JeKtP5T6s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FowrpS%2FbtsMy3hY6BO%2Fjxv9PVCFRfG2JeKtP5T6s1%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;281&quot; height=&quot;321&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;321&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;span style=&quot;color: #333333;&quot;&gt;여기서 hostname 수정(또는 hosts 수정)도 가능&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bryUO8/btsMyC52Msa/oi0KuRLktnkflHcDcZq2h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bryUO8/btsMyC52Msa/oi0KuRLktnkflHcDcZq2h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bryUO8/btsMyC52Msa/oi0KuRLktnkflHcDcZq2h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbryUO8%2FbtsMyC52Msa%2Foi0KuRLktnkflHcDcZq2h0%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;610&quot; height=&quot;198&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;198&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;&amp;nbsp;&lt;/p&gt;
&lt;p 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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;DB 라이센스 갱신하는 방법&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctPA02/btsMyIkM3YS/qsnA1RN6BQZ1vwtEK7gfC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctPA02/btsMyIkM3YS/qsnA1RN6BQZ1vwtEK7gfC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctPA02/btsMyIkM3YS/qsnA1RN6BQZ1vwtEK7gfC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctPA02%2FbtsMyIkM3YS%2FqsnA1RN6BQZ1vwtEK7gfC1%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;352&quot; height=&quot;623&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;sybase 폴더 클릭&lt;/span&gt;&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG4bV1/btsMy4A7t7Z/OSkIvkacvf0XYjHM8kov2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG4bV1/btsMy4A7t7Z/OSkIvkacvf0XYjHM8kov2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG4bV1/btsMy4A7t7Z/OSkIvkacvf0XYjHM8kov2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG4bV1%2FbtsMy4A7t7Z%2FOSkIvkacvf0XYjHM8kov2k%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;336&quot; height=&quot;137&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파일위치 : NPL/SYSAM-2_0/licenses&amp;nbsp;&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;span style=&quot;color: #333333;&quot;&gt;SYBASE_ASE_TestDrive.lic&amp;nbsp; 파일에 들어가면 '25년 3월 31일에 만료된다' 고 나온다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BW1KP/btsMyuNNfjt/8ztZuhT2DbZV9DKKWk7yrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BW1KP/btsMyuNNfjt/8ztZuhT2DbZV9DKKWk7yrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BW1KP/btsMyuNNfjt/8ztZuhT2DbZV9DKKWk7yrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBW1KP%2FbtsMyuNNfjt%2F8ztZuhT2DbZV9DKKWk7yrk%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;695&quot; height=&quot;53&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;53&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이&lt;b&gt; SYBASE_ASE_TestDrive.lic&lt;/b&gt; 는 2년마다 갱신해줘야 한다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어떻게? 기존 SYBASE_ASE_TestDrive.lic&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;파일을 삭제하고 재다운 받은 파일을 다시 넣으면 된다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SYBASE_ASE_TestDrive.lic 란? &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;DB라이센스를 인증해주는 파일&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;DB 라이센스 재다운로드&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이센스 재다운로드 위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://developers.sap.com/trials-downloads.html&quot;&gt;https://developers.sap.com/trials-downloads.html&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;처음에 라이센스 다운받았던 사이트에서 라이센스가 새로 업데이트가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5lyxs/btsMyUSSJy4/p4PGG1YTYpzT6ip8TPFolK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5lyxs/btsMyUSSJy4/p4PGG1YTYpzT6ip8TPFolK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5lyxs/btsMyUSSJy4/p4PGG1YTYpzT6ip8TPFolK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5lyxs%2FbtsMyUSSJy4%2Fp4PGG1YTYpzT6ip8TPFolK%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;702&quot; height=&quot;77&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;77&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;&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;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서버 라이센스 갱신하는 법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;중요!&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;SAP 서버가 깜빡깜빡한 상태가 됐을때 SAP LOGON 로그온 하기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnqPQz/btsMzN6QDQp/AvKhv6Xv2vs5ZOgQ8rhrak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnqPQz/btsMzN6QDQp/AvKhv6Xv2vs5ZOgQ8rhrak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnqPQz/btsMzN6QDQp/AvKhv6Xv2vs5ZOgQ8rhrak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnqPQz%2FbtsMzN6QDQp%2FAvKhv6Xv2vs5ZOgQ8rhrak%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;746&quot; height=&quot;647&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;647&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; SAP LOGON에서 로그온할때 서버 라이센스 만료가 됐으면 맨아래에 이렇게 뜬다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH8kLl/btsMxkyzXEz/ZE47NTmXUmWUuFjfmIMso1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH8kLl/btsMxkyzXEz/ZE47NTmXUmWUuFjfmIMso1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH8kLl/btsMxkyzXEz/ZE47NTmXUmWUuFjfmIMso1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH8kLl%2FbtsMxkyzXEz%2FZE47NTmXUmWUuFjfmIMso1%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;322&quot; height=&quot;38&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;38&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기존 라이센스 삭제 후 재다운로드 하고 업로드하기&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;sap*&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Down1oad&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;로 로그인해서 slicense 검색하면 라이센스가 만료(두 번째 줄)됐다고 뜬다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rLNo7/btsMyCdXdS7/Wot3KJAKUlvqLbG1EIAj5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rLNo7/btsMyCdXdS7/Wot3KJAKUlvqLbG1EIAj5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rLNo7/btsMyCdXdS7/Wot3KJAKUlvqLbG1EIAj5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrLNo7%2FbtsMyCdXdS7%2FWot3KJAKUlvqLbG1EIAj5k%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;1267&quot; height=&quot;536&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;536&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;&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;&lt;span style=&quot;color: #333333;&quot;&gt;1. 두번째 줄 우클릭 delete 하기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uYhUK/btsMzfJiuAm/qokksnLh5CfPCFD4cxOekk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uYhUK/btsMzfJiuAm/qokksnLh5CfPCFD4cxOekk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uYhUK/btsMzfJiuAm/qokksnLh5CfPCFD4cxOekk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuYhUK%2FbtsMzfJiuAm%2FqokksnLh5CfPCFD4cxOekk%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;1252&quot; height=&quot;436&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;436&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;span style=&quot;color: #333333;&quot;&gt;2. 라이센스 재다운로드 하기 위해 &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Active Hardware Key 복사한다&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;&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: start;&quot;&gt;3. minisap 사이트 또는 &lt;u&gt;&lt;a href=&quot;https://go.support.sap.com/minisap/#/minisap&quot;&gt;https://go.support.sap.com/minisap/#/minisap&lt;/a&gt;&amp;nbsp;&lt;/u&gt;사이트 접속&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740738012889&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;SAP License Keys for Preview, Evaluation and Developer Versions&quot; data-og-description=&quot;&quot; data-og-host=&quot;go.support.sap.com&quot; data-og-source-url=&quot;https://go.support.sap.com/minisap/#/minisap&quot; data-og-url=&quot;https://go.support.sap.com/minisap/#/minisap&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://go.support.sap.com/minisap/#/minisap&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://go.support.sap.com/minisap/#/minisap&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;SAP License Keys for Preview, Evaluation and Developer Versions&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;go.support.sap.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;&lt;span style=&quot;color: #333333;&quot;&gt;4. Netweaver 7.x sybase 버전 선택 &amp;gt; 아래 개인정보 작성 &amp;gt; 동의하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이렇게하면 &lt;span style=&quot;text-align: start;&quot;&gt;NPL.txt 파일이 다운로드가 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbJps9/btsMxJLucNK/ohlcydvkjlTthJKXI5njr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbJps9/btsMxJLucNK/ohlcydvkjlTthJKXI5njr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbJps9/btsMxJLucNK/ohlcydvkjlTthJKXI5njr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbJps9%2FbtsMxJLucNK%2FohlcydvkjlTthJKXI5njr0%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;1142&quot; height=&quot;817&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;817&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;&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;&lt;span style=&quot;color: #333333;&quot;&gt;5. 새로운 라이센스 설치 &amp;gt; NPL.txt 찾고 창뜨면 권한허용(Allow) &amp;gt; 설치완료&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;198&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNjS3a/btsMxljWFIk/nhsvAEdAd59OY4p8TKkPA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNjS3a/btsMxljWFIk/nhsvAEdAd59OY4p8TKkPA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNjS3a/btsMxljWFIk/nhsvAEdAd59OY4p8TKkPA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNjS3a%2FbtsMxljWFIk%2FnhsvAEdAd59OY4p8TKkPA1%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;198&quot; height=&quot;77&quot; data-origin-width=&quot;198&quot; data-origin-height=&quot;77&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6. 새로운 라이센스 업로드 완료! 유효기간 valid 확인하기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LvnYz/btsMyAApwhv/PVu1rw9ruGkglkO7182wM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LvnYz/btsMyAApwhv/PVu1rw9ruGkglkO7182wM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LvnYz/btsMyAApwhv/PVu1rw9ruGkglkO7182wM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLvnYz%2FbtsMyAApwhv%2FPVu1rw9ruGkglkO7182wM1%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;1246&quot; height=&quot;212&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;212&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;I&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;nstallation Number 상태가&amp;nbsp;&lt;/span&gt;&lt;b&gt;DEMOSYSYTE&amp;nbsp;&lt;/b&gt;로 자동으로 변경됐음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBZeMM/btsMxmQJ8W6/KEpOuy4a5gjqCJVzPWIiOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBZeMM/btsMxmQJ8W6/KEpOuy4a5gjqCJVzPWIiOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBZeMM/btsMxmQJ8W6/KEpOuy4a5gjqCJVzPWIiOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBZeMM%2FbtsMxmQJ8W6%2FKEpOuy4a5gjqCJVzPWIiOk%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;487&quot; height=&quot;160&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;160&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 과정을 3개월마다 라이센스 갱신을 반복해줘야한다. (유효기간 만료 10일전에 알려줌)&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;만약 SAP LOGON 에서&amp;nbsp;&lt;b&gt;비밀번호 5번 이상 오류&lt;/b&gt;시 잠금됐다면?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디 sap*&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호 Down1oad&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;로 로그온 하고 검색어 &quot;&lt;b&gt;su01&quot;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;친 후&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2nM6p/btsMxnB0xee/BivkmDkisgy3PxzoNH8bc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2nM6p/btsMxnB0xee/BivkmDkisgy3PxzoNH8bc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2nM6p/btsMxnB0xee/BivkmDkisgy3PxzoNH8bc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2nM6p%2FbtsMxnB0xee%2FBivkmDkisgy3PxzoNH8bc0%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;325&quot; height=&quot;357&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;357&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자물쇠 아이콘 클릭해서 잠금풀거나 잠금가능!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KDuBt/btsMzOdGjaL/pK58pZaxLn0bXKrHNwq3uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KDuBt/btsMzOdGjaL/pK58pZaxLn0bXKrHNwq3uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KDuBt/btsMzOdGjaL/pK58pZaxLn0bXKrHNwq3uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKDuBt%2FbtsMzOdGjaL%2FpK58pZaxLn0bXKrHNwq3uk%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;547&quot; height=&quot;277&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;277&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>SAP ERP 개발</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/179</guid>
      <comments>https://twoline.tistory.com/179#entry179comment</comments>
      <pubDate>Fri, 28 Feb 2025 19:43:18 +0900</pubDate>
    </item>
    <item>
      <title>h2 연결 에러들 Driver org.h2.Driver claims to not accept jdbcUrl</title>
      <link>https://twoline.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;h2 연동 에러들&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;에러문구&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; Caused by: java.lang.RuntimeException: Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl, &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.yml 또는 .properties 에 분명 오타 또는 띄어쓰기 잘못된거 있으니까 잘 보면 된다..&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;정말 삽질을 오래했는데 알고봤더니 jdbc 에서 j가 빠져있었다..&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/vintage-camera-shop&lt;/code&gt;&lt;/pre&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;&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;size18&quot;&gt;에러문구 : h2 DB가 제대로 연결이 안됐다?&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;java.lang.ClassNotFoundException:&amp;nbsp;org.h2.Driver&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;build.gradle 에 runtimeOnly 'com.h2database:h2'&amp;nbsp; 추가하면 된다!&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'

    compileOnly 'org.projectlombok:lombok'

    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    runtimeOnly('org.springframework.boot:spring-boot-devtools')
    
     runtimeOnly 'com.h2database:h2'
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>에러</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/176</guid>
      <comments>https://twoline.tistory.com/176#entry176comment</comments>
      <pubDate>Fri, 19 Apr 2024 02:04:12 +0900</pubDate>
    </item>
    <item>
      <title>Spring MVC | (5) PRG / Redirect / GET, RedirectAttributes - 저장완료 메세지 추가</title>
      <link>https://twoline.tistory.com/175</link>
      <description>&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;size18&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;[실제 상품을 등록한 뷰 화면]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6mKwC/btsGiclOO7g/Vx4DlgKAuaqj8ZJoXZv7CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6mKwC/btsGiclOO7g/Vx4DlgKAuaqj8ZJoXZv7CK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6mKwC/btsGiclOO7g/Vx4DlgKAuaqj8ZJoXZv7CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6mKwC%2FbtsGiclOO7g%2FVx4DlgKAuaqj8ZJoXZv7CK%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;612&quot; height=&quot;479&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;560&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;span style=&quot;color: #ee2323;&quot;&gt;새로고침&lt;span style=&quot;color: #333333;&quot;&gt;을 누른다면 상품ID는 계속 올라가고 &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;&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;[상품등록 POST - &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;BasicItemController&lt;/span&gt; ]&lt;/p&gt;
&lt;pre id=&quot;code_1712044954582&quot; class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@PostMapping(&quot;/add&quot;)
public String addItemV4(Item item){
    itemRepository.save(item);
    return &quot;basic/item&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;전체 흐름&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 상품등록&lt;/li&gt;
&lt;li&gt;상품 상세 뷰로 뷰템플릿&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;(basic/item)&lt;/span&gt;을 호출 - 끝&lt;/li&gt;
&lt;li&gt;상품 등록 (POST / add) URL 이 유지되어있는 상태&lt;/li&gt;
&lt;li&gt;새로고침하면 계속 POST / add 행위가 지속된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새로고침 시 마지막 행위가 다시 요청되기 때문에 상품이 중복저장이 되는 이슈가 발생한다.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t1YRI/btsGgAugDMu/CJrkSvkBXKFiDlIIdG6RM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t1YRI/btsGgAugDMu/CJrkSvkBXKFiDlIIdG6RM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t1YRI/btsGgAugDMu/CJrkSvkBXKFiDlIIdG6RM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft1YRI%2FbtsGgAugDMu%2FCJrkSvkBXKFiDlIIdG6RM1%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;639&quot; height=&quot;585&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;b&gt;문제 해결 방법은 리다이렉트!&amp;nbsp; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;POST ▶ Redirect ▶ GET&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 상품을 등록하고 뷰 템플릿으로 호출하는게 아니라 상품 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;상세화면으로 리다이렉트를 하면된다&lt;/span&gt;&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 하면 상품 등록 후 상품 상세 화면으로 다시 이동해서 (리다이렉트) 마지막에 호출한 GET /items/{id} 이 된다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnx1CM/btsGj4z79iE/a6XIgqJcfGgICBhBai09xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnx1CM/btsGj4z79iE/a6XIgqJcfGgICBhBai09xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnx1CM/btsGj4z79iE/a6XIgqJcfGgICBhBai09xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnx1CM%2FbtsGj4z79iE%2Fa6XIgqJcfGgICBhBai09xk%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;798&quot; height=&quot;672&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 흐름&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 상품등록 POST/ add&lt;/li&gt;
&lt;li&gt;상품 상세 화면으로&lt;b&gt; 리다이렉트 Redirect items/{itemId}&lt;/b&gt; 호출 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;http://localhost:8080/basic/items/3&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹 브라우저가 상품 상세를 새로 요청 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;GET /items/{id}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;새로고침을 해도 GET /items/{id}&lt;/b&gt; 상품 상세 화면으로 이동 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;문제 해결&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;span style=&quot;color: #333333; text-align: start;&quot;&gt;[상품등록 POST redirect -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;BasicItemController&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712045935768&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/add&quot;)
public String addItemV5(Item item) {
    itemRepository.save(item);
    return &quot;redirect:/basic/items/&quot; + item.getId();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 주의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+item.getId() 처럼 URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험&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;h4 data-ke-size=&quot;size20&quot;&gt;RedirectAttributes&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RedirectAttributes 을 사용하여 URL 인코딩 문제 해결과 상품이 실제로 등록이 됐을때 &quot;저장되었습니다.&quot; 메세지가 나오도록 해보자&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712050178417&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/add&quot;)
public String addItemV6(Item item, RedirectAttributes redirectAttributes){
    Item savedItem = itemRepository.save(item);
    redirectAttributes.addAttribute(&quot;itemId&quot;, savedItem.getId());
    redirectAttributes.addAttribute(&quot;status&quot;, true);
    return &quot;redirect:/basic/items/{itemId}&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;RedirectAttributes&lt;/span&gt; 는 리다이렉트할 때 &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;모델에 데이터를 전달할 수 있고 &lt;/span&gt;&lt;b&gt;파라미터에 itemId&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;와 &lt;/span&gt;status 를 붙여주는 역할&lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; basic/items/&lt;b&gt;1?status=true &lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&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;리다이렉트&amp;nbsp; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;redirect:/basic/items/{itemId}&amp;nbsp;&lt;/span&gt; ▶ 최종 basic/item 뷰 템플릿을 호출한다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Controller
@RequestMapping(&quot;/basic/items&quot;)
@RequiredArgsConstructor
public class BasicItemController {

    private final ItemRepository itemRepository;

    //상품 상세
    @GetMapping(&quot;/{itemId}&quot;)
    public String item(@PathVariable Long itemId, Model model){
        Item item = itemRepository.findById(itemId);
        model.addAttribute(&quot;item&quot;, item);
        return &quot;basic/item&quot;;
    }
    
    ....&lt;/code&gt;&lt;/pre&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;&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;size18&quot;&gt;뷰템플릿&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;resources/templates/basic/&lt;b&gt;item.html&amp;nbsp;&lt;/b&gt;&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상품 상세&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;div class=&quot;py-5 text-center&quot;&amp;gt;
        &amp;lt;h2&amp;gt;상품 상세&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;!-- --&amp;gt;
    &amp;lt;h2 th:if=&quot;${param.status}&quot; th:text=&quot;'저장 완료'&quot;&amp;gt;&amp;lt;/h2&amp;gt;
    
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;th:if 해당 조건이 참일 때&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;${param.status} : 파라미터 값을 조회할 수 있는 기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;참이면 '저장완료' 가 나온다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;상품 실제 등록시 '저장 완료' 메세지를 확인할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2vQTV/btsGh6sxxfG/ALrU3jiizRJDVjHplMpVo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2vQTV/btsGh6sxxfG/ALrU3jiizRJDVjHplMpVo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2vQTV/btsGh6sxxfG/ALrU3jiizRJDVjHplMpVo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2vQTV%2FbtsGh6sxxfG%2FALrU3jiizRJDVjHplMpVo1%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;672&quot; height=&quot;602&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Spring MVC 웹페이지 만들기</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/175</guid>
      <comments>https://twoline.tistory.com/175#entry175comment</comments>
      <pubDate>Tue, 2 Apr 2024 17:52:29 +0900</pubDate>
    </item>
    <item>
      <title>Spring MVC | (4) 상품 수정, 리다이렉트</title>
      <link>https://twoline.tistory.com/174</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품수정은 상품등록처럼 같은 url (&lt;span style=&quot;background-color: #dddddd;&quot;&gt;/{itemId}/edit&lt;/span&gt;)이다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET - 상품 수정 폼&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST - 상품 수정 처리&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;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;컨트롤러 - 상품 수정 [BasicItemController] 에 추가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;상품 수정 페이지를 열때는 GET (실제 수정 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712042023671&quot; class=&quot;reasonml&quot; style=&quot;background-color: #fafafa; color: #000000; text-align: start;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//상품 수정
@GetMapping(&quot;/{itemId}/edit&quot;)
public String editForm(@PathVariable Long itemId, Model model){

	Item item = itemRepository.findById(itemId);
	model.addAttribute(&quot;item&quot;, item);
	
	return &quot;basic/editForm&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;뷰 템플릿 [edit.html]&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;/resources/templates/basic/&lt;b&gt;editForm.html &lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;타임리프 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;html&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;xmlns:th=&quot;&lt;a href=&quot;http://www.thymeleaf.org&quot;&gt;http://www.thymeleaf.org&lt;/a&gt;&quot;&lt;/span&gt;&lt;/b&gt;&amp;gt;&lt;br /&gt;&amp;lt;link&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;th:href=&quot;@{/css/bootstrap.min.css}&quot;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1711973456336&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;link th:href=&quot;@{/css/bootstrap.min.css}&quot;
            href=&quot;../css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;style&amp;gt;
        .container {
        max-width: 560px;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;div class=&quot;py-5 text-center&quot;&amp;gt;
        &amp;lt;h2&amp;gt;상품 수정 폼&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;form action=&quot;item.html&quot; th:action method=&quot;post&quot;&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;label for=&quot;id&quot;&amp;gt;상품 ID&amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;id&quot; name=&quot;id&quot; class=&quot;form-control&quot; value=&quot;1&quot;
                   readonly&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;label for=&quot;itemName&quot;&amp;gt;상품명&amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;itemName&quot; name=&quot;itemName&quot; class=&quot;form-control&quot; value=&quot;상품A&quot; &amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;label for=&quot;price&quot;&amp;gt;가격&amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;price&quot; name=&quot;price&quot; class=&quot;form-control&quot;
                   value=&quot;10000&quot; th:value=&quot;${item.price}&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;label for=&quot;quantity&quot;&amp;gt;수량&amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;quantity&quot; name=&quot;quantity&quot; class=&quot;form-control&quot; value=&quot;10&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;hr class=&quot;my-4&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;col&quot;&amp;gt;
                &amp;lt;button class=&quot;w-100 btn btn-primary btn-lg&quot; type=&quot;submit&quot;&amp;gt;저장&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;!--수정폼에서 취소 눌렀을때 상품상세 페이지로--&amp;gt;
            &amp;lt;div class=&quot;col&quot;&amp;gt;
                &amp;lt;button class=&quot;w-100 btn btn-secondary btn-lg&quot;
                        onclick=&quot;location.href='item.html'&quot;
                        th:onclick=&quot;|location.href='@{/basic/items/{itemId}(itemId=${item.id})}'|&quot;
                        type=&quot;button&quot;&amp;gt;취소&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- /container --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;form&amp;nbsp;action=&quot;item.html&quot;&amp;nbsp;&lt;b&gt;th:action&lt;/b&gt;&amp;nbsp;method=&quot;post&quot;&amp;gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상품수정은 상품등록처럼 유사하게 GET,POST URL이 같기 때문에 th:action 에 생략해도 괜찮다&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;상품 수정화면&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 '상품 수정' 버튼을 눌러서 상품 수정 폼에 들어가면 &lt;span style=&quot;color: #ee2323;&quot;&gt;상품명이 안 바뀌어있다&amp;nbsp; &lt;/span&gt;( itemA ▶ 상품A )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVSPFf/btsGhDQSuwP/qkjrzYs0NEGFQJMG4YIirk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVSPFf/btsGhDQSuwP/qkjrzYs0NEGFQJMG4YIirk/img.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;546&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.8385%; margin-right: 10px;&quot; data-widthpercent=&quot;50.42&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVSPFf/btsGhDQSuwP/qkjrzYs0NEGFQJMG4YIirk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVSPFf%2FbtsGhDQSuwP%2FqkjrzYs0NEGFQJMG4YIirk%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;682&quot; height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzN2Ut/btsGibTOGRv/hs4HNfB6UPjOfWaoQdrHY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzN2Ut/btsGibTOGRv/hs4HNfB6UPjOfWaoQdrHY0/img.png&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;535&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.9987%;&quot; data-widthpercent=&quot;49.58&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzN2Ut/btsGibTOGRv/hs4HNfB6UPjOfWaoQdrHY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzN2Ut%2FbtsGibTOGRv%2Fhs4HNfB6UPjOfWaoQdrHY0%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;657&quot; height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;폼 input에 각 상품명, 가격, 수량에 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;th:value 값을 넣으면 된다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;th:value=&quot;${item.id}&quot;&lt;/li&gt;
&lt;li&gt;th:value=&quot;${item.itemName}&quot;&lt;/li&gt;
&lt;li&gt;th:value=&quot;${item.quantity}&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;변경 되는 상품수정 화면 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;( itemA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;▶ &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;itemA&lt;/span&gt; )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1N7i/btsGh41vDC7/W7dYBrOEdlq4hlliLZXoW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1N7i/btsGh41vDC7/W7dYBrOEdlq4hlliLZXoW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1N7i/btsGh41vDC7/W7dYBrOEdlq4hlliLZXoW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1N7i%2FbtsGh41vDC7%2FW7dYBrOEdlq4hlliLZXoW0%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;723&quot; height=&quot;607&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;607&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;취소 버튼&lt;/b&gt; 눌렀을때 다시 수정 폼으로 돌아가기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;th:onclick=&quot;|location.href='@{/basic/items/{itemId}(itemId=${item.id})&lt;/span&gt;&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;button class=&quot;w-100 btn btn-secondary btn-lg&quot;
        onclick=&quot;location.href='item.html'&quot;
        th:onclick=&quot;|location.href='@{/basic/items/{itemId}(itemId=${item.id})}'|&quot;
        type=&quot;button&quot;&amp;gt;취소
&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;컨트롤러 - 상품 수정 [BasicItemController] 에 추가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;상품을 실제로 수정할 때는 POST&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1711973158313&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/{itemId}/edit&quot;)
public String edit(@PathVariable Long itemId,@ModelAttribute Item item){

    itemRepository.update(itemId, item);
    //수정저장 후 redirect
    return &quot;redirect:/basic/items/{itemId}&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 이동 : 상품을 수정하고 저장하면 상품 상세 페이지로 이동하도록 한다.&lt;/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;h4 data-ke-size=&quot;size20&quot;&gt;리다이렉트 redirect&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품 수정 마지막에 뷰 템플릿을 호출하는게 아니라 상품 상세 화면으로 이동하는 리다이렉트를 호출한다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;redirect:/&lt;b&gt;basic/items/{itemId}&lt;/b&gt; ▶ &lt;b&gt;basic/items/1 &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt; Location : http://localhost:8080/basic/items/1&lt;/b&gt; 로 리다이렉트를 한 뒤&amp;nbsp;&lt;/li&gt;
&lt;li&gt;itemId&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;가 1인 항목을 불러온다. 즉, &lt;span style=&quot;color: #006dd7;&quot;&gt;상품 상세 컨트롤러를 다시 호출한다. &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXKXyJ/btsGipFi7MD/i8p7uhkSNqEKcNseCd9O7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXKXyJ/btsGipFi7MD/i8p7uhkSNqEKcNseCd9O7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXKXyJ/btsGipFi7MD/i8p7uhkSNqEKcNseCd9O7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXKXyJ%2FbtsGipFi7MD%2Fi8p7uhkSNqEKcNseCd9O7k%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;728&quot; height=&quot;432&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;432&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;&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>Spring MVC 웹페이지 만들기</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/174</guid>
      <comments>https://twoline.tistory.com/174#entry174comment</comments>
      <pubDate>Tue, 2 Apr 2024 16:45:03 +0900</pubDate>
    </item>
    <item>
      <title>Spring MVC | (3) 상품 등록, @ModelAttribute 와 @RequestParam 차이점</title>
      <link>https://twoline.tistory.com/173</link>
      <description>&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;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;컨트롤러 - 상품 등록 [BasicItemController] 에 추가&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상품 등록 페이지를 열때는 GET (실제 등록 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1712041888581&quot; class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;//상품 등록 
@GetMapping(&quot;/add&quot;)
public String addForm(){
    return &quot;basic/addForm&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상품을 실제로 등록할 때는 POST&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1711885222651&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/add&quot;)
public String save(){
    return &quot;basic/addForm&quot;;
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 URL인데 HTTP 메서드로 기능을 구별해준다.&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;size18&quot;&gt;뷰 템플릿 [addForm.html]&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;/resources/templates/basic/&lt;b&gt;addForm.html &lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타임리프 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;html&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;xmlns:th=&quot;http://www.thymeleaf.org&quot;&lt;/span&gt;&lt;/b&gt;&amp;gt; &lt;br /&gt;&amp;lt;link&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; th:href=&quot;@{/css/bootstrap.min.css}&quot;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1711884809531&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;link th:href=&quot;@{/css/bootstrap.min.css}&quot;
            href=&quot;../css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;style&amp;gt;
        .container {
        max-width: 560px;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;div class=&quot;py-5 text-center&quot;&amp;gt;
        &amp;lt;h2&amp;gt;상품 등록 폼&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;h4 class=&quot;mb-3&quot;&amp;gt;상품 입력&amp;lt;/h4&amp;gt;
    &amp;lt;form action=&quot;item.html&quot; th:action method=&quot;post&quot;&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;label for=&quot;itemName&quot;&amp;gt;상품명&amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;itemName&quot; name=&quot;itemName&quot; class=&quot;form-control&quot; placeholder=&quot;이름을 입력하세요&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;label for=&quot;price&quot;&amp;gt;가격&amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;price&quot; name=&quot;price&quot; class=&quot;form-control&quot;
                   placeholder=&quot;가격을 입력하세요&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;label for=&quot;quantity&quot;&amp;gt;수량&amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;quantity&quot; name=&quot;quantity&quot; class=&quot;form-control&quot; placeholder=&quot;수량을 입력하세요&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;hr class=&quot;my-4&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;col&quot;&amp;gt;
                &amp;lt;button class=&quot;w-100 btn btn-primary btn-lg&quot; type=&quot;submit&quot;&amp;gt;상품 등
                    록&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;col&quot;&amp;gt;
                &amp;lt;button class=&quot;w-100 btn btn-secondary btn-lg&quot;
                        onclick=&quot;location.href='items.html'&quot;
                        th:onclick=&quot;|location.href='@{/basic/items}'|&quot;
                        type=&quot;button&quot;&amp;gt;취소&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- /container --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y4WpB/btsGfzHaX5f/vvJEQSpo5LpJVLRkdJQhTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y4WpB/btsGfzHaX5f/vvJEQSpo5LpJVLRkdJQhTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y4WpB/btsGfzHaX5f/vvJEQSpo5LpJVLRkdJQhTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy4WpB%2FbtsGfzHaX5f%2FvvJEQSpo5LpJVLRkdJQhTk%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;685&quot; height=&quot;590&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;590&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;타임리프 속성&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;th:action&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품 등록 버튼을 눌렀을때 &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;동적으로 URL이 변경되도록 하는 액션속성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사실상 GET, POST 같은 URL (basic/items/add) 이기 때문에 안 써도 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;th:action=&quot;/basic/items/add&quot;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp; ▶ &amp;lt;form action=&quot;item.html&quot; &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;th:action&amp;nbsp;&lt;/b&gt;method=&quot;post&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&quot;&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;등록 페이지에 갔을때 '페이지 소스보기' 를 하면 action=&quot;&quot; 비어있는 것을 확인할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m90Xo/btsGd8w9r2y/aXvPL1anPO5xwu7ISWxb40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m90Xo/btsGd8w9r2y/aXvPL1anPO5xwu7ISWxb40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m90Xo/btsGd8w9r2y/aXvPL1anPO5xwu7ISWxb40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm90Xo%2FbtsGd8w9r2y%2FaXvPL1anPO5xwu7ISWxb40%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;292&quot; height=&quot;71&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;71&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;&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;size18&quot;&gt;취소 버튼 눌렀을때 url 수정하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취소했을때는 목록으로 돌아가기&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;th:onclick=&quot;|location.href='@{/basic/items}'|&quot;&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;button class=&quot;w-100 btn btn-secondary btn-lg&quot;
        onclick=&quot;location.href='items.html'&quot;
        th:onclick=&quot;|location.href='@{/basic/items}'|&quot;
        type=&quot;button&quot;&amp;gt;취소
&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&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;&amp;nbsp;&lt;/p&gt;
&lt;p 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;style6&quot; /&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;상품 등록 POST - @ModelAttribute&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선 @ModelAttribute 와 &lt;span&gt;@RequestParam 차이점을 알아보자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;@RequestParam&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px;&quot;&gt;@RequestParam - &lt;/span&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px;&quot;&gt; 상품 등록 처리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;클라이언트의 HTTP POST 요청&lt;/span&gt;파라미터를 처리하기 위해 @RequestParam 을 사용한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[addItemV1 - BasicItemController에 추가]&lt;/p&gt;
&lt;pre id=&quot;code_1712041883782&quot; class=&quot;armasm&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/add&quot;)
public String addItemV1(@RequestParam String itemName,
                        @RequestParam int price,
                        @RequestParam Integer quantity,
                        Model model) {
                        
	Item item = new Item();
	item.setItemName(itemName);
	item.setPrice(price);
	item.setQuantity(quantity);

	itemRepository.save(item);

	model.addAttribute(&quot;item&quot;, item);
    
	return &quot;&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@RequestParam&amp;nbsp;String&amp;nbsp;&lt;b&gt;itemName 은&amp;nbsp;&lt;/b&gt;addForm.html 의 &lt;b&gt;name=&quot;&quot;&lt;/b&gt; 값이다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&amp;lt;input type=&quot;text&quot; id=&quot;itemName&quot; &lt;b&gt;name=&quot;itemName&quot;&lt;/b&gt; ~ &amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;실제 상품을 등록한 뷰 화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3z6b/btsGeOSg4hR/Kicsuczz6lujUzV5IHkqg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3z6b/btsGeOSg4hR/Kicsuczz6lujUzV5IHkqg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3z6b/btsGeOSg4hR/Kicsuczz6lujUzV5IHkqg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3z6b%2FbtsGeOSg4hR%2FKicsuczz6lujUzV5IHkqg0%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;715&quot; height=&quot;560&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;560&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;@ModelAttribute&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;@ModelAttribute &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;상품 등록 처리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;[addItemV2 -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;BasicItemController에 추가]&lt;/p&gt;
&lt;pre id=&quot;code_1712041875465&quot; class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@PostMapping(&quot;/add&quot;)
public String addItemV2(@ModelAttribute(&quot;item&quot;) Item item ) {
	
	itemRepository.save(item);
	//model.addAttribute(&quot;item&quot;,item);
    
	return &quot;basic/item&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@ModelAttribute - 요청 파라미터 처리를 해준다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Item 객체를 생성하고 요청 파라미터 값을 setXxxx 으로&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;Item&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt; 객체의 필드에 값을 설정해준다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&amp;nbsp;Spring이 자동으로 처리해줌 개발자가 직접 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;setXxxx&lt;span&gt; 메서드를 호출할 필요가 없어진다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;pre id=&quot;code_1711970620208&quot; class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;Item item = new Item();
item.setItemName(itemName);
item.setPrice(price);
item.setQuantity(quantity);&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;@ModelAttribute&lt;span&gt; 은&amp;nbsp;&lt;/span&gt;&lt;/span&gt;자동으로 model에 뷰를 넣어준다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@ModelAttribute(&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&quot;item&quot;&lt;/b&gt;&lt;/span&gt;) 이름이 ▶ model.addAttribute(&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&quot;item&quot;&lt;/b&gt;&lt;/span&gt;, item) 이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;model.addAttribute(&quot;item&quot;, item) 가 주석처리를 해도 잘 동작한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;size18&quot;&gt;ModelAttribute 이름 생략&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;[addItemV3 -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;BasicItemController에 추가]&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712041878993&quot; class=&quot;kotlin&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/add&quot;)
public String addItemV3(@ModelAttribute Item item) {
	
	itemRepository.save(item);
	//model.addAttribute(&quot;item&quot;,item);
    
	return &quot;basic/item&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@ModelAttribute(&lt;span style=&quot;color: #ee2323;&quot;&gt;&quot;item&quot;&lt;/span&gt;) Item item 이름을 생략하면 &lt;b&gt;클래스의 첫글자만 소문자로 변경해서 등록&lt;/b&gt;한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;클래스명 Item&lt;span&gt; &lt;/span&gt;&lt;/span&gt;▶ &lt;b&gt;item&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;ModelAttribute 전체 생략&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;[addItemV4 -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;BasicItemController에 추가]&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711971487243&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@PostMapping(&quot;/add&quot;)
public String addItemV4(Item item) {
	
	itemRepository.save(item);
    
	return &quot;basic/item&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;addItemV1&amp;nbsp;처럼 단순타입인 String이라면 @RequestParam 이 자동적용되고&amp;nbsp;&lt;/li&gt;
&lt;li&gt;객체 타입인 경우 @ &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ModelAttribute&lt;span&gt;가 자동적용이 된다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;이것 또한 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;클래스명 Item&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;▶&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;item&amp;nbsp;&lt;/b&gt;소문자로 변경해서 모델에 담긴다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring MVC 웹페이지 만들기</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/173</guid>
      <comments>https://twoline.tistory.com/173#entry173comment</comments>
      <pubDate>Mon, 1 Apr 2024 20:45:05 +0900</pubDate>
    </item>
    <item>
      <title>Spring MVC | (2) 상품 상세 , 타임리프</title>
      <link>https://twoline.tistory.com/172</link>
      <description>&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;size18&quot;&gt;컨트롤러 - 상품 상세 [BasicItemController] 에 추가&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711883820051&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//상품 상세
@GepMapping(/{itemId})
public String item(@PathVariable Long itemId, Model model) {
	Item item = itemRepository.findById(itemId);
	model.addAttribute(&quot;item&quot;, item);
	return &quot;basic/item&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1711883707621&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
@RequestMapping(&quot;/basic/items&quot;)
@RequiredArgsConstructor
public class BasicItemController {

    private final ItemRepository itemRepository;

	//상품 목록
    @GetMapping
    public String items(Model model){
        List&amp;lt;Item&amp;gt; itmes = itemRepository.findAll(); //아이템 전체목록
        model.addAttribute(&quot;items&quot;, itmes);
        return &quot;basic/items&quot;;
    }

	//상품 상세
    @GepMapping(/{itemId})
    public String item(@PathVariable Long itemId, Model model) {
        Item item = itemRepository.findById(itemId);
        model.addAttribute(&quot;item&quot;, item);
        return &quot;basic/item&quot;;
    }
}&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;뷰 템플릿 [ &lt;span style=&quot;text-align: left;&quot;&gt;item.html&lt;/span&gt; ]&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp; /resources/templates/basic/item.html&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타임리프 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;html&amp;nbsp;xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;&lt;br /&gt;&amp;lt;link th:href=&quot;@{/css/bootstrap.min.css}&quot;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1711883926085&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;link th:href=&quot;@{/css/bootstrap.min.css}&quot;
            href=&quot;../css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;style&amp;gt;
        .container {
        max-width: 560px;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;div class=&quot;py-5 text-center&quot;&amp;gt;
        &amp;lt;h2&amp;gt;상품 상세&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div&amp;gt;
        &amp;lt;label for=&quot;itemId&quot;&amp;gt;상품 ID&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;itemId&quot; name=&quot;itemId&quot; class=&quot;form-control&quot;
               value=&quot;1&quot; th:value=&quot;${item.id}&quot; readonly&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;label for=&quot;itemName&quot;&amp;gt;상품명&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;itemName&quot; name=&quot;itemName&quot; class=&quot;form-control&quot;
               value=&quot;상품A&quot; th:value=&quot;${item.itemName}&quot; readonly&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;label for=&quot;price&quot;&amp;gt;가격&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;price&quot; name=&quot;price&quot; class=&quot;form-control&quot;
               value=&quot;10000&quot; th:value=&quot;${item.price}&quot; readonly&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;label for=&quot;quantity&quot;&amp;gt;수량&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;quantity&quot; name=&quot;quantity&quot; class=&quot;form-control&quot;
               value=&quot;10&quot; th:value=&quot;${item.quantity}&quot; readonly&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;hr class=&quot;my-4&quot;&amp;gt;
    &amp;lt;div class=&quot;row&quot;&amp;gt;
        &amp;lt;div class=&quot;col&quot;&amp;gt;
            &amp;lt;button class=&quot;w-100 btn btn-primary btn-lg&quot;
                    onclick=&quot;location.href='editForm.html'&quot;
                    th:onclick=&quot;|location.href='@{/basic/items/{itemId}/edit(itemId=${item.id})}'|&quot;
                    type=&quot;button&quot;&amp;gt;상품 수정&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;col&quot;&amp;gt;
            &amp;lt;button class=&quot;w-100 btn btn-secondary btn-lg&quot;
                    onclick=&quot;location.href='items.html'&quot;
                    th:onclick=&quot;|location.href='@{/basic/items}'|&quot;
                    type=&quot;button&quot;&amp;gt;목록으로&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- /container --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;렌더링 하기 - 상품ID&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;label&amp;nbsp;for=&quot;itemId&quot;&amp;gt;상품&amp;nbsp;ID&amp;lt;/label&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type=&quot;text&quot;&amp;nbsp;id=&quot;itemId&quot;&amp;nbsp;name=&quot;itemId&quot;&amp;nbsp;class=&quot;form-control&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value=&quot;1&quot;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;th:value=&quot;${item.id}&quot;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;readonly&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;상품명&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;th:value=&quot;${item.itemName}&quot;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;가격&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;th:value=&quot;${item.price}&quot;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;수량&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt; &lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;th:value=&quot;${item.quantity}&quot;&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wXMF2/btsGc67PRVX/CkYnZxvdktvzrUvV5wuz31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wXMF2/btsGc67PRVX/CkYnZxvdktvzrUvV5wuz31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wXMF2/btsGc67PRVX/CkYnZxvdktvzrUvV5wuz31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwXMF2%2FbtsGc67PRVX%2FCkYnZxvdktvzrUvV5wuz31%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;693&quot; height=&quot;641&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;641&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;&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;size18&quot;&gt;버튼 링크 수정하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상품수정 버튼&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;th:onclick=&quot;|location.href='@{/basic/items/{itemId}/edit(itemId=${item.id})}'|&quot;&lt;/li&gt;
&lt;li&gt;basic/items/1/edit 같은 URL&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;button class=&quot;w-100 btn btn-primary btn-lg&quot;
        onclick=&quot;location.href='editForm.html'&quot;
        th:onclick=&quot;|location.href='@{/basic/items/{itemId}/edit(itemId=${item.id})}'|&quot;
        type=&quot;button&quot;&amp;gt;상품 수정
&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목록으로 버튼&lt;/li&gt;
&lt;li&gt;th:onclick=&quot;|location.href='@{/basic/items}'|&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;button class=&quot;w-100 btn btn-secondary btn-lg&quot;
        onclick=&quot;location.href='items.html'&quot;
        th:onclick=&quot;|location.href='@{/basic/items}'|&quot;
        type=&quot;button&quot;&amp;gt;목록으로
&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>Spring MVC 웹페이지 만들기</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/172</guid>
      <comments>https://twoline.tistory.com/172#entry172comment</comments>
      <pubDate>Sun, 31 Mar 2024 20:30:43 +0900</pubDate>
    </item>
    <item>
      <title>Spring MVC | (1) 상품 목록, 뷰 템플릿 , 타임리프</title>
      <link>https://twoline.tistory.com/171</link>
      <description>&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;부트스트랩 공식 사이트: &lt;a href=&quot;https://getbootstrap.com&quot;&gt;https://getbootstrap.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;&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;1. 아래 URL에 접속하여 css 파일을 다운받고 압축풀어서 bootstrap.min.css 를 복사한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://getbootstrap.com/docs/5.0/getting-started/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://getbootstrap.com/docs/5.0/getting-started/download/&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;2. 그리고 resources/static/css/&lt;b&gt;bootstrap.min.css&lt;/b&gt; 폴더에 추가해보자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTs1gv/btsGeOSds0L/6AIVDtKWn4FsJdDQifoOwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTs1gv/btsGeOSds0L/6AIVDtKWn4FsJdDQifoOwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTs1gv/btsGeOSds0L/6AIVDtKWn4FsJdDQifoOwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTs1gv%2FbtsGeOSds0L%2F6AIVDtKWn4FsJdDQifoOwk%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;297&quot; height=&quot;120&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;120&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;3. 실행 후 http://localhost:8080/css/bootstrap.min.css 접속했을때 나오면 정상작동!&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;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;/resources/static&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 에 넣으면 스프링 부트가 정적 리소스를 제공한다&amp;nbsp;&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;주의!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적리소스인 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;/resources/static&lt;/span&gt; 에 html을 넣어두면 모두 공개된다 실제 서비스도 공개되기때문에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개할 필요가 없는 html 을 저장하는것을 주의해야한다&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;h4 data-ke-size=&quot;size20&quot;&gt;정적 리소스 - 상품 목록 HTML&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;resources/static/html/&lt;b&gt;items.html &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711541369445&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;link href=&quot;../css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot; style=&quot;max-width: 600px&quot;&amp;gt;
    &amp;lt;div class=&quot;py-5 text-center&quot;&amp;gt;
        &amp;lt;h2&amp;gt;상품 목록&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;row&quot;&amp;gt;
        &amp;lt;div class=&quot;col&quot;&amp;gt;
            &amp;lt;button class=&quot;btn btn-primary float-end&quot;
                    onclick=&quot;location.href='addForm.html'&quot; type=&quot;button&quot;&amp;gt;상품 등록
            &amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;hr class=&quot;my-4&quot;&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;table class=&quot;table&quot;&amp;gt;
            &amp;lt;thead&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;
                &amp;lt;th&amp;gt;상품명&amp;lt;/th&amp;gt;
                &amp;lt;th&amp;gt;가격&amp;lt;/th&amp;gt;
                &amp;lt;th&amp;gt;수량&amp;lt;/th&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;/thead&amp;gt;
            &amp;lt;tbody&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot;&amp;gt;1&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot;&amp;gt;테스트 상품1&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;10000&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot;&amp;gt;2&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot;&amp;gt;테스트 상품2&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;20000&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;/tbody&amp;gt;
        &amp;lt;/table&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- /container --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;&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;size18&quot;&gt;정직 리소스를 사용하면 노출 위험이 있으니 보안과 동적 콘텐츠 생성할 수 있는&amp;nbsp;컨트롤러와 뷰 템플릿으로 개발해보자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;뷰 템플릿?&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;HTML 과 비슷하지만 서버 측에서 동적으로 생성되며 클라이언트에게 전달된다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러므로 클라이언트에게 전달하기 전에 템플릿을 처리하여 필요한 데이터를 삽입해준다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위치는 주로 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;/resources/templates&lt;/span&gt; 에 위치한다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;items.html 정적 HTML을 뷰 템플릿(templates) 영역으로 복사하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; /resources/static/items.html&lt;/span&gt; &amp;rarr; 복사 &amp;rarr; &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;/resources/templates/basic/items.html&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;size18&quot;&gt;컨트롤러 &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; font-size: 1.12em; letter-spacing: 0px;&quot;&gt;의존성 주입(Dependency Injection) 간편화하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[ BasicItemController ]&lt;/p&gt;
&lt;pre id=&quot;code_1711878675136&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
@RequestMapping(&quot;/basic/items&quot;)
public class BasicItemController {

    private final ItemRepository itemRepository;
    
    //생성자
    @Autowired
    public BasicItemController(ItemRepository itemRepository){
    	this.itemRepository = itemRepository;
    }
    
}&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711878608819&quot; class=&quot;armasm&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@Autowired
public BasicItemController(ItemRepository itemRepository){
    this.itemRepository = itemRepository;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스프링에서 해당 생성자가 @Autowired 로 의존관계를 주입해주는데 생성자가 하나밖에 없으면 @Autowired를 생략가능하다&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; @RequiredArgsConstructor&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;final 이 붙은 멤버변수만 사용해서 생성자를 자동으로 만들어주는 어노테이션&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;따라서 private&amp;nbsp;&lt;b&gt;final&amp;nbsp;&lt;/b&gt;ItemRepository itemRepository; 에 final을 지우면 안된다&amp;nbsp;그럼 itemRepository 의존관계가 주입이 안되기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;간결해진 [ BasicItemController ]&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711879053781&quot; class=&quot;less&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@Controller
@RequestMapping(&quot;/basic/items&quot;)
@RequiredArgsConstructor
public class BasicItemController {

    private final ItemRepository itemRepository;
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p 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;style6&quot; /&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 상품목록 - 타임리프&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[ BasicItemController ]&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711879327996&quot; class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@Controller
@RequestMapping(&quot;/basic/items&quot;)
@RequiredArgsConstructor
public class BasicItemController {

    private final ItemRepository itemRepository;
    
    @GetMapping
    public String items(Model model) {
    	List&amp;lt;Item&amp;gt; items = itemRepository.findAll();
        model.addAttribute(&quot;items&quot;, items);
        return &quot;basic/items&quot;;
    }
}&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;데이터가 없는 상태이니까 테스트용으로 데이터를 넣어보기&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711879422925&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//테스트용 데이터 추가
@PostConstruct
public void init(){
    itemRepository.save(new Item(&quot;itemA&quot;, 1000,10));
    itemRepository.save(new Item(&quot;itemB&quot;, 2000,20));
}&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;&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;size18&quot;&gt;뷰템플릿 [ items.html ]&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;타임리프 사용하기&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;th:href 가 있으면 기존거를 안쓴다&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;html &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;xmlns:th=&quot;http://www.thymeleaf.org&quot;&lt;/b&gt;&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;link&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;th:href=&quot;@{/css/bootstrap.min.css}&quot;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;href=&quot;../css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1711877731024&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;link th:href=&quot;@{/css/bootstrap.min.css}&quot;
            href=&quot;../css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;container&quot; style=&quot;max-width: 600px&quot;&amp;gt;
    &amp;lt;div class=&quot;py-5 text-center&quot;&amp;gt;
        &amp;lt;h2&amp;gt;상품 목록&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;row&quot;&amp;gt;
        &amp;lt;div class=&quot;col&quot;&amp;gt;
            &amp;lt;button class=&quot;btn btn-primary float-end&quot;
                    onclick=&quot;location.href='addForm.html'&quot;
                    th:onclick=&quot;|location.href='@{/basic/items/add}'|&quot;
                    type=&quot;button&quot;&amp;gt;상품 등록
            &amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;hr class=&quot;my-4&quot;&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;table class=&quot;table&quot;&amp;gt;
            &amp;lt;thead&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;
                &amp;lt;th&amp;gt;상품명&amp;lt;/th&amp;gt;
                &amp;lt;th&amp;gt;가격&amp;lt;/th&amp;gt;
                &amp;lt;th&amp;gt;수량&amp;lt;/th&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;/thead&amp;gt;
            &amp;lt;tbody&amp;gt;
            &amp;lt;tr th:each=&quot;item : ${items}&quot;&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot; th:href=&quot;@{/basic/items/{itemId}(itemId=${item.id})}&quot; th:text=&quot;${item.id}&quot;&amp;gt;회원id&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot; th:href=&quot;@{|/basic/items/${item.id}|}&quot; th:text=&quot;${item.itemName}&quot;&amp;gt;상품명&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;td th:text=&quot;${item.price}&quot;&amp;gt;10000&amp;lt;/td&amp;gt;
                &amp;lt;td th:text=&quot;${item.quantity}&quot;&amp;gt;10&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;

            &amp;lt;/tbody&amp;gt;
        &amp;lt;/table&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- /container --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTL4dB/btsGd15ZEDx/AriBEJUbV1JG7c6s94Xrhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTL4dB/btsGd15ZEDx/AriBEJUbV1JG7c6s94Xrhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTL4dB/btsGd15ZEDx/AriBEJUbV1JG7c6s94Xrhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTL4dB%2FbtsGd15ZEDx%2FAriBEJUbV1JG7c6s94Xrhk%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;790&quot; height=&quot;420&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;420&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HTML 에 사용한 타임리프 속성 알아보기&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;상품 등록 버튼 누르면 http://localhost:8080/basic/items/add 경로로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;th:onclick=&quot;|location.href='@{/basic/items/add}'|&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1711879810835&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button class=&quot;btn btn-primary float-end&quot;
        onclick=&quot;location.href='addForm.html'&quot;
        th:onclick=&quot;|location.href='@{/basic/items/add}'|&quot;
        type=&quot;button&quot;&amp;gt;상품 등록
&amp;lt;/button&amp;gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;리터럴 '|&amp;nbsp; |' 문자&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타임리프에서 문자와 표현식 등은 분리되어 있기 때문에 더해서 사용해야 해야하는데&amp;nbsp;&lt;/p&gt;
&lt;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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;th:onclick=&quot;'location.href=' + '\'' + @{/basic/items/add} + '\''&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리터럴 문법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;th:onclick=&quot;|location.href='@{/basic/items/add}'|&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;th:each - 상품 목록 반복출력&lt;br /&gt;th:text 는 단순하게 데이터를 넣어주는 것 (테스트용으로 데이터를 넣은게 바로 들어간다)&lt;/blockquote&gt;
&lt;pre id=&quot;code_1711880329434&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;tr th:each=&quot;item : ${items}&quot;&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot; th:text=&quot;${item.id}&quot;&amp;gt;회원id&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot; th:text=&quot;${item.itemName}&quot;&amp;gt;상품명&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;td th:text=&quot;${item.price}&quot;&amp;gt;10000&amp;lt;/td&amp;gt;
    &amp;lt;td th:text=&quot;${item.quantity}&quot;&amp;gt;10&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;model.addAttribute(&lt;b&gt;&quot;items&quot;&lt;/b&gt;, items);&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;에서 &quot;items&quot;이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;HTML 템플릿에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;${items}에 접근하여 해당 데이터들을 item 에 넣어준다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;th:href 문법&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 ID, 상품명을 클릭시 이동하는 URL 은 같다 (상품id만 나오면 된다.&amp;nbsp; /basic/items/1&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;과 같은 URL이 생성&lt;/span&gt;)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;th:href=&quot;@{/basic/items/{itemId}(itemId=${item.id})}&quot; :&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(itemId=${item.id}) 값이 {itemId} 경로 변수에 들어간다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;th:href=&quot;@{|/basic/items/${item.id}|}&quot;&amp;nbsp; : 리터럴을 사용해서 위보다 URL을 간단히 만든 것&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1711881195460&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;tr th:each=&quot;item : ${items}&quot;&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot; th:href=&quot;@{/basic/items/{itemId}(itemId=${item.id})}&quot; th:text=&quot;${item.id}&quot;&amp;gt;회원id&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;&amp;lt;a href=&quot;item.html&quot; th:href=&quot;@{|/basic/items/${item.id}|}&quot; th:text=&quot;${item.itemName}&quot;&amp;gt;상품명&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;td th:text=&quot;${item.price}&quot;&amp;gt;10000&amp;lt;/td&amp;gt;
    &amp;lt;td th:text=&quot;${item.quantity}&quot;&amp;gt;10&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;&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;&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>Spring MVC 웹페이지 만들기</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/171</guid>
      <comments>https://twoline.tistory.com/171#entry171comment</comments>
      <pubDate>Wed, 27 Mar 2024 21:12:39 +0900</pubDate>
    </item>
    <item>
      <title>Spring MVC | 상품 도메인 개발 (Item, ItemRepository 클래스 및 테스트 코드 작성)</title>
      <link>https://twoline.tistory.com/170</link>
      <description>&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;size18&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;도메인 모델&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상품 ID&lt;/li&gt;
&lt;li&gt;상품명&lt;/li&gt;
&lt;li&gt;가격&lt;/li&gt;
&lt;li&gt;수량&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4가지 기능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상품 목록&lt;/li&gt;
&lt;li&gt;상품 등록&lt;/li&gt;
&lt;li&gt;상품 수정&lt;/li&gt;
&lt;li&gt;상품 상세&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h3 data-ke-size=&quot;size23&quot;&gt;상품&amp;nbsp;도메인 개발&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Item - 상품 객체&lt;/p&gt;
&lt;pre id=&quot;code_1711876302581&quot; class=&quot;arduino&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@Getter @Setter
public class item {

    private Long id;
    private String itemName;
    private Integer price; //Integer은 null일 가능성이 있기때문
    private int quantity;

    //기본 생성자
    public item() {
    }

    public item(String itemName, Integer price, int quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}&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;size14&quot;&gt;* @Data 를 쓰게 되면 getter,setter,required,Tostring...다 만들어줘서 위험하니까 필요한 getter,setter 만 쓴다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ItemRepository - &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Item&lt;span&gt;&amp;nbsp;저장소&lt;/span&gt;&lt;/span&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;pre id=&quot;code_1711876257336&quot; class=&quot;arduino&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@Repository //@Component 가 포함돼있어 컴포넌트 대상이 된다
public class ItemRepository {

    //Map&amp;lt;Long, Item&amp;gt; 상품의 id를 키로 사용하여 상품을 빠르게 검색하고 접근하기 위해
    private static final Map&amp;lt;Long, Item&amp;gt; store = new HashMap&amp;lt;&amp;gt;(); //static
    private static long sequence = 0L; //static

    //저장
    public Item save(Item item) {
        item.setId(++sequence);
        store.put(item.getId(),item);

        return item;
    }

    //조회
    public Item findById(Long id){
        return store.get(id);
    }

    //전체 조회
    public List&amp;lt;Item&amp;gt; findAll(){
        return new ArrayList&amp;lt;&amp;gt;(store.values());
    }

    //업데이트
    public void update(Long itemId, Item updateParam){
        Item findItem = findById(itemId);
        findItem.setItemName(updateParam.getItemName());
        findItem.setPrice(updateParam.getPrice());
        findItem.setQuantity(updateParam.getQuantity());
    }

    //테스트용 해시맵 데이터 날리기
    public void clearStore(){
        store.clear();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;ItemRepositoryTest&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ItemRepository 클래스에 클릭하고 ctrl + shift + T 하면 테스트용 자동완성이 된다 (JUnit5 라이브러리로 하기!)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxg2b/btsF9B6rraD/F5j8VA8wmhP9AU4Wf0OcE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxg2b/btsF9B6rraD/F5j8VA8wmhP9AU4Wf0OcE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxg2b/btsF9B6rraD/F5j8VA8wmhP9AU4Wf0OcE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkxg2b%2FbtsF9B6rraD%2FF5j8VA8wmhP9AU4Wf0OcE1%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;597&quot; height=&quot;618&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nddxe/btsF9zAO3Uo/spQFhLtvcAoXsGOWhKLXIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nddxe/btsF9zAO3Uo/spQFhLtvcAoXsGOWhKLXIk/img.png&quot; data-alt=&quot;생성된것을 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nddxe/btsF9zAO3Uo/spQFhLtvcAoXsGOWhKLXIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnddxe%2FbtsF9zAO3Uo%2FspQFhLtvcAoXsGOWhKLXIk%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;381&quot; height=&quot;177&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성된것을 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;pre id=&quot;code_1711876307399&quot; class=&quot;reasonml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;class ItemRepositoryTest {

    ItemRepository itemRepository = new ItemRepository();

    //테스트 끝날때마다 실행해준다 (깔끔하게 지워주기)
    @AfterEach
    void afterEach() {
        itemRepository.clearStore();
    }

    @Test
    void save(){
        //given
        Item item = new Item(&quot;itemA&quot;,10000,10);
        //when
        Item savedItem = itemRepository.save(item);
        //then
        Item findItem = itemRepository.findById(item.getId());
        assertThat(findItem).isEqualTo(savedItem); //조회한값=저장된값 테스트
    }
}&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;import org.assertj.core.api.Assertions;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;Assertions.assertThat(findItem).isEqualTo(savedItem);&lt;/code&gt;&lt;/pre&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;Assertions 에 커서를 두고 &lt;b&gt;alt + enter&lt;/b&gt; 해서 Add on-demand~~ 클릭하면 앞으로 Assertions 생략해도 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ofOgM/btsF9HZMDGA/xbq2N2rOazWyRl9AwGPlG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ofOgM/btsF9HZMDGA/xbq2N2rOazWyRl9AwGPlG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ofOgM/btsF9HZMDGA/xbq2N2rOazWyRl9AwGPlG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FofOgM%2FbtsF9HZMDGA%2Fxbq2N2rOazWyRl9AwGPlG1%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;653&quot; height=&quot;147&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;147&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;&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;두번째 전체 조회 테스트&lt;/p&gt;
&lt;pre id=&quot;code_1711876313229&quot; class=&quot;reasonml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@Test
void findAll(){
    //given
    Item item1 = new Item(&quot;item1&quot;,10000,10);
    Item item2 = new Item(&quot;item2&quot;,20000,20);

    itemRepository.save(item1);
    itemRepository.save(item2);
    
    //when
    List&amp;lt;Item&amp;gt; result = itemRepository.findAll();
    
    //then
    assertThat(result.size()).isEqualTo(2); //2개가 맞는지
    assertThat(result).contains(item1,item2); //item1과 item2 가 있는지

}&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;&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;색체크가 나오면 잘 동작한다는것!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIsAEb/btsGaAscWkz/G6RmEAqN1ZLKaR09M4KUi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIsAEb/btsGaAscWkz/G6RmEAqN1ZLKaR09M4KUi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIsAEb/btsGaAscWkz/G6RmEAqN1ZLKaR09M4KUi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIsAEb%2FbtsGaAscWkz%2FG6RmEAqN1ZLKaR09M4KUi0%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;801&quot; height=&quot;740&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;740&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;&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;세번째 업데이트 테스트 해보고 정상동작하는지 실행해보기&lt;/p&gt;
&lt;pre id=&quot;code_1711876318094&quot; class=&quot;reasonml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;@Test
void updateItem(){
    //given
    Item item = new Item(&quot;item1&quot;,10000,10);

    Item savedItem = itemRepository.save(item);
    Long itemid = savedItem.getId();

    //when
    Item updateParam = new Item(&quot;item2&quot;, 20000, 20);
    itemRepository.update(itemid,updateParam);

    //then
    Item findItem = itemRepository.findById(itemid);
    assertThat(findItem.getItemName()).isEqualTo(updateParam.getItemName());
    assertThat(findItem.getPrice()).isEqualTo(updateParam.getPrice());
    assertThat(findItem.getQuantity()).isEqualTo(updateParam.getQuantity());
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring MVC 웹페이지 만들기</category>
      <author>선이데이</author>
      <guid isPermaLink="true">https://twoline.tistory.com/170</guid>
      <comments>https://twoline.tistory.com/170#entry170comment</comments>
      <pubDate>Wed, 27 Mar 2024 20:37:02 +0900</pubDate>
    </item>
  </channel>
</rss>