<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>maxdev-lab.log</title>
        <link>https://velog.io/</link>
        <description>신입 개발자 윤현수입니다!</description>
        <lastBuildDate>Tue, 03 Jun 2025 13:27:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>maxdev-lab.log</title>
            <url>https://velog.velcdn.com/images/maxdev-lab/profile/8a41f709-2f85-452c-8945-83f7b1a0adfd/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. maxdev-lab.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/maxdev-lab" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[공부 일지] 3. 프로젝트 생성]]></title>
            <link>https://velog.io/@maxdev-lab/%EA%B3%B5%EB%B6%80-%EC%9D%BC%EC%A7%80-3.-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@maxdev-lab/%EA%B3%B5%EB%B6%80-%EC%9D%BC%EC%A7%80-3.-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Tue, 03 Jun 2025 13:27:44 GMT</pubDate>
            <description><![CDATA[<h2 id="31-프로젝트-생성해보기">3.1 프로젝트 생성해보기</h2>
<p>이번에 공부한 내용은 자바 JDK와 인텔리제이를 설치하고 프로젝트까지 생성해보는 것이었습니다.</p>
<p><img src="https://velog.velcdn.com/images/maxdev-lab/post/48d4d748-95e5-44f1-98af-863b1c3c4af7/image.png" alt="">
Springboot 공부하면서 git의 사용도 많이 해보고자 Git repository 설정하였습니다.
언어는 라이브러리가 방대하며 플랫폼 독립성이 높은 자바를 택했습니다.
타입은 기본 형식인 Gradle - Groovy로 정했습니다.
jdk 버전은 22로 설정했습니다.</p>
<p><img src="https://velog.velcdn.com/images/maxdev-lab/post/f1cf9185-bc1d-436f-8f3f-3a72b97bfe58/image.png" alt=""></p>
<p>프로젝트에서 사용할 의존성으로는 기본적인 의존성들만 선택한 후 진행하였습니다.</p>
<p><img src="https://velog.velcdn.com/images/maxdev-lab/post/df252daf-1636-438e-95ca-e59a5b43c7af/image.png" alt=""></p>
<p>생성된 프로젝트에서 build.gradle 파일을 통해 프로젝트의 빌드와 의존성 관리를 담당하는 설정들에 대해 공부해봤습니다.</p>
<ol>
<li>plugins { ... }</li>
</ol>
<ul>
<li>Gradle에서 사용할 플러그인을 정의
&#39;java&#39; : 자바 프로젝트로 인식
&#39;org.springframework.boot&#39; : 스프링 부트 프로젝트로 설정
&#39;io.spring.dependency-management&#39; : 의존성 버전 관리를 쉽게 도와주는 프로그인</li>
</ul>
<ol start="2">
<li>group, version</li>
</ol>
<ul>
<li>프로젝트의 기본 정보를 설정
group : 패키지 네임스페이스
version : 프로젝트 버전</li>
</ul>
<ol start="3">
<li>java.toolchain</li>
</ol>
<ul>
<li>자바 버전 명시</li>
</ul>
<ol start="4">
<li>configurations</li>
</ol>
<ul>
<li>Lombok 같은 어노테이션 프로세서 사용 시 필수</li>
</ul>
<ol start="5">
<li>repositories</li>
</ol>
<ul>
<li>의존성을 가져올 저장소 지정
mavenCentral() : 가장 널리 쓰이는 Maven 중앙 저장소 사용</li>
</ul>
<ol start="6">
<li>dependencies</li>
</ol>
<ul>
<li>프로젝트에서 사용하는 외부 라이브러리 목록
implementation : 실제 런타임/컴파일 시 사용될 라이브러리
compileOnly : 컴파일 시에만 필요
annotationProcessor : 컴파일 시 어노테이션 처리기 등록
testImplementation : 테스트 코드에서 사용하는 의존성
testRunTimeOnly : 테스트 실행 시만 필요한 라이브러리</li>
</ul>
<ol start="7">
<li>task.named(&#39;test&#39;)
test 작업 시 JUnit5을 사용하도록 추천</li>
</ol>
<h2 id="32-프로젝트-실행">3.2 프로젝트 실행</h2>
<p>아주 간단한 실행 예제를 만들어서 실행해봤습니다.</p>
<p><img src="https://velog.velcdn.com/images/maxdev-lab/post/9e05de53-0470-49b0-a80a-398329e1ac1e/image.png" alt=""></p>
<p>&lt;실행화면&gt;
<img src="https://velog.velcdn.com/images/maxdev-lab/post/d1fb77bd-4675-418c-a56b-b22aad3b1d9e/image.png" alt=""></p>
<h2 id="33-추가적으로-공부한-점">3.3 추가적으로 공부한 점</h2>
<p>교재에는 안나왔지만 Postman은 API 개발과 테스트를 위한 도구로 많이 사용하게 된다하여 직접 사용해 봤습니다.</p>
<p><img src="https://velog.velcdn.com/images/maxdev-lab/post/9a52ec25-ede1-4862-a570-ab60f661e404/image.png" alt=""></p>
<p>Postman처럼 api 실행은 물론 문서화 하기 좋은 swagger도 알게 되었지만 문서 연동 작업이 필요하여 이후 프로젝트 진행도가 높아지면 그때 사용해 봐야겠다고 생각했습니다.</p>
<p>또한 지금 당장 개발 혹은 협력의 목적은 아니지만 코드 관리, 상태 추적, git의 연습을 위하여 git 연동을 진행하였습니다.</p>
<p><img src="https://velog.velcdn.com/images/maxdev-lab/post/fb1c32c3-a652-4047-8320-bc58c35d5deb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/maxdev-lab/post/6e4080a3-a5a6-49ea-a2a7-3584bf8753c8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/maxdev-lab/post/713641d3-a0e1-41a9-aa84-c3c449cfce1a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/maxdev-lab/post/443f235a-c88d-4745-8e83-5afed474c73c/image.png" alt=""></p>
<p>.gitignore 설정이나 커밋 규칙 등은 아직 어떤게 정답이거나 필요한지 정확히 모르기 때문에 커밋해가면서 배우고자 합니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[공부 일지] 2. 개발 기초 지식]]></title>
            <link>https://velog.io/@maxdev-lab/%EA%B3%B5%EB%B6%80-%EC%9D%BC%EC%A7%80-%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EC%B4%88-%EC%A7%80%EC%8B%9D%EC%9E%91%EC%84%B1%EC%A4%91</link>
            <guid>https://velog.io/@maxdev-lab/%EA%B3%B5%EB%B6%80-%EC%9D%BC%EC%A7%80-%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EC%B4%88-%EC%A7%80%EC%8B%9D%EC%9E%91%EC%84%B1%EC%A4%91</guid>
            <pubDate>Tue, 27 May 2025 11:57:48 GMT</pubDate>
            <description><![CDATA[<h2 id="21-서버-간-통신--msa">2.1 서버 간 통신 &amp; MSA</h2>
<p><strong>단일 서비스 아키텍처</strong></p>
<pre><code>• 모든 기능(블로그, 메일, 카페 등)을 하나의 애플리케이션에 포함해 개발

• 서비스가 많아질수록 유지보수가 어려워지고 전체 배포 시간이 길어짐</code></pre><p><strong>마이크로서비스 아키텍처(MSA)</strong></p>
<pre><code>• 각 기능을 별도의 독립적인 서비스로 나누어 개발

• 서버 간 통신 필요 → 일반적으로 HTTP/HTTPS 사용

• 장점: 독립 배포, 확장 용이, 장애 격리</code></pre><h2 id="22-스프링-부트의-동작-구조">2.2 스프링 부트의 동작 구조</h2>
<p>• spring-boot-starter-web 사용 시 Tomcat을 내장 WAS로 포함</p>
<pre><code>• DispatcherServlet의 요청 흐름:

    1. 클라이언트 요청 → DispatcherServlet 진입

    2. URI 기반 핸들러 매핑 (HandlerMapping)

    3. 핸들러 어댑터(HandlerAdapter)가 컨트롤러 호출

    4. ModelAndView 생성 후 ViewResolver로 뷰 결정

    5. View 반환</code></pre><p><strong>RESTController 사용 시</strong></p>
<p>• 뷰를 사용하지 않고 MessageConverter를 통해 JSON 등으로 응답</p>
<p>• @ResponseBody에 의해 자동 적용됨</p>
<h2 id="23-레이어드-아키텍처">2.3 레이어드 아키텍처</h2>
<p><strong>일반적인 3계층 구조</strong></p>
<ol>
<li><p>Presentation Layer (UI): Controller, 사용자 요청 처리</p>
</li>
<li><p>Business Layer (Service): 비즈니스 로직 처리</p>
</li>
<li><p>Data Access Layer (DAO/Repository): 데이터베이스 연동</p>
</li>
</ol>
<h2 id="24-디자인-패턴">2.4 디자인 패턴</h2>
<p>▷ 생성 패턴</p>
<pre><code>팩토리 메서드: 객체 생성 로직을 하위 클래스에 위임하여, 새로운 객체 생성 로직이 필요할 때 코드 변경 없이 확장 가능

    예시: Spring에서 Bean 생성 시 실제 구현체를 외부 설정 파일이나 팩토리 클래스에 맡김으로써 유연성 확보</code></pre><blockquote>
<p>예시 코드:</p>
<pre><code class="language-java">interface Product {
    void use();
}
class ConcreteProduct implements Product {
    public void use() {
        System.out.println(&quot;Product 사용&quot;);
    }
}
abstract class Creator {
    abstract Product factoryMethod();
    public void operate() {
        Product p = factoryMethod();
        p.use();
      }
}</code></pre>
</blockquote>
<pre><code>싱글턴: 프로그램에서 단 하나의 인스턴스만 존재하게 보장하는 패턴

    사용 예: DB 커넥션 풀, 설정값 관리 객체, Logger 등 공유 자원에서 많이 사용됨

    주의점: 멀티스레드 환경에서는 동기화 이슈 발생 가능 → synchronized, enum 싱글턴 방식으로 해결</code></pre><blockquote>
<p>예시 코드:</p>
<pre><code class="language-java">public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}</code></pre>
</blockquote>
<p>▷ 구조 패턴</p>
<pre><code>프록시(Proxy): 실제 객체를 대신하여 요청을 가로채거나 기능을 부가한 대리 객체

    예시: API 호출 전에 캐시된 결과를 리턴하거나, 권한 체크, 지연 로딩 등에 활용

    실체 객체를 직접 사용하지 않고 필요한 시점에 로딩함으로써 효율성과 보안성 확보</code></pre><blockquote>
<p>예시 코드:</p>
<pre><code class="language-java">interface Service {
    void run();
}
class RealService implements Service {
    public void run() {
        System.out.println(&quot;실제 서비스 동작&quot;);
    }
}
class ProxyService implements Service {
    private RealService realService = new RealService();
    public void run() {
        System.out.println(&quot;프록시 사전 처리&quot;);
        realService.run();
        System.out.println(&quot;프록시 후처리&quot;);
    }
}</code></pre>
</blockquote>
<p>▷ 행위 패턴</p>
<pre><code>템플릿 메서드: 알고리즘의 기본 구조를 상위 클래스에서 정의하고, 세부 구현은 하위 클래스가 담당

    공통되는 로직은 추상화하여 코드 중복 최소화, 특정 단계만 오버라이딩하여 재사용성 극대화

    예시: AbstractController에서 doGet(), doPost()를 템플릿으로 제공하고 세부 로직은 상속 클래스에서 구현</code></pre><blockquote>
<p>예시 코드:</p>
<pre><code class="language-java">abstract class Template {
    public final void process() {
        step1();
        step2();
    }
    abstract void step1();
    abstract void step2();
}
class SubProcess extends Template {
    void step1() { System.out.println(&quot;1단계 실행&quot;); }
    void step2() { System.out.println(&quot;2단계 실행&quot;); }
}</code></pre>
</blockquote>
<h2 id="25-rest-api">2.5 REST API</h2>
<p>2.5.1 REST란?</p>
<pre><code>• Representational State Transfer의 약자

• URI로 자원을 식별하고 HTTP 메서드(GET, POST, PUT, DELETE)로 상태 조작</code></pre><p>2.5.2 REST API란?</p>
<pre><code>• REST 아키텍처 스타일을 따르는 API

• 시스템/애플리케이션이 서로 통신하기 위한 인터페이스로 RESTful하게 구성</code></pre><p>2.5.3 REST의 특징</p>
<pre><code>• 유니폼 인터페이스: 일관된 HTTP 표준 사용

• 무상태성: 서버가 클라이언트 상태를 저장하지 않음

• 캐시 가능: 응답 캐시를 통해 성능 최적화 가능

• 레이어 시스템: 네트워크 상 여러 계층 구성 가능

• 클라이언트-서버 구조 : 사용자 정보와 처리 로직 분리 설계</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[공부 일지] 1. 스프링 부트란?]]></title>
            <link>https://velog.io/@maxdev-lab/%EA%B3%B5%EB%B6%80-%EC%9D%BC%EC%A7%80-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8%EB%9E%80</link>
            <guid>https://velog.io/@maxdev-lab/%EA%B3%B5%EB%B6%80-%EC%9D%BC%EC%A7%80-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8%EB%9E%80</guid>
            <pubDate>Tue, 20 May 2025 11:20:01 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-spring">📌 Spring</h2>
<p>🔷 스프링은 자바로 애플리케이션을 개발하는 데 필요한 기능을 제공하고 쉽게 사용하도록 돕는 도구</p>
<h3 id="⭐-스프링의-특징과-구조">⭐ 스프링의 특징과 구조</h3>
<p>🔷 1. 제어 역전(IoC)
일반적인 자바 개발의 경우와 다르게 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임한다. 이를 통해 개발자는 비즈니스 로직을 작성하는 데 더 집중할 수 있다.</p>
<p>🔷 2. 의존성 주입(DI)
제어 역전의 방법 중 하나로, 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식으로 3가지 방법이 있다.</p>
<ul>
<li>생성자를 통한 의존성 주입</li>
<li>필드 객체 선언을 통한 의존성 주입</li>
<li>세터 메서드를 통한 의존성 주입</li>
</ul>
<p>이 중에서 생성자를 통한 의존성 주입받는 방식을 권장한다. 다른 방식과는 다르게 레퍼런스 객체 없이는 객체를 초기화 할 수 없게 설계할 수 있기 때문이다.</p>
<blockquote>
<p>@Autowired : 스프링에서 의존성을 주입하는 애너테이션(annotation)</p>
</blockquote>
<p>🔷 3. 관점 지향 프로그래밍(AOP)
AOP는 관점을 기준으로 묶어 개발하는 방식이다. 관점이란 어떤 기능을 구현할 때 &#39;핵심 기능&#39;과 &#39;부가 기능&#39;으로 구분해 각각을 하나의 관점으로 보는 것을 말한다
밑 예시는 클라이언트로부터 상품 정보 등록 요청을 받아 데이터베이스에 저장하고, 그 상품 정보를 조회하는 비즈니스 로직을 구현할 때, 상품 정보 등록과 상품 정보 조회가 핵심 기능이다.
부가 기능을 추가 할 때는 핵심 기능 사이에 로깅 처리 또는 트랜잭션을 처리하면 된다.
<img src="https://velog.velcdn.com/images/maxdev-lab/post/9775757c-04ac-4281-be18-b6a1086cbda9/image.png" alt=""></p>
<p>AOP 구현하는 방법</p>
<ul>
<li>컴파일 과정에 삽입하는 방식</li>
<li>바이트코드를 메모리에 로드하는 과정에 삽입하는 방식</li>
<li>프락시 패턴을 이용한 방식</li>
</ul>
<p>스프링은 프락시 패턴을 통해 AOP 기능을 제공하고 있다.
따라서, OOP와 같이 모듈화된 객체 구조와 이 핵심 기능을 수행하는 로직 이전에 부가 기능을 수행 함으로써 개발자가 온전히 비즈니스 로직만을 구현하는데 집중하게 해준다.</p>
<h3 id="⭐-스프링-프레임워크-vs-스프링-부트">⭐ 스프링 프레임워크 vs 스프링 부트</h3>
<table>
<thead>
<tr>
<th align="left"></th>
<th align="center">스프링 프레임워크</th>
<th align="center">스프링 부트</th>
</tr>
</thead>
<tbody><tr>
<td align="left">설정</td>
<td align="center">복잡</td>
<td align="center">단순</td>
</tr>
<tr>
<td align="left">의존성 관리</td>
<td align="center">직접 설정</td>
<td align="center">&#39;spring-boot-starter&#39; 의존성 제공</td>
</tr>
<tr>
<td align="left">자동설정</td>
<td align="center">없음</td>
<td align="center">자동설정 지원</td>
</tr>
<tr>
<td align="left">내장 WAS</td>
<td align="center">없음, 외부 WAS에 배포해야 함</td>
<td align="center">Tomcat 등 내장 WAS 지원</td>
</tr>
<tr>
<td align="left">모니터링</td>
<td align="center">직접 구현</td>
<td align="center">Spring Boot Acctuator로 모니터링 지원</td>
</tr>
</tbody></table>
]]></description>
        </item>
    </channel>
</rss>