<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>커비</title>
        <link>https://velog.io/</link>
        <description>전공은 컴퓨터공학, 복수전공은 해킹보안학, 직장은 방학(파워 구직중)</description>
        <lastBuildDate>Mon, 06 Jan 2025 04:42:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>커비</title>
            <url>https://velog.velcdn.com/images/kirby_y/profile/87949fb7-9684-4f38-adf1-25e89f442818/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 커비. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kirby_y" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[개별과제 : JPA를 사용한 일정 관리 앱 만들기 (+ 트러블슈팅) ]]></title>
            <link>https://velog.io/@kirby_y/%EA%B0%9C%EB%B3%84%EA%B3%BC%EC%A0%9C-JPA%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%BC%EC%A0%95-%EA%B4%80%EB%A6%AC-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85-7p6h1gah</link>
            <guid>https://velog.io/@kirby_y/%EA%B0%9C%EB%B3%84%EA%B3%BC%EC%A0%9C-JPA%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%BC%EC%A0%95-%EA%B4%80%EB%A6%AC-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85-7p6h1gah</guid>
            <pubDate>Mon, 06 Jan 2025 04:42:40 GMT</pubDate>
            <description><![CDATA[<h3 id="🥊-과제를-시작하며-남기는-회고">🥊 과제를 시작하며 남기는 회고</h3>
<h2 id="✅-작업-기록">✅ 작업 기록</h2>
<h3 id="0️⃣-단계--api-명세-및-erd-작성">0️⃣ 단계 : API 명세 및 ERD 작성</h3>
<h3 id="1️⃣-단계--일정-crud">1️⃣ 단계 : 일정 CRUD</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>일정을 생성, 조회, 수정, 삭제할 수 있습니다.</li>
<li>일정은 아래 필드를 가집니다.<ul>
<li><code>작성 유저명</code>, <code>할일 제목</code>, <code>할일 내용</code>, <code>작성일</code>, <code>수정일</code> 필드</li>
<li><code>작성일</code>, <code>수정일</code> 필드는 <code>JPA Auditing</code>을 활용합니다. → <code>3주차 JPA Auditing 참고!</code></li>
</ul>
</li>
</ul>
<hr>
<h3 id="2️⃣-단계--일정-수정-및-삭제">2️⃣ 단계 : 일정 수정 및 삭제</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-1">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li><strong>선택한 일정 수정</strong><ul>
<li>선택한 일정 내용 중 <code>할일</code>, <code>작성자명</code> 만 수정 가능<ul>
<li>서버에 일정 수정을 요청할 때 <code>비밀번호</code>를 함께 전달합니다.</li>
<li>작성일<code>은 변경할 수 없으며,</code>수정일` 은 수정 완료 시, 수정한 시점으로 변경합니다.
</li>
</ul>
</li>
</ul>
</li>
<li><strong>선택한 일정 삭제</strong><ul>
<li>선택한 일정을 삭제할 수 있습니다.<ul>
<li>서버에 일정 수정을 요청할 때 <code>비밀번호</code>를 함께 전달합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="3️⃣-단계--연관-관계-설정">3️⃣ 단계 : 연관 관계 설정</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-2">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li><strong>작성자와 일정의 연결</strong><ul>
<li>설명<ul>
<li>동명이인의 작성자가 있어 어떤 작성자가 등록한 ‘할 일’인지 구별할 수 없음</li>
<li>작성자를 식별하기 위해 이름으로만 관리하던 작성자에게 고유 식별자를 부여합니다.</li>
<li>작성자를 할 일과 분리해서 관리합니다.</li>
<li>작성자 테이블을 생성하고 일정 테이블에 FK를 생성해 연관관계를 설정해 봅니다.</li>
</ul>
</li>
<li>조건<ul>
<li>작성자는 <code>이름</code> 외에 <code>이메일</code>, <code>등록일</code>, <code>수정일</code> 정보를 가지고 있습니다.<ul>
<li>작성자의 정보는 추가로 받을 수 있습니다.(조건만 만족한다면 다른 데이터 추가 가능)</li>
</ul>
</li>
<li><del>기존 : 고유 식별자를 통해 작성자를 조회할 수 있도록 기존 코드를 변경합니다.</del><ul>
<li>변경 : 작성자의 고유 식별자를 통해 일정이 검색이 될 수 있도록 전체 일정 조회 코드 수정.</li>
</ul>
</li>
<li>작성자의 고유 식별자가 일정 테이블의 외래키가 될 수 있도록 합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="4️⃣-단계--페이지네이션">4️⃣ 단계 : 페이지네이션</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-3">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>설명<ul>
<li>많은 양의 데이터를 효율적으로 표시하기 위해 데이터를 여러 페이지로 나눕니다.<ul>
<li>페이지 번호<code>와</code>페이지 크기`를 쿼리 파라미터로 전달하여 요청하는 항목을 나타냅니다.</li>
<li>전달받은 페이지 번호와 크기를 기준으로 쿼리를 작성하여 필요한 데이터만을 조회하고 반환</li>
</ul>
</li>
</ul>
</li>
<li>조건<ul>
<li>등록된 일정 목록을 <code>페이지 번호</code>와 <code>크기</code>를 기준으로 모두 조회</li>
<li>조회한 일정 목록에는 <code>작성자 이름</code>이 포함</li>
<li>범위를 넘어선 페이지를 요청하는 경우 빈 배열을 반환</li>
<li>Paging 객체를 활용할 수 있음</li>
</ul>
</li>
</ul>
<hr>
<h3 id="5️⃣-단계--예외-발생-처리">5️⃣ 단계 : 예외 발생 처리</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-4">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>설명<ul>
<li>예외 상황에 대한 처리를 위해 <a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Status"><code>HTTP 상태 코드(링크)</code></a>와 <code>에러 메시지</code>를 포함한 정보를 사용하여 예외를 관리할 수 있습니다.<ol>
<li>필요에 따라 사용자 정의 예외 클래스를 생성하여 예외 처리를 수행할 수 있습니다.</li>
<li><code>@ExceptionHandler</code>를 활용하여 공통 예외 처리를 구현할 수도 있습니다.</li>
<li>예외가 발생할 경우 적절한 HTTP 상태 코드와 함께 사용자에게 메시지를 전달하여 상황을 관리합니다.</li>
</ol>
</li>
</ul>
</li>
<li>조건<ul>
<li>수정, 삭제 시 요청할 때 보내는 <code>비밀번호</code>가 일치하지 않을 때 예외가 발생합니다.</li>
<li>선택한 일정 정보를 조회할 수 없을 때 예외가 발생합니다.<ol>
<li>잘못된 정보로 조회하려고 할 때 </li>
<li>이미 삭제된 정보를 조회하려고 할 때</li>
</ol>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="6️⃣-단계--null-체크-및-특정-패턴에-대한-검증-수행">6️⃣ 단계 : null 체크 및 특정 패턴에 대한 검증 수행</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-5">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>설명<ul>
<li>유효성 검사<ol>
<li>잘못된 입력이나 요청을 미리 방지할 수 있습니다.</li>
<li>데이터의 <code>무결성을 보장</code>하고 애플리케이션의 예측 가능성을 높여줍니다.</li>
<li>Spring에서 제공하는 <code>@Valid</code> 어노테이션을 이용할 수 있습니다.</li>
</ol>
</li>
</ul>
</li>
<li>조건<ul>
<li><code>할일</code>은 최대 200자 이내로 제한, 필수값 처리</li>
<li><code>비밀번호</code>는 필수값 처리</li>
<li>담당자의 <code>이메일</code> 정보가 형식에 맞는지 확인</li>
</ul>
</li>
</ul>
<hr>
<h3 id="❓-과제-제출시에는-아래-질문을-고민해보고-답변-작성">❓ 과제 제출시에는 아래 질문을 고민해보고 답변 작성</h3>
<blockquote>
<h4 id="1-적절한-관심사-분리를-적용하셨나요-controller-service-repository">1. 적절한 관심사 분리를 적용하셨나요? (Controller, Service, Repository)</h4>
</blockquote>
<blockquote>
<h4 id="2-restful한-api를-설계하셨나요-어떤-부분이-그런가요-어떤-부분이-그렇지-않나요">2. RESTful한 API를 설계하셨나요? 어떤 부분이 그런가요? 어떤 부분이 그렇지 않나요?</h4>
</blockquote>
<blockquote>
<h4 id="3-수정-삭제-api의-request를-어떤-방식으로-사용-하셨나요-param-query-body">3. 수정, 삭제 API의 request를 어떤 방식으로 사용 하셨나요? (param, query, body)</h4>
</blockquote>
<hr>
<h2 id="🛠️-문제-해결-x-회고">🛠️ 문제 해결 X 회고</h2>
<blockquote>
<h3 id="작업-후기">작업 후기</h3>
<p><code>소요시간</code> : 아직 알 수 없음
<code>난이도</code> : 상</p>
</blockquote>
<p><a href="https://github.com/KIRBY-PARK/JPA-Calendar">&gt;&gt; Java : JDBC를 사용한 일정 관리 앱 만들기 GitHub Code 바로가기</a>
다 만들어진 코드는 위의 깃허브에 올려놓았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Getter 메서드 방식 알아보기 (feat. Lombok)]]></title>
            <link>https://velog.io/@kirby_y/Getter-%EB%A9%94%EC%84%9C%EB%93%9C-%EB%B0%A9%EC%8B%9D-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-feat.-Lombok</link>
            <guid>https://velog.io/@kirby_y/Getter-%EB%A9%94%EC%84%9C%EB%93%9C-%EB%B0%A9%EC%8B%9D-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-feat.-Lombok</guid>
            <pubDate>Thu, 19 Dec 2024 13:41:29 GMT</pubDate>
            <description><![CDATA[<p>숙련과제를 진행하면서 <strong>Getter 메서드 작성 방식</strong>에 대해 궁금해져서 적어보았다.
내가 작성한 코드는 <code>직접 Getter 메서드 작성 방식</code>, 인텔리제이가 추천해준 코드는 <code>Lombok의 @Gettert 사용방식</code> 이었다.</p>
<pre><code class="language-java">public class CalendarCreateRequestDto {
    private String name; // 작성 유저명
    private String title; // 할일 제목
    private String description; // 할일 내용
    private String date; // 작성일
    private String modify; // 수정일

    public String getName() {
        return this.name;
    }

}</code></pre>
<p>내가 작성한 코드는 이렇게 직접 작성하는 방식이었다.
이렇게 작성하면 인텔리제이에서 노란색 줄을 그어서 추천하는 코드를 제안해준다.</p>
<pre><code class="language-java">public class CalendarCreateRequestDto {
    @Getter
    private String name; // 작성 유저명
    private String title; // 할일 제목
    private String description; // 할일 내용
    private String date; // 작성일
    private String modify; // 수정일
}</code></pre>
<p>이유에 대해 ChatGPT에게 물어보니 아래와 같은 내용을 받을 수 있었다.</p>
<hr>
<h3 id="직접-getter-메서드-작성-방식">직접 Getter 메서드 작성 방식</h3>
<pre><code class="language-java">public String getName() {
    return this.name;
}</code></pre>
<h4 id="장점">장점</h4>
<ul>
<li><strong>커스터마이징 가능</strong> : Getter 메서드를 직접 작성하면 값을 반환하기 전에 로직을 추가하거나 반환값을 변형할 수 있다. 예를 들어 name 값을 가공하거나 null 체크를 추가할 수 있다.</li>
<li><strong>직관적이고 명시적임</strong> : 클래스의 모든 동작을 코드로 작성하여 클래스에서 제공하는 메서드와 기능을 한 눈에 파악하기 쉽다.</li>
</ul>
<h4 id="단점">단점</h4>
<ul>
<li><strong>보일러플레이트 코드가 많음</strong> : 필드가 많아질수록 Getter와 Setter 메서드를 반복 작성해야해서 코드가 길어지고 유지보수가 어려워질 수 있다.</li>
</ul>
<hr>
<h3 id="lombok의-getter-사용방식">Lombok의 @Getter 사용방식</h3>
<pre><code class="language-java">@Getter
private String name;</code></pre>
<h4 id="장점-1">장점</h4>
<ul>
<li><strong>간결함</strong> : Lombok을 사용하면 getter 메서드를 자동으로 생성하므로, 코드가 훨씬 간결해지고 유지보수가 용이합니다.</li>
<li><strong>표준화</strong> : 코드 작성 스타일이 일관되며, 개발 시간을 절약할 수 있습니다.</li>
<li><strong>추가 기능 지원</strong> : Lombok은 다양한 어노테이션 (@Setter, @Builder 등)을 제공하므로 코드 작성이 더 효율적입니다.</li>
</ul>
<h4 id="단점-1">단점</h4>
<ul>
<li><strong>의존성 필요</strong>: Lombok은 별도의 라이브러리이므로, 프로젝트에 Lombok 의존성을 추가해야 합니다. 이는 환경 설정이 제대로 되어 있지 않으면 문제가 될 수 있습니다.</li>
<li><strong>코드 명시성 부족</strong>: Lombok이 생성한 코드는 실제로 IDE에서 숨겨지므로, 생성된 메서드를 확인하기 어렵습니다. 이를 불편하게 여기는 개발자도 있습니다.</li>
</ul>
<hr>
<h3 id="그렇다면-어떤-방식이-더-좋을까">그렇다면 어떤 방식이 더 좋을까?</h3>
<blockquote>
<h4 id="lombok을-사용하는-것이-더-효율적이다">Lombok을 사용하는 것이 더 효율적이다.</h4>
<p>특히 DTO 클래스처럼 Getter와 Setter만 필요한 간단한 객체에는 Lombok을 사용하는 것이 코드 작성하는데 속도를 높이고 유지보수를 쉽게 만들어준다.</p>
</blockquote>
<p>하지만, Getter 메서드에 추가적인 로직이 필요하거나 팀에서 Lombok 사용이 금지된 경우 직접 작성하는 방식을 선택해야한다고 한다.</p>
<blockquote>
<h4 id="chatgpt-답변">ChatGPT 답변</h4>
<p>일반적으로 Lombok을 사용하는 방식이 더 권장되고 이를 통해 코드를 간결하게 유지하며 유지보수 시간도 줄어든다. 하지만 Lombok 설정과 사용 규칙이 프로젝트에서 합의된 경우에 사용하는 것이 좋다.</p>
</blockquote>
<p><a href="https://projectlombok.org/">Lombok 공식문서 바로가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개별과제 : JPA를 사용한 일정 관리 앱 만들기 (+ 트러블슈팅)]]></title>
            <link>https://velog.io/@kirby_y/%EA%B0%9C%EB%B3%84%EA%B3%BC%EC%A0%9C-JPA%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%BC%EC%A0%95-%EA%B4%80%EB%A6%AC-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</link>
            <guid>https://velog.io/@kirby_y/%EA%B0%9C%EB%B3%84%EA%B3%BC%EC%A0%9C-JPA%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%BC%EC%A0%95-%EA%B4%80%EB%A6%AC-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</guid>
            <pubDate>Thu, 19 Dec 2024 04:44:19 GMT</pubDate>
            <description><![CDATA[<h3 id="🥊-과제를-시작하며-남기는-회고">🥊 과제를 시작하며 남기는 회고</h3>
<p>이전 과제와 작은 변화가 있다면 데이터베이스 연결을 처음으로 시도해보았고 이전보다 시작을 해볼 수 있었음에 조금 기쁘면서도, <strong>해내지 못한 부분이 더 많다는 좌절감이 크게 남았다.</strong> 큰 이슈 없이, 입문과제도 못해냈다는 <strong>좌절감에 오랜시간 패닉을 겪은 것</strong> 같다. 이번 숙련과제는 단순히 내 자신감 부족과 이미 늦어버린게 아닐까 하는 생각으로 내려놓은 내 잘못된 패턴으로 인해 작업을 마무리하지 못했다.</p>
<p>수요일부터 목요일까지 하나씩 마주하며 다시 살펴보고 강의노트를 살펴보며 따라해보니,
크게 어려워하지 않아도 되었던 일임을 깨달았고, 잘못된 생각들로 시간을 낭비했다는 생각이 들었다.</p>
<p>스스로 해내는 것만이 뿌듯한 일이 아니라는 것을 알게 되었고 답이 안나올 때에는 <code>Google</code>이나 <code>ChatGPT</code>에 의존하는 것이 아니라 <code>튜터님들께 여쭤보는 것</code>이 좋다는 것을 깨달았다.</p>
<p>점심을 먹다가 알고리즘으로 인해 보게된 <a href="https://youtu.be/PCqAEHipf9s?si=z0m9zhEyYKg8u65F">성실한데 성과 못 내는 개발자 특징 Youtube</a> 영상을 보고 확실하게 깨달았다.</p>
<h2 id="✅-작업-기록">✅ 작업 기록</h2>
<h3 id="0️⃣-단계--api-명세-및-erd-작성">0️⃣ 단계 : API 명세 및 ERD 작성</h3>
<h3 id="1️⃣-단계--일정-crud">1️⃣ 단계 : 일정 CRUD</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>일정을 생성, 조회, 수정, 삭제할 수 있습니다.</li>
<li>일정은 아래 필드를 가집니다.<ul>
<li><code>작성 유저명</code>, <code>할일 제목</code>, <code>할일 내용</code>, <code>작성일</code>, <code>수정일</code> 필드</li>
<li><code>작성일</code>, <code>수정일</code> 필드는 <code>JPA Auditing</code>을 활용합니다. → <code>3주차 JPA Auditing 참고!</code></li>
</ul>
</li>
</ul>
<p><code>CalendarCreateRequestDto</code>을 생성하는 과정에서 Getter 형식이 2가지가 있어서 어떤 형식이 더 좋은지 궁금해져서 알아보았다.</p>
<p>내가 처음 작성한 Getter는 아래와 같았고</p>
<pre><code class="language-java">public class CalendarCreateRequestDto {
    private String name; // 작성 유저명
    private String title; // 할일 제목
    private String description; // 할일 내용
    private String date; // 작성일
    private String modify; // 수정일

    public String getName() {
        return this.name;
    }

}</code></pre>
<p>인텔리제이에서 추천해준 Getter는 아래와 같았다.</p>
<pre><code class="language-java">public class CalendarCreateRequestDto {
    @Getter
    private String name; // 작성 유저명
    private String title; // 할일 제목
    private String description; // 할일 내용
    private String date; // 작성일
    private String modify; // 수정일
}</code></pre>
<p>밤에는 조언을 구하기 어려워서 chatGPT에게 어떤 형식이 좋은 형식인지 질문해보았다.
<a href="https://velog.io/@kirby_y/Getter-%EB%A9%94%EC%84%9C%EB%93%9C-%EB%B0%A9%EC%8B%9D-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-feat.-Lombok">Getter 관련 내용 정리</a>로 따로 작성해놓았는데 상황에 따라 적재적소에 사용해야하는 메소드라는 생각이 들었다.</p>
<hr>
<h3 id="2️⃣-단계--일정-수정-및-삭제">2️⃣ 단계 : 일정 수정 및 삭제</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-1">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li><strong>선택한 일정 수정</strong><ul>
<li>선택한 일정 내용 중 <code>할일</code>, <code>작성자명</code> 만 수정 가능<ul>
<li>서버에 일정 수정을 요청할 때 <code>비밀번호</code>를 함께 전달합니다.</li>
<li>작성일<code>은 변경할 수 없으며,</code>수정일` 은 수정 완료 시, 수정한 시점으로 변경합니다.
</li>
</ul>
</li>
</ul>
</li>
<li><strong>선택한 일정 삭제</strong><ul>
<li>선택한 일정을 삭제할 수 있습니다.<ul>
<li>서버에 일정 수정을 요청할 때 <code>비밀번호</code>를 함께 전달합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="3️⃣-단계--연관-관계-설정">3️⃣ 단계 : 연관 관계 설정</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-2">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li><strong>작성자와 일정의 연결</strong><ul>
<li>설명<ul>
<li>동명이인의 작성자가 있어 어떤 작성자가 등록한 ‘할 일’인지 구별할 수 없음</li>
<li>작성자를 식별하기 위해 이름으로만 관리하던 작성자에게 고유 식별자를 부여합니다.</li>
<li>작성자를 할 일과 분리해서 관리합니다.</li>
<li>작성자 테이블을 생성하고 일정 테이블에 FK를 생성해 연관관계를 설정해 봅니다.</li>
</ul>
</li>
<li>조건<ul>
<li>작성자는 <code>이름</code> 외에 <code>이메일</code>, <code>등록일</code>, <code>수정일</code> 정보를 가지고 있습니다.<ul>
<li>작성자의 정보는 추가로 받을 수 있습니다.(조건만 만족한다면 다른 데이터 추가 가능)</li>
</ul>
</li>
<li><del>기존 : 고유 식별자를 통해 작성자를 조회할 수 있도록 기존 코드를 변경합니다.</del><ul>
<li>변경 : 작성자의 고유 식별자를 통해 일정이 검색이 될 수 있도록 전체 일정 조회 코드 수정.</li>
</ul>
</li>
<li>작성자의 고유 식별자가 일정 테이블의 외래키가 될 수 있도록 합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="4️⃣-단계--페이지네이션">4️⃣ 단계 : 페이지네이션</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-3">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>설명<ul>
<li>많은 양의 데이터를 효율적으로 표시하기 위해 데이터를 여러 페이지로 나눕니다.<ul>
<li>페이지 번호<code>와</code>페이지 크기`를 쿼리 파라미터로 전달하여 요청하는 항목을 나타냅니다.</li>
<li>전달받은 페이지 번호와 크기를 기준으로 쿼리를 작성하여 필요한 데이터만을 조회하고 반환</li>
</ul>
</li>
</ul>
</li>
<li>조건<ul>
<li>등록된 일정 목록을 <code>페이지 번호</code>와 <code>크기</code>를 기준으로 모두 조회</li>
<li>조회한 일정 목록에는 <code>작성자 이름</code>이 포함</li>
<li>범위를 넘어선 페이지를 요청하는 경우 빈 배열을 반환</li>
<li>Paging 객체를 활용할 수 있음</li>
</ul>
</li>
</ul>
<hr>
<h3 id="5️⃣-단계--예외-발생-처리">5️⃣ 단계 : 예외 발생 처리</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-4">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>설명<ul>
<li>예외 상황에 대한 처리를 위해 <a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Status"><code>HTTP 상태 코드(링크)</code></a>와 <code>에러 메시지</code>를 포함한 정보를 사용하여 예외를 관리할 수 있습니다.<ol>
<li>필요에 따라 사용자 정의 예외 클래스를 생성하여 예외 처리를 수행할 수 있습니다.</li>
<li><code>@ExceptionHandler</code>를 활용하여 공통 예외 처리를 구현할 수도 있습니다.</li>
<li>예외가 발생할 경우 적절한 HTTP 상태 코드와 함께 사용자에게 메시지를 전달하여 상황을 관리합니다.</li>
</ol>
</li>
</ul>
</li>
<li>조건<ul>
<li>수정, 삭제 시 요청할 때 보내는 <code>비밀번호</code>가 일치하지 않을 때 예외가 발생합니다.</li>
<li>선택한 일정 정보를 조회할 수 없을 때 예외가 발생합니다.<ol>
<li>잘못된 정보로 조회하려고 할 때 </li>
<li>이미 삭제된 정보를 조회하려고 할 때</li>
</ol>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="6️⃣-단계--null-체크-및-특정-패턴에-대한-검증-수행">6️⃣ 단계 : null 체크 및 특정 패턴에 대한 검증 수행</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-5">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>설명<ul>
<li>유효성 검사<ol>
<li>잘못된 입력이나 요청을 미리 방지할 수 있습니다.</li>
<li>데이터의 <code>무결성을 보장</code>하고 애플리케이션의 예측 가능성을 높여줍니다.</li>
<li>Spring에서 제공하는 <code>@Valid</code> 어노테이션을 이용할 수 있습니다.</li>
</ol>
</li>
</ul>
</li>
<li>조건<ul>
<li><code>할일</code>은 최대 200자 이내로 제한, 필수값 처리</li>
<li><code>비밀번호</code>는 필수값 처리</li>
<li>담당자의 <code>이메일</code> 정보가 형식에 맞는지 확인</li>
</ul>
</li>
</ul>
<hr>
<h3 id="❓-과제-제출시에는-아래-질문을-고민해보고-답변-작성">❓ 과제 제출시에는 아래 질문을 고민해보고 답변 작성</h3>
<blockquote>
<h4 id="1-적절한-관심사-분리를-적용하셨나요-controller-service-repository">1. 적절한 관심사 분리를 적용하셨나요? (Controller, Service, Repository)</h4>
</blockquote>
<blockquote>
<h4 id="2-restful한-api를-설계하셨나요-어떤-부분이-그런가요-어떤-부분이-그렇지-않나요">2. RESTful한 API를 설계하셨나요? 어떤 부분이 그런가요? 어떤 부분이 그렇지 않나요?</h4>
</blockquote>
<blockquote>
<h4 id="3-수정-삭제-api의-request를-어떤-방식으로-사용-하셨나요-param-query-body">3. 수정, 삭제 API의 request를 어떤 방식으로 사용 하셨나요? (param, query, body)</h4>
</blockquote>
<hr>
<h2 id="🛠️-문제-해결-x-회고">🛠️ 문제 해결 X 회고</h2>
<blockquote>
<h3 id="작업-후기">작업 후기</h3>
<p><code>소요시간</code> : 아직 알 수 없음
<code>난이도</code> : 상</p>
</blockquote>
<p><a href="https://github.com/KIRBY-PARK/JPA-Calendar">&gt;&gt; Java : JDBC를 사용한 일정 관리 앱 만들기 GitHub Code 바로가기</a>
다 만들어진 코드는 위의 깃허브에 올려놓았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 67일차 (2024.12.12 목) : 드디어 회복 완료!]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-67%EC%9D%BC%EC%B0%A8-2024.12.12-%EB%AA%A9-%EB%93%9C%EB%94%94%EC%96%B4-%ED%9A%8C%EB%B3%B5-%EC%99%84%EB%A3%8C</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-67%EC%9D%BC%EC%B0%A8-2024.12.12-%EB%AA%A9-%EB%93%9C%EB%94%94%EC%96%B4-%ED%9A%8C%EB%B3%B5-%EC%99%84%EB%A3%8C</guid>
            <pubDate>Thu, 12 Dec 2024 12:02:38 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="🚀-오늘의-공부기록-한-눈에-보기">🚀 오늘의 공부기록 한 눈에 보기</h3>
</blockquote>
<hr>
<h2 id="01-바뀐-밤낮-돌려내고-80-건강-회복">01. 바뀐 밤낮 돌려내고 80% 건강 회복!</h2>
<p>과제 제출 기간에 밤샘하느라 <strong>밤낮이 바뀌어 수요일까지 고생</strong>하다가 드디어 <strong>완벽하게 돌려냈다.</strong> 앞으로는 더 일찍 일어나서 <code>오전에 헬스장에 다녀오고 점심시간과 수업이 끝났을 때 가벼운 산책을 하는 루틴</code>을 가져야겠다고 절실하게 느꼈다. 나 자신의 스트레스는 없다고 생각하더라도 신체가 느끼는 스트레스는 남다른 것 같았고, 러닝도 못한지 3주가 되어 몸이 아파진게 아닐까? 하는 생각도 들었다. (글루텐 알레르기가 있는데 밀가루를 조금 섭취한 것도 문제가 되었을 듯..)</p>
<p>지금까지의 내 건강 루틴에서 어떤 것을 추가하고 어떻게 시간을 배분하면 좋을지 조금 더 고민해보는 시간을 가져야겠다고 느꼈다.</p>
<p>공부를 하면서도 <strong>내 몸에 대해 더 잘알아가야만 취직해서도 걱정없이 살아갈 수 있을 것</strong> 같다.
회사를 다니고 있지 않을 때 나에 대해 더 알아가고 방법을 찾아간다면 분명 취업할 시기에는 <strong>건강도 지키고 일도 잘하는 인재</strong>가 될 수 있지 않을까 하며 작은 상상도 해보았다 😁</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>건강관리도 정말 중요한 부분이라고 생각한다. 뭐랄까, 갑작스럽게 건강하지 못해서 하고자 하는 일을 다해내지 못하거나 팀에 영향을 끼치게 된다면 그건 매우 끔찍한 일인 것을 알고 있기에 이 기간동안 반드시 건강해져야하고, 유지하는 법을 알아내야만 한다고 생각한다</em></p>
</blockquote>
<hr>
<h2 id="02-공부방식을-바꾸자-선-노트-후-블로그">02. 공부방식을 바꾸자! (선 노트 후 블로그)</h2>
<p>지금까지는 강의를 들으며 듣는 동시에 모르면 멈추고 구글링, 즉시 블로그에 정리를 하다보니 블로그에 정리하며 키보드로 타자를 치고 있는 <strong>내 손만 기억하고 뇌는 기억하지 못한다</strong>고 느꼈다. 그래서 우선 <strong>아날로그하게 손으로 적으며 공부</strong>해보려고 한다. <code>이해하지 못한 포인트들은 따로 기재</code>해서 튜터님들을 찾아뵈어보려고 한다.</p>
<p>잘못된 공부방식이었기 때문에 머릿속에 남는게 없는 것 같다는 느낌을 받은 것 같다.
이번 과제가 끝나면 프로젝트 진행인데 팀에 민폐를 끼칠 수 없고 취업은 반드시 해야하기 때문에 생존형은 물론, 기술력도 반드시 키워내야만 살아남을 수 있다.</p>
<p><code>시간을 최대한 쪼개고 쪼개서 지식을 안착시키는데에 집중</code>해봐야겠다. 물론 이전에도 집중을 했지만, 지금와서보니, 두루뭉실하게 계획하고 지내온 것 같다고 느꼈기에 지금이라도 바꾸고 제대로 다시 공부하자고 느꼈다.</p>
<p>2월부터는 실업급여도 종료되서 삶이 약간 퍽퍽해지고 아르바이트와 병행하거나 다른 쪽에서 일정 수입을 가져와야만 하기 때문에 앞으로 최소 2달간 기초를 다지고 <code>제대로 공부해놓아야 2월 중순부터 고생하지 않을 것</code> 같았다. 여러모로 노력해야할 것이 산더미인 것을 다시 한 번 깨달으며 마음을 다져보았다.</p>
<blockquote>
<h4 id="🔥-한줄-요약-1">🔥 한줄 요약</h4>
<p><em>지금 제대로 바꿔놓지 않는다면 나중에 반드시 크게 후회할 것 같다고 생각이 들었다</em></p>
</blockquote>
<hr>
<h2 id="02-스탠다드반이지만-베이직을-듣는다">02. 스탠다드반이지만 베이직을 듣는다</h2>
<p>각 수준별 학습반의 설명을 듣고 베이직이 아니라 스탠다드가 적합하다는 생각에 들어갔지만.. 베이직이 조금 더 <code>이해하기 쉬운 강의와 차근차근 배우는</code> 느낌이 있어서 베이직반의 강의를 올라올 때마다 들어보기로 했다.</p>
<p><strong>우선 최애 튜터님이 강의하시기에.. 안들을 수 없다.. 언제나 최고 ! !</strong>
<img src="https://velog.velcdn.com/images/kirby_y/post/75a46a57-4c12-4d10-a123-379609b0340e/image.png" alt="">
베이직반은 OT 때부터 Spring 강의가 시작되어서 영상의 30분부터 집중해서 듣기 시작했다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/19deac78-b317-49b5-8627-0db6e46b3bb1/image.png" alt="">
인텔리제이 안에서 추가하고 프로젝트 시작은 해보았지만, 이런 방법은 처음이라 그대로 따라하면서 기억하고 싶은 부분은 노트에 적어놓았다. 공부는 아무래도 적어놓고 <strong>복습하면서 블로그 정리하는 방법</strong>이 좋을 것 같았다. (선 노트 후 블로그)</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/5cc88b6e-5f67-46e7-bf01-dd7f277f5f35/image.png" alt="">
<strong>의존성 파일들이 받아지느라 빌드하는데에 시간이 조금 소모</strong>되지만, 그건 이전의 방법에서도 동일했기에 괜찮았고 새로운 방법도 나쁘지 않고 오히려 편하게 느껴졌다!</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/32dea8c4-ed4e-4ed6-8e69-b561a4ff47e8/image.png" alt="">
한가득 다운로드된 것을 확인해볼 수 있다!
앞으로 신경쓸일이 거의 없는 부분이지만 캡쳐해서 기록해보았다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/e4b95f5e-d263-4e64-be8d-945ce9ab4c2b/image.png" alt="">
내가 집중해야할 부분은 <code>main</code>과 <code>test</code> 폴더인데 벌써 두근두근하다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/25f6e062-a454-4ad4-ad84-46fee9b218eb/image.png" alt="">
<strong>기본적으로 생성해야하는 패키지 구조!</strong> (암기해야한다고 하셨다)
보통 이 구조에서 <strong>확장</strong>하거나 <strong>변경</strong>하지만 대부분 이 구조로 <strong>실무에서 사용</strong>된다고 한다.</p>
<hr>
<blockquote>
<h3 id="🚀-오늘의-추천-트렌딩-top3">🚀 오늘의 추천 트렌딩 Top3</h3>
<p>오늘 읽은 트렌딩 글 중에 추천하고 싶은, 기억하고 싶은 글을 5개로 추려보았다.
</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 66일차 (2024.12.11 수) : 취업설명회 특강!]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-66%EC%9D%BC%EC%B0%A8-2024.12.11-%EC%88%98</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-66%EC%9D%BC%EC%B0%A8-2024.12.11-%EC%88%98</guid>
            <pubDate>Thu, 12 Dec 2024 00:54:06 GMT</pubDate>
            <description><![CDATA[<h2 id="01-취업설명회-특강">01. 취업설명회 특강</h2>
<p>내가 다니는 곳에서 진행한 취업설명회는 아니었지만, 생각보다 의외인 부분들을 알게되고 이력서를 어떻게 작성하면 좋을지 감이 와서 정말 유익하고 좋은 시간이라고 생각이 들었다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/2ae32ee4-0553-47a8-ae56-3e81bc6a43ef/image.png" alt="">
익명으로 질문을 받기도 하셨는데 하나하나 전부 답변해주셔서 질문과 답변도 정리해놓았다.
강의해주신 강사님은 처음엔 작은 기업에 계시다가 야놀자, 우아한 형제들에서 근무하셨다고 이력서를 공개해주셨다. 대강 이렇게 작성하면 됩니다~ 라는 느낌으로 보여주셨는데 어떻게 정리하면될지 감을 잡을 수 있게 해준 포인트가 되었다!</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/8ea868da-61a7-456b-bf28-4d3720d5c6d8/image.png" alt="">
노션에 이렇게 한 페이지로 정리를 해놓았고 이력서를 준비하며 조금씩 매일 수정해보려고 한다!
이전에 만들어놓은 퍼블리셔, 프론트엔드 포트폴리오는 다신 쓸 일이 없을 것 같았다 ㅎㅎ..</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>목표를 잊은 것 같다면 다시 되새기기</em></p>
</blockquote>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 65일차 (2024.12.10 화) : 밤샘은 가급적이면 하지말자]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-65%EC%9D%BC%EC%B0%A8-2024.12.10-%ED%99%94</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-65%EC%9D%BC%EC%B0%A8-2024.12.10-%ED%99%94</guid>
            <pubDate>Tue, 10 Dec 2024 12:49:58 GMT</pubDate>
            <description><![CDATA[<h2 id="01-밤샘하면-뇌-기능이-떨어지는-것-같아요">01. 밤샘하면 뇌 기능이 떨어지는 것 같아요</h2>
<p>과제 관련해서 공부를 제대로 하거나 실습을 제대로 끝마치지 못했어서 2일동안 잠 못자고 계속 강의 다시보면서 실습과 과제를 진행했다. 결국 시간이 부족해 0단계만 해서 제출했다..다음 과제는 반드시 발제 당일에 시작해볼 것이다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/16915226-7bba-46e4-81f8-3ecc5011bb01/image.png" alt=""></p>
<p>출석은 오전6시부터 가능해서 밤샘 공부하다가 인증했다.
내일부터는 상큼하게 시작하기 위해 밤낮을 바꾸려고 오늘은 일찍 잠들 예정이다!</p>
<p>몸이 한 번 안좋아지면 되돌리는데에만 최소 3일이 걸려서 곤란하고 힘들지만.. 이것도 경험이겠지 하는 마음으로 앞으로 이런 습관을 없애보려고 노력해야겠다.</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>건강하자</em></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 64일차 (2024.12.09 월) : 2025 커밋 캘린더 언박싱]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-64%EC%9D%BC%EC%B0%A8-2024.12.09-%EC%9B%94-2025-%EC%BB%A4%EB%B0%8B-%EC%BA%98%EB%A6%B0%EB%8D%94-%EC%96%B8%EB%B0%95%EC%8B%B1</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-64%EC%9D%BC%EC%B0%A8-2024.12.09-%EC%9B%94-2025-%EC%BB%A4%EB%B0%8B-%EC%BA%98%EB%A6%B0%EB%8D%94-%EC%96%B8%EB%B0%95%EC%8B%B1</guid>
            <pubDate>Tue, 10 Dec 2024 10:55:50 GMT</pubDate>
            <description><![CDATA[<h2 id="01-2025-커밋-캘린더-도착">01. 2025 커밋 캘린더 도착!</h2>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/9a1f0ac0-1336-4287-8d30-c4a757f59375/image.png" alt=""></p>
<p>학교에서도 캘린더를 보내줬지만 학교 캘린더는 사이즈가 너무 크고 부담스러운데 오늘 도착한 커밋 캘린더는 딱 좋은 아담한 사이즈였다! 항해99에서 문자가 와서 확인했더니 선착순이라길래 후다닥 신청했던 개발자 전용 달력!</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/522d8632-1272-4399-8f0d-d9308db47e57/image.png" alt="">
깃허브 잔디 심은 날, 하루를 마무리하며 잔디 테이핑도 해주면 된다. (So cute)
오늘은 10일인데 20일에 당당하게 잘못 붙였다. 2일 밤새고나니 제정신이 아닌 듯 하다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/91b11387-9627-4efb-9b74-4455f2373471/image.png" alt="">
처음부터 보여드리자면 이런 뽁뽁이와 겉에는 단단한 박스로 감싸서 도착했다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/712049f5-4e7c-421d-aa30-aa508fe5289c/image.png" alt="">
뒷면에는 글이 적힌 카드와 잔디 마스킹테이프가 있었다!</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/653a3644-eada-4dea-a7a1-d1966d06df65/image.png" alt="">
좋은 말과 달력 안에 있는 약간의 오류에 대한 내용이 적혀있다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/12cebffc-6f72-444b-9114-22fdca8dd6d1/image.png" alt="">
정말 왜 20일까지로 붙였을까?..사람은 역시 잠이 중요하고 필요한 것 같다.</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>처음부터 다시 공부해야한다고 느껴서 다시 공부하고 있다. 이게 맞나 싶지만 모르니 반복해야한다고 생각이 들었다</em></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[개별과제 : JDBC를 사용한 일정 관리 앱 만들기 (+ 트러블슈팅)]]></title>
            <link>https://velog.io/@kirby_y/%EA%B0%9C%EB%B3%84%EA%B3%BC%EC%A0%9C-JDBC%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%BC%EC%A0%95-%EA%B4%80%EB%A6%AC-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</link>
            <guid>https://velog.io/@kirby_y/%EA%B0%9C%EB%B3%84%EA%B3%BC%EC%A0%9C-JDBC%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%9D%BC%EC%A0%95-%EA%B4%80%EB%A6%AC-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</guid>
            <pubDate>Tue, 10 Dec 2024 03:08:39 GMT</pubDate>
            <description><![CDATA[<h3 id="🥊-과제를-시작하며-남기는-회고">🥊 과제를 시작하며 남기는 회고</h3>
<p>이번 과제는 발제 때부터 기대를 많이 했고 더욱 <code>재미있는 과제</code>라고 생각되어 이전과 다르게 차근차근 이해하며 작업하고 싶었다. 하지만 강의를 다 듣고나서 시작하기 위해 맘먹었을 때 남은 시간은 넉넉하지 못했다. 그래서 이번 과제물은 다음 과제가 나와도 취업해도.. <strong>도전과제를 해낼 때까지 계속 수정을 진행</strong>해보려고 한다!</p>
<p><strong>미래를 기약하는 말을 적은데에는 작은 이유</strong>가 있었다. 이번 과제는 급성 위경련으로 인해 남은 시간동안 입원해있었다 ^^.. 기말고사, 겨울계절학기, 자격증 공부, 영어 공부가 스트레스 스택을 가득 쌓았었나보다. 그래서 <code>12월 9일 월요일부터 제출하는 순간까지 실습 강의를 되돌려보며 다급하게 작업</code>했고 지금도 수정중이다..!😵 (주말을 반납하고 올인하자! 했던 과거의 나를 반성하고 있다)</p>
<p>화면 구현하는 부분이 필수는 아니지만 생겼다는 점에서 정말 많이 신났었는데.. 괜한 설레발이었다.
<strong>내가 유일하게 가장 자신있고 잘하는 부분</strong>이 포함되는데 구현은 커녕..레벨 1도 못하고 있다 🫠</p>
<p><strong>다음 과제는 반드시 발제 당일에 도전하리라.</strong></p>
<h2 id="✅-작업-기록">✅ 작업 기록</h2>
<p>그래도 하나하나 꼼꼼하게 작업하려고 최대한 노력해보았다.</p>
<h3 id="0️⃣-단계--api-명세-및-erd-작성">0️⃣ 단계 : API 명세 및 ERD 작성</h3>
<blockquote>
<h4 id="👀-api-명세서-작성하기">👀 API 명세서 작성하기</h4>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/786ca300-61aa-45c1-a777-afafe932ecef/image.png" alt="">
일정 조회는 <code>다건 조회</code> 와 <code>단건 조회</code> 로 나누었어야하는데 처음 작성할 때에는 단순하게 일정 조회만 작성해서 추가되어있지 않다. 아래에 <strong>변경한 API 명세</strong>를 추가해보려고 한다!
</p>
</blockquote>
<h4 id="💡-변경한-api-명세서">💡 변경한 API 명세서</h4>
<blockquote>
<h4 id="👀-erd-작성하기">👀 ERD 작성하기</h4>
</blockquote>
<pre><code class="language-lua">+-------------------+
|   Schedule        |
+-------------------+
| id                |
| title             |
| date              |
| time              |
| description       |
| password          |
+-------------------+</code></pre>
<p>ERD는 빈약하지만 현재 상태를 남겨놓은거라 작업하며 추가해보려고 한다.
</p>
<h4 id="💡-변경한-erd">💡 변경한 ERD</h4>
<blockquote>
<h4 id="👀-sql-작성하기">👀 SQL 작성하기</h4>
</blockquote>
<pre><code class="language-sql">CREATE TABLE Schedule (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
date DATE NOT NULL,
time TIME NOT NULL,
description TEXT,
password VARCHAR(255) NOT NULL
);</code></pre>
<h3 id="1️⃣-단계--일정-생성-및-조회">1️⃣ 단계 : 일정 생성 및 조회</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li><strong>일정 생성(일정 작성하기)</strong><ul>
<li>일정 생성 시, 포함되어야할 데이터<ul>
<li><code>할일</code>, <code>작성자명</code>, <code>비밀번호</code>, <code>작성/수정일</code>을 저장</li>
<li><code>작성/수정일</code>은 날짜와 시간을 모두 포함한 형태</li>
</ul>
</li>
<li>각 일정의 고유 식별자(ID)를 자동으로 생성하여 관리</li>
<li>최초 입력 시, 수정일은 작성일과 동일
</li>
</ul>
</li>
<li><strong>전체 일정 조회(등록된 일정 불러오기)</strong><ul>
<li>다음 조건을 바탕으로 등록된 일정 목록을 전부 조회<ul>
<li><code>수정일</code> (형식 : YYYY-MM-DD)</li>
<li><code>작성자명</code></li>
</ul>
</li>
<li>조건 중 한 가지만을 충족하거나, 둘 다 충족을 하지 않을 수도, 두 가지를 모두 충족할 수도 있습니다.</li>
<li><code>수정일</code> 기준 내림차순으로 정렬하여 조회
</li>
</ul>
</li>
<li><strong>선택 일정 조회(선택한 일정 정보 불러오기)</strong><ul>
<li>선택한 일정 단건의 정보를 조회할 수 있습니다.</li>
<li>일정의 고유 식별자(ID)를 사용하여 조회합니다.</li>
</ul>
</li>
</ul>
<hr>
<h3 id="2️⃣-단계--일정-수정-및-삭제">2️⃣ 단계 : 일정 수정 및 삭제</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-1">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li><strong>선택한 일정 수정</strong><ul>
<li>선택한 일정 내용 중 <code>할일</code>, <code>작성자명</code> 만 수정 가능<ul>
<li>서버에 일정 수정을 요청할 때 <code>비밀번호</code>를 함께 전달합니다.</li>
<li>작성일<code>은 변경할 수 없으며,</code>수정일` 은 수정 완료 시, 수정한 시점으로 변경합니다.
</li>
</ul>
</li>
</ul>
</li>
<li><strong>선택한 일정 삭제</strong><ul>
<li>선택한 일정을 삭제할 수 있습니다.<ul>
<li>서버에 일정 수정을 요청할 때 <code>비밀번호</code>를 함께 전달합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="3️⃣-단계--연관-관계-설정">3️⃣ 단계 : 연관 관계 설정</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-2">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li><strong>작성자와 일정의 연결</strong><ul>
<li>설명<ul>
<li>동명이인의 작성자가 있어 어떤 작성자가 등록한 ‘할 일’인지 구별할 수 없음</li>
<li>작성자를 식별하기 위해 이름으로만 관리하던 작성자에게 고유 식별자를 부여합니다.</li>
<li>작성자를 할 일과 분리해서 관리합니다.</li>
<li>작성자 테이블을 생성하고 일정 테이블에 FK를 생성해 연관관계를 설정해 봅니다.</li>
</ul>
</li>
<li>조건<ul>
<li>작성자는 <code>이름</code> 외에 <code>이메일</code>, <code>등록일</code>, <code>수정일</code> 정보를 가지고 있습니다.<ul>
<li>작성자의 정보는 추가로 받을 수 있습니다.(조건만 만족한다면 다른 데이터 추가 가능)</li>
</ul>
</li>
<li><del>기존 : 고유 식별자를 통해 작성자를 조회할 수 있도록 기존 코드를 변경합니다.</del><ul>
<li>변경 : 작성자의 고유 식별자를 통해 일정이 검색이 될 수 있도록 전체 일정 조회 코드 수정.</li>
</ul>
</li>
<li>작성자의 고유 식별자가 일정 테이블의 외래키가 될 수 있도록 합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="4️⃣-단계--페이지네이션">4️⃣ 단계 : 페이지네이션</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-3">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>설명<ul>
<li>많은 양의 데이터를 효율적으로 표시하기 위해 데이터를 여러 페이지로 나눕니다.<ul>
<li>페이지 번호<code>와</code>페이지 크기`를 쿼리 파라미터로 전달하여 요청하는 항목을 나타냅니다.</li>
<li>전달받은 페이지 번호와 크기를 기준으로 쿼리를 작성하여 필요한 데이터만을 조회하고 반환</li>
</ul>
</li>
</ul>
</li>
<li>조건<ul>
<li>등록된 일정 목록을 <code>페이지 번호</code>와 <code>크기</code>를 기준으로 모두 조회</li>
<li>조회한 일정 목록에는 <code>작성자 이름</code>이 포함</li>
<li>범위를 넘어선 페이지를 요청하는 경우 빈 배열을 반환</li>
<li>Paging 객체를 활용할 수 있음</li>
</ul>
</li>
</ul>
<hr>
<h3 id="5️⃣-단계--예외-발생-처리">5️⃣ 단계 : 예외 발생 처리</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-4">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>설명<ul>
<li>예외 상황에 대한 처리를 위해 <a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Status"><code>HTTP 상태 코드(링크)</code></a>와 <code>에러 메시지</code>를 포함한 정보를 사용하여 예외를 관리할 수 있습니다.<ol>
<li>필요에 따라 사용자 정의 예외 클래스를 생성하여 예외 처리를 수행할 수 있습니다.</li>
<li><code>@ExceptionHandler</code>를 활용하여 공통 예외 처리를 구현할 수도 있습니다.</li>
<li>예외가 발생할 경우 적절한 HTTP 상태 코드와 함께 사용자에게 메시지를 전달하여 상황을 관리합니다.</li>
</ol>
</li>
</ul>
</li>
<li>조건<ul>
<li>수정, 삭제 시 요청할 때 보내는 <code>비밀번호</code>가 일치하지 않을 때 예외가 발생합니다.</li>
<li>선택한 일정 정보를 조회할 수 없을 때 예외가 발생합니다.<ol>
<li>잘못된 정보로 조회하려고 할 때 </li>
<li>이미 삭제된 정보를 조회하려고 할 때</li>
</ol>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="6️⃣-단계--null-체크-및-특정-패턴에-대한-검증-수행">6️⃣ 단계 : null 체크 및 특정 패턴에 대한 검증 수행</h3>
<blockquote>
<h4 id="❗-필수-기능-가이드-5">❗ 필수 기능 가이드</h4>
</blockquote>
<ul>
<li>설명<ul>
<li>유효성 검사<ol>
<li>잘못된 입력이나 요청을 미리 방지할 수 있습니다.</li>
<li>데이터의 <code>무결성을 보장</code>하고 애플리케이션의 예측 가능성을 높여줍니다.</li>
<li>Spring에서 제공하는 <code>@Valid</code> 어노테이션을 이용할 수 있습니다.</li>
</ol>
</li>
</ul>
</li>
<li>조건<ul>
<li><code>할일</code>은 최대 200자 이내로 제한, 필수값 처리</li>
<li><code>비밀번호</code>는 필수값 처리</li>
<li>담당자의 <code>이메일</code> 정보가 형식에 맞는지 확인</li>
</ul>
</li>
</ul>
<hr>
<h3 id="❓-과제-제출시에는-아래-질문을-고민해보고-답변-작성">❓ 과제 제출시에는 아래 질문을 고민해보고 답변 작성</h3>
<blockquote>
<h4 id="1-적절한-관심사-분리를-적용하셨나요-controller-service-repository">1. 적절한 관심사 분리를 적용하셨나요? (Controller, Service, Repository)</h4>
</blockquote>
<blockquote>
<h4 id="2-restful한-api를-설계하셨나요-어떤-부분이-그런가요-어떤-부분이-그렇지-않나요">2. RESTful한 API를 설계하셨나요? 어떤 부분이 그런가요? 어떤 부분이 그렇지 않나요?</h4>
</blockquote>
<blockquote>
<h4 id="3-수정-삭제-api의-request를-어떤-방식으로-사용-하셨나요-param-query-body">3. 수정, 삭제 API의 request를 어떤 방식으로 사용 하셨나요? (param, query, body)</h4>
</blockquote>
<hr>
<h2 id="🛠️-문제-해결-x-회고">🛠️ 문제 해결 X 회고</h2>
<blockquote>
<h3 id="작업-후기">작업 후기</h3>
<p><code>소요시간</code> : 아직 알 수 없음
<code>난이도</code> : 상</p>
</blockquote>
<p><a href="https://github.com/KIRBY-PARK/JDBC-schedule">&gt;&gt; Java : JDBC를 사용한 일정 관리 앱 만들기 GitHub Code 바로가기</a>
다 만들어진 코드는 위의 깃허브에 올려놓았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 63일차 (2024.12.08 일) : 과로, 스트레스, 위경련 이슈]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-63%EC%9D%BC%EC%B0%A8-2024.12.08-%EC%9D%BC-%EA%B3%BC%EB%A1%9C-%EC%8A%A4%ED%8A%B8%EB%A0%88%EC%8A%A4-%EC%9C%84%EA%B2%BD%EB%A0%A8-%EC%9D%B4%EC%8A%88</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-63%EC%9D%BC%EC%B0%A8-2024.12.08-%EC%9D%BC-%EA%B3%BC%EB%A1%9C-%EC%8A%A4%ED%8A%B8%EB%A0%88%EC%8A%A4-%EC%9C%84%EA%B2%BD%EB%A0%A8-%EC%9D%B4%EC%8A%88</guid>
            <pubDate>Mon, 09 Dec 2024 21:16:14 GMT</pubDate>
            <description><![CDATA[<h2 id="01-밤샘-연속으로-돌아오는-건-위경련">01. 밤샘 연속으로 돌아오는 건 위경련</h2>
<p>기말고사와 겨울 계절학기 시작으로 인해 2일 연달아 밤샘하는 경우가 하루 건너 일어나고 있다. 순간적으로 내가 나중에 뭐가 되고 싶어서 이렇게 노력하는걸까? 하는 생각이 많이 들면서도 결국 알아낸 것이나 해낸 것이나 진득하게 알고 있는 것이 없어서 정말 괴로웠다.</p>
<p>금요일부터 토요일까지 밤샘하다가 일요일 새벽 1시에 아주 심하게 아픈 복통과 함께 구토를 4번이나 했다. 정말 갑작스러워서 나조차도 너무 당황스러웠다. 편입학도 고려하면서 여러모로 준비하는게 많아서 스트레스가 심했는지 스트레스로 인한 급성 위경련이라는 진단을 받았다.</p>
<p>하하하하. 여기에 아팠던 것도 적는게 맞는지 모르겠지만 기록해놓으면 밤샘을 조금 더 조심한다거나 신체적 스트레스 해소하는 방법에 대해 고민해보는 것을 잊지 않을 것 같았다.</p>
<p>여러모로 노력해야할 부분이 한 둘이 아닌 것 같다.
스프링 입문과제를 시작도 못해서 지금 굉장히 초조하고 조급하다. 당장 시작하기엔 실습조차도 다 마무리하지 않은 상황이라 조금 울고 싶지만 최대한 작업해보려고 한다..!</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>울지마 박지안</em></p>
</blockquote>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 62일차 (2024.12.07 토) : 무한 루트에 빠진 토요일]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-62%EC%9D%BC%EC%B0%A8-2024.12.07-%ED%86%A0-%EB%AC%B4%ED%95%9C-%EB%A3%A8%ED%8A%B8%EC%97%90-%EB%B9%A0%EC%A7%84-%ED%86%A0%EC%9A%94%EC%9D%BC</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-62%EC%9D%BC%EC%B0%A8-2024.12.07-%ED%86%A0-%EB%AC%B4%ED%95%9C-%EB%A3%A8%ED%8A%B8%EC%97%90-%EB%B9%A0%EC%A7%84-%ED%86%A0%EC%9A%94%EC%9D%BC</guid>
            <pubDate>Mon, 09 Dec 2024 21:02:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="🚀-오늘의-공부기록-한-눈에-보기">🚀 오늘의 공부기록 한 눈에 보기</h3>
<p><a href="https://velog.io/@kirby_y/Spring-MVC-%ED%8C%A8%ED%84%B4">&gt;&gt; Spring : MVC 패턴</a></p>
</blockquote>
<hr>
<h2 id="01-생소한-용어가-많아서-무한-복습">01. 생소한 용어가 많아서 무한 복습</h2>
<p>공부방식을 계속 변경하다보니 조금 적응하는데 시간이 걸리는 것 같다. 더군다나, 스프링 강사님의 강의는 너무나도.. 준비된 프린트물 읽기 형식이며.. 흥미를 잃게 만드는 특유의 말투와 목소리가 있어서 배울 때 조금씩 지루해진다.</p>
<p>구매한 책을 읽으며 공부하면 그렇게 재미있을 수가 없는데 왜 이러는걸까 ㅠㅠ</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>생소한 용어가 많아서 더 어려운 편이지만, 그래도 열심히 해보자!</em></p>
</blockquote>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring : MVC 패턴]]></title>
            <link>https://velog.io/@kirby_y/Spring-MVC-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@kirby_y/Spring-MVC-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Mon, 09 Dec 2024 21:00:09 GMT</pubDate>
            <description><![CDATA[<h3 id="template-engine">Template Engine</h3>
<p><code>동적인 웹 페이지를 생성하기 위해 사용되는 도구</code>이며 템플릿을 기반으로 정적인 부분과 동적인 데이터를 결합하여 HTML, XML 등의 문서를 생성하는 역할을 수행함</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/9218dd83-0fb8-4461-90b8-80dd182f7ff5/image.png" alt="">
(우리가 흔히 말하는 UI를 만들며 SSR에 사용됨)</p>
<h3 id="템플릿-엔진이-나온-이유">템플릿 엔진이 나온 이유</h3>
<ul>
<li>자바 코드로 HTML을 만들어내는 것이 아닌 HTML 문서에 동적으로 변경해야하는 부분만 자바 코드를 넣을 수 있다면 더 편리하기 때문</li>
</ul>
<h3 id="대표적인-템플릿-엔진">대표적인 템플릿 엔진</h3>
<ul>
<li>Thymeleaf : Spring과 통합이 잘되어있고 다양한 기능을 포함하고 있음</li>
<li>JSP : 예전에는 많이 사용했으나 현재는 사용하지 않는 추세</li>
<li>FreeMarker</li>
<li>Velocity</li>
<li>Mustache</li>
</ul>
<hr>
<h3 id="mvc-패턴">MVC 패턴</h3>
<p><code>Servlet</code>이나 <code>JSP</code>만으로 비즈니스 로직과 <code>View Redering</code>까지 모두 처리하면 너무 많은 역할을 하게 되고 책임이 너무 많기 때문에 유지보수가 굉장히 어려워져서 고안된 패턴
<code>Web Appliction</code>은 일반적으로 <code>MVC(Model View Controller)</code> 패턴을 사용함</p>
<hr>
<h3 id="servlet-예시">Servlet 예시</h3>
<pre><code class="language-java">@WebServlet(&quot;/hello-world&quot;)
public class HelloWorldServlet extends HttpServlet {

        // User 저장소
    private UserRepository repository = new UserRepository();

    public HelloWorldServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

        response.setContentType(&quot;text/html;charset=utf-8&quot;);
        PrintWriter out = response.getWriter();

        try {
            // 비지니스 로직을 처리하는 코드
            // 파라미터 조회 
            String userIdParam = request.getParameter(&quot;userId&quot;);
            Long userId = null;
            if (userIdParam != null) {
                userId = Long.parseLong(userIdParam);
            }

            // 회원 조회 
            String userInfo = repository.findById(userId);

            // 화면을 그리는 코드 START
            out.println(&quot;&lt;h1&gt;Hello World!&lt;/h1&gt;&quot;);
            out.println(&quot;&lt;div&gt;조회한 회원의 정보: &quot; + userInfo + &quot;&lt;/div&gt;&quot;);
            // 화면을 그리는 코드 END


        } catch (NumberFormatException e) {
            // parsing 에러가 발생한 경우
            out.println(&quot;&lt;div&gt;Invalid user ID format&lt;/div&gt;&quot;);
        } finally {
            out.close();
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {        
        doGet(request, response);
    }
}</code></pre>
<h3 id="servlet-문제점">Servlet 문제점</h3>
<ul>
<li>화면을 그리는 View 영역과 비즈니스 로직이 Servlet 하나에 모두 섞여있음</li>
<li>책임을 너무 많이 가지고 있음</li>
</ul>
<h3 id="servlet-동작-순서">Servlet 동작 순서</h3>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/23f4a744-b10f-4be7-92c7-e7f5463e3f9a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/ba21ef6a-c44f-42d2-8ca6-606294043629/image.png" alt=""></p>
<ol>
<li>사용자가 Client(브라우저)를 통해 서버에 HTTP Request 즉, API 요청을 한다.</li>
<li>요청을 받은 Servlet 컨테이너는 <code>HttpServletRequest</code>, <code>HttpServletResponse</code>객체를 생성한다.</li>
<li>설정된 정보(URL, HTTP Method)를 통해 어떠한 Servlet에 대한 요청인지 찾는다.</li>
<li>해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라 <code>doGet()</code> 혹은<code>doPost()</code> 등의 메서드를 호출한다.</li>
<li>서버에서 응답을 생성한 뒤 <code>HttpServletResponse</code>객체에 응답을 담아 Client(브라우저)에 반환한다.</li>
<li>응답이 완료되면 생성한 <code>HttpServletRequest</code>, <code>HttpServletResponse</code>객체를 소멸한다.</li>
</ol>
<hr>
<h3 id="jsp-예시">JSP 예시</h3>
<p><code>Servlet</code> 코드에서 <code>HTML</code>을 만드는 부분인 <code>View</code>가 분리되었음</p>
<pre><code class="language-html">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
        &lt;!-- HTML 코드... --&gt;
        &lt;!-- &lt;%...%&gt; 영역에는 Java 코드를 사용할 수 있다. --&gt;
    &lt;%
            // 게시글 저장소 싱글톤으로 인스턴스 생성
            BoardRepository boardRepository = BoardRepository.getInstance();

            // 게시글 제목, 내용 
        String title = request.getParameter(&quot;title&quot;);
        String content = request.getParameter(&quot;content&quot;);

        // 게시글 객체 생성
        Board board = new Baord(title, content);

        // 게시글 객체 저장
        repository.save(board);

    %&gt;
    &lt;div&gt;
        ID : &lt;input type =&quot;text&quot; name = &quot;id&quot; value=&quot;&lt;%=id %&gt;&quot;&gt;
    &lt;/div&gt;
        &lt;!-- JSP 코드... --&gt;
        &lt;!-- HTML 코드... --&gt;
    &lt;jsp:forward page=&quot;&lt;%=url %&gt;&quot; /&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/db730a72-8026-417c-b012-5963c922687b/image.png" alt=""></p>
<blockquote>
<h4 id="servlet-jsp-방식의-문제점">Servlet, JSP 방식의 문제점</h4>
</blockquote>
<ol>
<li><code>Servlet</code>만을 사용한 경우 View를 위한 코드와 비지니스 로직을 처리하는 코드가 <code>Servlet</code>에 모두 존재하여 유지보수가 어려워진다.</li>
<li><code>JSP</code>를 사용하여 <code>View</code>를 분리하였지만 비지니스 로직의 일부가 <code>JSP</code> 파일안에 존재한다. 여전히 책임이 많아 유지보수가 어렵다.</li>
</ol>
<hr>
<h2 id="mvc-패턴-1">MVC 패턴</h2>
<p>하나의 Servlet이나 JSP로 처리하던 것들을 Model, View, Controller 영역으로 나눈것</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/1b752e7b-ad86-4fe5-8bd7-0d41ad3fae9a/image.png" alt=""></p>
<blockquote>
<h4 id="mvc패턴의-핵심">MVC패턴의 핵심</h4>
</blockquote>
<ul>
<li>View가 분리된 이유의 핵심은 변경이다.</li>
<li>기획이 변하지 않는 이상 비지니스 로직과 View의 수정 원인은 별개로 발생한다.<ul>
<li>화면 구성에 수정이 발생하면 View만 변경</li>
<li>요구사항에 수정이 발생하는 경우 비지니스 로직 변경</li>
</ul>
</li>
<li>즉, 서로 연관이 없는 코드끼리 함께 존재할 필요가 없다. 완전히 분리하자</li>
</ul>
<h3 id="controller">Controller</h3>
<ol>
<li>HTTP Request를 전달받아 파라미터를 검증</li>
<li>비지니스 로직을 실행<ul>
<li>비지니스 로직을 Controller에 포함하게되면 Controller가 너무 많은 역할을 담당하게 되어 일반적으로 <strong>Service Layer</strong>를 별도로 만들어서 처리</li>
<li>Database와 상호작용 하는 Layer를 따로 구분하여 <strong>Repository Layer</strong>를 추가로 구성함</li>
<li>Controller도 비지니스 로직을 포함할 수 있지만 일반적으로 Service Layer를 호출하는 역할을 담당함</li>
</ul>
</li>
<li>View에 전달할 결과를 조회하여 Model 객체에 임시로 저장</li>
</ol>
<h3 id="model">Model</h3>
<ol>
<li>View에 출력할 Data를 저장하는 객체</li>
<li>View는 비지니스 로직이나 Data 접근을 몰라도 되고 View Rendering에만 집중(책임 분리)</li>
</ol>
<h3 id="view">View</h3>
<ul>
<li>예시 코드에서 JSP에 해당하는 영역</li>
</ul>
<ol>
<li>Model 객체에 담겨져 있는 Data를 사용하여 화면을 Rendering함</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 61일차 (2024.12.06 금) : 밤낮이 쉽게 바뀌는 나]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-61%EC%9D%BC%EC%B0%A8-2024.12.06-%EA%B8%88-%EB%B0%A4%EB%82%AE%EC%9D%B4-%EC%89%BD%EA%B2%8C-%EB%B0%94%EB%80%8C%EB%8A%94-%EB%82%98</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-61%EC%9D%BC%EC%B0%A8-2024.12.06-%EA%B8%88-%EB%B0%A4%EB%82%AE%EC%9D%B4-%EC%89%BD%EA%B2%8C-%EB%B0%94%EB%80%8C%EB%8A%94-%EB%82%98</guid>
            <pubDate>Sat, 07 Dec 2024 13:52:35 GMT</pubDate>
            <description><![CDATA[<h2 id="01-수시로-바뀐-이번주의-밤낮">01. 수시로 바뀐 이번주의 밤낮</h2>
<p>날씨가 추워서 무기력해진 몸을 이끌고 공부를 하다가 잠깐 쉬었다가 할까? 하면 1시간이 순식간에 사라진다. 그 후, 잃은 1시간을 매꾸겠다며 다시 공부하기를 반복하면 어느새 다음날 새벽 5시가 되어있다.</p>
<p>그래서 요즘 TIL도 반나절 ~ 하루씩 밀려쓰게 되는 것 같다.</p>
<p>다시 감기에 걸려서 힘내기 어렵지만 그래도 다시 한 번 힘내서 다음주는 꼭 제대로 집중하고 정규 시간에 맞춰 지내고 싶다. 더이상 밤낮이 바뀌고 면역력이 약해지는 건 사절이다.</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>평균 수면시간만 지킨다고 건강을 지킬 수 있는 것은 아니었다</em></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 60일차 (2024.12.05 목) : 노력의 첫번째 결실!]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-60%EC%9D%BC%EC%B0%A8-2024.12.05-%EB%AA%A9-%EB%85%B8%EB%A0%A5%EC%9D%98-%EC%B2%AB%EB%B2%88%EC%A7%B8-%EA%B2%B0%EC%8B%A4</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-60%EC%9D%BC%EC%B0%A8-2024.12.05-%EB%AA%A9-%EB%85%B8%EB%A0%A5%EC%9D%98-%EC%B2%AB%EB%B2%88%EC%A7%B8-%EA%B2%B0%EC%8B%A4</guid>
            <pubDate>Fri, 06 Dec 2024 08:56:58 GMT</pubDate>
            <description><![CDATA[<h2 id="01-파이썬-과제-100점">01. 파이썬 과제 100점!!</h2>
<p>파이썬 프로그래밍 과목에서 <strong>기말고사 대체 과제</strong>를 받게 되어 작업했던 팩맨게임 기반의 게임!</p>
<p>파이썬은 학교에서 배우면서 처음 사용해보았는데 재미를 먼저 느끼도록 도와주신 교수님의 커리큘럼과 과제 주제에도 자율도를 높여주신 덕에 시간이 촉박해도 정말 재미있게 작업했다고 느꼈다. 2일동안 밤을 새도 즐거운 마음으로 코딩하고 자료도 만들었어서 대학생활 3년 중 가장 뿌듯하고 행복했다!</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/36805fe0-d838-4fcf-bc23-80756329a0a7/image.png" alt=""></p>
<p><strong>그 결과 100점을 받았다!</strong>
교수님을 이번 과목에서 처음 뵌게 아닌데 과제를 100점 맞아본 것은 정말 처음이었다!
호다닥 교수님의 피드백도 살펴보았는데 만들어놓은 게임을 확장하는 과정에서 어려움이 있다면 언제든지 메일을 줘도 괜찮다며 한 학기동안 열심히 해주어 고맙다는 글을 남겨주셨다! 내가 더 감사한 일이지만.. 너무너무 기쁘고 행복했다 🥹</p>
<p>과제 관련 글도 남겨놓고 싶은데 그건 티스토리에 작성하게될 것 같다.
산타팩맨게임도 조금 더 확장하면 블로그에 연동해볼 생각을 하고 있다 ㅎㅎ</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>과제 성적을 확인하고나니 한결 마음이 놓인다. 올해도 전액장학 가능하려나..?! 두근두근</em></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 59일차 (2024.12.04 수) : 두번째 벽을 넘었다!]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-59%EC%9D%BC%EC%B0%A8-2024.12.04-%EC%88%98-%EB%91%90%EB%B2%88%EC%A7%B8-%EB%B2%BD%EC%9D%84-%EB%84%98%EC%97%88%EB%8B%A4</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-59%EC%9D%BC%EC%B0%A8-2024.12.04-%EC%88%98-%EB%91%90%EB%B2%88%EC%A7%B8-%EB%B2%BD%EC%9D%84-%EB%84%98%EC%97%88%EB%8B%A4</guid>
            <pubDate>Wed, 04 Dec 2024 17:22:37 GMT</pubDate>
            <description><![CDATA[<h2 id="01-두번째-벽을-넘었다">01. 두번째 벽을 넘었다!</h2>
<p>MBTI의 I가 100%라서 그런지 누군가에게 먼저 다가가는 일이 조금 많이 어려운 편에 속했다. 궁금한 것이 있어도 최대한 구글링과 챗GPT에게 물어보았는데 이번에는 직접 찾아뵈어야만 한다는 생각이 들었기에 용기를 내서 찾아뵙는 시뮬레이션만 2일동안 10번 정도 돌린 것 같다.</p>
<p>이런 어려움을 이해하는 이전 팀원 분들이 굉장히 많이 응원해주시고 본인만의 방법들을 많이 공유해주셨다..! 그 덕에 내가 직접 찾아뵈어 진행되는 튜터링을 경험해볼 수 있었다!</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/4ae4a563-e5c9-462f-b8ae-cd333ee44cac/image.png" alt="">
튜터님께 가보았기에 알 수 있는 것들에 대해 열심히 필기했다!
그 중 캡쳐해서 남긴 부분은 이 파트인데 가시성이 떨어지는 코드를 작성했어서 가급적이면 어떻게 표기하면 좋을지에 대해 공유해주셨다!</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/b87f4c48-ecbd-484f-b80d-4d69daacc165/image.png" alt=""></p>
<p>이 이미지는 이전 팀원분이 찍어준 것인데 다같이 기뻐해주고 축하해주고 격려해주는 분위기이었기에 힘을 내서 어려움을 이겨낼 수 있었던 것이 아니었을까 싶었다.</p>
<p>현재 함께 팀원인 분도 굉장히 반겨주시고 격려를 많이 해주셔서 너무너무 감사하고 기쁜 날이었다!</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>따뜻한 사람들의 도움 덕에 가장 어려운 관문을 한 번 넘어보았고 마음이 몽글몽글 따뜻해졌다</em></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 58일차 (2024.12.03 화) : 냅다 도전한 스프링부트 개발환경 구축 완료!]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-58%EC%9D%BC%EC%B0%A8-2024.12.03-%ED%99%94-%EB%83%85%EB%8B%A4-%EB%8F%84%EC%A0%84%ED%95%9C-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-%EC%99%84%EB%A3%8C</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-58%EC%9D%BC%EC%B0%A8-2024.12.03-%ED%99%94-%EB%83%85%EB%8B%A4-%EB%8F%84%EC%A0%84%ED%95%9C-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-%EC%99%84%EB%A3%8C</guid>
            <pubDate>Tue, 03 Dec 2024 10:33:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="🚀-오늘의-공부기록-한-눈에-보기">🚀 오늘의 공부기록 한 눈에 보기</h3>
<p><a href="https://velog.io/@kirby_y/%EA%B6%81%EA%B8%88%EC%A6%9D-%ED%95%B4%EC%86%8C-%EC%99%9C-%EB%A9%94%EC%9D%B4%EB%B8%90Maven%EB%B3%B4%EB%8B%A4-%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%A4Gradle%EC%9D%84-%EB%8D%94-%EB%A7%8E%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B2%8C-%EB%90%98%EC%97%88%EC%9D%84%EA%B9%8C">&gt;&gt; 궁금증 해소 : 왜 메이븐(Maven)보다 그레이들(Gradle)을 더 많이 사용하게 되었을까?</a></p>
</blockquote>
<hr>
<h2 id="01-메이븐maven과-그레이들gradle의-차이">01. 메이븐(Maven)과 그레이들(Gradle)의 차이</h2>
<p>인텔리제이(InteliJ)의 IDEA를 사용하다보면 아래 이미지와 같은 부분을 볼 수 있는데 이 부분의 차이를 오늘에서야 알게 되었다! 이 부분에 대해 진작 궁금했지만, 제대로 알아볼 생각은 미처 하지 못했었다. Spring으로 넘어오면서 이들에 대해 알게 되었는데 아래에 정리해보았다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/00882643-fe8f-4636-87f0-ed5579c280da/image.png" alt=""></p>
<p>새 프로젝트를 생성할 때 <code>Build system</code> 을 선택하도록 되어있는 부분을 확인해볼 수 있다.
<strong>메이븐</strong>과 <strong>그레이들</strong>, 이 둘은 모두 <strong>자바 생태계에서 사용</strong>하는 <code>빌드 관리 도구</code>이다.</p>
<p>우리가 사용하는 소스 코드는 사용자가 바로 사용할 수 없는 형태이기 때문에 사용자가 애플리케이션 형태로 사용할 수 있는 모습을 갖추려면 <code>빌드</code>라는 과정을 거쳐야한다고 한다. 이런 빌드 과정에서 필요한 것들을 관리하고 자동화하는 도구를 <code>빌드 관리 도구</code> 라고 한다.</p>
<p>이 과정에는 <code>의존성 내려받기</code>, <code>코드 패키징</code>, <code>컴파일</code>, <code>테스트 실행</code> 등이 포함되어 있다.
그리고 예전에는 메이븐을 많이 사용했지만, 요즘은 그레이들을 많이 사용하는 추세라고 한다.</p>
<blockquote>
<h3 id="그레이들gradle의-특징">그레이들(Gradle)의 특징</h3>
</blockquote>
<ul>
<li>메이븐에 비해 가독성이 좋고 설정이 간단하다.</li>
<li>자바, 코틀린, 그루비 등 다양한 언어를 지원하며 원하는대로 빌드 스크립트를 작성할 수 있다.</li>
<li>빌드와 테스트 속도가 메이븐에 비해 더 빠르다.</li>
</ul>
<p>메이븐에 비해 가독성이 좋고 설정이 간단하다는 이유에서 그레이들을 많이 사용하는 추세로 바뀌었던걸까?
이 3가지만으로 변경했다면 왜 이전에는 메이븐을 더 많이 사용했을까? 안정성이 보장되지 않았던걸까? 더욱 궁금해졌다.</p>
<p><strong>이렇게 상세하게 궁금해지는 궁금증은 그 때 그 때 해소하는 것이 제 맛!</strong></p>
<p>그레이들을 더 많이 사용하게 된 계기를 알려면 메이븐에 대해서 정확하게 짚고 이해하는 편이 좋겠다는 생각이 들어 메이븐에 대해 먼저 알아보았다.</p>
<p>음 내용이 길어져서 오늘의 공부기록 한 눈에 보기로 게시물을 따로 만들었다!
궁금한 점을 해소하다가 추가적으로 알게된 것은 빌드 관리 도구에 `Maven과 Gradle만 있었던 것이 아닌, 초창기에는 Ant도 있었다는 것이다!</p>
<p><a href="https://velog.io/@kirby_y/%EA%B6%81%EA%B8%88%EC%A6%9D-%ED%95%B4%EC%86%8C-%EC%99%9C-%EB%A9%94%EC%9D%B4%EB%B8%90Maven%EB%B3%B4%EB%8B%A4-%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%A4Gradle%EC%9D%84-%EB%8D%94-%EB%A7%8E%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B2%8C-%EB%90%98%EC%97%88%EC%9D%84%EA%B9%8C">&gt;&gt; 궁금증 해소 : 왜 메이븐(Maven)보다 그레이들(Gradle)을 더 많이 사용하게 되었을까? 보러가기</a></p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>공부할 시간이 부족하더라도 짚고 넘어가고 싶다는 생각이 들면 알아보는 것이 좋지 않을까 싶었다</em></p>
</blockquote>
<hr>
<h2 id="02-도전-spring-boot">02. 도전 Spring Boot</h2>
<p>원래는 Spring을 먼저 차근차근해야하지만, Spring 입문 강의를 모두 들었고, 강의가 조금 미흡한 면이 있어서 (도저히 해당 강의만으로 과제를 할 자신이 없었음) 구매해놓았던 책을 보며 따라해보기로 결정했다.</p>
<h3 id="개발환경-구축-과정에서-일어난-몇가지-문제-기록">개발환경 구축 과정에서 일어난 몇가지 문제 기록!</h3>
<p>스프링부트 기본서를 보며 똑같이 잘 따라했는데도 왜? 오류가 발생하고 컴파일 에러는 왜 발생하지? 라는 생각에 1분 정도 고민하다가 모르겠어서 <code>ChatGPT</code>에게 물어보게 되었다.</p>
<h3 id="자동-완성-기능으로-인한-오타-발생">자동 완성 기능으로 인한 오타 발생</h3>
<p>추천으로 나오는 영문이 비슷하다는 생각에 Tab을 눌러 자동완성했다가 잘못 입력된 것을 뒤늦게 확인하고 수정하게 되었다.
<img src="https://velog.velcdn.com/images/kirby_y/post/91eaf90e-9d62-4445-8de1-fcd01a6a267a/image.png" alt="">
하지만 이 한가지로 해결되지 않았고 오류메세지는 <code>build.Gradle</code> 을 바라보았기에 해당 부분도 도움을 받아보았다.</p>
<h3 id="두번째도-오타로-인한-오류-발생">두번째도 오타로 인한 오류 발생</h3>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/774ef428-5f98-45a8-8f38-3b73a71b12fa/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/e6309522-56fa-41c1-bc87-4368f57be73b/image.png" alt="">
<code>r</code>을 빼먹은 나.. 정말 멋지다..
그래도 수정하고 나니 정상적으로 작동해서 다행이라고 느꼈다. 앞으로는 눈을 더 크게 뜨고 꼼꼼히 살펴봐야겠다고 느꼈다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/c30fd846-bfe4-4f5b-a94c-f488e6472913/image.png" alt="">
<code>build.Gradle</code> 을 수정한 후 다시 임포트 했다. (새로고침!)</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/7f7d6e3a-89a5-424b-980a-3e000214284f/image.png" alt="">
생성했던 클래스를 다시 실행해보니 이렇게 성공한 콘솔창을 확인해볼 수 있었다! (30초 동안 박수치며 기뻐함)</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/863ef9e7-3785-43ed-a974-01ed086e7e3a/image.png" alt="">
책을 읽어보니 맨 아래에 있는 이 부분을 확인해보라고 했다.
<code>스프링 애플리케이션이 시작되었음을 의미하는 코드</code>라고 한다!</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/e943399f-b1df-4bbc-8569-f1b6b4ac093c/image.png" alt="">
<img src="https://velog.velcdn.com/images/kirby_y/post/1b4f58bc-b275-4e63-b304-95dcb9bda796/image.png" alt="">
제대로 실행됬다는 것을 알 수 있다!</p>
<p>404에러페이지인데 뭐가 제대로 실행됬느냐 물으신다면, localhost:8080을 요청함면 index.html을 찾도록 설정되어 있는데 index.html 파일이 없기 때문!</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/579e13a0-1d98-4c40-a633-4a294e140526/image.png" alt="">
index.html 파일을 넣고 나면 오류 페이지가 나오지 않고 연결한 파일이 잘 나오는 것을 확인해볼 수 있었다!</p>
<blockquote>
<h4 id="🔥-한줄-요약-1">🔥 한줄 요약</h4>
<p><em>냅다 도전했을 때 가장 큰 즐거움을 느껴서 조금 당황했다</em></p>
</blockquote>
<hr>
<blockquote>
<h3 id="🚀-오늘의-추천-트렌딩-top3">🚀 오늘의 추천 트렌딩 Top3</h3>
<p>오늘 읽은 트렌딩 글 중에 추천하고 싶은, 기억하고 싶은 글을 5개로 추려보았다.

<a href="https://velog.io/@chiyongs/Spring-Spring-Framework-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0">01. Spring Framework?? 그게 뭔데?</a>
<a href="https://velog.io/@ohzzi/Spring-DIIoC-IoC-DI-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0">02. IoC? DI? 그게 뭔데?</a>
<a href="https://velog.io/@jkijki12/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-Bean-IoC-Container-DI%EA%B0%80-%EB%AD%94%EB%8D%B0">03. 스프링 Bean, IoC Container, DI가 뭔데!!</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[궁금증 해소 : 왜 메이븐(Maven)보다 그레이들(Gradle)을 더 많이 사용하게 되었을까?]]></title>
            <link>https://velog.io/@kirby_y/%EA%B6%81%EA%B8%88%EC%A6%9D-%ED%95%B4%EC%86%8C-%EC%99%9C-%EB%A9%94%EC%9D%B4%EB%B8%90Maven%EB%B3%B4%EB%8B%A4-%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%A4Gradle%EC%9D%84-%EB%8D%94-%EB%A7%8E%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B2%8C-%EB%90%98%EC%97%88%EC%9D%84%EA%B9%8C</link>
            <guid>https://velog.io/@kirby_y/%EA%B6%81%EA%B8%88%EC%A6%9D-%ED%95%B4%EC%86%8C-%EC%99%9C-%EB%A9%94%EC%9D%B4%EB%B8%90Maven%EB%B3%B4%EB%8B%A4-%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%A4Gradle%EC%9D%84-%EB%8D%94-%EB%A7%8E%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B2%8C-%EB%90%98%EC%97%88%EC%9D%84%EA%B9%8C</guid>
            <pubDate>Tue, 03 Dec 2024 03:51:25 GMT</pubDate>
            <description><![CDATA[<p><code>인텔리제이(InteliJ)</code>의 <code>IDEA</code>를 사용하다보면 아래 이미지와 같은 부분을 볼 수 있는데 이 부분의 차이를 오늘에서야 알게 되었다! 이 부분에 대해 진작 궁금했지만, 제대로 알아볼 생각은 미처 하지 못했었다. <code>Spring</code>으로 넘어오면서 이들에 대해 알게 되었는데 아래에 정리해보았다.</p>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/00882643-fe8f-4636-87f0-ed5579c280da/image.png" alt=""></p>
<p>새 프로젝트를 생성할 때 <code>Build system</code> 을 선택하도록 되어있는 부분을 확인해볼 수 있다.
<strong>메이븐</strong>과 <strong>그레이들</strong>, 이 둘은 모두 <strong>자바 생태계에서 사용</strong>하는 <code>빌드 관리 도구</code>이다.</p>
<p>우리가 사용하는 소스 코드는 사용자가 바로 사용할 수 없는 형태이기 때문에 사용자가 애플리케이션 형태로 사용할 수 있는 모습을 갖추려면 <code>빌드</code>라는 과정을 거쳐야한다고 한다. 이런 빌드 과정에서 필요한 것들을 관리하고 자동화하는 도구를 <code>빌드 관리 도구</code> 라고 한다.</p>
<p>이 과정에는 <code>의존성 내려받기</code>, <code>코드 패키징</code>, <code>컴파일</code>, <code>테스트 실행</code> 등이 포함되어 있다.
그리고 예전에는 메이븐을 많이 사용했지만, 요즘은 그레이들을 많이 사용하는 추세라고 한다.</p>
<blockquote>
<h3 id="그레이들gradle의-특징">그레이들(Gradle)의 특징</h3>
</blockquote>
<ul>
<li>메이븐에 비해 가독성이 좋고 설정이 간단하다.</li>
<li>자바, 코틀린, 그루비 등 다양한 언어를 지원하며 원하는대로 빌드 스크립트를 작성할 수 있다.</li>
<li>빌드와 테스트 속도가 메이븐에 비해 더 빠르다.</li>
</ul>
<p>하지만 이런 간단한 특징 3가지만으로 메이븐에서 그레이들로 이동한 이유를 납득하지 못했다.
<strong>내가 사용하는 모든 도구와 행동에는 이유가 명확해야한다</strong>고 생각하기 때문에 우선, 메이븐이 무엇인지에 대해 알아보기로 했다.</p>
<hr>
<h2 id="maven">Maven</h2>
<p>앞서 설명한 것과 동일하게 Java프로젝트를 위한 빌드 자동화 도구로 <code>빌드</code>, <code>패키징(jar 또는 war 생성)</code>, <code>테스트</code>, <code>외부 라이브러리 관리 및 배포</code> 등을 한 번의 명령으로 간편하게 처리할 수 있다.</p>
<p>과거에는 필요한 라이브러리를 직접 다운로드하고 프로젝트 폴더에 수동으로 배치해 관리해야 했기에 라이브러리의 버전이 변경될 때마다 다시 다운로드하고 업데이트해야하는 번거로움이 많았다고 한다.</p>
<p><code>Maven</code>이 등장하기 이전에는 <code>Ant</code>라는 빌드 관리 도구를 사용했지만, <code>Ant</code>에는 외부 라이브러리 관리 기능이 부족해서 부족한 점을 보완해 나온 것이 <code>Maven</code> 이 등장한 것이었다. 단점을 보완하는 동시에 표준화된 프로젝트 구조와 빌드 방식을 지원해 빌드 작업을 더욱 간소화하고 효율적으로 만들어주었다고 한다.</p>
<blockquote>
<h4 id="메이븐-간단-정리">메이븐 간단 정리</h4>
<p>자동으로 빌드 및 테스트, 패키징을 자동으로 수행해주어 개발 생산성 향사!
<code>Maven</code>은 <code>POM.xml(Project Object Model)</code> 파일을 사용해 빌드 설정을 관리함
다양한 프로젝트를 빠르게 생성하기 위한 아키타입(archeType)을 제공함
<strong>단점 : XML기반의 빌드 파일을 사용해 가독성이 떨어짐</strong></p>
</blockquote>
<hr>
<h2 id="gradle">Gradle</h2>
<p>2007년 <code>JetBrains</code> 회사의 <code>Hans Docter</code>가 개발한 오픈 소스 빌드 자동화 도구로 <code>Apache Ant</code>와 <code>Apache Maven</code>의 장점을 결합하여 만들어졌다. <code>Groovy</code> 기반 스크립트 방식을 사용하여 <code>build.gradle</code> 이라는 빌드 파일을 만들기 때문에 가독성이 좋고 스크립트를 통해 여러가지 상황에 적합한 빌드를 만들어낼 수 있다. (유연함!)</p>
<p>이러한 유연성 덕에 빌드 과정에서 병렬 처리와 캐싱을 활용해 <code>Maven</code>보다 <code>10~100배</code>까지 향상된 성능을 구현할 수 있게 되었다. 이런 장점 덕에 <strong>안드로이드 개발을 위한 공식 빌드 도구로 지정</strong>되었고 안드로이드 애플리케이션을 빌드하고 관리할 때 많이 사용되고 있다고 한다.</p>
<blockquote>
<h4 id="그레이들gradle-간단정리">그레이들(Gradle) 간단정리</h4>
</blockquote>
<ul>
<li>메이븐에 비해 가독성이 좋고 설정이 간단하다.</li>
<li>자바, 코틀린, 그루비 등 다양한 언어를 지원하며 원하는대로 빌드 스크립트를 작성할 수 있다.</li>
<li>빌드와 테스트 속도가 메이븐에 비해 더 빠르다.</li>
</ul>
<p><a href="https://docs.gradle.org/current/userguide/userguide.html">Gradle User Manual</a></p>
<hr>
<h2 id="maven과-gradle-차이점-총정리">Maven과 Gradle 차이점 총정리!</h2>
<table>
<thead>
<tr>
<th align="center">항목</th>
<th align="center">Maven</th>
<th align="center">Gradle</th>
</tr>
</thead>
<tbody><tr>
<td align="center">설정 언어</td>
<td align="center">XML</td>
<td align="center">Groovy 또는 Kotlin</td>
</tr>
<tr>
<td align="center">빌드 스크립트</td>
<td align="center">선언적</td>
<td align="center">선언적 + 명령적</td>
</tr>
<tr>
<td align="center">성능</td>
<td align="center">상대적으로 느림</td>
<td align="center">캐싱 및 병렬 빌드로 인해 더 빠름</td>
</tr>
<tr>
<td align="center">의존성 관리</td>
<td align="center">고정된 생명 주기와 의존성 관리 방식</td>
<td align="center">유연한 생명 주기와 의존성 관리 방식</td>
</tr>
<tr>
<td align="center">플러그인 생태계</td>
<td align="center">방대한 플로그인 생태계</td>
<td align="center">풍부한 플러그인 생태계, 다양한 커뮤니티 플러그인</td>
</tr>
<tr>
<td align="center">빌드 구성</td>
<td align="center">표준화된 구성</td>
<td align="center">구성 가능성 높음</td>
</tr>
<tr>
<td align="center">학습 곡선</td>
<td align="center">상대적으로 완만함</td>
<td align="center">다소 가파름</td>
</tr>
<tr>
<td align="center">확장성</td>
<td align="center">XML 기반으로 확장에 제한적임</td>
<td align="center">Groovy, Kotlin 스크립트를 통해 높은 확장성</td>
</tr>
<tr>
<td align="center">도구 통합</td>
<td align="center">IDE 및 CI 도구와의 통합이 잘 되어 있음</td>
<td align="center">IDE 및 CI 도구와의 통합이 잘 되어 있음, 특히 Gradle Wrapper 지원</td>
</tr>
<tr>
<td align="center">안드로이드 지원</td>
<td align="center">기본 지원하지 않음</td>
<td align="center">안드로이드 스튜디오의 기본 빌드 시스템</td>
</tr>
<tr>
<td align="center">생명주기</td>
<td align="center">고정된 빌드 생명주기</td>
<td align="center">유연한 생명주기 및 사용자 정의 테스크 가능</td>
</tr>
</tbody></table>
<hr>
<h2 id="maven과-gradle은-어떤-프로젝트에-적합할까">Maven과 Gradle은 어떤 프로젝트에 적합할까?</h2>
<p>Maven과 Gradle을 알아보니, 보완하여 나온 관계이지만 각각의 장점과 특성이 명확하한 빌드 도구라는 생각이 들었다. 그렇다면 이 둘을 어떨 때 사용해야 효율적으로 쓸 수 있을지 고민해보았다!</p>
<blockquote>
<h4 id="maven--간단한-프로젝트-or-명확한-구조와-표준화가-요구되는-프로젝트">Maven : 간단한 프로젝트 or 명확한 구조와 표준화가 요구되는 프로젝트</h4>
<p>Maven은 단순하고 일관된 빌드 생명 주기를 제공하고 표준화된 프로젝트 관리에 뛰어나기 때문</p>
</blockquote>
<blockquote>
<h4 id="gradle--성능-최적화가-필요하거나-복잡한-빌드-프로세스를-관리해야하는-경우">Gradle : 성능 최적화가 필요하거나 복잡한 빌드 프로세스를 관리해야하는 경우</h4>
<p>Gradle은 유연한 구성과 뛰어는 성능을 제공하기에 Groovy 스크립트 언어를 사용해 복잡한 빌드 요구사항을 효과적으로 처리할 수 있기 때문</p>
</blockquote>
<p>각각 최적의 용도에 맞춰 프로젝트에 활용한다면 프로젝트 관리와 빌드 프로세스의 효율성을 크게 향상시킬 수 있을 것 같아서 반드시 기억해두어야할 것 같다고 생각이 들었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 57일차 (2024.12.02 월) : 하루가 어떻게 지나갔는지 알 수 없다]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-57%EC%9D%BC%EC%B0%A8-2024.12.02-%EC%9B%94-%ED%95%98%EB%A3%A8%EA%B0%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%A7%80%EB%82%98%EA%B0%94%EB%8A%94%EC%A7%80-%EC%95%8C-%EC%88%98-%EC%97%86%EB%8B%A4</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-57%EC%9D%BC%EC%B0%A8-2024.12.02-%EC%9B%94-%ED%95%98%EB%A3%A8%EA%B0%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%A7%80%EB%82%98%EA%B0%94%EB%8A%94%EC%A7%80-%EC%95%8C-%EC%88%98-%EC%97%86%EB%8B%A4</guid>
            <pubDate>Mon, 02 Dec 2024 15:01:23 GMT</pubDate>
            <description><![CDATA[<h2 id="01-오늘은-하루가-순식간에-사라졌다">01. 오늘은 하루가 순식간에 사라졌다</h2>
<p>강의 1.5배속으로 다시 들으며 자바 문법 기본서를 읽으며 실습해보는 사이에 8시가 되었다.
8시부터는 학교 기말고사가 있어서 시험에 집중을 했고 9시 30분부터 다시 기본서를 살펴보며 실습했다.</p>
<p>TIL이 상당하게 빈약해지고 있지만, 내일부터 다시 열심히 적어보려고 한다.</p>
<p>내일은 베이직반 OT가 열리는데 솔직히.. 스탠다드보다 베이직이 맞지 않나 라는 생각을 하고 있어서 꼼꼼히 들어보려고한다..!</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>내가 정말 잘 하고 있는건지 의심스러운 요즘</em></p>
</blockquote>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring 기초 : Java의 역사]]></title>
            <link>https://velog.io/@kirby_y/Spring-%EA%B8%B0%EC%B4%88-Java%EC%9D%98-%EC%97%AD%EC%82%AC</link>
            <guid>https://velog.io/@kirby_y/Spring-%EA%B8%B0%EC%B4%88-Java%EC%9D%98-%EC%97%AD%EC%82%AC</guid>
            <pubDate>Sun, 01 Dec 2024 15:00:44 GMT</pubDate>
            <description><![CDATA[<h3 id="servlet의-등장1997">Servlet의 등장(1997)</h3>
<p>Java를 사용합 웹 개발의 시초로 서버에서 동적으로 콘텐츠를 생성하기 위해 사용되었고 클라이언트의 요청을 받고 그에 대한 응답을 생성하는 기본적인 구조를 제공했다</p>
<h4 id="servlet의-단점">Servlet의 단점</h4>
<p>코드의 복잡성이 증가하고 유지보수가 어려워졌음</p>
<hr>
<h3 id="jspjava-server-pages-도입1999">JSP(Java Server Pages) 도입(1999)</h3>
<p>JSP는 HTML 내에 Java 코드를 삽입할 수 있는 기술로 웹페이지를 더 쉽게 동적으로 생성할 수 있도록 도와주었음</p>
<h4 id="jsp의-단점">JSP의 단점</h4>
<p>JSP 내에 비즈니스 로직을 분리할 수 없음</p>
<hr>
<h3 id="servlet-jsp-기반의-mvc-패턴-도입">Servlet, JSP 기반의 MVC 패턴 도입</h3>
<ul>
<li>MVC 패턴이 도입되면서 UI, 비즈니스로직, 데이터를 분리하여 개발하는 방식이 등장함</li>
<li>Servlet은 주로 컨트롤러(비즈니스 로직)으로 사용되었고 JSP는 뷰(UI)를 담당하게 되었음</li>
</ul>
<h4 id="mvc패턴의-장점">MVC패턴의 장점</h4>
<p>웹 애플리케이션의 유지보수성과 확장성을 크게 향상시킴</p>
<h4 id="mvc패턴의-단점">MVC패턴의 단점</h4>
<p>개발자가 중복적으로 설정해줘야 하는 부분들이 다수 발생함</p>
<hr>
<h3 id="mvc-프레임워크의-등장과-발전20002010">MVC 프레임워크의 등장과 발전(2000~2010)</h3>
<ul>
<li>Struts, Spring 등의 MVC 프레임워크가 등장하며 웹 애플리케이션 개발이 더욱 구조화되고 효율적으로 변했다.</li>
<li>그 중 Spring MVC는 단순하면서도 강력한 기능을 제공하여 Java 웹 개발의 표준으로 자리 잡게 되었다.</li>
<li>중복적으로 설정해야하는 부분들을 프레임워크로 자동화했다</li>
</ul>
<h4 id="mvc패턴의-단점-1">MVC패턴의 단점</h4>
<ul>
<li>여전히 애플리케이션 개발 관련 설정이 복잡했다.</li>
</ul>
<hr>
<h3 id="annotation-기반의-spring-mvc2007현재">Annotation 기반의 Spring MVC(2007~현재)</h3>
<p>Annotation을 통해 애플리케이션 설정의 복잡함을 줄여주었다</p>
<h4 id="annotation-기반의-spring-mvc-장점">Annotation 기반의 Spring MVC 장점</h4>
<p>더 직관적이고 간결한 방식으로 웹 애플리케이션을 개발할 수 있게 되었다</p>
<hr>
<h3 id="spring-boot의-등장2014현재">Spring Boot의 등장(2014~현재)</h3>
<p>Spring 프레임워크를 보다 쉽게 사용하도록 만든 도구로 설정과 복잡한 초기 설정 작업을 자동하 함</p>
<h4 id="spring-boot-장점">Spring Boot 장점</h4>
<p>개발자들이 빠르게 애플리케이션을 개발할 수 있도록 도와줌</p>
<hr>
<h3 id="최신기술-동향">최신기술 동향</h3>
<blockquote>
<h4 id="web-servlet">Web Servlet</h4>
<p><strong>Spring MVC</strong>
        - 안정적이고 동기식 프로그래밍 모델을 기반으로 한 웹 애플리케이션 개발에 널리 사용됨</p>
</blockquote>
<blockquote>
<h4 id="web-reactive">Web Reactive</h4>
<p><strong>Spring WebFlux</strong>
        - 비동기 및 넌블로킹 모델을 기반으로 한 웹 프레임워크로 높은 동시성을 요구하는애플리케이션에서 효율적인 성능을 제공한다. 함수형 프로그래밍 스타일을 지원하며 서블릿 기술 대신 Netty 등의 비동기 서버를 사용한다.
        - 서블릿 기술을 사용하지 않으며 실시간 데이터를 처리하거나 높은 동시성을 요구하는 애플리케이션에 적합하다
        - RDBMS 지원 부족과 높은 기술적 난이도 등으로 인해 아직은 MVC 모델이 많은 실무에서 더 많이 사용되고 있다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 부트캠프 56일차 (2024.12.01 일) : 나는야 스톤헤드..]]></title>
            <link>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-56%EC%9D%BC%EC%B0%A8-2024.12.01-%EC%9D%BC-%EC%8A%A4%ED%86%A4%ED%97%A4%EB%93%9C</link>
            <guid>https://velog.io/@kirby_y/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-56%EC%9D%BC%EC%B0%A8-2024.12.01-%EC%9D%BC-%EC%8A%A4%ED%86%A4%ED%97%A4%EB%93%9C</guid>
            <pubDate>Sun, 01 Dec 2024 14:47:53 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="🚀-오늘의-공부기록-한-눈에-보기">🚀 오늘의 공부기록 한 눈에 보기</h3>
<p><a href="https://velog.io/@kirby_y/Spring-%EA%B8%B0%EC%B4%88-Spring-Framework-Spring-Boot">&gt;&gt; Spring 기초 : Spring Framework, Spring Boot</a>
<a href="https://velog.io/@kirby_y/Spring-%EA%B8%B0%EC%B4%88-%EB%B9%8C%EB%93%9C-%EA%B4%80%EB%A6%AC-%EB%8F%84%EA%B5%AC-Gradle">&gt;&gt; Spring 기초 : 빌드 관리 도구 Gradle</a>
<a href="https://velog.io/@kirby_y/Spring-%EA%B8%B0%EC%B4%88-Java%EC%9D%98-%EC%97%AD%EC%82%AC">&gt;&gt; Spring 기초 : Java의 역사</a></p>
</blockquote>
<hr>
<h2 id="01-강의를-듣고-있지만-아직-어려운-spring">01. 강의를 듣고 있지만 아직 어려운 Spring</h2>
<p>Spring 강의를 2배속으로 1회차 수강 완료했다. 이제 2번째로 수강할 때는 실습을 하며 1.5배속으로 진행해보고자 한다. 이 방법은 한 튜터님의 추천 방법으로 내게 맞는지 확인해보는 과정이라고 볼 수 있다!</p>
<p>아직은 이해가 잘 안되지만 반복해서 공부하다보면 이해하고 눈으로 보이는 부분들이 있지 않을까 싶다.
TIL에 투자하는 시간이 점점 더 적어져서 조금 걱정이 되지만, 우선 강의 수강과 실습에 조금 더 투자하면 좋을 것 같다는 생각이 더 큰 것 같다. 내일도 화이팅!</p>
<blockquote>
<h4 id="🔥-한줄-요약">🔥 한줄 요약</h4>
<p><em>TIL 작성 시간이 20분 정도였지만 5분으로 줄어들어버린 요즘</em></p>
</blockquote>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring 기초 : 빌드 관리 도구 Gradle]]></title>
            <link>https://velog.io/@kirby_y/Spring-%EA%B8%B0%EC%B4%88-%EB%B9%8C%EB%93%9C-%EA%B4%80%EB%A6%AC-%EB%8F%84%EA%B5%AC-Gradle</link>
            <guid>https://velog.io/@kirby_y/Spring-%EA%B8%B0%EC%B4%88-%EB%B9%8C%EB%93%9C-%EA%B4%80%EB%A6%AC-%EB%8F%84%EA%B5%AC-Gradle</guid>
            <pubDate>Sun, 01 Dec 2024 13:49:19 GMT</pubDate>
            <description><![CDATA[<h2 id="gradle">Gradle</h2>
<p>Java와 유사한 문법 구조를 가진 Groovy 기반의 스크립트 언어를 사용하며 다양한 소프트웨어를 빌드할 수 있는 유연한 빌드 자동화 도구</p>
<h3 id="빌드build">빌드(Build)</h3>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/410897dd-ad5d-4c65-b579-f8edefda5575/image.png" alt=""></p>
<ul>
<li>소스 코드를 컴퓨터가 실행 가능한 파일로 변환해주는 작업</li>
</ul>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/63006509-339a-46ed-b913-fffa55714514/image.png" alt=""></p>
<ul>
<li>빌드에 필요한 과정</li>
</ul>
<hr>
<h3 id="gradle의-특징">Gradle의 특징</h3>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/0b729ebf-5789-4271-b8f6-6727664965b6/image.png" alt=""></p>
<ol>
<li><p>유연성
복잡한 빌드 시나리오를 처리할 수 있는 유연한 시스템 제공
빌드 스크립트를 통해 다양한 빌드 작업을 정의하고 필요한 경우 커스터마이징할 수 있음</p>
</li>
<li><p>성능</p>
</li>
</ol>
<ul>
<li><p><strong>Build Cache</strong>
빌드 결과물을 캐싱하여 재사용 함
라이브러리 의존성을 캐싱하여 재사용 함</p>
</li>
<li><p><strong>점진적 빌드</strong>
마지막 빌드 호출 이후 변경된 부분만 빌드함
변경되지 않은 부분은 캐시 결과를 검색해 재사용함</p>
</li>
<li><p><strong>데몬 프로세스</strong>
다음 빌드 작업을 위해 백그라운드에서 대기하는 프로세스
초기 빌드 이후부터는 빌드 실행 시 초기화 작업을 거치지 않음</p>
</li>
</ul>
<ol start="3">
<li>멀티 프로젝트 빌드 지원</li>
</ol>
<p><img src="https://velog.velcdn.com/images/kirby_y/post/cf8fcede-c8e7-4a17-b348-97ddb2ab6aef/image.png" alt="">
공통으로 사용하는 클래스를 모듈로 만들어 독립적인 각 프로젝트에서 사용할 수 있도록 함</p>
<ol start="4">
<li>설정 주입 방식
필요한 설정을 직접 프로젝트에 주입하는 방식
공통되는 정보는 묶어서 한 번에 주입이 가능함
프로젝트 별로 설정을 다르게 주입할 수 있음</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>