<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ysrec328 님의 블로그</title>
    <link>https://ysrec328.tistory.com/</link>
    <description>ysrec328 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 15 Jun 2026 18:34:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ysrec328</managingEditor>
    <item>
      <title>부트캠프 개발 포트폴리오</title>
      <link>https://ysrec328.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;프로젝트 1. 자유 게시판 API 서버 &amp;ndash; 품질 관리 중심의 게시판 시스템&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인 프로젝트 | 2025.09 ~ 2025.10&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot와 Java로 개발한 자유 게시판 백엔드 API 서버입니다.&lt;br /&gt;기능 개발뿐 아니라 QA 관점의 위험 요소 분석과 결함 예방 전략을 개발 과정 전반에 적용한 프로젝트입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기술 스택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java, Spring Boot, Spring Security, JWT, JPA, MySQL, HTML, CSS, JavaScript&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게시글 CRUD&lt;/li&gt;
&lt;li&gt;댓글 CRUD&lt;/li&gt;
&lt;li&gt;게시글/댓글 좋아요&lt;/li&gt;
&lt;li&gt;게시글&amp;middot;댓글 페이지네이션&lt;/li&gt;
&lt;li&gt;관리자 페이지(게시글/댓글 관리)&lt;/li&gt;
&lt;li&gt;Postman을 활용한 API 테스트&lt;/li&gt;
&lt;li&gt;개발 단계에서 QA 관점 기반의 리스크 분석 및 결함 예방 전략 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GitHub&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/cho-yooseok/newboard&quot;&gt;https://github.com/cho-yooseok/newboard&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;프로젝트 2. To-Do List API 서버 &amp;ndash; 계층별 테스트 기반 품질 확보&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인 프로젝트 | 2025.07.31 ~ 2025.09.02&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Layered Architecture 기반으로 설계하고, 각 계층에 대한 단위&amp;middot;통합 테스트(JUnit5, Mockito)를 정교하게 작성하여 개발한 프로젝트입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기술 스택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java, Spring Boot, JPA, MySQL, HTML, CSS, JavaScript, JUnit5, Mockito&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Controller / Service / Repository 계층별 단위&amp;middot;통합 테스트 작성&lt;/li&gt;
&lt;li&gt;상태 기반 테스트 시나리오 직접 설계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;완료/미완료 상태 전환&lt;/li&gt;
&lt;li&gt;조건 검색 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;서버 구조 안정화 및 테스트 기반 개발 경험&lt;/li&gt;
&lt;li&gt;QA 업무에 필요한 구조적 사고 및 테스트 중심의 개발 방식 경험&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GitHub&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/cho-yooseok/todo-list&quot;&gt;https://github.com/cho-yooseok/todo-list&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;프로젝트 3. My Pocket Book &amp;ndash; 리뷰 API 및 성능 최적화 (팀 프로젝트)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6인 팀 프로젝트 | 2025.05.27 ~ 2025.07.07&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kakao API를 연동해 도서를 검색하고, 리뷰와 별점을 작성하는 도서 리뷰 플랫폼입니다.&lt;br /&gt;이 프로젝트에서 리뷰 기능 전체 개발과 성능 최적화를 담당했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기술 스택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java, Spring Boot, JPA, Redis, MySQL, Swagger, HTML, CSS, JavaScript, Locust&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 성과&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리뷰 기능 전체 API 개발&lt;/li&gt;
&lt;li&gt;Redis 캐시 적용으로 TOP10 리뷰 조회 성능 개선
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;63ms &amp;rarr; 2.38ms (약 26배 향상)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Locust 기반 부하 테스트를 통한 병목 구간 분석 및 개선&lt;/li&gt;
&lt;li&gt;팀 내 결함 관리 프로세스 표준화에 기여&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GitHub&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/cho-yooseok/my-pocket-book-api&quot;&gt;https://github.com/cho-yooseok/my-pocket-book-api&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;프로젝트 4. 상품 정보 스크래핑 자동화 &amp;ndash; Selenium + Jsoup&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인 프로젝트 | 2025.11.01 ~ 2025.11.29&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 사이트에서 상품 정보를 크롤링하고 이미지까지 다운로드하는 자동화 프로그램입니다.&lt;br /&gt;Selenium과 Jsoup을 조합하여 동적 페이지 처리부터 정적 파싱까지 한 번에 수행하는 구조를 구축했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기술 스택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java, Spring Boot, MySQL, Selenium, Jsoup, Swagger&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Selenium을 이용한 동적 URL 자동 수집&lt;/li&gt;
&lt;li&gt;Jsoup으로 HTML 파싱&lt;/li&gt;
&lt;li&gt;상품 정보 및 이미지 다운로드&lt;/li&gt;
&lt;li&gt;Swagger를 통한 API 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GitHub&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/cho-yooseok/CrawlingPractice&quot;&gt;https://github.com/cho-yooseok/CrawlingPractice&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;프로젝트 5. 자동 로그인, 상품 정보 스크래핑, 자동 판매 등록 시스템&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인 프로젝트 | 2025.11.01 ~ 2025.11.30&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쇼핑몰 사이트에 자동 로그인하고 상품 정보를 수집한 뒤,&lt;br /&gt;다른 쇼핑몰에 자동으로 판매 등록까지 수행하는 종합 자동화 시스템입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기술 스택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java, Spring Boot, MySQL, Selenium, Swagger, Docker&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Selenium 기반 자동 로그인 기능&lt;/li&gt;
&lt;li&gt;상품 정보 자동 크롤링&lt;/li&gt;
&lt;li&gt;판매 등록 자동화&lt;/li&gt;
&lt;li&gt;프로젝트 전체 Docker 컨테이너화&lt;/li&gt;
&lt;li&gt;Swagger 기반 API 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GitHub&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/cho-yooseok/AutoLoginCrawlingPractice&quot;&gt;https://github.com/cho-yooseok/AutoLoginCrawlingPractice&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>트러블슈팅,기술적의사결정</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/105</guid>
      <comments>https://ysrec328.tistory.com/105#entry105comment</comments>
      <pubDate>Wed, 10 Dec 2025 18:11:16 +0900</pubDate>
    </item>
    <item>
      <title>단위 테스트란? 통합 테스트란?</title>
      <link>https://ysrec328.tistory.com/99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;단위 테스트(Unit Test)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 작은 단위의 코드를 독립적으로 테스트 하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 대상 : 개별 함수, 메소드, 클래스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적 : 각 코드 조각이 의도한 대로 동작하는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 코드와 분리하여 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠르게 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 발생 시 정확한 위치 파악 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// 계산기 클래스의 덧셈 함수만 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public void testAdd() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Calculator calc = new Calculator();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; assertEquals(5, calc.add(2,3));&amp;nbsp; // 2+3 = 5 인지 확인&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;통합테스트(Integration Test)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 모듈이나 컴포넌트를 결합하여 함께 동작하는지 테스트하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 대상 : 모듈 간의 상호작용, 데이터 흐름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적 : 각 부분이 연결되었을 때 제대로 협력하는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;p 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;DB, 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// 사용자 서비스 + 데이터베이스 통합 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public void testUserRegistration() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; UserService service = new UserService();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; User user = service.register(&quot;test@email.com&quot;,&quot;password&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; // DB에 실제로 저장되었는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; User savedUser&amp;nbsp; = datebase.findUser(user.getId());&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; assertNotNull(savedUser);&lt;/p&gt;
&lt;p data-ke-size=&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis 성능 테스트 예시로 보면 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단위 테스트: Redis의 set() 메소드만 테스트, get() 메소드만 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통합 테스트: 실제 애플리케이션에서 Redis에 데이터 저장 -&amp;gt; 조회 -&amp;gt; 삭제하는 전체 흐름 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알게된것,복습한것,헷갈렸던것 정리</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/99</guid>
      <comments>https://ysrec328.tistory.com/99#entry99comment</comments>
      <pubDate>Thu, 27 Nov 2025 23:02:30 +0900</pubDate>
    </item>
    <item>
      <title>API 테스트란?</title>
      <link>https://ysrec328.tistory.com/98</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;API 테스트란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 테스트란 애플리케이션의 API(Application Programming Interface) 가 정해진 스펙대로 정확하게 동작하는지 검증하는 과정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 요청(Request)에 대한 응답(Response)의 정확성, 응답 시간, 에러 처리, 데이터 형식 등을 확인합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;API란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API(Application Programming Interface)는 소프트웨어 간에 상호작용하기 위한 인터페이스 입니다.&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;예를 들어, REST API는 HTTP 프로토콜을 통해 JSON이나 XML형식으로 데이터를 주고 받으며,&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;REST API의 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET&amp;nbsp; &amp;nbsp; /api/posts&amp;nbsp; &amp;nbsp; # 모든 게시글 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET&amp;nbsp; &amp;nbsp; /api/posts/123&amp;nbsp; &amp;nbsp; # 특정 게시글(ID: 123) 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST&amp;nbsp; &amp;nbsp; /api/posts&amp;nbsp; &amp;nbsp; # 새 게시글 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PUT&amp;nbsp; &amp;nbsp; /api/posts/123&amp;nbsp; &amp;nbsp; # 게시글 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DELETE&amp;nbsp; &amp;nbsp; /api/posts/123&amp;nbsp; &amp;nbsp; # 게시글 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실제 요청/ 응답예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;요청(게시글 조회):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET &lt;a href=&quot;https://example.com/api/posts/123&quot;&gt;https://example.com/api/posts/123&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;size18&quot;&gt;응답(게시글 조회):&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;{&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;id&quot; : 123,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;title&quot; : &quot;첫 번째 게시글&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;content&quot; : &quot;안녕하세요&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;author&quot; : &quot;홍길동&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;created_at&quot; : &quot;2025-11-27T10:30:00&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청(게시글 작성):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST &lt;a href=&quot;https://example.com/api/posts&quot;&gt;https://example.com/api/posts&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Content-Type: application/json&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; &amp;nbsp; &quot;title&quot; : &quot;새 게시글&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;content&quot; : &quot;내용입니다&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;&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; &amp;nbsp; &quot;id&quot; : 124,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;title&quot; : &quot;새 게시글&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;content&quot; : &quot;내용입니다&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;status&quot; : &quot;created&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알게된것,복습한것,헷갈렸던것 정리</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/98</guid>
      <comments>https://ysrec328.tistory.com/98#entry98comment</comments>
      <pubDate>Thu, 27 Nov 2025 22:47:31 +0900</pubDate>
    </item>
    <item>
      <title>JWT를 이용한 인증/인가  란?</title>
      <link>https://ysrec328.tistory.com/97</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;JWT를 이용한 인증/인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서비스에서 사용자 신원을 확인하고, 권한을 판단하기 위해 사용하는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;토큰 기반 인증 방식&lt;/b&gt;&amp;nbsp; &amp;nbsp;입니다&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;쉽게 말하면&amp;nbsp; &amp;nbsp;&quot;로그인 했는지 확인하고, 무엇을 할 수 있는지 결정하는 방법&quot;을&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT(Json Web Token) 으로 처리하는 것&amp;nbsp; &amp;nbsp;입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인증(Authentication)&amp;nbsp; -&amp;gt; &quot;누구세요?&quot;&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;1. 사용자가 로그인 요청(아이디/ 비밀번호 전송)&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;3. 서버가 JWT Access Token(그리고 보통 Refresh Token) 발급&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 사용자는 이후 요청 시 헤더에 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;pgsql&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authorization: Bearer&amp;lt;Access Token&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;5. 서버는 이 토큰만 보고도&amp;nbsp; &amp;nbsp; &quot;아, 이 사람은 인증된 사용자구나&quot; 하고 판단합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인가(Authentication) -&amp;gt; &quot;누구세요?&quot;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인가란 인증된 사용자가 접근 가능한 권한을 확인하는 과정&amp;nbsp;&lt;/b&gt; 입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 흐름&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;&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;json&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; &amp;nbsp; &quot;sub&quot; : &quot;userId123&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;role&quot; : &quot;ADMIN&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;exp&quot; : 170000000&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;서버는 토큰 속 role 또는 권한 정보를 보고 &quot;이 요청을 허용해도 되는지&quot; 판단합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JWT는 왜 쓰는 걸까?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT의 장점은:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버가 세션을 따로 안들어도 됩니다. (Stateless)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/ 서버는 DB나 Redis에 &quot;로그인 상태&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;&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;/ 서버 여러 대가 띄워져 있어도 문제 없습니다.&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;size18&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요약&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증(Authentication) : 사용자가 누구인지 확인(로그인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인가(Authorization) : 사용자가 무엇을 할 수 있는지 확인(권한)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT : 이 정보를 담아 클라이언트에게 주고, 요청마다 보내게 하는 토큰&lt;/p&gt;</description>
      <category>알게된것,복습한것,헷갈렸던것 정리</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/97</guid>
      <comments>https://ysrec328.tistory.com/97#entry97comment</comments>
      <pubDate>Wed, 26 Nov 2025 15:46:16 +0900</pubDate>
    </item>
    <item>
      <title>RESTful API 란?</title>
      <link>https://ysrec328.tistory.com/96</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;RESTful 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;-&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;인터넷에서 약속된 방식으로 데이터를 주고 받는 것&quot;&amp;nbsp; &amp;nbsp; 입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;REpresentational State Transfer 의 약자입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자원의 상태를 표현 (Representation) 해서 클라이언트에게 전달(Transfer) 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Resource(자원)&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;Representation(표현)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자원을 어떤 형태로 표현해서 전달하는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 JSON, XML, HTML 형태로 전달합니다.&lt;/p&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;사용자 자원(Resource): 한 사람의 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표현(Representation): JSON으로 보낸다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{ &quot;id&quot;: 5, &quot;name&quot;: &quot;홍길동&quot;}&lt;/p&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(상태)&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;Transfer(전송)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 표현(Representation)을 클라이언트&amp;lt;-&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;웹 자원을 URL로 표현하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 자원을 HTTP방식(GET, POST, PUT, DELETE 등) 으로&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;API&lt;br /&gt;API는 서로 다른 프로그램끼리 소통하게 해주는 창구, 인터페이스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(클라이언트 -&amp;gt; 서버 호출, 앱 -&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;REST&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 &quot;자원의 상태&quot;를 특정 표현(JSON)으로 만들어 클라이언트에게 전달하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 HTTP 기반 규칙으로 깔끔하고 일관성 있게 설계하자는 개념&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;자원의 상태를 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 RESTful API는&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;REST원칙을 잘 지켜서 만든 API&amp;nbsp; &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;HTTP 메서드를 활용해 자원을 직관적으로 조작하는 방식&lt;/p&gt;
&lt;p data-ke-size=&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;RESTful API의 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /users&amp;nbsp; &amp;nbsp; -&amp;gt; 유저 목록 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST /users&amp;nbsp; &amp;nbsp; -&amp;gt; 유저 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /users/10&amp;nbsp; &amp;nbsp; -&amp;gt; ID=10 유저 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PUT /users/10&amp;nbsp; &amp;nbsp; -&amp;gt; 유저 정보 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DELETE /users/10&amp;nbsp; &amp;nbsp; -&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;URL은 자원(users)만 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행동은 HTTP메서드(GET, POST, PUT, DELETE)로 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규칙이 명확하고 일관성이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;RESTful API 란&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;HTTP 메서드로 다루는 규칙을 잘 지킨 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;&amp;nbsp;&lt;/p&gt;</description>
      <category>알게된것,복습한것,헷갈렸던것 정리</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/96</guid>
      <comments>https://ysrec328.tistory.com/96#entry96comment</comments>
      <pubDate>Wed, 26 Nov 2025 00:12:06 +0900</pubDate>
    </item>
    <item>
      <title>LIKE와 =(등호)   차이</title>
      <link>https://ysrec328.tistory.com/94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. = (등호 연산자)&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;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;SQL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT&amp;nbsp; * FROM Comment WHERE content = 'hello';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content 값이 &quot;hello&quot; 인 행만 조회됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Hello&quot; 또는 &quot;hello world&quot; 는 조회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;해석 : &quot;값이 정확히 같은 경우만 선택한다&quot;&lt;/p&gt;
&lt;p data-ke-size=&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;2.. LIKE(패턴 매칭 연산자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열의 부분 일치를 찾을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;% : 0개 이상의 어떤 문자열도 올 수 있습니다&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;SQL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT * FROM Comment WHERE content LIKE '%hello%';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;hello&quot; -&amp;gt; (O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;hello world&quot; -&amp;gt; (O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;sayhello&quot; -&amp;gt; (O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;hey&quot; -&amp;gt; (X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해석: 값이 특정 패턴과 일치하면 선택한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= : 정확히 일치(완전히 같아야 한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIKE : 부분 일치 (패턴을 이용해 검색 가능, %와 _ 사용)&lt;/p&gt;</description>
      <category>알게된것,복습한것,헷갈렸던것 정리</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/94</guid>
      <comments>https://ysrec328.tistory.com/94#entry94comment</comments>
      <pubDate>Fri, 3 Oct 2025 23:38:22 +0900</pubDate>
    </item>
    <item>
      <title>오버로딩(Overloading) 이란?</title>
      <link>https://ysrec328.tistory.com/93</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;예제1: 일반 메서드 오버로딩&lt;/p&gt;
&lt;pre id=&quot;code_1758975121980&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java

class Calculator {
	// 1) 두 정수 더하기
    public int add(int a, int b) {
    	return a + b;
    }
    
    // 2) 세 정수 더하기
    public int add(int a, int b, int c) {
    	return a + b + c;
    }
    
    // 3) 두 실수 더하기
    public double add(double a, double b) {
    	return a + b;
    }
}



사용 예시:
Calculator calc = new Calculator();
System.out.println(calc.add(2, 3));			// 5   -&amp;gt; int 2개
System.out.println(calc.add(2, 3, 4));		// 9   -&amp;gt; int 3개
System.out.println(calc.add(2.5, 3.2));		// 5.7 -&amp;gt; double 2개&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 2 : 생성자 오버로딩&lt;/p&gt;
&lt;pre id=&quot;code_1758976107254&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;class Person {
	private String name;
    private int age;
    
    // 1) 이름만 받는 생성자
    public Person(String name) {
    	this.name = name;
        this.age = 0;	// 기본값
    }
    
    // 2) 이름과 나이를 받는 생성자
    public Person(Stiring name ,int age) {
    	this.name = name;
        this.age = age
    }
}​&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1758976169417&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Person p1 = new Person(&quot;철수&quot;);			// 이름만 넣음 -&amp;gt; age = 0
Person p2 = new Person(&quot;영희&quot;, 20);		// 이름 + 나이 넣음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ErrorResponse 에 적용된 오버로딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ErrorResponse도 같은 원리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러가 하나일 때 -&amp;gt; new ErrorResponse(time, 400, &quot;메시지&quot;, &quot;/api&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러가 여러 개일 때 -&amp;gt; new ErrorResponse(time, 400, &quot;메시지&quot;, &quot;/api&quot;, errorsMap)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;이렇게 상황별로 다른 형태의 생성자를 제공하기 위해 오버로딩을 쓴 것&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자를 두 개 만든 이유 = 오버로딩(Overloading) -&amp;gt; 상황에 따라 객체를 편리하게 만들 수 있도록 하기 위해서.&lt;/p&gt;</description>
      <category>알게된것,복습한것,헷갈렸던것 정리</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/93</guid>
      <comments>https://ysrec328.tistory.com/93#entry93comment</comments>
      <pubDate>Sat, 27 Sep 2025 21:35:29 +0900</pubDate>
    </item>
    <item>
      <title>@NoArgsConstructor, @AllArgsConsturctor, @RequiredArgsConstructor 정리</title>
      <link>https://ysrec328.tistory.com/89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;@NoArgsConstructor 와 @AllArgsConstructor 는 Lombok 라이브러리에서 제공하는 어노테이션으로,&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. @NoArgsConstructor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뜻 : 매개변수가 없는 기본 생성자를 자동으로 만들어 줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, new 클래스명() 형태로 객체를 만들 수 있게 해줌&lt;/p&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;import lombok.NoArgsConstructor;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NoArgsConstructor // 기본 생성자 자동 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class User {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private String name;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private int age;&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;// public User() {}&lt;/p&gt;
&lt;p data-ke-size=&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;public class Main {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; public static void main(String[] args) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; User user = new User();&amp;nbsp; // 기본 생성자 호출 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // user.setName(&quot;철수&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // user.setAge(20);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;2. @AllArgsConstructor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뜻 : 모든 필드를 매개 변수로 받는 생성자를 자동으로 만들어줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 객체를 만들 때 값을 한 번에 넣을 수 있음NoArgsConstructor 와 @AllArgsConstructor 는 Lombok 라이브러리에서 제공하는 어노테이션으로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 직접 생성자를 일일이 만들지 않아도 자동으로 생성해주는 기능입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. @NoArgsConstructor&lt;/p&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;즉, new 클래스명() 형태로 객체를 만들 수 있게 해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import lombok.NoArgsConstructor;&lt;/p&gt;
&lt;p data-ke-size=&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;@NoArgsConstructor // 기본 생성자 자동 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class User {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private String name;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private int age;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// 위 어노테이션이 붙으면 컴파일 시 아래 코드가 자동으로 추가됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// public User() {}&lt;/p&gt;
&lt;p data-ke-size=&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class Main {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; public static void main(String[] args) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; User user = new User(); // 기본 생성자 호출 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // user.setName(&quot;철수&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // user.setAge(20);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&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;2. @AllArgsConstructor&lt;/p&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;
&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;import lombok.AllArgsConstructor;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@AllArgsConstuctor // 모든 필드를 받는 생성자 자동 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class User {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private String name'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private int age;&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;// public User(String name, int age) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp; &amp;nbsp; &amp;nbsp;this.name = name;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp; &amp;nbsp; &amp;nbsp;this.age = age;&lt;/p&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;public calss Main&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; public static void Main {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; User user = new User(&quot;철수&quot;, 20); // 모든 필드 값을 넣어 생성 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NoArgsContructor&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;@AllArgsConstructor&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;실무에서는 두 개를 함께 사용하는 경우가 많다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 JPA(Entity 클래스)는 기본 생성자가 꼭 필요해서, @NoArgsconstructor 를,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTO나 VO 같은 경우는 한 번에 값을 넣기 위해 @AllArgsConstructor 를 씁니다.&lt;/p&gt;
&lt;p data-ke-size=&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. @RequiredArgsConstructor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뜻 : final 이거나 @NonNull 이 붙은 필드만을 매개변수로 받는 생성자를 자동 생성 해줌&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;import lombok.RequiredArgsConstructor;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import lombok.NonNull;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@RequiredArgsConstructor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class User {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private final String name;&amp;nbsp; &amp;nbsp; // final -&amp;gt;&amp;nbsp; 반드시 생성 시 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; @NonNull&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private String email;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// @NonNull -&amp;gt; 반드시 생성 시 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private int age;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;nbsp; 선택 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&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;// public User(String name, String email) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp; &amp;nbsp; &amp;nbsp;this.name = name;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp; &amp;nbsp; &amp;nbsp;this.email = email;&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;public class Main {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; public static void main(String[] args) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; User user = new User(&quot;철수&quot;, &quot;chulsu@email.com&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // age 는 생성자에 없음 -&amp;gt; 필요하면 setter로 나중에 넣을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;정리 (세 가지 차이점)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NoArgsConstructor -&amp;gt; 아무것도 안 받는 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; new User()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@AllArgsConstructor -&amp;gt; 모든 필드를 받는 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; new User(&quot;철수&quot;, 20, &quot;email@...&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@RequiredArgsConstructor&amp;nbsp;-&amp;gt; final 또는 @NonNull 필드만 받는 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; new User(&quot;철수&quot;, &quot;email.@...&quot;)&lt;/p&gt;
&lt;p data-ke-size=&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;Entity(JPA) -&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NoArgsConstructor (기본 생성자 필수) + @RequiredArgsConstructor (필수값만 받도록)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTO -&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@AllArgsConstructor (필드 전체를 한 번에 세팅)&lt;/p&gt;
&lt;p data-ke-size=&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;예제 코드 : JPA 엔티티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import jakarta.persistence.Entity;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import jakarta.persistence.GeneratedValue;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import jakarta.persistence.GenerationType;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import jakarta.persistence.Id;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import lombok.*;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;@Getter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NoArgsConstructor&amp;nbsp; &amp;nbsp;// JPA에서 프록시 생성을 위해 반드시 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@AllArgsConstructor&amp;nbsp; &amp;nbsp;// 모든 필드를 받는 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@RequiredArgsConstructor&amp;nbsp; &amp;nbsp; // final, @NonNull 필드만 받는 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class User {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; @Id&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; @GeneratedValue(strategy = GenerationType.IDENTITY)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private Long id;&amp;nbsp; &amp;nbsp; // DB에서 자동 생성 -&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;nbsp; &amp;nbsp; @NonNull&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private String username;&amp;nbsp; &amp;nbsp; // 반드시 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; @NonNull&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private String email;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 반드시 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private int age;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 선택 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자 사용 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class Main {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; public static void main(String[] args) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 1. @NoArgsConstructor -&amp;gt; 기본 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; User user1 = new User();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // user1.setUsername(&quot;철수&quot;); // setter 나 다른 방식으로 값 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // user1.setEmail(&quot;test@test.com&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 2. @AllArgsConstructor -&amp;gt; 모든 필드 받는 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; User user2 = new User(1L, &quot;영희&quot;, &quot;younghee@test.com&quot;, 25);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 3. @RequiredArgsConstructor -&amp;gt; 필수값(final, @NonNull)만 받는 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; User user3 = new User(&quot;민수&quot;, &quot;minsu@Test.com);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;@NoArgsConstructor&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;p data-ke-size=&quot;size16&quot;&gt;@AllArgsConstructor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTO 변환 같은 경우에 유용 (모든 값 한 번에 세팅)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@RequiredArgsConstructor&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>알게된것,복습한것,헷갈렸던것 정리</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/89</guid>
      <comments>https://ysrec328.tistory.com/89#entry89comment</comments>
      <pubDate>Thu, 11 Sep 2025 22:48:50 +0900</pubDate>
    </item>
    <item>
      <title>파라미터와 기본생성자</title>
      <link>https://ysrec328.tistory.com/88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 파라미터(Parameter) 가 무슨 뜻인가요?&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;예를 들어, 아래 코드에서 a와 b가 바로 파라미터입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public int add(int a, int b)&amp;nbsp; { // 여기서 'int a'와 'int b'가 파라미터입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; return a + b;&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;int result = add(5, 3); // 여기서 '5'와 '3'은&amp;nbsp; '인자(Argument)' 라고 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&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;기본 생성자(Default Constructor)가 무슨 뜻인가요?&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;Java에서는 클래스에 생성자가 하나도 없을 경우, 컴파일러가 자동으로 아래와 같은 기본 생성자를 만들어줍니다.&lt;/p&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;public MyClass() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;1. @NoArgsConstructor 를 사용하지 않은 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Person 클래스를 만들고, 기본 생성자와 다른 생성자를 직접 작성해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class Person {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private String name;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private int age;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; // 파라미터가 없는 기본 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; public Person() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println(&quot;기본 생성자가 호출되었습니다.&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; // name 과 age를 파라미터 받는 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; public Person(String name, int age) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.name = name;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.age = age;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;2. @NoArgsConstructor 를 사용한 경우&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;import lombok.NoArgsConstructor;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import lombok.AllArgsConstructor;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import lombok.Data;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Data // getter, setter, toString 등을 자동으로 만들어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NoArgsConstructor // 파라미터 없는 생성자를 자동으로 만들어 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@AllArgsConstructor // 모든 파라미터를 받는 생성자를 자동으로 만들어 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class Person {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private String name;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; private int age;&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;// Main 클래스에서 객체를 생성하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class Main {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; public static void main(String[] args) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // @NoArgsConstructor 가 만들어준 기본 생성자를 이용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Person person1 = new Person();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; person1.setName(&quot;홍길동&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; person1.setAge(30);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println(&quot;기본 생성자로 만든 객체: &quot; + person1);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;위 예시에서 @NoArgsConstructor 덕분에 public Person() {...} 코드를 직접 작성하지 않고도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new Person() 처럼 파라미터 없이 객체를 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하자면, @NoArgsConstructor 는 반복적 생성자 코드는 줄여줘서 개발을 더 빠르고 편하게 해주는 도구라고&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;div style=&quot;background-color: #282c34; color: #abb2bf;&quot;&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;추가해설

파라미터가 없는 기본 생성자란?
생성자   는  붕어빵 기계 틀과 같습니다. 객체(붕어 빵)를 만들어 내는 역할을 합니다

그리고

파라미터   는 붕어빵 틀에 넣는 재료라고 생각하면 됩니다.

파라미터가 있는 생성자 : &quot;팥, 슈크림을 넣어서 붕어빵을 만들어줘&quot; 라고 말하는 것과 같습니다
재료(파라미터)를 지정해서 붕어빵(객체)를 만듭니다.

파라미터가 없는 생성자(기본 생성자) : &quot; 그냥 아무 재료 없이 붕어빵 틀만 찍어내줘&quot; 라고 말하는 것과
같습니다. 아무런 재료도 넣지 않고 껍데기(기본 객체)만 만드는 겁니다.

@NoArgsConstructor 의 역할
@NoArgsConstructor 는 이        아무 재료 없는 붕어빵 틀      을 여러분이 직접 만들지 않아도,
롬복(Lombok) 이라는 도구가 알아서 만들어주는 마법같은 도구입니다.


// @NoArgsConstructor 가 없다면 이렇게 직접 만들어야 합니다.
public class Person {
    // ... 필드들

    public Person() { // &amp;lt;- 이게 기본 생성자 입니다.
        // 아무것도 안 해도 되지만, 꼭 만들어야 합니다.
    }
}

// @NoArgsConstructor 가 있다면 이렇게 깔끔해집니다.
@NoArgsConstructor // &amp;lt;- 이 한 줄이 위 코드를 대신해줍니다.
public class Person {
    // ... 필드들

    // 자동으로 만들어주니 직접 작성할 필요가 없습니다.
}

즉, @NoArgsConstructor 는 아무것도 없는 빈 객체를 만들어주는 도구     를
코드로 직접 치지 않아도, 한줄로 간단하게 해결해 주는 역할을 합니다.



붕어빵 틀 = 생성자
붕어빵 재료 = 파라미터

파라미터가 없는 생성자 (기본 생성자)
재료를 넣지 않고, 빈 붕어빵 껍데기를 만드는 것과 같습니다.
일단 붕어빵을 만든 후에 나중에 팥을 넣을 수도 있습니다.

특징 : 객체(붕어빵)를 만들 때 초기값을 지정하지 않습니다.
언제 사용 : 일단 객체를 만든 다음, 필요에 따라 값을   설정할 때 주로 사용합니다.


class Person {
    private String name;
    private int age;

    // 파라미터가 없는 생성자 (기본 생성자)
    public Person() {
        System.out.println(&quot;기본 생성자가 호출되었습니다. 빈 객체를 만들어요&quot;);
    }

    // getter와 setter
    public String getName() { return name;}
    public void setName(String name) {this.name = name; }
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age; }
}

public class Main {
    public static void main(String[] args) {
        // 1. 파라미터가 없는 생성자로 빈 객체(빈 붕어빵) 만들기
        Person person1 = new Person();

        // 2. 나중에 값을 채워 넣기 (팥 넣기)
        person1.setName(&quot;홍길동&quot;);
        person1.setAge(25);

        System.out.println(&quot;만들어진 사람의 이름 :&quot; + person1.getName()); // 출력 : 홍길동
        System.out.println(&quot;만들어진 사람의 나이&quot; + person1.getAge()); // 출력 : 25
    }
}


파라미터가 있는 생성자
붕어빵을 만들 때 재료(팥, 슈크림 등)를 미리 넣어서 만드는 것과 같습니다. 객체가 만들어지는 순간부터
원하는 값을 가지고 시작합니다.

특징 : 객체를 만들 때 필수적인 초기값을 반드시 지정해야 합니다.
언제 사용 : 객체를 만들 때부터 모든 속성을 완벽하게 채우고 싶을 때 사용합니다.

class Person {
    private String name;
    private int age;

    // 파라미터가 있는 생성자
    public Person(String name, int age) {
        // 전달받은 값(파라미터)으로 객체의 필드를 초기화합니다.
        this.name = name;
        this.age = age;
        System.out.println(&quot;파라미터가 있는 생성자가 호출되어습니다. 재료를 채워서 객체를 만듭니다.&quot;);
    }

    // getter와 setter
    public String getName() {return name; }
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
}

public class Main {
    public static void main(String[] args) {
        // 1. 파라미터가 있는 생성자로 객체(재료를 넣은 붕어빵) 만들기
        Person person2 = new Person(&quot;김철수, 30&quot;);

        // 2. 이미 값이 채워져 있으므로 바로 사용 가능
        Systen.out.println(&quot;만들어진 사람의 이름 : &quot; + person2.getName() ); // 출력 : 김철수
        System.out.println(&quot;만들어진 사람의 나이&quot; + person2.getAge()); // 출력 : 30
    }
}


가장 큰 차이점 요약
구분           | 파라미터가 없는 생성자(기본)          | 파라미터가 있는 생성자
객체 생성 시점  | 빈 객체를 만들고, 나중에 값을 채워 넣음 | 객체 생성과 동시에 값을 모두 채워 넣음
장점           | 유연하게 객체를 생성할 수 있음         | 코드 한 줄로 완벽한 객체를 만들 수 있어 편리함


이 중 @NoArgsConstructor 는 이중에서 '파라미터 없는 생성자'를 자동으로 만들어주는 도구입니다.


@AllArgsConstructor 은 클래스에 있는 모든 필드를 파라미터로 받는 생성자를 자동으로 만들어주는 도구입니다.
붕어빵 비유로 다시 설명드리겠습니다.

@NoArgsConstructor : &quot;재료 없이 일단 빈 붕어빵 틀만 찍어내줘&quot;
@AllArgsConstructor : &quot;팥, 슈크림 등 모든 재료를 완벽하게 다 넣어서 붕어빵을 만들어줘&quot;


@AllArgsConstructor의 역할
우리가 Person 이라는 클래스를 만들고, name 과 age 라는 두 개의 필드를 가질 때,
이 두 필드를 모두 파라미터로 받는 생성자를 직접 만들지 않아도,  @AllArgsConstructor가 알아서 만들어줍니다

1. @AllArgsConstructor 를 사용하지 않은 경우

name과 age 필드를 초기화 하는 생성자를 직접 작성해야 합니다.

public class Person {
    private String name;
    private int age;

    // 모든 필드를 파라미터로 받는 생성자를 직접 작성
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}


2. @AllArgsConstructor를 사용한 경우
위의 코드와 동일한 기능을 하지만, 코드가 훨씬 간결해 집니다.

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor // 이 어노테이션이 위 코드를 대신해줍니다.
public class Person {
    private String name;
    private int age;
}



@NoArgsConstructor와 @AllArgsConstructor를 함께 사용했을 때의 예시코드

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Data;

@Data // @Getter, @Setter, @ToString 등
@NoArgsConstructor // 빈 객체를 만드는 기본 생성자
@AllArgsConstructor // 모든 필드를 채워서 객체를 만드는 생성자
public class Person {
    private String name;
    private int age;
}

public class Main {
    public static void main(String[] args) {
        System.out.println(&quot;--- @NoArgsConstructor로 객체 생성&quot;)
        // 빈 붕어빵 껍데기를 만들고, 나중에 재료를 넣습니다.
        Person person1 = new Person();
        person1.setName(&quot;홍길동&quot;);
        person1.setAge(25);
        System.out.println(&quot;person1&quot; + person1); // person1 : Person(name = 홍길동, age = 25)

        System.out.println(&quot;\n--- @AllArgsConstructor로 객체 생성 ---&quot;)
        // 모든 재료를 한 번에 넣어서 붕어빵을 만듭니다.
        Person person2 = new Person(&quot;김철수&quot;, 30);
        System.out.println(&quot;person2:&quot; + person2); // person2 : person(name = 김철수, age =30)
    }
}


@AllArgsConstructor 는 왜 쓸까?

@AllArgsConstructor 는 특히 불변 객체 (Immutable Object)를 만들 때 아주 유용합니다.
객체가 처음 생성될 때 모든 값이 완벽하게 채워져야 나중에 값이 변경될 위험이 없어지기 때문입니다.

결론적으로, @AllArgsConstructor 는 객체를 생성하는 시점에 모든 필드에 값을 한꺼번에 넣고 싶을 때
사용하는 편리한 도구입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>알게된것,복습한것,헷갈렸던것 정리</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/88</guid>
      <comments>https://ysrec328.tistory.com/88#entry88comment</comments>
      <pubDate>Fri, 1 Aug 2025 18:56:12 +0900</pubDate>
    </item>
    <item>
      <title>프로그래밍을 하실 예정이라면, 계정명은 반드시 영문으로 설정하시는 것을 강력히 권장드립니다.</title>
      <link>https://ysrec328.tistory.com/87</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20250720_051901290.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxTzs4/btsPqIXqbiA/SFxKU3rPz6mR8C2FRuSLE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxTzs4/btsPqIXqbiA/SFxKU3rPz6mR8C2FRuSLE1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxTzs4/btsPqIXqbiA/SFxKU3rPz6mR8C2FRuSLE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxTzs4%2FbtsPqIXqbiA%2FSFxKU3rPz6mR8C2FRuSLE1%2Fimg.jpg&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;4032&quot; height=&quot;2268&quot; data-filename=&quot;KakaoTalk_20250720_051901290.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-21 140342.png&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbK6vS/btsPruxtRll/WA2bnUtJuYw0MOXrLexkjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbK6vS/btsPruxtRll/WA2bnUtJuYw0MOXrLexkjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbK6vS/btsPruxtRll/WA2bnUtJuYw0MOXrLexkjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbK6vS%2FbtsPruxtRll%2FWA2bnUtJuYw0MOXrLexkjK%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;371&quot; height=&quot;150&quot; data-filename=&quot;스크린샷 2025-07-21 140342.png&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;102&quot; data-start=&quot;43&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;102&quot; data-start=&quot;43&quot; data-ke-size=&quot;size16&quot;&gt;최근 프로그래밍할때 오류가 나서 오류의 원인을 구글링하다보면, 결국 경로에 한글이 포함되어 있어서 문제가 발생한 경우가 많았습니다.&lt;/p&gt;
&lt;p data-end=&quot;175&quot; data-start=&quot;104&quot; data-ke-size=&quot;size16&quot;&gt;저의 경우, 사용자 계정명이 한글로 되어 있어 경로에 자연스럽게 한글이 포함되곤 했고, 이로 인해 오류가 발생했습니다.&lt;/p&gt;
&lt;p data-end=&quot;175&quot; data-start=&quot;104&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;260&quot; data-start=&quot;177&quot; data-ke-size=&quot;size16&quot;&gt;보통은 환경변수를 변경해서 해결할 수 있었지만, 이런 일이 반복되다 보니 계정명을 영어로 변경하는 것이 더 낫겠다는 생각이 들었습니다.&lt;/p&gt;
&lt;p data-end=&quot;333&quot; data-start=&quot;262&quot; data-ke-size=&quot;size16&quot;&gt;예전부터 컴퓨터를 포맷해서 불필요한 프로그램도 정리하고 싶다는 생각을 하고 있었기 때문에, 이번 기회에 포맷하면서 사용자계정명을 영어로 설정하였습니다.&lt;/p&gt;
&lt;p data-end=&quot;333&quot; data-start=&quot;262&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;333&quot; data-start=&quot;262&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;414&quot; data-start=&quot;335&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;프로그래밍을 하시는 분들은 사용자 계정명을 영어로 설정하셔서, 한글 계정명으로 인해 발생할 수 있는 오류를 미리 방지하시는 것을 추천드립니다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>트러블슈팅,기술적의사결정</category>
      <author>ysrec328</author>
      <guid isPermaLink="true">https://ysrec328.tistory.com/87</guid>
      <comments>https://ysrec328.tistory.com/87#entry87comment</comments>
      <pubDate>Mon, 21 Jul 2025 14:05:19 +0900</pubDate>
    </item>
  </channel>
</rss>