<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hong_sm.log</title>
        <link>https://velog.io/</link>
        <description>열심히 배워가는 중..</description>
        <lastBuildDate>Wed, 09 Apr 2025 05:22:16 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hong_sm.log</title>
            <url>https://velog.velcdn.com/images/hong_sm/profile/9890365f-7760-4169-8828-41b67ad44a09/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hong_sm.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hong_sm" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Spring Boot 3 백엔드 개발자 되기] 2장 – 스프링과 부트의 탄생 배경부터 핵심 원리까지]]></title>
            <link>https://velog.io/@hong_sm/Spring-Boot-3-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%90%98%EA%B8%B0-2%EC%9E%A5-Spring-Boot%EC%97%90-%EB%8C%80%ED%95%9C-%EB%AA%A8%EB%93%A0-%EA%B2%83</link>
            <guid>https://velog.io/@hong_sm/Spring-Boot-3-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%90%98%EA%B8%B0-2%EC%9E%A5-Spring-Boot%EC%97%90-%EB%8C%80%ED%95%9C-%EB%AA%A8%EB%93%A0-%EA%B2%83</guid>
            <pubDate>Wed, 09 Apr 2025 05:22:16 GMT</pubDate>
            <description><![CDATA[<h1 id="스프링과-스프링-부트-그리고-주요-원리-총정리">스프링과 스프링 부트, 그리고 주요 원리 총정리</h1>
<h2 id="1-스프링spring의-등장">1. 스프링(Spring)의 등장</h2>
<p>스프링은 <strong>엔터프라이즈 애플리케이션</strong>을 위한 개발 환경을 제공하고자 만들어졌습니다.<br>그럼 엔터프라이즈 애플리케이션이란 무엇일까요?</p>
<blockquote>
<p>대규모의 복잡한 데이터를 관리하고 많은 사용자의 요청을 동시에 처리해야 하는 애플리케이션을 말합니다.</p>
</blockquote>
<p>이런 시스템에서는 <strong>서버 성능</strong>, <strong>안정성</strong>, <strong>보안</strong>이 매우 중요하지만, 개발자들이 이런 요소까지 모두 신경 쓰면서 비즈니스 로직까지 구현하기엔 부담이 컸습니다.</p>
<p>이 때 등장한 것이 <strong>Spring Framework</strong>입니다.<br>스프링은 서버 성능, 안정성, 보안을 높은 수준으로 제공하여 개발자들이 <strong>비즈니스 로직에만 집중할 수 있도록</strong> 도와줍니다.</p>
<hr>
<h2 id="2-spring-vs-spring-boot">2. Spring vs Spring Boot</h2>
<p>스프링은 이렇게 장점이 많은 개발 도구였지만 설정이 매우 복잡했고 이를 보완하고자 스프링부트가 탄생했습니다. 스프링부트는 스프링과 똑같거나 다른 것이 아닌 그냥 스프링을 보다 더 쉽게 사용하게 해 주는 도구입니다.</p>
<h3 id="●-주요-차이점">● 주요 차이점</h3>
<h4 id="--구성의-차이">- 구성의 차이</h4>
<ul>
<li><strong>스프링</strong>: 수동으로 설정해야 함</li>
<li><strong>스프링 부트</strong>: <code>starter</code>를 이용해 자동 설정 (개발 환경 자동 구성)</li>
</ul>
<h4 id="--내장-wasweb-application-server">- 내장 WAS(Web Application Server)</h4>
<ul>
<li><strong>스프링</strong>: 외부 WAS 필요 (톰캣 등)</li>
<li><strong>스프링 부트</strong>: <strong>내장 톰캣 포함</strong> → 바로 실행 가능</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/0035687c-936b-4eb2-89e3-c2332d4e5b52/image.png" alt="WAS 구조">  그림 출처: <a href="https://goldsony.tistory.com/37">goldsony.tistory.com</a></p>
<h4 id="--기타">- 기타</h4>
<ul>
<li>XML 설정 없이 사용 가능</li>
<li>인메모리 DB(H2 등) 지원</li>
</ul>
<hr>
<h2 id="3-스프링의-주요-원리-4가지">3. 스프링의 주요 원리 4가지</h2>
<h3 id="31-ioc-제어의-역전-inversion-of-control">3.1 IOC (제어의 역전, Inversion of Control)</h3>
<p> IOC는 (Inversion of Control)의 줄임말로 말 그대로 <strong>제어의 역전</strong>입니다. 여러분들이 자바를 공부해 보셨다면 자바에서 객체를 생성할 때는 객체가 필요한 곳에서 직접 생성을 한다는 말을 이해하실 수 있으실 겁니다.</p>
<pre><code class="language-java">Public class A {
    b = new B(); // 직접 객체 생성
}</code></pre>
<p> 클래스B의 객체를 사용하기 위해 클래스 A에서 직접 객체를 만드는 예제입니다.</p>
<p> 제어의 역전은 다른 객체를 <strong>직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용</strong>한다는 의미입니다. </p>
<blockquote>
<p>이 의미는 위 코드처럼 직접 객체를 만드는 것이 아니라 어딘가에 있는 객체를 받아와서 사용한다는 의미이고 실제로 스프링에서는 스프링 컨테이너가 객체를 관리하고 제공해주는 역할을 수행하고 있습니다.</p>
</blockquote>
<pre><code class="language-java"> public class A {
     private B b;
 }</code></pre>
<p>위 코드처럼 코드에서 객체를 생성하지 않고 스프링 컨테이너가 객체를 제공하여 클래스 B의 객체를 사용하고 있습니다.</p>
<p> <img src="https://velog.velcdn.com/images/hong_sm/post/41db38cd-4eac-4739-852b-1ed26e5f655d/image.png" alt="">
그림 출처 <a href="https://buly.kr/8IveRlC">https://buly.kr/8IveRlC</a></p>
<hr>
<h3 id="32-di-의존성-주입-dependency-injection">3.2 DI (의존성 주입, Dependency Injection)</h3>
<p>IOC를 구현하는 방법 중 하나입니다.
스프링에서는 <code>@Autowired</code> 어노테이션 등을 사용해 <strong>빈(Bean)</strong>을 주입합니다.</p>
<p><strong>DI는 (Dependency Injection)</strong> 의 약자로 어떤 클래스가 다른 클래스에 의존한다는 것을 의미합니다. <code>@Autowired</code> 어노테이션은 스프링 컨테이너에 등록되어 있던 빈이라는 것을 주입해주는 역할을 합니다. 여기서 빈이 무엇이냐면 쉽게 말해 스프링 컨테이너에서 관리하는 객체를 의미합니다.</p>
<h4 id="--field변수를-사용하는-방법">- Field변수를 사용하는 방법</h4>
<pre><code class="language-java">public class A {
    //A에서 B를 주입받음.
    @Autowired
     B b;
}</code></pre>
<p>위 코드처럼 스프링 컨테이너에서 객체를 만들어서 클래스 A에 주입해주는 것을 DI라고 합니다. 이러한 방법 이외에도 <strong>생성자</strong>를 이용하거나** setter**를 이용하는 방법도 있습니다.</p>
<h4 id="--생성자를-사용하는-방법">- 생성자를 사용하는 방법</h4>
<pre><code class="language-java">public class A {

    private B b;

    public A (B b) {
        this.b = b;
    }
}</code></pre>
<h4 id="--setter를-사용하는-방법">- Setter를 사용하는 방법</h4>
<pre><code class="language-java">public class A {

    private B b;

    @Autowired
    public void setB(B b) {
        this.b = b;
    }</code></pre>
<p><strong>각 방법들의 장단점</strong></p>
<ul>
<li><p><strong>생성자 주입</strong>: 가장 권장되는 방식. 의존성이 명확하게 보이고, 불변성 보장.</p>
</li>
<li><p><strong>세터 주입</strong>: 선택적인 의존성 주입할 때 사용.</p>
</li>
<li><p><strong>필드 주입</strong>: 편하지만 테스트하기 어렵고 유지보수에 불리함.</p>
</li>
</ul>
<p>여기서 스프링 컨테이너와 빈에 대해서 간단하게 다시 집고 넘어가겠습니다.</p>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/cc5fa769-77b2-41d7-8d69-7e649292d02f/image.png" alt="">
그림 출처 <a href="https://ittrue.tistory.com/220#google_vignette">https://ittrue.tistory.com/220#google_vignette</a></p>
<ul>
<li><p><strong>스프링 컨테이너</strong>
스프링에서 제공하는 것으로 <strong>빈을 생성하고 관리</strong>해줍니다. 즉 빈이 생성되고 소멸하기 까지의 <strong>생명주기를 스프링 컨테이너가 관리</strong>하는 것입니다. 그리고 <code>@AutoWired</code> 어노테이션을 사용해 원하는 위치에서 빈을 주입받을 수 있게 DI를 지원해 주는 역할을 합니다.</p>
</li>
<li><p><strong>스프링 빈</strong>
앞에서 봤듯이 스<strong>프링 컨테이너에서 생성하고 관리하는 객체</strong>입니다. 위 코드에서는 B가 빈인데 빈을 등록하는 방법에는 어노테이션이나 XML 파일 설정 등등 여러가지 방법이 있습니다.</p>
<pre><code class="language-java">@Component // 클래스 MyBean 빈으로 등록됨.
public class MyBean{
}</code></pre>
<blockquote>
<p>위처럼 @Component 어노테이션을 사용해 빈으로 등록할 수 있고 이렇게 등록된 빈은 제일 첫글자가 소문자로 바뀌어서 myBean이라는 빈 이름으로 클래스가 등록이 됩니다.</p>
</blockquote>
</li>
</ul>
<hr>
<h3 id="33-aop-관점-지향-프로그래밍">3.3 AOP (관점 지향 프로그래밍)</h3>
<p> <img src="https://velog.velcdn.com/images/hong_sm/post/1033faf1-8d7d-4be8-bf17-1ef8e3eb2706/image.png" alt=""></p>
<p>  AOP란 Aspect Oriented Programming의 줄임말로 직역하면 <strong>관점 지향 프로그래밍</strong>입니다. 프로그래밍을 <strong>핵심관점과 부가관점으로 나누어서 이를 기준으로 모듈화하는 것</strong>을 의미합니다.</p>
<p> <img src="https://velog.velcdn.com/images/hong_sm/post/b5707c94-5fb7-4f35-b039-1b27601301f0/image.png" alt="">
 그림 출처 <a href="https://imbf.github.io/spring/2020/03/23/AOP.html">https://imbf.github.io/spring/2020/03/23/AOP.html</a></p>
<p>예를 들어,</p>
<ul>
<li><p><strong>핵심 관점</strong>: 계좌이체, 고객 관리</p>
</li>
<li><p><strong>부가 관점</strong>: 로깅, 보안, 트랜잭션</p>
</li>
</ul>
<p>AOP는 이 부가 로직들을 공통 모듈로 분리하여 <strong>유지보수성과 재사용성</strong>을 높여줍니다.한마디로 부가관점 코드를 분리하여 개발자가 핵심관점의 개발에 보다 더 집중할 수 있도록 하고 프로그램의 <strong>변경과 확장에 있어 유연하게 대응</strong>할 수 있도록 해줍니다.</p>
<hr>
<h3 id="34-psa-이식-가능한-추상화-서비스-portable-service-abstraction">3.4 PSA (이식 가능한 추상화 서비스, Portable Service Abstraction)</h3>
<p>PSA는 이식 가능한 추상화 서비스로 (Portable Service Abstraction)의 약자로 스프링에서 제공하는 다양한 기술들을 <strong>추상화</strong> 하여 개발자가 쉽게 사용할 수 있는 인터페이스를 의미합니다.</p>
<p>대표적인 PSA로는 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 어노테이션 등이 있습니다. 그리고 스프링에서 DB에 접근하려면 JPA, MyBatis, JDBC등 다양한 기술을 사용할 수 있는데 여기에서 <strong>어떤 기술을 사용하든 일관된 방</strong>식으로 DB에 접근할 수 있도록 인터페이스를 지원합니다.</p>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/548b8a19-34ef-4768-b1a1-cc0522f4e454/image.png" alt="">
그림 출처 <a href="https://velog.io/@bernard/Spring-PSA">https://velog.io/@bernard/Spring-PSA</a></p>
<p>마지막으로 정리하자면</p>
<blockquote>
<ul>
<li><strong>IOC</strong> : <strong>객체의 생성과 관리</strong>를 개발자가 하는 것이 아니라 <strong>프레임워크</strong>가 대신 하는 것</li>
</ul>
</blockquote>
<ul>
<li><strong>DI *<em>: *</em>외부에서 객체를 주입</strong>받아 사용하는 것</li>
<li><strong>AOP</strong> : 프로그래밍을 할 떄 <strong>핵심 관점과 부가 관점</strong>을 구분하여 개발하는 것</li>
<li><strong>PSA *<em>: 어떤 기술을 사용하든 *</em>일관된 방식</strong>으로 처리되도록 하는 것</li>
</ul>
<hr>
<p>추가적인 개념으로 </p>
<h3 id="pojo란-무엇일까">POJO란 무엇일까?</h3>
<p>POJO는 Plain Old Java Object의 약자로,<strong>특별한 규약이나 상속 없이 작성된 순수한 자바 객체</strong>를 의미합니다. 즉 POJO는 어떤 프레임워크나 라이브러리에도 의존하지 않고, 단순히 필드와 메서드만으로 구성된 자바 객체라고 할 수 있습니다.</p>
<p>POJO의 특징으로는 </p>
<ul>
<li><p><strong>상속 없음</strong></p>
<ul>
<li>javax.persistence.Entity나 org.springframework.Component 같은 특정 클래스를 상속받지 않아도 됨</li>
</ul>
</li>
<li><p><strong>어노테이션 없음</strong></p>
<ul>
<li>프레임워크의 어노테이션에 의존하지 않아도 됨</li>
</ul>
</li>
<li><p><strong>간단한 구조</strong></p>
<ul>
<li>대부분은 필드 + getter/setter + toString + equals/hashCode 정도만 가짐</li>
</ul>
</li>
</ul>
<p>Spring 같은 프레임워크는 POJO를 관리 대상으로 등록해 다양한 기능을 부여할 수 있습니다. 또한 <strong>유지보수가 쉽고 유연함</strong>을 지니고 있기 때문에 스프링은 이 <strong>POJO 기반 프로그래밍을 지향</strong>합니다.</p>
<hr>
<h3 id="마무리하며">마무리하며</h3>
<p>오늘은 스프링과 스프링부트의 차이점과
스프링의 핵심 개념인 <strong>IOC, DI, AOP, PSA</strong>를 정리해보았습니다.</p>
<p>특히 <strong>PSA와 POJO</strong> 개념은 처음 접해보는 용어라 더 흥미로웠고,
스프링의 추상화 구조와 개념을 이해하는 데 큰 도움이 되었습니다.</p>
<p>감사합니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB] Spring Boot 프로젝트에 MySQL 연결하는 방법과 각 DB들의 조합 추천]]></title>
            <link>https://velog.io/@hong_sm/Spring-Boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-MySQL-%EC%97%B0%EA%B2%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EA%B3%BC-%EA%B0%81-DB%EB%93%A4%EC%9D%98-%EC%A1%B0%ED%95%A9-%EC%B6%94%EC%B2%9C</link>
            <guid>https://velog.io/@hong_sm/Spring-Boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-MySQL-%EC%97%B0%EA%B2%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EA%B3%BC-%EA%B0%81-DB%EB%93%A4%EC%9D%98-%EC%A1%B0%ED%95%A9-%EC%B6%94%EC%B2%9C</guid>
            <pubDate>Thu, 03 Apr 2025 11:05:08 GMT</pubDate>
            <description><![CDATA[<h3 id="spring-boot-프로젝트와-잘-맞는-데이터베이스db-및-mysql-연동-방법">Spring Boot 프로젝트와 잘 맞는 데이터베이스(DB) 및 MySQL 연동 방법</h3>
<p>스프링부트(Spring Boot) 프로젝트에서 데이터베이스(DB)는 필수적인 요소입니다. 프로젝트의 성격에 따라 적절한 DB를 선택하는 것이 중요하며, 이번 글에서는 <strong>스프링부트와 잘 맞는 DB</strong>를 소개하고, <strong>Spring Boot와 MySQL을 연동하는 방법</strong>을 정리해보겠습니다.</p>
<hr>
<h2 id="spring-boot와-잘-맞는-데이터베이스">Spring Boot와 잘 맞는 데이터베이스</h2>
<h3 id="1-관계형-데이터베이스rdbms">1. 관계형 데이터베이스(RDBMS)</h3>
<h4 id="🔹-mysql--mariadb"><strong>🔹 MySQL / MariaDB</strong></h4>
<ul>
<li>가장 널리 사용되는 오픈소스 RDBMS</li>
<li>Spring Boot와의 연동이 용이</li>
<li>클라우드 환경에서도 잘 동작 (AWS RDS, GCP Cloud SQL 등)</li>
<li>MariaDB는 MySQL과 거의 동일하며, 라이선스 문제에서 자유로움</li>
</ul>
<h4 id="🔹-postgresql"><strong>🔹 PostgreSQL</strong></h4>
<ul>
<li>ACID(원자성, 일관성, 독립성, 지속성) 지원이 강력함</li>
<li>JSON, 배열 등의 데이터 타입 지원 → NoSQL 기능도 일부 활용 가능</li>
<li>Spring Data JPA와 잘 맞으며, 확장성이 뛰어남</li>
</ul>
<h4 id="🔹-oracle-db"><strong>🔹 Oracle DB</strong></h4>
<ul>
<li>기업용 프로젝트에서 많이 사용됨</li>
<li>대규모 트랜잭션 처리 가능, 안정성이 높음</li>
<li>스프링과 연동 시 JDBC나 MyBatis를 주로 사용</li>
</ul>
<h4 id="🔹-microsoft-sql-server"><strong>🔹 Microsoft SQL Server</strong></h4>
<ul>
<li>Windows 환경에서 주로 사용되는 RDBMS</li>
<li>Spring Boot와 연동 가능하지만, 기업 시스템에서 주로 사용됨</li>
</ul>
<hr>
<h3 id="2-nosql-데이터베이스">2. NoSQL 데이터베이스</h3>
<h4 id="🔹-mongodb"><strong>🔹 MongoDB</strong></h4>
<ul>
<li>JSON 문서 기반의 NoSQL DB</li>
<li>Spring Data MongoDB 사용 가능</li>
<li>스키마가 유연하여 빠른 개발에 유리함</li>
</ul>
<h4 id="🔹-redis"><strong>🔹 Redis</strong></h4>
<ul>
<li>인메모리 데이터 저장소로, 캐싱 및 세션 관리에 유용</li>
<li>Spring Boot에서 쉽게 설정 가능</li>
</ul>
<h4 id="🔹-elasticsearch"><strong>🔹 Elasticsearch</strong></h4>
<ul>
<li>검색 기능이 중요한 프로젝트에서 사용</li>
<li>로그 데이터 분석, 검색 최적화 등에 적합</li>
</ul>
<hr>
<h3 id="추천-조합">추천 조합</h3>
<p><strong>웹 서비스, API 서버</strong> : MySQL / PostgreSQL + Redis (캐싱)</p>
<p><strong>대규모 트래픽 처리</strong> : PostgreSQL + MongoDB (혼합) + Redis</p>
<p><strong>기업용 시스템</strong> : Oracle DB / MS SQL Server</p>
<p><strong>검색 기능 강화</strong> : MySQL + Elasticsearch</p>
<p><strong>실시간 데이터 처리</strong> : MongoDB + Redis</p>
<hr>
<h2 id="spring-boot와-mysql-연동-방법">Spring Boot와 MySQL 연동 방법</h2>
<h3 id="1️⃣-mysql-설치-및-설정">1️⃣ MySQL 설치 및 설정</h3>
<p>MySQL이 설치되어 있지 않다면, (<a href="https://dev.mysql.com/downloads/windows/installer/8.0.html)%EC%97%90%EC%84%9C">https://dev.mysql.com/downloads/windows/installer/8.0.html)에서</a> 다운로드합니다.</p>
<p>설치 후에는 아래의 블로그에 들어가서 설치를 완료해 줍니다.
(<a href="https://velog.io/@bi-sz/MySQL-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0">https://velog.io/@bi-sz/MySQL-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</a>)</p>
<p>그 다음으로 DB를 생성합니다.</p>
<pre><code class="language-sql">CREATE DATABASE spring_db;
USE spring_db;</code></pre>
<hr>
<h3 id="2️⃣-spring-boot-프로젝트-설정">2️⃣ Spring Boot 프로젝트 설정</h3>
<h4 id="1-buildgradle-또는-pomxml-수정"><strong>1. build.gradle (또는 pom.xml) 수정</strong></h4>
<p>Spring Boot에서 MySQL을 사용하려면 <code>spring-boot-starter-data-jpa</code>와 <code>mysql-connector-java</code>를 추가해야 합니다.</p>
<pre><code class="language-gradle">dependencies {
    implementation &#39;org.springframework.boot:spring-boot-starter-data-jpa&#39;
    implementation &#39;mysql:mysql-connector-java&#39;
}</code></pre>
<p>Maven을 사용하는 경우:</p>
<pre><code class="language-xml">&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;mysql&lt;/groupId&gt;
        &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;</code></pre>
<hr>
<h3 id="3️⃣-applicationproperties-또는-applicationyml-설정">3️⃣ application.properties (또는 application.yml) 설정</h3>
<h4 id="applicationproperties"><strong>application.properties</strong></h4>
<pre><code class="language-properties">spring.datasource.url=jdbc:mysql://localhost:3306/spring_db?serverTimezone=Asia/Seoul
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update</code></pre>
<h4 id="applicationyml"><strong>application.yml</strong></h4>
<pre><code class="language-yaml">spring:
  datasource:
    url: jdbc:mysql://localhost:3306/spring_db?serverTimezone=Asia/Seoul
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database-platform: org.hibernate.dialect.MySQL8Dialect
    hibernate:
      ddl-auto: update</code></pre>
<p> <code>ddl-auto</code> 옵션 설명</p>
<ul>
<li><code>create</code> : 애플리케이션 실행 시 기존 테이블 삭제 후 다시 생성</li>
<li><code>update</code> : 변경된 부분만 반영 (권장)</li>
<li><code>validate</code> : 테이블이 실제로 존재하는지 확인 (수정 없음)</li>
<li><code>none</code> : Hibernate 자동 DDL 생성을 사용하지 않음</li>
</ul>
<hr>
<h3 id="4️⃣-엔티티entity-및-레포지토리repository-생성">4️⃣ 엔티티(Entity) 및 레포지토리(Repository) 생성</h3>
<h4 id="1-엔티티entity-클래스-생성"><strong>1. 엔티티(Entity) 클래스 생성</strong></h4>
<pre><code class="language-java">import jakarta.persistence.*;
import lombok.*;

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 50)
    private String name;
}</code></pre>
<h4 id="2-레포지토리repository-생성"><strong>2. 레포지토리(Repository) 생성</strong></h4>
<pre><code class="language-java">import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository&lt;User, Long&gt; {
}</code></pre>
<hr>
<h3 id="5️⃣-데이터-저장-및-조회-테스트">5️⃣ 데이터 저장 및 조회 테스트</h3>
<h4 id="서비스service-및-컨트롤러controller-추가"><strong>서비스(Service) 및 컨트롤러(Controller) 추가</strong></h4>
<pre><code class="language-java">import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(&quot;/users&quot;)
@RequiredArgsConstructor
public class UserController {
    private final UserRepository userRepository;

    @PostMapping
    public User saveUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @GetMapping
    public List&lt;User&gt; getUsers() {
        return userRepository.findAll();
    }
}</code></pre>
<p>이렇게 만들어두고 PostMan을 사용하면 Request를 쉽게 보내서 DB와 연결이 되었는지 확인 할 수 있을겁니다.</p>
<hr>
<h2 id="마무리">마무리</h2>
<p>이렇게 각 프로젝트의 요구사항에 따라 적절한 DB를 선택하고 설정하여 효율적인 개발을 하고 Spring Boot와 MySQL을 연동하는 법을 알아보았습니다. 감사합니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Thymeleaf (타임리프)란 무엇인가? 그리고 현재 Thymeleaf (타임리프)의 사용에 대하여]]></title>
            <link>https://velog.io/@hong_sm/Thymeleaf-%ED%83%80%EC%9E%84%EB%A6%AC%ED%94%84%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%98%84%EC%9E%AC-Thymeleaf-%ED%83%80%EC%9E%84%EB%A6%AC%ED%94%84%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@hong_sm/Thymeleaf-%ED%83%80%EC%9E%84%EB%A6%AC%ED%94%84%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%98%84%EC%9E%AC-Thymeleaf-%ED%83%80%EC%9E%84%EB%A6%AC%ED%94%84%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Wed, 26 Mar 2025 14:52:18 GMT</pubDate>
            <description><![CDATA[<hr>

<h3 id="spring-boot에서-thymeleaf-누락-오류와-풀스택-개발로의-전환">Spring Boot에서 Thymeleaf 누락 오류와 풀스택 개발로의 전환</h3>
<p>Spring Boot 프로젝트를 진행하다가 Thymeleaf 관련 오류를 마주한 경험이 있습니다. <br>원래는 Spring Boot의 뷰 템플릿 엔진으로 Thymeleaf를 사용하려 했습니다.  build.gradle에</p>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/bebf7011-1281-4bff-8a29-9d4d174fa04f/image.png" alt="">
이 dependency를 추가해줘야 스프링부트 내부에서 템플릿을 찾아서 데이터를 띄워주는데 추가해주지 않아서 뷰를 렌더링할 때 오류가 발생했었습니다.</p>
<p>오류를 해결하려고 하다가, <strong>서버 사이드 렌더링(SSR)</strong> 방식 대신 프론트엔드와 백엔드를 분리하는 <strong>풀스택 개발 방식</strong>이 더 적합하다고 판단했고,
그래서 Thymeleaf를 제거하고, Vue.js를 프론트엔드로 따로 구축하기로 결정했습니다. </p>
<blockquote>
<h4 id="✔-백엔드spring-boot-→-json-데이터를-반환하는-rest-api-제공">✔ 백엔드(Spring Boot) → JSON 데이터를 반환하는 REST API 제공</h4>
<h4 id="✔-프론트엔드vuejs-→-api-호출하여-ui-렌더링">✔ 프론트엔드(Vue.js) → API 호출하여 UI 렌더링</h4>
</blockquote>
<p>이렇게 하면 더 유연한 개발이 가능하고, 특히 <strong>SPA(Single Page Application)</strong>로 확장하기 쉬워지는 장점도 있습니다.</p>
<p>React랑 Vue.js를 고민하다가 Vue.js를 선택한 이유는 단기간에 학습하여 결과를 보기 좋고, Vue.js가 작은 프로젝트에 많이 사용된다는 점이었습니다.</p>
<p>Vue와 Spring Boot 자세한 연동 방식에 대해서는 다음 글에서 써 보겠습니다!</p>
<hr>

<p>이번에는 사용하려고 했던 Thymeleaf에 대해 좀 더 자세히 알아보겠습니다.</p>
<h2 id="thymeleaf란">Thymeleaf란?</h2>
<p>Thymeleaf는 <strong>Java 기반 템플릿 엔진</strong>으로, HTML, XML, JavaScript, CSS 등 다양한 마크업 언어를 처리할 수 있는 <strong>서버 사이드 템플릿 엔진</strong>입니다.</p>
<p>Spring Boot에서는 Spring MVC와 쉽게 연동되어 뷰 템플릿으로 많이 사용되며, JSP보다 자연스러운 HTML과의 통합, 다양한 기능, 강력한 확장성 때문에 더 자주 사용되고 있습니다.</p>
<h3 id="thymeleaf의-주요-특징">Thymeleaf의 주요 특징</h3>
<h4 id="1-html-친화적인-문법">1. HTML 친화적인 문법</h4>
<ul>
<li><p>순수 HTML 파일에서도 문제없이 볼 수 있음. (th:text 등의 속성이 Thymeleaf 문법)</p>
</li>
<li><p>JSP처럼 &lt;% %&gt; 같은 태그가 아니라 <strong>속성(attribute) 기반</strong>으로 템플릿을 작성.</p>
</li>
</ul>
<blockquote>
<pre><code>&lt;p th:text=&quot;&#39;안녕하세요, &#39; + ${name} + &#39;님!&#39;&quot;&gt;&lt;/p&gt;</code></pre></blockquote>
<br>

<h4 id="2-서버-사이드-렌더링ssr-가능">2. 서버 사이드 렌더링(SSR) 가능</h4>
<ul>
<li><p>서버에서 HTML을 렌더링하여 클라이언트에게 전송하는 방식.</p>
</li>
<li><p>SEO(검색 엔진 최적화)에 유리하며, JavaScript를 사용할 필요가 없음.</p>
</li>
</ul>
<blockquote>
<pre><code>@Controller
public class HomeController {
    @GetMapping(&quot;/home&quot;)
    public String home(Model model) {
        model.addAttribute(&quot;name&quot;, &quot;홍길동&quot;);
        return &quot;home&quot;; // home.html 템플릿 렌더링
    }
}</code></pre></blockquote>
<p>-&gt; 결과적으로 서버에서 <strong>렌더링한 HTML을 반환</strong></p>
<blockquote>
</blockquote>
<pre><code>&lt;p&gt;안녕하세요, 홍길동님!&lt;/p&gt;</code></pre><br>

<h4 id="3-이메일-템플릿-지원">3. 이메일 템플릿 지원</h4>
<ul>
<li><p>Spring Boot에서 이메일 전송 시 HTML 형식의 이메일을 쉽게 만들 수 있음.</p>
</li>
<li><p><strong>ThymeleafTemplateEngine</strong>을 이용하여 동적인 이메일 내용 생성 가능.</p>
</li>
</ul>
<p><strong>이메일 템플릿 예시 (email-template.html)</strong></p>
<blockquote>
</blockquote>
<pre><code>&lt;html&gt;
&lt;body&gt;
    &lt;h1&gt;안녕하세요, &lt;span th:text=&quot;${username}&quot;&gt;&lt;/span&gt;님!&lt;/h1&gt;
    &lt;p&gt;가입을 축하드립니다. 아래 버튼을 눌러 이메일을 인증해주세요.&lt;/p&gt;
    &lt;a th:href=&quot;@{https://example.com/verify?token={token}(token=${token})}&quot;&gt;이메일 인증&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>이메일 서비스에서 Thymeleaf 템플릿 사용</strong></p>
<blockquote>
</blockquote>
<pre><code>@Autowired
private SpringTemplateEngine templateEngine;
  public String createEmailContent(String username, String token) {
      Context context = new Context();
      context.setVariable(&quot;username&quot;, username);
      context.setVariable(&quot;token&quot;, token);
      return templateEngine.process(&quot;email-template&quot;, context);
  }</code></pre><br>


<h4 id="4-프론트엔드-역할도-가능-thymeleaf--javascript">4. 프론트엔드 역할도 가능 (Thymeleaf + JavaScript)</h4>
<ul>
<li>Thymeleaf를 사용하여 JavaScript 코드 내에서 서버 데이터를 <strong>동적으로 삽입</strong>할 수 있음.</li>
</ul>
<blockquote>
</blockquote>
<pre><code>&lt;script th:inline=&quot;javascript&quot;&gt;
    var username = /*[[${username}]]*/ &#39;default&#39;;
    console.log(&quot;User:&quot;, username);
&lt;/script&gt;</code></pre><p>Thymeleaf는 현재도 현업에서 사용되긴 하지만, 새로운 프로젝트에서는 상대적으로 덜 사용되고 있습니다. 대신, <strong>프론트엔드와 백엔드를 분리하는 아키텍처(SPA + REST API)</strong>가 대세가 되면서, Thymeleaf의 활용 범위가 줄어들고 있다고 합니다.</p>
<p>하지만 이제 완전히 Thymeleaf를 사용하지 않는 것은 아닙니다.
<br></p>
<hr>

<h3 id="thymeleaf를-여전히-사용하는-경우">Thymeleaf를 여전히 사용하는 경우</h3>
<h4 id="1-관리자-페이지admin-dashboard">1. 관리자 페이지(Admin Dashboard)</h4>
<ul>
<li><p>내부 직원만 사용하는 서비스의 경우, Vue.js나 React 같은 프론트엔드 프레임워크 없이 Spring Boot + Thymeleaf로 간단하게 개발하는 경우가 많음.</p>
</li>
<li><p>서버 렌더링을 사용하면 보안 관리가 용이하고, 추가적인 프론트엔드 기술 없이 개발할 수 있음.</p>
</li>
</ul>
<h4 id="2-ssr서버-사이드-렌더링이-필요한-경우">2. SSR(서버 사이드 렌더링)이 필요한 경우</h4>
<ul>
<li><p>검색 엔진 최적화(SEO)가 중요한 경우(예: 블로그, 뉴스 사이트)</p>
</li>
<li><p>Thymeleaf는 서버에서 HTML을 렌더링하기 때문에, 구글이나 네이버 같은 검색 엔진이 페이지를 쉽게 인덱싱할 수 있음.</p>
</li>
</ul>
<h4 id="3-이메일-템플릿">3. 이메일 템플릿</h4>
<ul>
<li><p>Spring Boot에서 HTML 기반 이메일을 보낼 때 Thymeleaf를 활용하는 경우가 많음.</p>
</li>
<li><p>이메일 본문을 동적으로 생성해야 할 때 유용.</p>
</li>
</ul>
<h4 id="4-spring-security와의-통합이-쉬운-경우">4. Spring Security와의 통합이 쉬운 경우</h4>
<ul>
<li>Spring Security와 연동하여 사용자 권한에 따라 UI를 다르게 렌더링할 수 있음.</li>
</ul>
<hr>

<h3 id="마무리하며">마무리하며</h3>
<p>오늘은 Thymeleaf에 대해 알아보았습니다. 공부를 하고 블로그를 쓰면 쓸수록 써야할 것들이 늘어나는 것 같습니다. 공부해야 하는 것들이 많아지니 오히려 의욕도 늘어나고 좋은 것 같습니다. 다음 글에서는 Spring Boot와 Vue.js 연동 방법을 다룰 예정입니다!  <br> 오늘도 제 글을 읽어주셔서 감사합니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로젝트 개발 현황]]></title>
            <link>https://velog.io/@hong_sm/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B0%9C%EB%B0%9C-%ED%98%84%ED%99%A9</link>
            <guid>https://velog.io/@hong_sm/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B0%9C%EB%B0%9C-%ED%98%84%ED%99%A9</guid>
            <pubDate>Thu, 20 Mar 2025 07:15:48 GMT</pubDate>
            <description><![CDATA[<p>학교 생활과 병행하며 프로젝트를 진행하느라 바쁜 나날을 보냈습니다. 게다가 저의 게으름(?)도 한몫했지만, 그래도 꾸준히 개발은 이어왔습니다. 다만, 그동안의 진행 과정을 Velog에 정리하지 못했기에 이번 기회를 통해 현재 프로젝트의 진행 상황을 공유하고자 합니다.</p>
<p>그 과정에서 배운 것들과 수정했던 오류들을 정리해두면, 앞으로 다른 프로젝트를 진행할 때 유용하게 활용할 수 있을 것 같아 다시 글을 쓰기로 했습니다. </p>
<p>이 글에서는 지금까지 개발해 온 과정과 현재까지 구현된 기능들을 정리하고, 다음 글에서는 개발하며 겪었던 문제들과 해결 방법을 공유하려고 합니다.</p>
<hr>

<h2 id="1-프로젝트-개요">1. 프로젝트 개요</h2>
<h3 id="--프로젝트-이름-및-간단한-소개">- 프로젝트 이름 및 간단한 소개</h3>
<p>프로젝트 이름은 아직 정하지 않았으나 레시피를 찾아준다는 의미로 Recipe-Finder라고 명명하긴 했습니다. </p>
<h3 id="--개발을-시작한-이유-목표-및-배경">- 개발을 시작한 이유 (목표 및 배경)</h3>
<p>개발의 시작은 부족한 제 프로젝트 경험을 채워보고자 시작하였습니다. 그리고 단순한 학습용 프로젝트가 아니라 실제로 의미 있는 서비스를 만들고 싶었습니다. 항상 저녁 메뉴 고민을 하시던 엄마가 생각나서 냉장고에 있는 재료만으로 간편하게 레시피를 추천받을 수 있는 웹 서비스를 만들게 되었습니다.</p>
<h3 id="--프로젝트의-주요-기능-및-핵심-특징">- 프로젝트의 주요 기능 및 핵심 특징</h3>
<ul>
<li>재료를 검색하여 레시피 추천 
사용자가 가지고 있는 재료를 입력하면, 해당 재료를 활용한 다양한 레시피를 추천해줍니다.</li>
<li>레시피 공유 플랫폼 기능
사용자들이 직접 레시피를 업로드하고, 서로 공유할 수 있는 기능을 제공합니다.</li>
</ul>
<hr>

<h2 id="2-현재까지-개발된-기능">2. 현재까지 개발된 기능</h2>
<h4 id="📂-프로젝트-구조">📂 프로젝트 구조</h4>
<p>현재 프로젝트의 구조는 다음과 같습니다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/3795c7dd-c424-4262-9acc-c0d7db8aa914/image.png" alt=""></p>
</blockquote>
<hr>

<h4 id="🎨-메인-화면">🎨 메인 화면</h4>
<blockquote>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/8387f972-147a-492b-9f40-e2045d614581/image.png" alt=""></p>
</blockquote>
<ul>
<li>검색창과 마이페이지 등의 메뉴가 포함되어 있으며,</li>
<li>스크롤을 통해 여러 레시피를 확인할 수 있습니다.</li>
<li>레시피 카드에는 썸네일, 제목, 작성자, 요약 정보가 표시됩니다.</li>
</ul>
<hr>

<h4 id="🔍-레시피-검색-기능">🔍 레시피 검색 기능</h4>
<blockquote>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/3612aa56-59e0-4e4e-b5eb-0d490d5650a3/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/c96b10a7-c8aa-4274-9f64-1a4775b5a227/image.png" alt=""></p>
</blockquote>
<ul>
<li>현재 <strong>해외 Open API &quot;Edamam API&quot;</strong>를 활용하여 레시피를 검색할 수 있도록 구현했습니다.</li>
<li>검색어를 입력하면 스크롤을 통해 레시피를 확인할 수 있습니다.</li>
<li>다만, 검색 결과가 영어로 출력되기 때문에 추후 한국어 번역 기능을 추가할 계획입니다.</li>
</ul>
<hr>


<h4 id="🔑-로그인-및-oauth-기능">🔑 로그인 및 OAuth 기능</h4>
<blockquote>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/be62eb6c-04e3-4075-9aec-38a54be1c298/image.png" alt=""></p>
</blockquote>
<ul>
<li>로그인 화면입니다. </li>
<li>OAuth를 사용하여 기본 로그인에 더해 소셜계정의 로그인도 가능하게 만들었습니다.</li>
</ul>
<hr>


<h4 id="👤-마이페이지-기능">👤 마이페이지 기능</h4>
<blockquote>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/5a2e42cd-f6dd-423d-b6fe-5e870f4e7357/image.png" alt=""></p>
</blockquote>
<ul>
<li>현재 제작중인 마이페이지 화면입니다.</li>
<li>개인 정보를 변경 및 확인할 수 있습니다.</li>
</ul>
<h2 id="3-사용한-기술-스택">3. 사용한 기술 스택</h2>
<h4 id="백엔드-spring-boot-jpa-spring-security-jwt">백엔드: Spring Boot, JPA, Spring Security, JWT</h4>
<h4 id="데이터베이스-mysql">데이터베이스: MySQL</h4>
<h4 id="기타-연동-기술-oauth">기타 연동 기술: OAuth</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경의 구성]]></title>
            <link>https://velog.io/@hong_sm/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD%EC%9D%98-%EA%B5%AC%EC%84%B1</link>
            <guid>https://velog.io/@hong_sm/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD%EC%9D%98-%EA%B5%AC%EC%84%B1</guid>
            <pubDate>Mon, 19 Aug 2024 03:19:32 GMT</pubDate>
            <description><![CDATA[<p>이미지 출처) <a href="http://tobetong.com/?p=7935">http://tobetong.com/?p=7935</a></p>
<h1 id="개발-환경이란-무엇일까">개발 환경이란 무엇일까?</h1>
<p>개발 환경은 소프트웨어 개발자가 코드 작성, 디버깅, 테스트, 배포 등 다양한 개발 작업을 수행할 수 있도록 도와주는 도구, 라이브러리, 프레임워크, 운영체제 등의 통합 환경을 의미합니다. 즉, 개발자가 작업을 원활하게 수행하기 위해 필요한 모든 요소를 포함하는 공간이라고 할 수 있습니다.</p>
<br>

<h2 id="개발-환경의-중요성">개발 환경의 중요성</h2>
<p>개발 환경은 소프트웨어 개발의 효율성을 크게 좌우합니다. 잘 구성된 개발 환경은 개발자가 코드 작성과 테스트를 빠르고 정확하게 수행할 수 있도록 지원하며, 개발 속도를 높이고 오류 발생을 줄이는 데 중요한 역할을 합니다. 특히 여러사람이 같이 작업하는 팀프로젝트의 경우에는 이 <strong>개발 환경을 통일</strong>시켜주는 것이 매우 중요합니다. 반대로, 통일되지 않거나 불완전한 개발 환경은 개발 과정에서 다양한 문제를 야기할 수 있으며, 프로젝트의 품질과 일정에 부정적인 영향을 미칠 수 있습니다. </p>
<br>

<h2 id="내가-사용하는-개발-환경">내가 사용하는 개발 환경</h2>
<p>저는 현재 <strong>백엔드</strong>는 <code>Spring Boot</code>, <strong>프론트엔드</strong>는 <code>Vue.js</code>를 사용하여 개발을 진행하고 있습니다. 이 두 가지 기술 스택은 각각의 특성과 강점을 가지고 있으며 현대 웹 애플리케이션 개발에서 자주 사용되고 있습니다. 저는 프론트엔드는 비교적 잘 모르기에 초보자도 쉽게 접근 가능한 Vue.js를 선택하게 되었습니다.</p>
<h3 id="spring-boot란">Spring Boot란?</h3>
<p><strong>Spring Boot</strong>는 자바 기반의 백엔드 프레임워크로, 복잡한 설정 없이 빠르게 애플리케이션을 개발할 수 있도록 도와줍니다. Spring Boot는 Spring 프레임워크의 다양한 기능을 간단히 설정할 수 있도록 해주며, REST API 서버나 웹 애플리케이션 개발에 주로 사용됩니다.</p>
<h4 id="spring-boot-개발-환경-구성">Spring Boot 개발 환경 구성</h4>
<ul>
<li><strong>IDE</strong>: IntelliJ IDEA 또는 Eclipse를 주로 사용합니다.</li>
<li><strong>빌드 도구</strong>: Gradle 또는 Maven을 사용해 프로젝트를 관리합니다.</li>
<li><strong>JDK</strong>: Java Development Kit (버전 11 이상 권장)을 설치합니다.</li>
<li><strong>Database</strong>: MySQL, PostgreSQL 등을 연동하여 백엔드 개발을 진행합니다.</li>
<li><strong>Spring Initializr</strong>: Spring 프로젝트를 쉽게 생성할 수 있는 도구로, 필요한 의존성을 선택하고 프로젝트를 시작합니다.</li>
</ul>
<blockquote>
<p><strong>Spring Initializr 사용법 및 설명</strong>
<a href="https://velog.io/@hong_sm/Spring-Initializr-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%84%A4%EB%AA%85">https://velog.io/@hong_sm/Spring-Initializr-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%84%A4%EB%AA%85</a></p>
</blockquote>
<blockquote>
<p><strong>Spring Initializr를 사용한 프로젝트 초기 설정 화면</strong><br><img src="https://velog.velcdn.com/images/hong_sm/post/27d5eb90-150b-4b62-9eac-b290cbfed69e/image.png" alt=""></p>
</blockquote>
<h3 id="vuejs란">Vue.js란?</h3>
<p><strong>Vue.js</strong>는 경량의 프론트엔드 프레임워크로, 사용자 인터페이스를 구축하는 데 매우 효율적입니다. Vue.js는 컴포넌트 기반 아키텍처를 제공하여 코드의 재사용성과 유지보수성을 높이며, 반응형 데이터 바인딩을 통해 직관적이고 동적인 UI 개발을 가능하게 합니다.</p>
<h4 id="vuejs-개발-환경-구성">Vue.js 개발 환경 구성</h4>
<ul>
<li><strong>IDE</strong>: Visual Studio Code를 주로 사용합니다.</li>
<li><strong>Node.js &amp; npm</strong>: Node.js는 서버 측 자바스크립트 실행 환경이며, npm은 Node.js 패키지 매니저로 프로젝트의 의존성을 관리합니다.</li>
<li><strong>Vue CLI</strong>: Vue.js 프로젝트를 생성하고 개발 서버를 쉽게 실행할 수 있도록 도와주는 도구입니다.</li>
<li><strong>ESLint &amp; Prettier</strong>: 코드 품질과 일관성을 유지하기 위한 도구로, 자바스크립트 코드를 검사하고 자동으로 포맷팅해줍니다.</li>
<li><strong>Webpack</strong>: 모듈 번들러로, 프로젝트의 자원들을 효율적으로 관리하고 빌드할 수 있도록 도와줍니다.</li>
</ul>
<br>
<hr>

<h2 id="마무리">마무리</h2>
<p>이처럼 개발 환경은 개발자가 효율적이고 안정적으로 프로젝트를 진행할 수 있도록 돕는 중요한 요소입니다. Spring Boot와 Vue.js는 각각 백엔드와 프론트엔드 개발에 특화된 도구로, 저는 이 둘을 활용하여 효율적인 개발 환경을 구축할 수 있었습니다. 프로젝트의 특성과 목표에 맞는 최적의 개발 환경을 구성하는 것이 중요하며 여러분들도 개발 환경을 잘 만드셔서 좋은 개발 하셨으면 좋겠습니다. 감사합니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Initializr 사용법 및 설명]]></title>
            <link>https://velog.io/@hong_sm/Spring-Initializr-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%84%A4%EB%AA%85</link>
            <guid>https://velog.io/@hong_sm/Spring-Initializr-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%84%A4%EB%AA%85</guid>
            <pubDate>Mon, 19 Aug 2024 02:56:18 GMT</pubDate>
            <description><![CDATA[<h1 id="🛠️-spring-initializr에-대하여">🛠️ Spring Initializr에 대하여</h1>
<p>Spring Boot 프로젝트를 시작할 때, 복잡한 설정 없이 빠르게 개발 환경을 구축할 수 있는 도구가 있다면 정말 편리할 것입니다. 바로 <strong>Spring Initializr</strong>가 그 역할을 해줍니다. 이번 글에서는 Spring Initializr가 무엇인지, 주요 기능과 사용법, 그리고 장점에 대해 소개해 드리겠습니다.</p>
<br>

<h2 id="spring-initializr란">Spring Initializr란?</h2>
<p><strong>Spring Initializr</strong>는 Spring Boot 프로젝트를 빠르고 간편하게 설정할 수 있는 웹 기반 도구입니다. 이 도구를 사용하면 개발자는 필요로 하는 의존성(dependency)을 추가하고, 프로젝트의 기본 구조를 자동으로 생성할 수 있습니다. 특히, 복잡한 설정 과정을 생략하고, 코드 작성에 집중할 수 있도록 도와줍니다.</p>
<br>

<h2 id="주요-기능-및-특징">주요 기능 및 특징</h2>
<h3 id="1-프로젝트-타입-선택">1. 프로젝트 타입 선택</h3>
<p>Spring Initializr에서는 프로젝트를 빌드할 도구로 <strong>Maven</strong>과 <strong>Gradle</strong> 중 하나를 선택할 수 있습니다.</p>
<ul>
<li><p><strong>Maven</strong>: XML 기반의 빌드 도구로, 안정적이고 널리 사용됩니다.</p>
</li>
<li><p><strong>Gradle</strong>: 더 유연하고 성능이 뛰어난 빌드 도구로, Groovy 또는 Kotlin DSL을 사용합니다.</p>
</li>
</ul>
<h3 id="2-언어-선택">2. 언어 선택</h3>
<p><strong>Java</strong>, <strong>Kotlin</strong>, <strong>Groovy</strong> 중 하나를 선택할 수 있습니다.</p>
<ul>
<li><strong>Java</strong>: 가장 널리 사용되는 언어로, 강력한 타입 시스템과 방대한 라이브러리 지원을 제공합니다.</li>
<li><strong>Kotlin</strong>: 현대적인 언어 특징을 제공하며, Java와 완전히 호환됩니다.</li>
<li><strong>Groovy</strong>: 스크립트 언어로, Java와 유사한 구문을 제공하면서도 더 간단한 코드를 작성할 수 있게 해줍니다.</li>
</ul>
<h3 id="3-spring-boot-버전-선택">3. Spring Boot 버전 선택</h3>
<p>프로젝트에 적합한 Spring Boot의 버전을 선택할 수 있습니다. 최신 안정 버전 또는 특정 버전을 선택하여 프로젝트를 생성할 수 있습니다.</p>
<h3 id="4-프로젝트-메타데이터-설정">4. 프로젝트 메타데이터 설정</h3>
<ul>
<li><strong>Group</strong>: 프로젝트의 고유 식별자 역할을 하는 그룹 ID입니다. 보통 도메인 역순으로 작성합니다.</li>
<li><strong>Artifact</strong>: 생성되는 JAR 또는 WAR 파일의 이름으로, 프로젝트 이름과 동일하게 설정됩니다.</li>
<li><strong>Name</strong>: 프로젝트의 전체 이름으로, 대개 Artifact와 동일합니다.</li>
<li><strong>Description</strong>: 프로젝트에 대한 간단한 설명을 입력합니다.</li>
<li><strong>Package Name</strong>: Java 패키지 구조의 루트 이름을 정의합니다.</li>
<li><strong>Packaging</strong>: 프로젝트의 배포 형식을 선택합니다. JAR 파일 또는 WAR 파일로 패키징할 수 있습니다.</li>
<li><strong>Java Version</strong>: 프로젝트에서 사용할 Java 버전을 선택할 수 있습니다.</li>
</ul>
<blockquote>
<p><strong>프로젝트 관련 설정 및 메타데이터 설정 화면</strong><br><img src="https://velog.velcdn.com/images/hong_sm/post/68e5b256-6178-4e0e-8571-a63a8a0947cd/image.png" alt=""></p>
</blockquote>
<h3 id="5-의존성-추가">5. 의존성 추가</h3>
<p>Spring Initializr에서는 프로젝트에 필요한 다양한 의존성을 쉽게 추가할 수 있습니다. 많이 사용되는 의존성을 몇가지 설명 드리겠습니다.</p>
<ul>
<li><p><strong>Spring Boot DevTools</strong>: 개발 도구로, 애플리케이션의 빠른 재시작, LiveReload, 구성 파일의 자동 업데이트 등을 지원하여 개발 경험을 향상시킵니다.</p>
</li>
<li><p><strong>Lombok</strong>: 반복되는 Java 코드를 줄여주는 어노테이션 라이브러리입니다. 예를 들어, getter/setter, 생성자, toString 메서드 등을 자동으로 생성해줍니다.</p>
</li>
<li><p><strong>Spring Web</strong>: RESTful 웹 애플리케이션과 Spring MVC를 기반으로 한 웹 애플리케이션을 구축할 수 있도록 도와줍니다. 기본적으로 내장된 Tomcat 서버를 사용합니다.</p>
</li>
<li><p><strong>Thymeleaf</strong>: 서버 측 템플릿 엔진으로, HTML을 쉽게 렌더링하고 브라우저에 올바르게 표시할 수 있도록 도와줍니다. 정적인 HTML 파일을 동적으로 처리할 수 있는 기능을 제공합니다.</p>
</li>
<li><p><strong>Spring Security</strong>: 애플리케이션의 인증 및 권한 부여 기능을 강화할 수 있는 프레임워크입니다. 다양한 보안 기능을 커스터마이징할 수 있습니다.</p>
</li>
<li><p><strong>OAuth2 Client</strong>: OAuth2/OpenID Connect를 사용하여 애플리케이션이 외부 인증 서버와 통합할 수 있도록 지원합니다. Spring Security와 함께 사용됩니다.</p>
</li>
<li><p><strong>Spring Data JPA</strong>: 데이터베이스와의 상호작용을 간편하게 해주는 ORM(Object-Relational Mapping) 라이브러리입니다. JPA(Java Persistence API)를 통해 데이터베이스 작업을 추상화하여 코드의 복잡성을 줄일 수 있습니다.</p>
</li>
</ul>
<blockquote>
<p><strong>프로젝트 의존성 추가 화면</strong><br><img src="https://velog.velcdn.com/images/hong_sm/post/cff5ddfe-79b7-4b05-9c24-bcf4135b07f3/image.png" alt=""></p>
</blockquote>
<h2 id="🔧-spring-initializr의-사용법">🔧 Spring Initializr의 사용법</h2>
<ol>
<li><strong>웹사이트 방문</strong>: <a href="https://start.spring.io">Spring Initializr</a>로 이동합니다.</li>
<li><strong>프로젝트 설정</strong>: 필요한 옵션을 선택하여 프로젝트를 설정합니다.</li>
<li><strong>의존성 추가</strong>: 필요한 의존성을 선택합니다. 예를 들어 <code>Spring Web</code>, <code>Spring Data JPA</code>, <code>Spring Security</code> 등을 추가합니다.</li>
<li><strong>프로젝트 다운</strong>: 모든 설정이 완료되면 &quot;Generate&quot; 버튼을 클릭하여 프로젝트를 생성합니다. 생성된 프로젝트는 ZIP 파일로 다운로드 됩니다. </li>
<li><strong>프로젝트 생성</strong>: 다운로드 한 ZIP 파일을 압축 해제한 후 IDE에서 열어 개발을 시작할 수 있습니다. 이 때 File -&gt; Open을 통해 압축 해제한 파일을 찾고 그 안에서 build.gradle을 열어주면 자동으로 프로젝트가 생성되기 시작합니다.</li>
</ol>
<blockquote>
<p><img src="https://velog.velcdn.com/images/hong_sm/post/7cd9aa66-bfef-4923-98f2-7d1cc74e0e28/image.png" alt="">
<strong>=&gt; File에서 Open으로 들어갑니다.</strong>
<img src="https://velog.velcdn.com/images/hong_sm/post/17bf2d57-3bf9-4288-9b85-58e709f3305b/image.png" alt="">
<strong>=&gt; 여기서 build.gradle을 클릭하여 프로젝트 실행</strong></p>
</blockquote>
<h2 id="spring-initializr의-장점">Spring Initializr의 장점</h2>
<ul>
<li><strong>사용의 용이성</strong>: 직관적인 인터페이스로 쉽게 프로젝트를 설정할 수 있습니다.</li>
<li><strong>시간 절약</strong>: 프로젝트 초기 설정에 소요되는 시간을 크게 줄여줍니다.</li>
<li><strong>유연성</strong>: 다양한 옵션과 의존성 선택을 통해 맞춤형 프로젝트를 손쉽게 생성할 수 있습니다.</li>
<li><strong>자동화된 설정</strong>: 프로젝트의 기본 설정이 자동으로 구성되므로, 개발자는 핵심 로직에 더 집중할 수 있습니다.</li>
</ul>
<p><br><hr></p>
<p>글 읽으시고 Spring 프로젝트 잘 생성하셨으면 합니다. 감사합니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로젝트 요구사항 정리]]></title>
            <link>https://velog.io/@hong_sm/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@hong_sm/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 12 Aug 2024 02:32:46 GMT</pubDate>
            <description><![CDATA[<hr>
<p>제 프로젝트 주제는 <strong>개인의 취향과 필요에 맞는 레시피를 추천받을 수 있는 웹사이트</strong>입니다. 이 웹사이트를 성공적으로 구현하기 위해서는 개발을 시작하기 전에 기능적 요구사항과 비기능적 요구사항을 명확히 정의하는 것이 중요하다고 생각하여 이 글에서는 이 두 가지 요구사항의 개념을 정리하고, 제가 만들고자 하는 웹사이트의 구체적인 요구사항들을 적어보고자 합니다.
<img src="https://velog.velcdn.com/images/hong_sm/post/f5d70002-2431-4965-b686-8e0f2ec29409/image.png" alt=""></p>
<h1 id="기능적-요구사항과-비기능적-요구사항">기능적 요구사항과 비기능적 요구사항</h1>
<p>시스템 개발 과정에서 요구사항은 시스템의 성공적인 구현을 위해 반드시 정의되어야 합니다. 이 요구사항은 크게 <strong>기능적 요구사항</strong>과 <strong>비기능적 요구사항</strong>으로 나뉩니다. 이 두 가지 요구사항은 시스템의 서로 다른 측면을 다루며, 각각의 역할과 중요성은 명확하게 구분됩니다.</p>
<br>

<h2 id="기능적-요구사항">기능적 요구사항</h2>
<p>기능적 요구사항은 시스템이 수행해야 하는 특정 <strong>기능이나 서비스</strong>에 대한 요구사항을 정의합니다. 이 요구사항은 사용자가 시스템을 통해 얻을 수 있는 직접적인 결과를 나타내며, 시스템이 제공해야 하는 기능적 동작을 명시합니다.</p>
<p>예를 들어, 은행의 온라인 뱅킹 시스템을 개발한다고 가정할 때, 기능적 요구사항에는 다음과 같은 내용이 포함될 수 있습니다:</p>
<ul>
<li>사용자는 자신의 계좌 잔액을 조회할 수 있어야 한다.</li>
<li>사용자는 다른 계좌로 이체를 할 수 있어야 한다.</li>
<li>사용자는 거래 내역을 확인할 수 있어야 한다.</li>
</ul>
<blockquote>
<p><strong>구체적 예시:</strong><br>&quot;사용자는 로그인 페이지에서 ID와 비밀번호를 입력하여 시스템에 로그인할 수 있어야 한다.&quot;<br>이 요구사항은 사용자가 시스템에 접근하기 위해 수행해야 하는 구체적인 기능을 명시하고 있습니다.</p>
</blockquote>
<h2 id="비기능적-요구사항">비기능적 요구사항</h2>
<p>비기능적 요구사항은 시스템의 품질 속성, 성능, 보안, 확장성 등 기능적 요구사항 이외의 요소를 다룹니다. 이 요구사항은 시스템이 <strong>어떻게</strong> 작동해야 하는지를 정의하며, 시스템의 사용자 경험과 성능에 큰 영향을 미칩니다.</p>
<p>비기능적 요구사항의 예로는 다음과 같은 것들이 있습니다:</p>
<ul>
<li>시스템은 1초 이내에 사용자 요청에 응답해야 한다.</li>
<li>시스템은 하루에 최소 10만 명의 사용자를 처리할 수 있어야 한다.</li>
<li>시스템은 사용자의 개인정보를 암호화하여 저장해야 한다.</li>
</ul>
<blockquote>
<p><strong>구체적 예시:</strong><br>&quot;시스템은 99.9%의 가용성을 유지해야 한다.&quot;<br>이 요구사항은 시스템이 높은 신뢰성을 유지해야 함을 강조하며, 다운타임을 최소화하기 위한 비기능적 요구사항입니다.</p>
</blockquote>
<br>

<h2 id="기능적-요구사항과-비기능적-요구사항의-차이점">기능적 요구사항과 비기능적 요구사항의 차이점</h2>
<p>기능적 요구사항과 비기능적 요구사항의 주요 차이점은 다음과 같습니다:</p>
<ul>
<li>기능적 요구사항은 시스템이 <strong>무엇을</strong> 해야 하는지에 초점을 맞추며, 비기능적 요구사항은 시스템이 <strong>어떻게</strong> 작동해야 하는지에 초점을 맞춥니다.</li>
<li>기능적 요구사항은 구체적이고 측정 가능하며, 비기능적 요구사항은 일반적으로 성능, 보안, 확장성 등의 품질 속성에 관련됩니다.</li>
</ul>
<br>

<h2 id="레시피-추천-웹의-요구사항">레시피 추천 웹의 요구사항</h2>
<p>제가 개발하고자 하는 <strong>레시피 추천 웹</strong>의 기능적 요구사항과 비기능적 요구사항을 정리하면 다음과 같습니다:</p>
<h3 id="기능적-요구사항-1">기능적 요구사항</h3>
<table>
<thead>
<tr>
<th><strong>카테고리</strong></th>
<th><strong>기능</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>1. 사용자 관리 기능</strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td><strong>회원가입/로그인</strong></td>
<td>사용자는 이메일, 소셜 미디어 계정(Google, Facebook 등)을 사용해 가입 및 로그인할 수 있어야 합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>비밀번호 재설정</strong></td>
<td>사용자는 비밀번호를 재설정할 수 있는 기능이 있어야 합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>프로필 관리</strong></td>
<td>사용자는 자신의 프로필 정보를 편집하고 저장할 수 있어야 합니다 (예: 이름, 프로필 사진, 선호 요리 스타일 등).</td>
</tr>
<tr>
<td></td>
<td><strong>식단 관리</strong></td>
<td>사용자는 자신의 선호 식단 (채식, 글루텐 프리 등)을 설정할 수 있어야 합니다.</td>
</tr>
<tr>
<td><strong>2. 레시피 탐색 및 검색 기능</strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td><strong>카테고리별 탐색</strong></td>
<td>사용자는 카테고리(예: 아침, 점심, 저녁, 디저트 등)별로 레시피를 탐색할 수 있어야 합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>재료별 검색</strong></td>
<td>사용자는 특정 재료를 기반으로 레시피를 검색할 수 있어야 합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>키워드 검색</strong></td>
<td>사용자는 제목, 설명, 태그 등의 키워드를 사용해 레시피를 검색할 수 있어야 합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>필터 기능</strong></td>
<td>사용자는 조리 시간, 난이도, 칼로리, 리뷰 평점 등 다양한 기준으로 레시피를 필터링할 수 있어야 합니다.</td>
</tr>
<tr>
<td><strong>3. 레시피 추천 기능</strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td><strong>개인화된 추천</strong></td>
<td>사용자의 선호도, 이전 검색 및 사용 기록을 바탕으로 맞춤형 레시피를 추천합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>인기 레시피</strong></td>
<td>전체 사용자 사이에서 인기 있는 레시피를 추천합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>계절/행사 추천</strong></td>
<td>계절, 명절, 특별 행사에 맞는 레시피를 추천합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>식단 기반 추천</strong></td>
<td>사용자의 식단 설정(채식주의, 저탄수화물 등)에 맞는 레시피를 추천합니다.</td>
</tr>
<tr>
<td><strong>4. 레시피 상세 페이지 기능</strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td><strong>레시피 정보</strong></td>
<td>레시피명, 요리 시간, 난이도, 필요한 재료, 조리 방법, 영양 정보, 레시피 작성자 정보 등을 포함합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>이미지/비디오</strong></td>
<td>조리 과정을 보여주는 이미지 및 동영상을 제공합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>리뷰 및 평점</strong></td>
<td>사용자가 레시피에 대한 리뷰를 작성하고 평점을 부여할 수 있습니다.</td>
</tr>
<tr>
<td></td>
<td><strong>즐겨찾기</strong></td>
<td>사용자가 레시피를 즐겨찾기(북마크)할 수 있습니다.</td>
</tr>
<tr>
<td></td>
<td><strong>공유 기능</strong></td>
<td>소셜 미디어나 이메일을 통해 레시피를 공유할 수 있습니다.</td>
</tr>
<tr>
<td><strong>5. 사용자 상호작용 기능</strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td><strong>댓글 및 피드백</strong></td>
<td>사용자가 레시피에 대해 댓글을 남기고 질문을 할 수 있는 기능이 있습니다.</td>
</tr>
<tr>
<td></td>
<td><strong>사용자 간 메시징</strong></td>
<td>사용자가 서로 메시지를 주고받을 수 있는 기능이 포함될 수 있습니다.</td>
</tr>
<tr>
<td></td>
<td><strong>팔로우 시스템</strong></td>
<td>사용자가 좋아하는 레시피 작성자를 팔로우하고, 해당 작성자의 새로운 레시피 업데이트를 받을 수 있습니다.</td>
</tr>
<tr>
<td></td>
<td><strong>커뮤니티 기능</strong></td>
<td>사용자가 요리 팁을 공유하고 토론할 수 있는 포럼이나 그룹 기능을 제공합니다.</td>
</tr>
<tr>
<td><strong>6. 관리자 기능</strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td><strong>레시피 검토 및 승인</strong></td>
<td>제출된 레시피를 검토하고 승인하는 기능이 있어야 합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>사용자 관리</strong></td>
<td>사용자 계정을 관리하고, 필요 시 사용자를 차단하거나 경고를 부여할 수 있습니다.</td>
</tr>
<tr>
<td></td>
<td><strong>콘텐츠 관리</strong></td>
<td>레시피, 댓글, 리뷰 등을 관리하고, 부적절한 콘텐츠를 삭제할 수 있는 기능이 필요합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>통계 및 분석</strong></td>
<td>사용자 활동, 레시피 인기, 검색 패턴 등을 분석할 수 있는 대시보드가 필요합니다.</td>
</tr>
<tr>
<td><strong>7. 부가 기능</strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td><strong>다국어 지원</strong></td>
<td>웹사이트를 여러 언어로 사용할 수 있는 기능이 필요합니다.</td>
</tr>
<tr>
<td></td>
<td><strong>레시피 인쇄 및 다운로드</strong></td>
<td>사용자가 레시피를 인쇄하거나 PDF로 다운로드할 수 있는 기능이 제공됩니다.</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td><strong>캘린더/식단 계획</strong></td>
<td>사용자가 주간/월간 식단을 계획하고 저장할 수 있는 기능이 필요합니다.</td>
</tr>
<tr>
<td><br></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h3 id="비기능적-요구사항-1">비기능적 요구사항</h3>
<table>
<thead>
<tr>
<th>번호</th>
<th>요구사항</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>시스템은 1초 이내에 레시피 검색 결과를 반환해야 한다.</td>
</tr>
<tr>
<td>2</td>
<td>시스템은 1천 명 이상의 동시 접속자를 처리할 수 있어야 한다.</td>
</tr>
<tr>
<td>3</td>
<td>사용자의 개인 정보는 반드시 암호화되어 저장되어야 한다.</td>
</tr>
<tr>
<td>4</td>
<td>시스템은 월 99.9% 이상의 가용성을 유지해야 한다.</td>
</tr>
</tbody></table>
<br>

<h3 id="마치며">마치며</h3>
<p>이번에는 기능적 요구사항과 비기능적 요구사항이 무엇인지 정리해보았고 제 프로젝트 주제인 레시피 추천 웹에 대한 기능적 요구사항과 비기능적 요구사항을 정리해보았습니다. 다음에는 프로젝트 환경설정과 기초설정들, 백 프론트 연결에 대해서 적어보겠습니다. 글 읽어주셔서 감사합니다~!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[첫 개인프로젝트를 시작하며..]]></title>
            <link>https://velog.io/@hong_sm/%EC%B2%AB-%EA%B0%9C%EC%9D%B8%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B0</link>
            <guid>https://velog.io/@hong_sm/%EC%B2%AB-%EA%B0%9C%EC%9D%B8%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B0</guid>
            <pubDate>Fri, 09 Aug 2024 09:07:54 GMT</pubDate>
            <description><![CDATA[<hr>
<h3>블로그를 시작하며</h3>
안녕하세요! Velog를 만들고 첫 번째 게시글을 작성하게 되었습니다.<br>
이 블로그는 개인적으로 만든 지는 조금 되었지만, 여러 가지 이유로 이제서야 첫 번째 글을 쓰게 되었습니다. 컴퓨터 공학부 4학년으로 졸업을 앞두고 있으며, 졸업 전에 개인 프로젝트를 진행하면서 얻은 경험을 공유하고자 합니다. <br><br>

<h3 id="개인-프로젝트를-시작하게-된-배경">개인 프로젝트를 시작하게 된 배경</h3>
<p>졸업을 앞두고 현업에서 필요한 기술과 경험을 쌓기 위해 개인 프로젝트를 시작했습니다. 처음으로 혼자 진행하는 프로젝트를 통해 실제 개발 환경에서 겪을 수 있는 다양한 문제들을 해결하고, 이 과정에서 배우고 성장하고자 합니다. <br><br></p>
<p>이 블로그에서는 프로젝트 진행 과정에서의 중요한 내용, 코드, 그리고 직면한 문제와 그 해결 방법들을 기록하려고 합니다. 각각의 개발 과정에서 어떤 문제에 봉착했는지, 그리고 그것을 어떻게 해결했는지에 대한 경험을 공유하려고 합니다. <br><br></p>
<p>글쓰기와 코딩 모두 아직 많이 부족하지만, 피드백과 조언은 언제든지 환영합니다. 이 블로그가 제 성장 기록이자, 비슷한 문제를 겪고 있는 다른 개발자들에게도 도움이 되었으면 좋겠습니다. 꾸준히 포스팅을 통해 진행 상황을 공유하고, 스스로도 더 발전해 나가겠습니다.<br></p>
<h3>마치며</h3>
앞으로의 글에서는 프론트엔드와 백엔드 연동, 개발 환경 설정 등 개발 과정을 다룰 계획입니다. 추가적으로 개발을 진행하며 잘 모르는 부분에 대해서도 따로 공부하여 글을 올리고자 합니다. 많은 관심과 응원 부탁드리며, 여러분과 함께 성장하는 블로그가 되겠습니다. 감사합니다! <br><br>



<p><del><img src="https://velog.velcdn.com/images/hong_sm/post/faeedbce-3ed7-43d0-8abe-52ed340c4f4f/image.png" alt="개인 프로젝트 시작" style="width: 120%; max-width: 700px;"></del></p>
]]></description>
        </item>
    </channel>
</rss>