<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개린이 개발노트</title>
    <link>https://note9999.tistory.com/</link>
    <description>dog린이 개발노트 입니다. 발전ing</description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 08:50:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개린이9999</managingEditor>
    <image>
      <title>개린이 개발노트</title>
      <url>https://tistory1.daumcdn.net/tistory/5781398/attach/71cbd03378a3487bb655f48278de4cd4</url>
      <link>https://note9999.tistory.com</link>
    </image>
    <item>
      <title>실무 개발자 필수 HTTP 에러 코드 Top 8</title>
      <link>https://note9999.tistory.com/226</link>
      <description>&lt;h2 data-end=&quot;172&quot; data-start=&quot;141&quot; data-ke-size=&quot;size26&quot;&gt;✅ 실무 개발자 필수 HTTP 에러 코드 Top 8&lt;/h2&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eMUmVA/btsN5RNfIIA/t1h0w0H45HBMIbaa2YkPlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eMUmVA/btsN5RNfIIA/t1h0w0H45HBMIbaa2YkPlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eMUmVA/btsN5RNfIIA/t1h0w0H45HBMIbaa2YkPlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeMUmVA%2FbtsN5RNfIIA%2Ft1h0w0H45HBMIbaa2YkPlk%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;738&quot; height=&quot;476&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;882&quot; data-start=&quot;879&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;900&quot; data-start=&quot;884&quot; data-ke-size=&quot;size26&quot;&gt;  코드별 자세한 예시&lt;/h2&gt;
&lt;hr data-end=&quot;905&quot; data-start=&quot;902&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;931&quot; data-start=&quot;907&quot; data-ke-size=&quot;size23&quot;&gt;  400 Bad Request&lt;/h3&gt;
&lt;p data-end=&quot;953&quot; data-start=&quot;932&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 클라이언트가 뭔가 잘못 보냄&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;json&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;400&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;email 필드는 필수입니다.&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1091&quot; data-start=&quot;1021&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1060&quot; data-start=&quot;1021&quot;&gt;예시: @RequestBody로 JSON 보냈는데 key가 없음&lt;/li&gt;
&lt;li data-end=&quot;1091&quot; data-start=&quot;1061&quot;&gt;비유: 주문서에 이름도 없이 &amp;ldquo;주문합니다&amp;rdquo;라고만 씀&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1096&quot; data-start=&quot;1093&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1123&quot; data-start=&quot;1098&quot; data-ke-size=&quot;size23&quot;&gt;  401 Unauthorized&lt;/h3&gt;
&lt;p data-end=&quot;1145&quot; data-start=&quot;1124&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 로그인 안 했거나 토큰 없음&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;json&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;401&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;로그인이 필요합니다.&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1250&quot; data-start=&quot;1208&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1223&quot; data-start=&quot;1208&quot;&gt;예시: JWT 없이 요청&lt;/li&gt;
&lt;li data-end=&quot;1250&quot; data-start=&quot;1224&quot;&gt;비유: &amp;ldquo;신분증 없이 비행기 타겠다는 사람&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*근데 Spring Security는 &quot;요청이 인증 절차에 도달조차 못하면 &amp;rarr; 403&quot;을 던짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*401은 &quot;너 누구냐?&quot;고 묻는 거&lt;/p&gt;
&lt;hr data-end=&quot;1255&quot; data-start=&quot;1252&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1279&quot; data-start=&quot;1257&quot; data-ke-size=&quot;size23&quot;&gt;  403 Forbidden&lt;/h3&gt;
&lt;p data-end=&quot;1304&quot; data-start=&quot;1280&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 로그인은 했지만 접근 권한이 없음&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;json&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;403&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;이 기능은 관리자만 사용할 수 있습니다.&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1428&quot; data-start=&quot;1378&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1401&quot; data-start=&quot;1378&quot;&gt;예시: 일반 사용자가 관리자 메뉴 접근&lt;/li&gt;
&lt;li data-end=&quot;1428&quot; data-start=&quot;1402&quot;&gt;비유: 사원증은 있는데 회의실 출입권한 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;*근데&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Spring Security는 &quot;요청이 인증 절차에 도달조차 못하면 &amp;rarr; 403&quot;을 던짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*403은 &quot;너 누군진 알겠는데, &lt;b&gt;이 요청은 못 해&lt;/b&gt;&quot;라고 말하는 거&lt;/p&gt;
&lt;hr data-end=&quot;1433&quot; data-start=&quot;1430&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1457&quot; data-start=&quot;1435&quot; data-ke-size=&quot;size23&quot;&gt;  404 Not Found&lt;/h3&gt;
&lt;p data-end=&quot;1480&quot; data-start=&quot;1458&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 요청한 URL, 리소스가 없음&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;json&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;404&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;해당 ID의 게시글이 존재하지 않습니다.&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1605&quot; data-start=&quot;1554&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1586&quot; data-start=&quot;1554&quot;&gt;예시: /board/9999 요청했는데 그 글 없음&lt;/li&gt;
&lt;li data-end=&quot;1605&quot; data-start=&quot;1587&quot;&gt;비유: 없는 가게에 배달 시도&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1610&quot; data-start=&quot;1607&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1643&quot; data-start=&quot;1612&quot; data-ke-size=&quot;size23&quot;&gt;  405 Method Not Allowed&lt;/h3&gt;
&lt;p data-end=&quot;1669&quot; data-start=&quot;1644&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 지원하지 않는 HTTP 메서드 요청&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;json&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;405&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;GET 방식은 지원되지 않습니다.&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1796&quot; data-start=&quot;1739&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1770&quot; data-start=&quot;1739&quot;&gt;예시: @PostMapping에 GET 요청 보냄&lt;/li&gt;
&lt;li data-end=&quot;1796&quot; data-start=&quot;1771&quot;&gt;비유: &amp;ldquo;주문은 말로만 받는데 글로 써냄&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1801&quot; data-start=&quot;1798&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1824&quot; data-start=&quot;1803&quot; data-ke-size=&quot;size23&quot;&gt;  409 Conflict&lt;/h3&gt;
&lt;p data-end=&quot;1840&quot; data-start=&quot;1825&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 현재 상태와 충돌&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;json&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;409&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;이미 등록된 이메일입니다.&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1943&quot; data-start=&quot;1906&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1928&quot; data-start=&quot;1906&quot;&gt;예시: 동일한 이메일로 회원가입 시도&lt;/li&gt;
&lt;li data-end=&quot;1943&quot; data-start=&quot;1929&quot;&gt;비유: 중복 예약 시도&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1948&quot; data-start=&quot;1945&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1985&quot; data-start=&quot;1950&quot; data-ke-size=&quot;size23&quot;&gt;  415 Unsupported Media Type&lt;/h3&gt;
&lt;p data-end=&quot;2017&quot; data-start=&quot;1986&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 서버가 이해하지 못하는 Content-Type&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;json&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;415&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;지원되지 않는 형식입니다. (application/json만 허용)&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2156&quot; data-start=&quot;2106&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2133&quot; data-start=&quot;2106&quot;&gt;예시: 서버는 JSON만 받는데 XML로 요청&lt;/li&gt;
&lt;li data-end=&quot;2156&quot; data-start=&quot;2134&quot;&gt;비유: 외국어로 말했더니 못 알아들음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2161&quot; data-start=&quot;2158&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2197&quot; data-start=&quot;2163&quot; data-ke-size=&quot;size23&quot;&gt;  500 Internal Server Error&lt;/h3&gt;
&lt;p data-end=&quot;2223&quot; data-start=&quot;2198&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 서버 자체 문제 (버그, 예외 등)&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;json&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;500&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;NullPointerException 발생&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2342&quot; data-start=&quot;2298&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2319&quot; data-start=&quot;2298&quot;&gt;예시: 로직 오류, DB 연결 실패&lt;/li&gt;
&lt;li data-end=&quot;2342&quot; data-start=&quot;2320&quot;&gt;비유: 주방장이 국 대신 설탕을 넣음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2347&quot; data-start=&quot;2344&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2376&quot; data-start=&quot;2349&quot; data-ke-size=&quot;size26&quot;&gt;✅ 개발자가 반드시 기억해야 할 포인트 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&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; &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; &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;상태코드
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2618&quot; data-start=&quot;2378&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2618&quot; data-start=&quot;2412&quot;&gt;
&lt;tr data-end=&quot;2440&quot; data-start=&quot;2412&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2433&quot; data-start=&quot;2412&quot;&gt;필수 파라미터 누락, 잘못된 형식&lt;/td&gt;
&lt;td data-end=&quot;2440&quot; data-start=&quot;2433&quot; data-col-size=&quot;sm&quot;&gt;400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2462&quot; data-start=&quot;2441&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2455&quot; data-start=&quot;2441&quot;&gt;로그인 안 한 사용자&lt;/td&gt;
&lt;td data-end=&quot;2462&quot; data-start=&quot;2455&quot; data-col-size=&quot;sm&quot;&gt;401&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2487&quot; data-start=&quot;2463&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2480&quot; data-start=&quot;2463&quot;&gt;로그인은 했는데 권한 없음&lt;/td&gt;
&lt;td data-end=&quot;2487&quot; data-start=&quot;2480&quot; data-col-size=&quot;sm&quot;&gt;403&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2512&quot; data-start=&quot;2488&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2505&quot; data-start=&quot;2488&quot;&gt;존재하지 않는 리소스 요청&lt;/td&gt;
&lt;td data-end=&quot;2512&quot; data-start=&quot;2505&quot; data-col-size=&quot;sm&quot;&gt;404&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2543&quot; data-start=&quot;2513&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2536&quot; data-start=&quot;2513&quot;&gt;요청 방식(GET/POST 등) 틀림&lt;/td&gt;
&lt;td data-end=&quot;2543&quot; data-start=&quot;2536&quot; data-col-size=&quot;sm&quot;&gt;405&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2568&quot; data-start=&quot;2544&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2561&quot; data-start=&quot;2544&quot;&gt;이미 존재하는 데이터 등록&lt;/td&gt;
&lt;td data-end=&quot;2568&quot; data-start=&quot;2561&quot; data-col-size=&quot;sm&quot;&gt;409&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2595&quot; data-start=&quot;2569&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2588&quot; data-start=&quot;2569&quot;&gt;Content-Type 잘못됨&lt;/td&gt;
&lt;td data-end=&quot;2595&quot; data-start=&quot;2588&quot; data-col-size=&quot;sm&quot;&gt;415&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2618&quot; data-start=&quot;2596&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2611&quot; data-start=&quot;2596&quot;&gt;코드 오류, 서버 예외&lt;/td&gt;
&lt;td data-end=&quot;2618&quot; data-start=&quot;2611&quot; data-col-size=&quot;sm&quot;&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>에러 및 에러해결</category>
      <category>http</category>
      <category>에로큳</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/226</guid>
      <comments>https://note9999.tistory.com/226#entry226comment</comments>
      <pubDate>Tue, 20 May 2025 15:47:47 +0900</pubDate>
    </item>
    <item>
      <title>클래스 VS 객체 VS 인스턴스 차이</title>
      <link>https://note9999.tistory.com/225</link>
      <description>&lt;h2 data-end=&quot;79&quot; data-start=&quot;64&quot; data-ke-size=&quot;size26&quot;&gt;  한 줄 정의 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;용어의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;266&quot; data-start=&quot;81&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;266&quot; data-start=&quot;109&quot;&gt;
&lt;tr data-end=&quot;148&quot; data-start=&quot;109&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;126&quot; data-start=&quot;109&quot;&gt;&lt;b&gt;클래스(Class)&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;148&quot; data-start=&quot;126&quot;&gt;객체를 만들기 위한 &lt;b&gt;설계도&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;197&quot; data-start=&quot;149&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;166&quot; data-start=&quot;149&quot;&gt;&lt;b&gt;객체(Object)&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;197&quot; data-start=&quot;166&quot;&gt;클래스에 따라 메모리에 만들어진 &lt;b&gt;실제 실체&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;266&quot; data-start=&quot;198&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;219&quot; data-start=&quot;198&quot;&gt;&lt;b&gt;인스턴스(Instance)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;266&quot; data-start=&quot;219&quot; data-col-size=&quot;sm&quot;&gt;객체와 거의 같지만, &lt;b&gt;&quot;메모리에 올라가 있다&quot;는 의미를 강조&lt;/b&gt;할 때 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;305&quot; data-start=&quot;268&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;305&quot; data-start=&quot;270&quot; data-ke-size=&quot;size16&quot;&gt;✅ 즉, 클래스 &amp;rarr; 객체를 만들고 &amp;rarr; 메모리에 올라가면 인스턴스&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;310&quot; data-start=&quot;307&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;333&quot; data-start=&quot;312&quot; data-ke-size=&quot;size26&quot;&gt;☕ 비유: &amp;ldquo;건축 설계도와 건물&amp;rdquo;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2NnrG/btsN5Pvh4He/NSAFTmkw8iKLYzttQInU80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2NnrG/btsN5Pvh4He/NSAFTmkw8iKLYzttQInU80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2NnrG/btsN5Pvh4He/NSAFTmkw8iKLYzttQInU80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2NnrG%2FbtsN5Pvh4He%2FNSAFTmkw8iKLYzttQInU80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;146&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;503&quot; data-start=&quot;500&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;515&quot; data-start=&quot;505&quot; data-ke-size=&quot;size26&quot;&gt;✅ 코드 예제&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;// 클래스: 설계도&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Robot&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { String name; &lt;/span&gt;&lt;span&gt;&lt;span&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;speak&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { System.out.println(name + &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;이 말한다&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); } } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;// 객체 생성: 실체 만들기&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Robot&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;r1&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Robot&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(); r1.name = &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;뚜비&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;// r1은 Robot 클래스의 '인스턴스'&lt;/span&gt;&lt;/span&gt;&lt;span&gt; r1.speak();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F42rI/btsN3tt5TNO/5T52EoUIZJ5elOkCALqyZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F42rI/btsN3tt5TNO/5T52EoUIZJ5elOkCALqyZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F42rI/btsN3tt5TNO/5T52EoUIZJ5elOkCALqyZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF42rI%2FbtsN3tt5TNO%2F5T52EoUIZJ5elOkCALqyZ1%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;629&quot; height=&quot;140&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;889&quot; data-start=&quot;886&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;903&quot; data-start=&quot;891&quot; data-ke-size=&quot;size26&quot;&gt;  용어 정리표&lt;/h2&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tgT1j/btsN4d5eZVx/kIUQvHdTLmbIAlpJZSGgTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tgT1j/btsN4d5eZVx/kIUQvHdTLmbIAlpJZSGgTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tgT1j/btsN4d5eZVx/kIUQvHdTLmbIAlpJZSGgTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtgT1j%2FbtsN4d5eZVx%2FkIUQvHdTLmbIAlpJZSGgTK%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;649&quot; height=&quot;191&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1097&quot; data-start=&quot;1094&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1114&quot; data-start=&quot;1099&quot; data-ke-size=&quot;size26&quot;&gt;  쉽게 기억하는 법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1153&quot; data-start=&quot;1116&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1127&quot; data-start=&quot;1116&quot;&gt;클래스는 &quot;정의&quot;&lt;/li&gt;
&lt;li data-end=&quot;1138&quot; data-start=&quot;1128&quot;&gt;객체는 &quot;실체&quot;&lt;/li&gt;
&lt;li data-end=&quot;1153&quot; data-start=&quot;1139&quot;&gt;인스턴스는 &quot;실행 중&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Dog&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;dog1&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Dog&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(); &lt;/span&gt;&lt;span&gt;&lt;span&gt;Dog&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;dog2&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Dog&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1266&quot; data-start=&quot;1212&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1225&quot; data-start=&quot;1212&quot;&gt;Dog &amp;rarr; 클래스&lt;/li&gt;
&lt;li data-end=&quot;1250&quot; data-start=&quot;1226&quot;&gt;dog1, dog2 &amp;rarr; 객체 2개&lt;/li&gt;
&lt;li data-end=&quot;1266&quot; data-start=&quot;1251&quot;&gt;둘 다 Dog의 인스턴스&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1271&quot; data-start=&quot;1268&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1287&quot; data-start=&quot;1273&quot; data-ke-size=&quot;size26&quot;&gt;  최종 핵심 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&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; &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;인스턴스
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1482&quot; data-start=&quot;1289&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1482&quot; data-start=&quot;1350&quot;&gt;
&lt;tr data-end=&quot;1381&quot; data-start=&quot;1350&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1355&quot; data-start=&quot;1350&quot;&gt;개념&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1361&quot; data-start=&quot;1355&quot;&gt;설계도&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1366&quot; data-start=&quot;1361&quot;&gt;실체&lt;/td&gt;
&lt;td data-end=&quot;1381&quot; data-start=&quot;1366&quot; data-col-size=&quot;sm&quot;&gt;메모리에 올라간 객체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1423&quot; data-start=&quot;1382&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1390&quot; data-start=&quot;1382&quot;&gt;생성 시기&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1398&quot; data-start=&quot;1390&quot;&gt;코드 작성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1408&quot; data-start=&quot;1398&quot;&gt;new 키워드&lt;/td&gt;
&lt;td data-end=&quot;1423&quot; data-start=&quot;1408&quot; data-col-size=&quot;sm&quot;&gt;new 이후 실행 중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1482&quot; data-start=&quot;1424&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1429&quot; data-start=&quot;1424&quot;&gt;관계&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1444&quot; data-start=&quot;1429&quot;&gt;객체를 만들기 위한 틀&lt;/td&gt;
&lt;td data-end=&quot;1460&quot; data-start=&quot;1444&quot; data-col-size=&quot;sm&quot;&gt;클래스 기반으로 만들어짐&lt;/td&gt;
&lt;td data-end=&quot;1482&quot; data-start=&quot;1460&quot; data-col-size=&quot;sm&quot;&gt;객체 = 인스턴스 (거의 동의어)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>자바Java</category>
      <category>java</category>
      <category>객체</category>
      <category>인스턴스</category>
      <category>자바</category>
      <category>클래스</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/225</guid>
      <comments>https://note9999.tistory.com/225#entry225comment</comments>
      <pubDate>Tue, 20 May 2025 14:57:58 +0900</pubDate>
    </item>
    <item>
      <title>객체란?</title>
      <link>https://note9999.tistory.com/224</link>
      <description>&lt;h2 data-end=&quot;163&quot; data-start=&quot;147&quot; data-ke-size=&quot;size26&quot;&gt;✅ 객체란? 한 줄 정의&lt;/h2&gt;
&lt;blockquote data-end=&quot;198&quot; data-start=&quot;165&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;198&quot; data-start=&quot;167&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;객체 = 상태(값) + 행동(기능)을 가진 실체.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;247&quot; data-start=&quot;200&quot; data-ke-size=&quot;size16&quot;&gt;  즉, 어떤 정보를 담고 있고, 그걸 처리하는 동작(메서드)도 함께 가진 단위야.&lt;/p&gt;
&lt;hr data-end=&quot;252&quot; data-start=&quot;249&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;267&quot; data-start=&quot;254&quot; data-ke-size=&quot;size26&quot;&gt;☕ 비유: &quot;로봇&quot;&lt;/h2&gt;
&lt;blockquote data-end=&quot;291&quot; data-start=&quot;269&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;291&quot; data-start=&quot;271&quot; data-ke-size=&quot;size16&quot;&gt;너가 '로봇'을 만든다고 생각해보자.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;376&quot; data-start=&quot;293&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;339&quot; data-start=&quot;293&quot;&gt;로봇의 이름, 배터리잔량, ID번호 =   &lt;b&gt;상태 (필드/멤버 변수)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;376&quot; data-start=&quot;340&quot;&gt;로봇의 걷기(), 충전하기() =   &lt;b&gt;행동 (메서드)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;399&quot; data-start=&quot;378&quot; data-ke-size=&quot;size16&quot;&gt;  이걸 자바로 표현하면 객체가 돼.&lt;/p&gt;
&lt;hr data-end=&quot;404&quot; data-start=&quot;401&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;428&quot; data-start=&quot;406&quot; data-ke-size=&quot;size26&quot;&gt;✅ 예시 코드: 객체로 표현한 로봇&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1747720486435&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Robot { String name; int battery; public void walk() { battery -= 10; System.out.println(name + &quot;이 걷는다. 남은 배터리: &quot; + battery); } public void charge() { battery = 100; System.out.println(name + &quot; 충전 완료!&quot;); } }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1747720505505&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Robot r1 = new Robot(); //   객체 생성 r1.name = &quot;뚜비&quot;; r1.battery = 80; r1.walk(); //   행동 실행 r1.charge(); //   또 다른 행동&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;962&quot; data-start=&quot;860&quot; data-ke-size=&quot;size16&quot;&gt;  r1 이라는 변수에 저장된 게 바로 &lt;b&gt;객체&lt;/b&gt;&lt;br /&gt;&amp;rarr; 필드(name, battery)와 메서드(walk(), charge())를 &lt;b&gt;모두 가지고 있는 실체&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;967&quot; data-start=&quot;964&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;985&quot; data-start=&quot;969&quot; data-ke-size=&quot;size26&quot;&gt;✅ 객체가 왜 필요한데?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1109&quot; data-start=&quot;987&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1022&quot; data-start=&quot;987&quot;&gt;&lt;b&gt;코드 재사용&lt;/b&gt;이 쉬움 (필요할 때마다 로봇 복사 가능)&lt;/li&gt;
&lt;li data-end=&quot;1072&quot; data-start=&quot;1023&quot;&gt;&lt;b&gt;현실 세계 모델링&lt;/b&gt;에 적합 (사람, 주문서, 게시글 같은 걸 그대로 표현 가능)&lt;/li&gt;
&lt;li data-end=&quot;1109&quot; data-start=&quot;1073&quot;&gt;&lt;b&gt;데이터랑 기능을 하나로 묶음&lt;/b&gt; &amp;rarr; 유지보수, 설계에 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1114&quot; data-start=&quot;1111&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1137&quot; data-start=&quot;1116&quot; data-ke-size=&quot;size26&quot;&gt;✅ 객체 = 데이터 + 기능 묶음&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구성 요소예시
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1242&quot; data-start=&quot;1139&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1242&quot; data-start=&quot;1175&quot;&gt;
&lt;tr data-end=&quot;1206&quot; data-start=&quot;1175&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1180&quot; data-start=&quot;1175&quot;&gt;상태&lt;/td&gt;
&lt;td data-end=&quot;1206&quot; data-start=&quot;1180&quot; data-col-size=&quot;sm&quot;&gt;name, battery, age, id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1242&quot; data-start=&quot;1207&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1212&quot; data-start=&quot;1207&quot;&gt;행동&lt;/td&gt;
&lt;td data-end=&quot;1242&quot; data-start=&quot;1212&quot; data-col-size=&quot;sm&quot;&gt;walk(), charge(), update()&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1247&quot; data-start=&quot;1244&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1284&quot; data-start=&quot;1249&quot; data-ke-size=&quot;size26&quot;&gt;  객체와 직렬화(Serializable)는 어떤 관계?&lt;/h2&gt;
&lt;blockquote data-end=&quot;1325&quot; data-start=&quot;1286&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1325&quot; data-start=&quot;1288&quot; data-ke-size=&quot;size16&quot;&gt;객체는 메모리에만 존재해 &amp;rarr; 꺼내거나 보내려면 &amp;lsquo;직렬화&amp;rsquo;가 필요해!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1352&quot; data-start=&quot;1327&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 세션에 사용자 정보를 저장하려면:&lt;/p&gt;
&lt;p data-end=&quot;1352&quot; data-start=&quot;1327&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;User&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;implements&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Serializable&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { String name; &lt;/span&gt;&lt;span&gt;&lt;span&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span&gt; age; } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1529&quot; data-start=&quot;1443&quot; data-ke-size=&quot;size16&quot;&gt;  이걸 직렬화하면 &amp;rarr; byte[] 로 바뀜 &amp;rarr; 디스크, 네트워크, 세션 저장 가능&lt;br /&gt;(마치 사람의 정보를 종이에 써서 포장해 택배로 보내는 느낌)&lt;/p&gt;
&lt;hr data-end=&quot;1534&quot; data-start=&quot;1531&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1550&quot; data-start=&quot;1536&quot; data-ke-size=&quot;size26&quot;&gt;  진짜 핵심 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;개념설명비유
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1725&quot; data-start=&quot;1552&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1725&quot; data-start=&quot;1592&quot;&gt;
&lt;tr data-end=&quot;1640&quot; data-start=&quot;1592&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1597&quot; data-start=&quot;1592&quot;&gt;객체&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1620&quot; data-start=&quot;1597&quot;&gt;값(상태)과 기능(행동)을 가진 실체&lt;/td&gt;
&lt;td data-end=&quot;1640&quot; data-start=&quot;1620&quot; data-col-size=&quot;sm&quot;&gt;&quot;로봇&quot; (이름 + 걷기능력)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1677&quot; data-start=&quot;1641&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1648&quot; data-start=&quot;1641&quot;&gt;인스턴스&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1665&quot; data-start=&quot;1648&quot;&gt;new로 만든 객체의 실체&lt;/td&gt;
&lt;td data-end=&quot;1677&quot; data-start=&quot;1665&quot; data-col-size=&quot;sm&quot;&gt;뚜비, 나나 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1725&quot; data-start=&quot;1678&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1684&quot; data-start=&quot;1678&quot;&gt;직렬화&lt;/td&gt;
&lt;td data-end=&quot;1702&quot; data-start=&quot;1684&quot; data-col-size=&quot;sm&quot;&gt;객체를 바이트로 바꾸는 작업&lt;/td&gt;
&lt;td data-end=&quot;1725&quot; data-start=&quot;1702&quot; data-col-size=&quot;sm&quot;&gt;사람 정보를 종이에 써서 택배 포장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1730&quot; data-start=&quot;1727&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1757&quot; data-start=&quot;1732&quot; data-ke-size=&quot;size26&quot;&gt;✅ 네가 정말로 이해해야 할 핵심 포인트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1878&quot; data-start=&quot;1759&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1776&quot; data-start=&quot;1759&quot;&gt;&lt;b&gt;클래스는 설계도&lt;/b&gt;고&lt;/li&gt;
&lt;li data-end=&quot;1807&quot; data-start=&quot;1777&quot;&gt;**객체는 그걸 기반으로 만든 실체(인스턴스)**야&lt;/li&gt;
&lt;li data-end=&quot;1841&quot; data-start=&quot;1808&quot;&gt;객체는 &lt;b&gt;상태와 동작을 모두 포함&lt;/b&gt;하는 데이터 단위야&lt;/li&gt;
&lt;li data-end=&quot;1878&quot; data-start=&quot;1842&quot;&gt;이걸 저장/전송하려면 직렬화(Serializable)가 필요해&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>자바Java</category>
      <category>java</category>
      <category>객체</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/224</guid>
      <comments>https://note9999.tistory.com/224#entry224comment</comments>
      <pubDate>Tue, 20 May 2025 14:55:44 +0900</pubDate>
    </item>
    <item>
      <title>@ManyToOne, @OneToMany, @OneToOne, @ManyToMany</title>
      <link>https://note9999.tistory.com/223</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;@ManyToOne, @OneToMany, @OneToOne, @ManyToMany는 객체 간 관계를 정의하는 어노테이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스의 외래키(FK)와 1:N, N:1 같은 개념을 자바 객체에서도 표현해주는 것&lt;/p&gt;
&lt;p data-ke-size=&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;회사(COMPANY) 와 직원(EMPLYOEE)의 관계를 생각해보면,&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;566&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zV3gE/btsN4pqnNhw/NDZkdVHLCJMiG1zRHOsla1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zV3gE/btsN4pqnNhw/NDZkdVHLCJMiG1zRHOsla1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zV3gE/btsN4pqnNhw/NDZkdVHLCJMiG1zRHOsla1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzV3gE%2FbtsN4pqnNhw%2FNDZkdVHLCJMiG1zRHOsla1%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;566&quot; height=&quot;206&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;206&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;1. @ManyToOne (N:1 관계) &lt;br /&gt;많은&amp;nbsp;객체가&amp;nbsp;하나의&amp;nbsp;객체를&amp;nbsp;참조함&lt;/p&gt;
&lt;pre id=&quot;code_1747714477975&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Employee {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = &quot;company_id&quot;)  // FK 컬럼 이름
    private Company company;  // 직원은 하나의 회사에 소속
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이렇게 하면 DB에는 employee 테이블에 company_id FK가 생김&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. @OneToMany (1:N 관계) &lt;br /&gt;하나의 객체가 여러 개를 참조함&lt;/p&gt;
&lt;pre id=&quot;code_1747714495379&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Company {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = &quot;company&quot;)  // 상대방 필드명
    private List&amp;lt;Employee&amp;gt; employees = new ArrayList&amp;lt;&amp;gt;();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;mappedBy는&amp;nbsp;연관관계&amp;nbsp;주인이&amp;nbsp;아님을&amp;nbsp;명시하는&amp;nbsp;것.&amp;nbsp;(DB에&amp;nbsp;FK&amp;nbsp;안&amp;nbsp;만들어짐) &lt;br /&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1747714533016&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Person {

    @Id
    private Long id;

    @OneToOne
    @JoinColumn(name = &quot;card_id&quot;)
    private IDCard idCard;
}

@Entity
public class IDCard {

    @Id
    private Long id;

    private String cardNumber;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이렇게 하면 양방향 관계가 되고, JPA는 이를 기반으로 쿼리를 생성함. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;3. @OneToOne (1:1 관계)&lt;/p&gt;
&lt;pre id=&quot;code_1747714548290&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Person {

    @Id
    private Long id;

    @OneToOne
    @JoinColumn(name = &quot;card_id&quot;)
    private IDCard idCard;
}

@Entity
public class IDCard {

    @Id
    private Long id;

    private String cardNumber;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;사람&amp;nbsp;한&amp;nbsp;명은&amp;nbsp;주민등록증&amp;nbsp;하나.&amp;nbsp;@OneToOne은&amp;nbsp;두&amp;nbsp;객체가&amp;nbsp;서로&amp;nbsp;1:1&amp;nbsp;대응될&amp;nbsp;때&amp;nbsp;사용함. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;4. @ManyToMany (N:N 관계) &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1747714562359&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Student {

    @Id
    private Long id;

    @ManyToMany
    @JoinTable(
        name = &quot;student_subject&quot;,
        joinColumns = @JoinColumn(name = &quot;student_id&quot;),
        inverseJoinColumns = @JoinColumn(name = &quot;subject_id&quot;)
    )
    private List&amp;lt;Subject&amp;gt; subjects;
}

@Entity
public class Subject {

    @Id
    private Long id;

    private String name;

    @ManyToMany(mappedBy = &quot;subjects&quot;)
    private List&amp;lt;Student&amp;gt; students;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;이 경우 중간 테이블(student_subject)이 자동으로 생성됨 &lt;br /&gt;&lt;br /&gt;요약 표 &lt;br /&gt;관계 설명 JPA&amp;nbsp;어노테이션 &lt;br /&gt;1:N 회사&amp;nbsp;-&amp;nbsp;직원 @OneToMany,&amp;nbsp;@ManyToOne &lt;br /&gt;1:1 사람&amp;nbsp;-&amp;nbsp;주민등록증 @OneToOne &lt;br /&gt;N:N 학생&amp;nbsp;-&amp;nbsp;과목 @ManyToMany &lt;br /&gt;&lt;br /&gt;실제 개발 시 팁 &lt;br /&gt;대부분&amp;nbsp;실무에서는&amp;nbsp;@ManyToOne을&amp;nbsp;주로&amp;nbsp;사용&amp;nbsp;(N:1&amp;nbsp;구조가&amp;nbsp;많음) &lt;br /&gt;&lt;br /&gt;@OneToMany는&amp;nbsp;단독으로&amp;nbsp;사용하면&amp;nbsp;성능상&amp;nbsp;불리할&amp;nbsp;수&amp;nbsp;있음&amp;nbsp;(즉시&amp;nbsp;로딩,&amp;nbsp;N+1&amp;nbsp;이슈&amp;nbsp;등) &lt;br /&gt;&lt;br /&gt;양방향보다&amp;nbsp;단방향&amp;nbsp;관계로&amp;nbsp;설계하고,&amp;nbsp;필요한&amp;nbsp;경우만&amp;nbsp;양방향&amp;nbsp;사용 &lt;br /&gt;&lt;br /&gt;DTO로&amp;nbsp;관계&amp;nbsp;객체는&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;제한적으로&amp;nbsp;넘겨야&amp;nbsp;함&amp;nbsp;(무한&amp;nbsp;루프&amp;nbsp;방지)&lt;/p&gt;</description>
      <category>데이터베이스</category>
      <category>@ManyToMany</category>
      <category>@ManyToOne</category>
      <category>@OneToMany</category>
      <category>@onetoone</category>
      <category>jpa</category>
      <category>ManyToMany</category>
      <category>ManyToOne</category>
      <category>onetoMany</category>
      <category>OneToOne</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/223</guid>
      <comments>https://note9999.tistory.com/223#entry223comment</comments>
      <pubDate>Tue, 20 May 2025 13:13:05 +0900</pubDate>
    </item>
    <item>
      <title>@PreAuthorize</title>
      <link>https://note9999.tistory.com/222</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;정의 : @PreAuthorize는 &lt;b&gt;Spring Security에서 메서드 실행 전에 권한을 체크&lt;/b&gt;하기 위해 사용하는 어노테이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; @PreAuthorize는 &lt;b&gt;&amp;ldquo;이 메서드를 누가 실행할 수 있는지&amp;rdquo;를 미리 제한하는 용도&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;728&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjbtqA/btsNYvFmHJ4/0RsTpGyhKZ2UIzsDKyRn31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjbtqA/btsNYvFmHJ4/0RsTpGyhKZ2UIzsDKyRn31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjbtqA/btsNYvFmHJ4/0RsTpGyhKZ2UIzsDKyRn31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjbtqA%2FbtsNYvFmHJ4%2F0RsTpGyhKZ2UIzsDKyRn31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;356&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;356&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;pre id=&quot;code_1747351640986&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PreAuthorize(&quot;hasRole('ADMIN')&quot;)
public void deleteUser(String id) {
    // 관리자만 실행 가능
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1747351657550&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PreAuthorize(&quot;#userId == authentication.name&quot;)
public void updateMyPage(String userId) {
    // 로그인한 사용자 본인만 접근 가능
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1747351663786&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PreAuthorize(&quot;isAuthenticated()&quot;)
public List&amp;lt;Post&amp;gt; getMyPosts() {
    // 로그인한 사용자만 글 목록 조회 가능
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pNKZR/btsNYvFmIaG/Xm4iuadWMizvbfdMiU9En1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pNKZR/btsNYvFmIaG/Xm4iuadWMizvbfdMiU9En1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pNKZR/btsNYvFmIaG/Xm4iuadWMizvbfdMiU9En1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpNKZR%2FbtsNYvFmIaG%2FXm4iuadWMizvbfdMiU9En1%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;705&quot; height=&quot;178&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;178&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;@PreAuthorize 쓰려면 보안 설정 클래스에 아래처럼 설정해야 작동함:&lt;/p&gt;
&lt;pre id=&quot;code_1747351690584&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@EnableGlobalMethodSecurity(prePostEnabled = true)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>스프링Spring</category>
      <category>@PreAuthorize</category>
      <category>preauthorize</category>
      <category>Spring Security</category>
      <category>스프링</category>
      <category>스프링시큐리티</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/222</guid>
      <comments>https://note9999.tistory.com/222#entry222comment</comments>
      <pubDate>Fri, 16 May 2025 08:28:28 +0900</pubDate>
    </item>
    <item>
      <title>@RequestParam, @PathVariable, @RequestBody, @RequestPart 차이 한눈에 정리</title>
      <link>https://note9999.tistory.com/221</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWKNn/btsNZRUHWcJ/hWnTlQwcyoaxzffc9xLXk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWKNn/btsNZRUHWcJ/hWnTlQwcyoaxzffc9xLXk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWKNn/btsNZRUHWcJ/hWnTlQwcyoaxzffc9xLXk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWKNn%2FbtsNZRUHWcJ%2FhWnTlQwcyoaxzffc9xLXk0%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;779&quot; height=&quot;338&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;629&quot; data-start=&quot;616&quot; data-ke-size=&quot;size26&quot;&gt;상세 예제 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. @RequestParam&lt;/p&gt;
&lt;pre id=&quot;code_1747351149706&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/search&quot;)
public String search(@RequestParam String keyword) {
    return &quot;검색어: &quot; + keyword;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1747351186286&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET /search?keyword=건축&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. @PathVariable&lt;/p&gt;
&lt;pre id=&quot;code_1747351204993&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/user/{id}&quot;)
public String getUser(@PathVariable Long id) {
    return &quot;ID: &quot; + id;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1747351215723&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET /user/123&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. @RequestBody&lt;/p&gt;
&lt;pre id=&quot;code_1747351235444&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/user&quot;)
public String createUser(@RequestBody UserVO user) {
    return &quot;이름: &quot; + user.getName();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1747351249382&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;POST /user
Content-Type: application/json

{
  &quot;name&quot;: &quot;홍길동&quot;,
  &quot;age&quot;: 30
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. @RequestPart&lt;/p&gt;
&lt;pre id=&quot;code_1747351270492&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(&quot;/upload&quot;)
public String upload(
    @RequestPart(&quot;file&quot;) MultipartFile file,
    @RequestPart(&quot;meta&quot;) UploadMeta meta) {
    return &quot;파일명: &quot; + file.getOriginalFilename();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1747351289628&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;multipart/form-data로 JSON + 파일 같이 보낼 때

보통 파일 업로드 + 폼 데이터 같이 처리할 때 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pQwXr/btsNYCRP0Cv/GwCl11uMguL06GOSKnb61k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pQwXr/btsNYCRP0Cv/GwCl11uMguL06GOSKnb61k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pQwXr/btsNYCRP0Cv/GwCl11uMguL06GOSKnb61k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpQwXr%2FbtsNYCRP0Cv%2FGwCl11uMguL06GOSKnb61k%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;552&quot; height=&quot;274&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>스프링Spring</category>
      <category>@PathVariable</category>
      <category>@RequestBody</category>
      <category>@RequestParam</category>
      <category>@RequestPart</category>
      <category>PathVariable</category>
      <category>RequestBody</category>
      <category>RequestParam</category>
      <category>RequestPart</category>
      <category>스프링</category>
      <category>스프링부트</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/221</guid>
      <comments>https://note9999.tistory.com/221#entry221comment</comments>
      <pubDate>Fri, 16 May 2025 08:22:34 +0900</pubDate>
    </item>
    <item>
      <title>@controller @restcontroller 차이</title>
      <link>https://note9999.tistory.com/220</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;@Controller와 @RestController는 둘 다 Spring Framework에서 사용되는 어노테이션으로, 주된 차이점은 HTTP 요청에 대한 응답 형식과 목적에 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;@Controller&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주요 목적&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring MVC의 전통적인 컨트롤러로, **뷰(template)**를 반환하는 데 사용됩니다.&lt;/li&gt;
&lt;li&gt;HTML, JSP 등 뷰를 렌더링하기 위한 데이터를 모델에 추가한 후, 뷰 이름을 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동작 원리&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드에서 반환된 값은 &lt;b&gt;뷰 이름&lt;/b&gt;으로 간주됩니다.&lt;/li&gt;
&lt;li&gt;데이터를 뷰에 전달하기 위해 Model 객체를 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;:
&lt;div&gt;
&lt;div&gt;java&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;코드 복사&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;@Controller&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; &lt;span&gt;ExampleController&lt;/span&gt; { &lt;span&gt;@GetMapping(&quot;/example&quot;)&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; String &lt;span&gt;example&lt;/span&gt;&lt;span&gt;(Model model)&lt;/span&gt; { model.addAttribute(&lt;span&gt;&quot;message&quot;&lt;/span&gt;, &lt;span&gt;&quot;Hello, World!&quot;&lt;/span&gt;); &lt;span&gt;return&lt;/span&gt; &lt;span&gt;&quot;exampleView&quot;&lt;/span&gt;; &lt;span&gt;// exampleView.jsp 또는 exampleView.html&lt;/span&gt; } }&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저는 HTML 페이지(예: exampleView.jsp)를 받습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;@RestController&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주요 목적&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RESTful API를 구현하는 데 사용됩니다.&lt;/li&gt;
&lt;li&gt;HTTP 요청에 대해 &lt;b&gt;JSON 또는 XML&lt;/b&gt; 형식의 데이터를 직접 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동작 원리&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@RestController는 @Controller와 @ResponseBody를 합친 것과 동일한 동작을 합니다.&lt;/li&gt;
&lt;li&gt;모든 메서드의 반환값은 **응답 본문(body)**에 직렬화되어 클라이언트로 전송됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;:
&lt;div&gt;
&lt;div&gt;java&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;코드 복사&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;@RestController&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; &lt;span&gt;ExampleRestController&lt;/span&gt; { &lt;span&gt;@GetMapping(&quot;/example&quot;)&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; Map&amp;lt;String, String&amp;gt; &lt;span&gt;example&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; { Map&amp;lt;String, String&amp;gt; response = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;HashMap&lt;/span&gt;&amp;lt;&amp;gt;(); response.put(&lt;span&gt;&quot;message&quot;&lt;/span&gt;, &lt;span&gt;&quot;Hello, World!&quot;&lt;/span&gt;); &lt;span&gt;return&lt;/span&gt; response; &lt;span&gt;// {&quot;message&quot;: &quot;Hello, World!&quot;}&lt;/span&gt; } }&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저나 클라이언트는 JSON 데이터를 받습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;차이점 요약&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;특징@Controller@RestController&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;주된 용도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;뷰 반환 (HTML, JSP)&lt;/td&gt;
&lt;td&gt;JSON 또는 XML 데이터를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;기본 반환 동작&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;뷰 이름으로 처리&lt;/td&gt;
&lt;td&gt;HTTP 응답 본문(body)로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;뷰 템플릿 사용 여부&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용 가능 (JSP, Thymeleaf 등)&lt;/td&gt;
&lt;td&gt;사용하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;결합 어노테이션&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;@Controller&lt;/td&gt;
&lt;td&gt;@Controller + @ResponseBody&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;예제 응답 형식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;HTML 페이지 (예: JSP, Thymeleaf)&lt;/td&gt;
&lt;td&gt;JSON 데이터 (RESTful API 응답)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;언제 사용해야 하나요?&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@Controller&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에서 렌더링된 **뷰(HTML, JSP 등)**를 반환해야 하는 경우.&lt;/li&gt;
&lt;li&gt;웹 애플리케이션의 전통적인 MVC 아키텍처를 구현할 때.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@RestController&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RESTful API를 개발하거나, 클라이언트와 데이터를 JSON/XML 형식으로 주고받아야 할 때.&lt;/li&gt;
&lt;li&gt;프론트엔드(React, Vue.js 등)가 백엔드 API와 통신해야 할 때.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>스프링Spring</category>
      <category>controller</category>
      <category>restcontroller</category>
      <category>레스트컨트롤러</category>
      <category>스프링</category>
      <category>자바</category>
      <category>컨트롤러</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/220</guid>
      <comments>https://note9999.tistory.com/220#entry220comment</comments>
      <pubDate>Thu, 9 Jan 2025 15:27:28 +0900</pubDate>
    </item>
    <item>
      <title>항해 플러스3기 수료생 후기(백엔드) 현업 개발자 부트캠프</title>
      <link>https://note9999.tistory.com/218</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;길고 긴 11주의 여정이 끝났다. 원래는 10주였는데 설날이 끼여서 11주동안 진행했다. 개인적으로 공부를 하고 있지만&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byj5m1/btsE9JKKu8n/xmF7FtZFe3D70kiL1KUZY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byj5m1/btsE9JKKu8n/xmF7FtZFe3D70kiL1KUZY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byj5m1/btsE9JKKu8n/xmF7FtZFe3D70kiL1KUZY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyj5m1%2FbtsE9JKKu8n%2FxmF7FtZFe3D70kiL1KUZY1%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;600&quot; height=&quot;361&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 챕터로 진행된다. CI/CD 파이프라인 구축은 개인적으로 가장힘든 프로젝트였다. 신입이 보통 하지 않는 업무다 보니.. 그치만 반대로 신입이 할 수 없는 업무를 직접 경험해 보아서 좋았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2213&quot; data-origin-height=&quot;1353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caCYzO/btsE8QwCc3g/bl4kXWVplpcyIWVrURCWLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caCYzO/btsE8QwCc3g/bl4kXWVplpcyIWVrURCWLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caCYzO/btsE8QwCc3g/bl4kXWVplpcyIWVrURCWLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaCYzO%2FbtsE8QwCc3g%2Fbl4kXWVplpcyIWVrURCWLk%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;2213&quot; height=&quot;1353&quot; data-origin-width=&quot;2213&quot; data-origin-height=&quot;1353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리제이도 스프링부트도 어색했지만(회사에서는 전자정부, 스프링을 쓴다) 하다보니 익숙해졌고, 미약게나마 프로젝트를 만들었다. 많이 부족했지만 이런게 있고, 이런 경험을 해본다는게 정말 큰 경험 이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 TDD 서버구축. TDD라는 것을 많이 들어보긴했지만 왜해야하는지 어떻게 해야하는 지 몰랐는데 직접해보고나니 그 필요성을 절실히 느꼈고 개인적으로 가장 재밌는 챕터중에 하나였다. 너무 욕심을 많이 부려서 레포지토리를 몇개 생성하긴 했지만 하면서 가장 실력이 많이 향상됐다고 느끼는 챕터였다.&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;2091&quot; data-origin-height=&quot;1373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo6cCJ/btsE7tVX1JS/foukGvES1c7rcW9U9f2ewk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo6cCJ/btsE7tVX1JS/foukGvES1c7rcW9U9f2ewk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo6cCJ/btsE7tVX1JS/foukGvES1c7rcW9U9f2ewk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo6cCJ%2FbtsE7tVX1JS%2FfoukGvES1c7rcW9U9f2ewk%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;2091&quot; height=&quot;1373&quot; data-origin-width=&quot;2091&quot; data-origin-height=&quot;1373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 통합모니터링서버 구축, 장애대응 챕터였는데 ngrinder를 통해 내가만든 api 부하테스트를 해보았다. ngrinder를 처음 써보고 어색하기도 했지만 주변 동기들과 코치님들의 도움으로 진행할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 프로젝트들은 전부 개인프로젝트였다면 팀프로젝트를 만들고 직접 발표까지 하게된 가장 애정(?)있는 프로젝트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈소스를 기여하거나 생성하는 프로젝트였는데 직접 오픈소스를 생성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리제이 플러그인을 만들었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfY23f/btsE6BGYfoo/0WN8MqT1QjG19z8OMT3E20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfY23f/btsE6BGYfoo/0WN8MqT1QjG19z8OMT3E20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfY23f/btsE6BGYfoo/0WN8MqT1QjG19z8OMT3E20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfY23f%2FbtsE6BGYfoo%2F0WN8MqT1QjG19z8OMT3E20%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;2002&quot; height=&quot;1354&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1719&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nOUKk/btsE9Nl39rs/IoBWnjkJuL35qjVlTCiCh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nOUKk/btsE9Nl39rs/IoBWnjkJuL35qjVlTCiCh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nOUKk/btsE9Nl39rs/IoBWnjkJuL35qjVlTCiCh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnOUKk%2FbtsE9Nl39rs%2FIoBWnjkJuL35qjVlTCiCh1%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;1719&quot; height=&quot;1246&quot; data-origin-width=&quot;1719&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hhplus3-team4/dependencies-version-helper/tree/develop&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/hhplus3-team4/dependencies-version-helper/tree/develop&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1708414171762&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hhplus3-team4/dependencies-version-helper&quot; data-og-description=&quot;Contribute to hhplus3-team4/dependencies-version-helper development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hhplus3-team4/dependencies-version-helper/tree/develop&quot; data-og-url=&quot;https://github.com/hhplus3-team4/dependencies-version-helper&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/djoMTQ/hyVm4Mt9GC/5VeDRleVMiKVRuSPEjNyFk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hhplus3-team4/dependencies-version-helper/tree/develop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hhplus3-team4/dependencies-version-helper/tree/develop&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/djoMTQ/hyVm4Mt9GC/5VeDRleVMiKVRuSPEjNyFk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - hhplus3-team4/dependencies-version-helper&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to hhplus3-team4/dependencies-version-helper development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 프로젝트 인데 스프링에서 디펜던시 버전을 관리해주는데도 불구하고 빌드그래들에 불필요한 버전명시를 해서 그 기능을 활용하지 못하는것에 대한 방지로 플러그인을 제작하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 발표준비도하고 발표도 하면서 쉽진 않았지만 개발적으로 한층 성장함을 느껴서 좋았다. 항해를 하면서 여러 프로젝트를 만들 수 있어서 좋았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 관심있으면 지인추천 제도를 활용하면 특별할인도 있다고 하니 관심있는 분들은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hanghae99.spartacodingclub.kr/plus/apply/be&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hanghae99.spartacodingclub.kr/plus/apply/be&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1708414498479&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;IT 커리어 성장 코스 항해99, 첫 취업부터 현직자 코스까지&quot; data-og-description=&quot;항해99는 실무에 집중합니다. 최단기간에 개발자/PM으로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.&quot; data-og-host=&quot;hanghae99.spartacodingclub.kr&quot; data-og-source-url=&quot;https://hanghae99.spartacodingclub.kr/plus/apply/be&quot; data-og-url=&quot;https://hanghae99.spartacodingclub.kr&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d2B05l/hyVm3NypkJ/42kdZpDgFyE6u8p52z9pk0/img.jpg?width=1260&amp;amp;height=630&amp;amp;face=0_0_1260_630,https://scrap.kakaocdn.net/dn/FQ39L/hyVmZ5qE7t/V3ZPjg4v6Ek5rvKF0UvxD1/img.jpg?width=1260&amp;amp;height=630&amp;amp;face=0_0_1260_630,https://scrap.kakaocdn.net/dn/3AdSQ/hyVmTc4g7E/0XLPGn0qE0Xed7YKxmziy1/img.png?width=3840&amp;amp;height=960&amp;amp;face=0_0_3840_960&quot;&gt;&lt;a href=&quot;https://hanghae99.spartacodingclub.kr/plus/apply/be&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hanghae99.spartacodingclub.kr/plus/apply/be&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d2B05l/hyVm3NypkJ/42kdZpDgFyE6u8p52z9pk0/img.jpg?width=1260&amp;amp;height=630&amp;amp;face=0_0_1260_630,https://scrap.kakaocdn.net/dn/FQ39L/hyVmZ5qE7t/V3ZPjg4v6Ek5rvKF0UvxD1/img.jpg?width=1260&amp;amp;height=630&amp;amp;face=0_0_1260_630,https://scrap.kakaocdn.net/dn/3AdSQ/hyVmTc4g7E/0XLPGn0qE0Xed7YKxmziy1/img.png?width=3840&amp;amp;height=960&amp;amp;face=0_0_3840_960');&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;IT 커리어 성장 코스 항해99, 첫 취업부터 현직자 코스까지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;항해99는 실무에 집중합니다. 최단기간에 개발자/PM으로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hanghae99.spartacodingclub.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기로 지원하시고 지원하실 때 3기 김상훈이라고 입력하면 추가할인 있으니까 꼭!! 추가할인 받길!!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 위로 지원하시고 등록까지완료하신분 연락주시면 3기 경험 더욱 더 자세하게 알려드리고 항해플러스에 필요한 자료도 제공해드리겠습니다!&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;여하튼, 주니어개발자라면 꼭 한번 지원해볼만하다고 생각한다. 물경력이라는 고민이 든다면 꼭 지원하길 .. 자기자신이 많이 부족하다는 걸 깨닫게 되지만 반대로 또 깨닫게 되어서 다행이다라는 생각도 들게하는 항해플러스 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;사실.. 15기정도에 한번더 지원하고싶긴하다..ㅎㅎ&amp;nbsp;&lt;/p&gt;</description>
      <category>항해플러스 3기</category>
      <category>항해99 #항해플러스 #주니어개발자 #주니어개발자역량강화 #주니어개발자멘토링 #개발자사이드프로젝트 #코딩부트캠프 #코딩부트캠프후기</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/218</guid>
      <comments>https://note9999.tistory.com/218#entry218comment</comments>
      <pubDate>Tue, 20 Feb 2024 16:37:09 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] Generate 단축키 (윈도우)</title>
      <link>https://note9999.tistory.com/217</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beJFfJ/btsEhr55nQr/YDdckYQVp78cWRWDtMdfOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beJFfJ/btsEhr55nQr/YDdckYQVp78cWRWDtMdfOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beJFfJ/btsEhr55nQr/YDdckYQVp78cWRWDtMdfOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeJFfJ%2FbtsEhr55nQr%2FYDdckYQVp78cWRWDtMdfOK%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;656&quot; height=&quot;361&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;361&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;Alt + Insert&lt;/p&gt;</description>
      <category>DevTools</category>
      <category>IntelliJ#인텔리제이#인텔리#단축키</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/217</guid>
      <comments>https://note9999.tistory.com/217#entry217comment</comments>
      <pubDate>Thu, 1 Feb 2024 14:30:26 +0900</pubDate>
    </item>
    <item>
      <title>@RequestParam, 쿼리스트링</title>
      <link>https://note9999.tistory.com/216</link>
      <description>&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;@RequestParam은 Spring Framework에서 웹 요청의 파라미터를 메서드의 매개변수로 바인딩하기 위해 사용되는 어노테이션입니다. 주로 웹 애플리케이션의 컨트롤러에서 사용되며, HTTP 요청의 파라미터를 컨트롤러 메서드의 매개변수로 전달받을 때 활용됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;@RequestParam은 다양한 속성을 제공하여 파라미터의 동작을 커스터마이징할 수 있습니다. 가장 간단한 형태는 아래와 같습니다&lt;/p&gt;
&lt;pre id=&quot;code_1705024315839&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/example&quot;)
public String exampleMethod(@RequestParam String parameterName) {
    // 메서드 내용...
    return &quot;result&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 예시에서 parameterName은 HTTP 요청의 파라미터 중에서 &quot;parameterName&quot;이라는 이름의 값을 받아옵니다. 이 값은 자동으로 문자열로 변환되어 매개변수에 전달됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 @RequestParam의 주요 속성은 다음과 같습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #374151; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;name:&lt;/b&gt; 요청 파라미터의 이름을 지정합니다. 기본값은 메서드 매개변수의 이름과 동일합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;required:&lt;/b&gt; 해당 파라미터가 반드시 필요한지 여부를 나타냅니다. 기본값은 true이며, false로 설정하면 요청에 해당 파라미터가 없어도 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;defaultValue:&lt;/b&gt; 요청에 해당 파라미터가 없을 경우 사용할 기본값을 지정합니다.&lt;/li&gt;
&lt;li&gt;예를들어&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1705024346719&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/example&quot;)
public String exampleMethod(
    @RequestParam(name = &quot;param&quot;, required = false, defaultValue = &quot;default&quot;) String parameter) {
    // 메서드 내용...
    return &quot;result&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 &quot;param&quot;이라는 이름의 요청 파라미터를 받아오며, 해당 파라미터가 없을 경우 기본값으로 &quot;default&quot;를 사용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;@RequestParam은 주로 &lt;b&gt;HTTP GET 요청의 쿼리 문자열&lt;/b&gt;이나 POST 요청의 폼 데이터를 처리하는 데에 사용되며, 컨트롤러 메서드의 매개변수로 받은 값을 활용하여 비즈니스 로직을 수행할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;HTTP GET 요청의 쿼리 문자열(쿼리스트링)은 URL에 포함된 매개변수로, 클라이언트가 서버에 데이터를 전달하는 방법 중 하나입니다. 쿼리 문자열은 URL의 끝에 물음표(?)로 시작하며, 그 뒤에 key=value 형태로 매개변수를 전달합니다. 여러 매개변수를 전달할 때는 앰퍼샌드(&amp;amp;)로 구분합니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 다음은 이름과 나이라는 두 개의 매개변수를 포함한 간단한 HTTP GET 요청의 URL입니다:&lt;/p&gt;
&lt;pre id=&quot;code_1705024420230&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://example.com/user?name=John&amp;amp;age=25&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 URL에서 &quot;name&quot;과 &quot;age&quot;는 각각 매개변수의 이름이고, &quot;=&quot; 뒤에 오는 값은 해당 매개변수의 값입니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Spring Framework에서는 @RequestParam 어노테이션을 사용하여 이러한 쿼리 문자열의 매개변수를 컨트롤러 메서드의 매개변수로 쉽게 바인딩할 수 있습니다. 예를 들어, 다음은 Spring 컨트롤러에서 쿼리 문자열의 매개변수를 받아오는 예시입니다:&lt;/p&gt;
&lt;pre id=&quot;code_1705024443358&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/user&quot;)
public String getUserInfo(
    @RequestParam String name,
    @RequestParam int age) {
    // name과 age를 사용하여 비즈니스 로직 수행
    return &quot;User Information&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;이런 식으로 컨트롤러 메서드의 매개변수에 &lt;/span&gt;@RequestParam&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 어노테이션을 사용하면 Spring이 자동으로 쿼리 문자열에서 해당 매개변수를 추출하여 바인딩해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;총 정리&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;pring Framework에서는 웹 요청의 파라미터를 컨트롤러 메서드의 매개변수로 바인딩하기 위해 @RequestParam 어노테이션을 사용합니다. 이 어노테이션은 HTTP 요청에서 파라미터를 추출하여 메서드의 매개변수에 자동으로 매핑해줍니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 간단한 예시를 통해 설명하겠습니다&lt;/p&gt;
&lt;pre id=&quot;code_1705024497478&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class MyController {

    @GetMapping(&quot;/example&quot;)
    public String exampleMethod(@RequestParam String parameterName) {
        // 메서드 내용...
        return &quot;result&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 예시에서 /example 경로로 들어오는 HTTP GET 요청에서 parameterName이라는 이름의 파라미터를 추출하여 exampleMethod 메서드의 매개변수로 자동으로 바인딩합니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다른 예시를 통해 몇 가지 중요한 사항을 살펴보겠습니다:&lt;/p&gt;
&lt;pre id=&quot;code_1705024511854&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class MyController {

    @GetMapping(&quot;/user&quot;)
    public String getUserInfo(
        @RequestParam String name,
        @RequestParam int age) {
        // name과 age를 사용하여 비즈니스 로직 수행
        return &quot;User Information&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 /user 경로로 들어오는 HTTP GET 요청에서 &quot;name&quot;과 &quot;age&quot;라는 두 개의 파라미터를 추출하여 각각 name과 age 매개변수에 자동으로 바인딩합니다. Spring은 자동으로 매개변수의 타입에 맞게 변환을 수행합니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 기본적으로 @RequestParam은 해당 파라미터가 반드시 필요한 것으로 간주됩니다. 만약 필수가 아닌 파라미터라면 required 속성을 false로 설정하여 해당 파라미터가 없어도 컨트롤러 메서드를 호출할 수 있습니다. 또한, 기본값을 설정할 수도 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1705024541749&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class MyController {

    @GetMapping(&quot;/user&quot;)
    public String getUserInfo(
        @RequestParam(name = &quot;name&quot;, defaultValue = &quot;Guest&quot;) String userName,
        @RequestParam(name = &quot;age&quot;, required = false) Integer userAge) {
        // userName과 userAge를 사용하여 비즈니스 로직 수행
        return &quot;User Information&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;위의 예시에서 &lt;/span&gt;name&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 파라미터는 기본값으로 &quot;Guest&quot;를 갖고, &lt;/span&gt;age&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 파라미터는 필수가 아닙니다. 만약 요청에 &lt;/span&gt;name&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;이 포함되지 않으면 &quot;Guest&quot;로 기본값이 설정되고, &lt;/span&gt;age&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;가 포함되지 않아도 &lt;/span&gt;userAge&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 매개변수는 &lt;/span&gt;null&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;로 설정됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>스프링Spring</category>
      <category>@RequestParam</category>
      <category>쿼리스트링#쿼리문자열#바인딩</category>
      <author>개린이9999</author>
      <guid isPermaLink="true">https://note9999.tistory.com/216</guid>
      <comments>https://note9999.tistory.com/216#entry216comment</comments>
      <pubDate>Fri, 12 Jan 2024 10:56:20 +0900</pubDate>
    </item>
  </channel>
</rss>