<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>juuuu.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 20 Apr 2025 06:24:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>juuuu.log</title>
            <url>https://velog.velcdn.com/images/jv_hyvn/profile/c1ac1a64-fa29-4573-bb7c-df0586292786/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. juuuu.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jv_hyvn" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[DB 연동 및 쿼리 개념 학습 및 ERD 설계 마무리]]></title>
            <link>https://velog.io/@jv_hyvn/DB-%EC%97%B0%EB%8F%99-%EB%B0%8F-%EC%BF%BC%EB%A6%AC-%EA%B0%9C%EB%85%90-%ED%95%99%EC%8A%B5-%EB%B0%8F-ERD-%EC%84%A4%EA%B3%84-%EB%A7%88%EB%AC%B4%EB%A6%AC</link>
            <guid>https://velog.io/@jv_hyvn/DB-%EC%97%B0%EB%8F%99-%EB%B0%8F-%EC%BF%BC%EB%A6%AC-%EA%B0%9C%EB%85%90-%ED%95%99%EC%8A%B5-%EB%B0%8F-ERD-%EC%84%A4%EA%B3%84-%EB%A7%88%EB%AC%B4%EB%A6%AC</guid>
            <pubDate>Sun, 20 Apr 2025 06:24:20 GMT</pubDate>
            <description><![CDATA[<h2 id="db-연동">DB 연동</h2>
<ol>
<li>먼저 mysql을 다운받아 초기 설정을 함
다운로드 링크: <a href="https://dev.mysql.com/downloads/windows/installer/8.0.html">mysql 다운로드</a></li>
<li>root로 설정하고 비밀번호를 단순히 4자리 숫자로 적었는데 자꾸 스프링부트에서 db연동이 안되는 상황이 발생 -&gt; 비밀번호가 일치하지 않다는 error가 뜸</li>
<li>구글링을 통해 해결<pre><code>Consider using a password with 8 or more characters with mixed case letters, numbers and punctuation marks.</code></pre>비밀번호를 대소문자, 특수문자, 숫자 포함하여 8글자 이상 설정하지 않아서 생긴 오류였고 비밀번호를 변경하니까 해결됨</li>
</ol>
<ul>
<li>application.yml에 내용 추가</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/23cc7ef2-a429-4277-8213-81fb491c1ef7/image.png" alt=""></p>
<ul>
<li>dependencies 수정<pre><code>runtimeOnly &#39;com.mysql:mysql-connector-j&#39; //추가 </code></pre><img src="https://velog.velcdn.com/images/jv_hyvn/post/31634422-0e11-42b9-816b-29f9cd84c696/image.png" alt=""></li>
</ul>
<h2 id="쿼리테스트">쿼리테스트</h2>
<h3 id="게시판post-crud-시-실제로-어떤-sql-쿼리가-나가는지-확인">게시판(Post) CRUD 시 실제로 어떤 SQL 쿼리가 나가는지 확인</h3>
<blockquote>
<p>쿼리(Query) : DB에게 수행을 요청하는 구문</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/9a898f50-0314-46fb-a733-2cc80eb24ab6/image.png" alt=""></p>
<pre><code>insert into post (content, title) values (?, ?)</code></pre><ul>
<li>게시글 저장 시 위와 같은 쿼리</li>
</ul>
<pre><code>select p1_0.id, p1_0.content, p1_0.title from post p1_0</code></pre><ul>
<li>게시글 전체 조회 시 위와 같은 쿼리</li>
</ul>
<pre><code>select ... from post where p1_0.id=?
update post set content=?, title=? where id=?</code></pre><ul>
<li>게시글 수정 시 위와 같은 쿼리</li>
<li>특정 게시글을 찾고 수정해야하기 때문에 select문도 실행됨</li>
</ul>
<pre><code>select ... from post where p1_0.id=?
delete from post where id=?</code></pre><ul>
<li>게시글 삭제 시 위와 같은 쿼리</li>
<li>특정 게시글을 찾고 삭제해야하기 때문에 select문도 실행됨</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/0b1fed71-b3e5-4ce4-abe4-2428722159be/image.png" alt=""></p>
<ul>
<li><p>post 후 Workbench를 통해 sql문을 실행하여 테이블 확인하여 데이터가 잘 들어갔는지 확인함
<img src="https://velog.velcdn.com/images/jv_hyvn/post/10e32754-949d-408d-be56-d7128bd39657/image.png" alt=""></p>
</li>
<li><p>put을 통해 게시글 내용과 제목을 수정 후 다시 sql문을 실행하여 데이터가 잘 바뀌었는지 확인함
<img src="https://velog.velcdn.com/images/jv_hyvn/post/10213463-2468-485b-b5cd-fe8b45973121/image.png" alt=""></p>
</li>
</ul>
<h2 id="erd-설계--ing">ERD 설계 -ing</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA를 이용하여 게시판 CRUD 만들기]]></title>
            <link>https://velog.io/@jv_hyvn/JPA%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EA%B2%8C%EC%8B%9C%ED%8C%90-CRUD-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@jv_hyvn/JPA%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EA%B2%8C%EC%8B%9C%ED%8C%90-CRUD-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Sun, 13 Apr 2025 13:13:39 GMT</pubDate>
            <description><![CDATA[<h2 id="erdentity-relationship-diagram">ERD(Entity Relationship Diagram)</h2>
<blockquote>
<p>데이터베이스 설계 과정에서 사용되는 모델링 기법 중 하나로, 데이터베이스에 저장될 데이터 엔티티(entity)들과 엔티티 간의 관계(relationship)를 시각적으로 표현</p>
</blockquote>
<h3 id="erd의-용도">ERD의 용도</h3>
<ul>
<li>데이터 베이스 모델링
엔티티와 속성들을 테이블과 컬럼들로 변환</li>
<li>소프트웨어 엔지니어링
서로 다른 시스템 요소와 서로 간의 관계를 식별하는데 도움이 됨</li>
</ul>
<h3 id="erd-구성요소">ERD 구성요소</h3>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/49679021-ea32-4871-8d56-164995017f3e/image.png" alt=""></p>
<h4 id="entity">Entity</h4>
<p>어떤 시스템인지에 따라 Entity는 사람, 장소, 사건(이벤트), 오브젝트가 될 수 있음
데이터베이스의 테이블이 엔티티로 표현됨
<img src="https://velog.velcdn.com/images/jv_hyvn/post/330745d4-b508-44b0-adc3-545dce5f4248/image.png" alt=""></p>
<h4 id="attribute">Attribute</h4>
<p>특성, 엔티티의 성격, 관계, 또 다른 속성
데이터베이스의 테이블의 각 필드(컬럼)들이 엔티티 속성</p>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/b570d380-efb0-4c97-afa7-1796afe32d53/image.png" alt=""></p>
<h4 id="relationship">Relationship</h4>
<p>엔티티 사이의 논리적인 연결 즉 엔티티와 엔티티가 존재의 형태나 행위로서 서로에게 영향을 주는 형태</p>
<h4 id="domain">Domain</h4>
<p>속성의 값, 타입, 제약사항 등에 대한 범위를 표현
사용자의 기호에 따라 속성 타입만 그릴수도 있고 가독성을 위해서 생략할 수도 있음</p>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/621a9368-d871-462f-abb0-6af981e8c594/image.png" alt=""></p>
<h3 id="erd-키와-제약-조건-표기법">ERD 키와 제약 조건 표기법</h3>
<h4 id="주-식별자pk">주 식별자(PK)</h4>
<p>데이터베이스 테이블의 Primary Key표현
중복이 없고 NULL 값이 없는 유일한 값에 지정하는 식별자
◆ 다이아몬드로 표현하기도 하고 아니면 열쇠로도 표현하기도 함
주 식별자는 유일한 속성이므로 다른 속성과의 명확한 구분을 위해 구분선을 두기도 함</p>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/a9fb611e-7a6a-469b-8db1-482629ae455d/image.png" alt=""></p>
<h4 id="not-null">NOT NULL</h4>
<p>해당 속성에 들어갈 값에 NULL을 비허용한다면 N 혹은 NN을 적음
만약 NULL을 허용한다면 N을 적지 않음</p>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/dc462e17-85f2-4990-82e1-2dbc67d5ed9a/image.png" alt=""></p>
<h4 id="외래-식별자fk">외래 식별자(FK)</h4>
<p>데이터베이스 테이블의 Foreign Key를 표현
외래 식별자 역시 Key의 일종이기 때문에 ERD 엔티티에도 열쇠 아이콘으로 표시
외래 식별자를 표시할 때에는 선을 이어주는데 개체와 관계를 따져 표시</p>
<h3 id="erd-엔티티-관계-표기법">ERD 엔티티 관계 표기법</h3>
<p>엔티티끼리 관계가 있는 경우 선을 이어 관계를 맺어야 함
부모의 키를 자식에서 PK로 쓰는지 일반 속성으로 사용하는지에 따라 실선인지 점선인지 나뉘게 됨
실선으로 그으면 강한 관계를 나타내는 것이며 <strong>식별자 관계</strong>임
점선으로 그으면 약한 관계를 나타내는 것이며 <strong>비식별자 관계</strong>임</p>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/4e2126ca-82a2-400c-844b-ec62305cc3d8/image.png" alt=""></p>
<h3 id="erd-네이밍-규칙">ERD 네이밍 규칙</h3>
<ul>
<li>테이블 이름은 직관적이어야하고 약어는 지양해야함</li>
<li>테이블 이름은 복수로 정해야 함</li>
</ul>
<h3 id="cardinality">Cardinality</h3>
<ul>
<li>테이블 간의 관계를 명시하는 표현</li>
<li>1:1 관계: 유저당 유저 이메일</li>
<li>1:n 관계: 한 유저당 여러 개의 상품을 장바구니에 넣는 경우</li>
<li>n:m 관계: 학생과 강의의 관계</li>
</ul>
<h3 id="함수적-종속성">함수적 종속성</h3>
<ul>
<li>DB 속성들간의 종속 관계</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/ec246d0e-3747-4896-bf47-d6e48a946cbf/image.png" alt=""></p>
<ul>
<li>학번을 통해 학생의 학년을 알 수 있다 (학번은 중복될 수 없다)</li>
<li>학번, 과목번호 ▶️ 성적
완전 함수 종속: 학번과 과목번호를 모두 알아야 성적을 알 수 있다
즉 Y가 X의 전체에 종속됨</li>
<li>과목번호, 학번 ▶️ 학년
부분 함수 종속: 학년을 알기 위해서는 과목번호까지는 몰라도 된다
즉 Y가 X의 부분만 종속됨</li>
</ul>
<hr>
<h3 id="crud">CRUD</h3>
<p>&quot;Create, Read, Update, Delete&quot;의 약어로 데이터 베이스와 같은 시스템에서 기본적인 데이터 관리 기능을 의미</p>
<h4 id="db에서의-crud">DB에서의 CRUD</h4>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/d6dcb2bf-c85a-4c58-b972-ac183e55506c/image.png" alt=""></p>
<ul>
<li>Create(생성): 새로운 데이터 생성</li>
<li>Read(읽기): 데이터 조회</li>
<li>Update(갱신): 기존 데이터 수정</li>
<li>Delete(삭제): 데이터 삭제</li>
</ul>
<h4 id="rest-api에서의-crud">REST API에서의 CRUD</h4>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/885e5489-2293-4d24-ab6e-20d331d622f0/image.png" alt=""></p>
<ul>
<li>Create(생성)
  -HTTP 메서드: POST
  -ex) 새로운 사용자 생성</li>
<li>Read(읽기)
  -HTTP 메서드: GET
  -ex) 모든 사용자 목록 가져오는 경우</li>
<li>Update(갱신)
  -HTTP 메서드: PUT 또는 PATCH
  -ex) 특정 사용자의 정보 업데이트</li>
<li>Delete(삭제)
  -HTTP 메서드: DELETE
  -ex) 특정 사용자 삭제</li>
</ul>
<hr>
<h3 id="crud-구현">CRUD 구현</h3>
<table>
<thead>
<tr>
<th align="center">기능</th>
<th align="center">HTTP</th>
<th align="center">URL</th>
</tr>
</thead>
<tbody><tr>
<td align="center">게시글 목록 조회</td>
<td align="center">GET</td>
<td align="center">/posts</td>
</tr>
<tr>
<td align="center">게시글 단건 조회</td>
<td align="center">GET</td>
<td align="center">/posts/{id}</td>
</tr>
<tr>
<td align="center">게시글 작성</td>
<td align="center">POST</td>
<td align="center">/posts</td>
</tr>
<tr>
<td align="center">게시글 수정</td>
<td align="center">PUT</td>
<td align="center">/posts/{id}</td>
</tr>
<tr>
<td align="center">게시글 삭제</td>
<td align="center">DELETE</td>
<td align="center">/posts{id}</td>
</tr>
</tbody></table>
<h4 id="계층-분리-구조">계층 분리 구조</h4>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/3bc4e3bb-8c49-4e9a-830e-3cab98b22dcb/image.png" alt=""></p>
<ul>
<li>Controller는 요청을 받고</li>
<li>Repository는 DB와 통신을 하고</li>
<li>Service는 그 사이에서 진짜 로직을 처리</li>
</ul>
<h4 id="게시판-엔티티">게시판 엔티티</h4>
<pre><code>package com.goormthonUniv.goormthon.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Column;

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 100)
    private String title;

    @Column(nullable = false, columnDefinition = &quot;TEXT&quot;)
    private String content;

    public Long getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setContent(String content) {
        this.content = content;
    }
}</code></pre><h4 id="controller">Controller</h4>
<pre><code>package com.goormthonUniv.goormthon.controller;

import com.goormthonUniv.goormthon.dto.PostRequestDto;
import com.goormthonUniv.goormthon.dto.PostResponseDto;
import com.goormthonUniv.goormthon.repository.PostRepository;
import com.goormthonUniv.goormthon.service.PostService;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(&quot;/posts&quot;)
public class PostController {

    private final PostService postService;

    public PostController(PostService postService) {
        this.postService = postService;
    }

    @PostMapping
    public ResponseEntity&lt;PostResponseDto&gt; createPost(@RequestBody PostRequestDto request) {
       PostResponseDto response = postService.createPost(request);
       return new ResponseEntity&lt;&gt;(response, HttpStatus.CREATED);
    }

    @GetMapping
    public List&lt;PostResponseDto&gt; list() {
        return postService.getAllposts();
    }


    @GetMapping(&quot;/{id}&quot;)
    public PostResponseDto get(@PathVariable Long id) {
        return postService.getPost(id);
    }

    @DeleteMapping(&quot;/{id}&quot;)
    public ResponseEntity&lt;String&gt; delete(@PathVariable Long id) {
        postService.deletePost(id);
        return ResponseEntity.ok(&quot;게시글이 성공적으로 삭제되었습니다.&quot;);
    }

    @PutMapping(&quot;/{id}&quot;)
    public PostResponseDto update(@PathVariable Long id, @RequestBody @Valid PostRequestDto request) {
        return postService.updatePost(id, request);
    }
}
</code></pre><h3 id="post">POST</h3>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/68b0c3f2-8cfd-4075-890d-647016c5ea06/image.png" alt=""></p>
<h3 id="get">GET</h3>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/338745d3-87c0-4011-962b-d0829eedbd98/image.png" alt="">
<img src="https://velog.velcdn.com/images/jv_hyvn/post/60054605-a049-44f9-be06-1a63979bf8f2/image.png" alt=""></p>
<h3 id="delete">DELETE</h3>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/293313b0-4022-421e-ad98-ace48dfaa0de/image.png" alt=""></p>
<ul>
<li>DELETE 후 GET 실행하여 삭제되었는지 확인
<img src="https://velog.velcdn.com/images/jv_hyvn/post/140bb3e6-56d7-470f-aec7-66c15e6307be/image.png" alt=""></li>
</ul>
<h3 id="put">PUT</h3>
<p><img src="https://velog.velcdn.com/images/jv_hyvn/post/228cdb6b-aacd-43e9-ae22-8e2128c84c5b/image.png" alt=""></p>
<p>-PUT 후 GET 실행하여 제대로 수정이 되었는지 확인
<img src="https://velog.velcdn.com/images/jv_hyvn/post/18c1aff8-3e46-4c2c-bf4c-8af66a2a25d9/image.png" alt=""></p>
<hr>
<h3 id="어노테이션-개념-정리">어노테이션 개념 정리</h3>
<table>
<thead>
<tr>
<th align="center">어노테이션</th>
<th align="center">위치</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">@RestController</td>
<td align="center">Controller</td>
<td align="center">이 클래스가 REST API 요청을 처리하는 컨트롤러임을 나타냄 <br>리턴값이 자동으로 JSON으로 변환</td>
</tr>
<tr>
<td align="center">@RequestMapping(&quot;/posts&quot;)</td>
<td align="center">Controller</td>
<td align="center">이 컨트롤러의 기본 경로를 설정</td>
</tr>
<tr>
<td align="center">@PostMapping</td>
<td align="center">Controller</td>
<td align="center">HTTP POST 요청을 처리</td>
</tr>
<tr>
<td align="center">@GetMapping</td>
<td align="center">Controller</td>
<td align="center">HTTP GET 요청을 처리</td>
</tr>
<tr>
<td align="center">@DeleteMapping</td>
<td align="center">Controller</td>
<td align="center">HTTP DELETE 요청을 처리</td>
</tr>
<tr>
<td align="center">@PutMapping</td>
<td align="center">Controller</td>
<td align="center">HTTP DELETE 요청을 처리</td>
</tr>
<tr>
<td align="center">@PathVariable</td>
<td align="center">Controller</td>
<td align="center">URL 경로에 있는 값을 변수로 받기<br>/posts/3 → id = 3</td>
</tr>
<tr>
<td align="center">@RequestBody</td>
<td align="center">Controller</td>
<td align="center">요청 바디의 JSON → Java 객체로 변환</td>
</tr>
<tr>
<td align="center">@Valid</td>
<td align="center">Controller</td>
<td align="center">@RequestBody로 받은 DTO의 유효성 검사를 수행</td>
</tr>
<tr>
<td align="center">@Service</td>
<td align="center">Service</td>
<td align="center">이 클래스가 비즈니스 로직을 수행하는 Service 컴포넌트임을 Spring에게 알려줌</td>
</tr>
<tr>
<td align="center">@Entity</td>
<td align="center">Entity</td>
<td align="center">이 클래스가 JPA가 관리하는 엔티티임을 나타냄</td>
</tr>
<tr>
<td align="center">@Id</td>
<td align="center">Entity</td>
<td align="center">이 필드가 테이블의 기본 키(PK) 임을 나타냄</td>
</tr>
<tr>
<td align="center">@GeneratedValue(strategy = GenerationType.IDENTITY)</td>
<td align="center">Entity</td>
<td align="center">id 값을 DB가 자동 생성하도록 지정</td>
</tr>
<tr>
<td align="center">@Column(nullable = false, length = 100)</td>
<td align="center">Entity</td>
<td align="center">이 필드를 DB 컬럼으로 매핑 + 컬럼 제약 조건 설정</td>
</tr>
<tr>
<td align="center">@Column(nullable = false, columnDefinition = &quot;TEXT&quot;)</td>
<td align="center">Entity</td>
<td align="center">이 필드를 DB에서 TEXT 타입 컬럼으로 저장</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA["Hello, Spring Boot!" 프로젝트 만들기]]></title>
            <link>https://velog.io/@jv_hyvn/Hello-Spring-Boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-wug7e2y0</link>
            <guid>https://velog.io/@jv_hyvn/Hello-Spring-Boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-wug7e2y0</guid>
            <pubDate>Sat, 05 Apr 2025 14:05:13 GMT</pubDate>
            <description><![CDATA[<h1 id="mvc-패턴">MVC 패턴</h1>
<p>프로젝트를 구성할 때 <strong>Model,Controller,View의 역할로 구분</strong>하는 패턴</p>
<ul>
<li><p><code>Model</code>: 데이터를 담는 곳 , Controller에서 View로 데이터를 전달하기 위한 일시적인 <strong>데이터 저장소</strong></p>
</li>
<li><p><code>Controller</code>: 요청을 처리하는 곳 → <strong>중간 관리자</strong>
사용자의 요청을 받아서 비지니스 로직을 수행하고 그 결과를 View에 전달하는 역할</p>
<pre><code>@Controller
public class UserController {

  @Autowired
  private UserService userService;

  @GetMapping(&quot;/users&quot;)
  public String getUsers(Model model) {
      // 엔티티에서 데이터베이스로부터 사용자 목록을 가져옴
      List&lt;User&gt; users = userService.getAllUsers();

      // 모델에 사용자 데이터를 담아 뷰로 전달
      model.addAttribute(&quot;users&quot;, users);

      return &quot;userList&quot;; // userList.jsp 혹은 userList.html로 이동
  }
}</code></pre></li>
<li><p><code>View</code>: 사용자가 보는 화면, 즉 input text, check box와 같은 사용자 인터페이스 요소를 의미 → 데이터를 기반으로 사용자들이 볼 수 있는 화면
<img src="https://velog.velcdn.com/images/jv_hyvn/post/8c249f79-6e2c-4bb1-afe2-a6739e9e6114/image.png" alt=""></p>
</li>
</ul>
<hr>
<h1 id="spring-web-layer">Spring web Layer</h1>
<ol>
<li>Web Layer: 사용자의 요청과 이에 대한 응답 반환의 전반적인 처리가 일어나는 영역</li>
<li>Service Layer: Web Layer와 Repository Layer 사이에서 실질적인 어플리케이션 로직이 일어나는 영역</li>
<li>Repository Layer: DB와 같은 데이터 저장소에 접근하는 영역</li>
<li>DTOs: 계층 간의 데이터 교환을 위한 객체</li>
<li>Domain Model: 개발 대상, 즉 도메인을 모든 사람들이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화한 것
<img src="https://velog.velcdn.com/images/jv_hyvn/post/a3b7bec4-555e-49a0-b805-16233867ad45/image.png" alt=""></li>
</ol>
<hr>
<ul>
<li><code>DAO (Data Access Object)</code> : 데이터 베이스에 접근하기 위한 객체</li>
<li><code>DTO (Data Transfer Object):</code> 계층 간 데이터 교환을 하기 위해 사용하는 객체 → 로직을 가지지 않는 순수한 데이터 객체(getter &amp; setter 만 가진 클래스)</li>
<li><code>VO (Value Object)</code>: 값 오브젝트로써 값을 위해 쓰임 오직 <strong>read-Only</strong> 
VO는 DTO와 다르게 getter만 가지고 있음</li>
<li><code>IOC(Inversion of Control,제어의 역전</code>): <strong>제어의 흐름을 개발자가 직접 관리하지 않고</strong> <strong>프레임워크나 컨테이너가 대신 관리</strong>하는 것
→ 의존하는 객체를 직접 생성하지 않으므로 클래스 간 의존성이 낮아짐</li>
<li><code>DI(Dependency Injection,의존성 주입)</code>: 객체가 다른 객체에 의존할 때 이를 외부에서 주입해주는 방식</li>
</ul>
<h3 id="di-방식">DI 방식</h3>
<ul>
<li><p>생성자 주입 (Constructor Injection)</p>
<ul>
<li><p>객체를 생성할 때 의존성을 생성자의 인자로 주입하는 방식</p>
<pre><code>public class Car {
private Engine engine;

// 생성자를 통해 의존성을 주입
public Car(Engine engine) {
 this.engine = engine;
}
}</code></pre></li>
</ul>
</li>
</ul>
<ul>
<li>setter 주입 (Setter Injection)<ul>
<li>객체 생성 후 세터 메서드를 통해 의존성을 주입</li>
<li>선택적인 의존성에 대해 사용할 수 있으며 의존성이 필요하지 않을 수도 있는 경우에 유용</li>
</ul>
</li>
</ul>
<pre><code>public class Car {
    private Engine engine;

    // 세터를 통해 의존성 주입
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}</code></pre><ul>
<li>필드 주입 (Field Injection)<ul>
<li>필드에 직접적으로 의존성을 주입하는 방식으로 가장 간단한 방법</li>
<li>테스트나 유지보수 측면에서 권장되지 않음<pre><code>@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}</code></pre></li>
</ul>
</li>
</ul>
<hr>
<h1 id="spring-bean">Spring Bean</h1>
<h3 id="bean의-역할">Bean의 역할</h3>
<ul>
<li>객체 생성 및 관리</li>
<li>의존성 관리</li>
<li>객체 생애 주기 관리</li>
</ul>
<h3 id="bean-등록하는-방법"><strong>Bean 등록</strong>하는 방법</h3>
<ul>
<li>어노테이션 기반 설정<ul>
<li><code>@Component</code> 애노테이션이 있으면 스프링 빈으로 자동 등록</li>
<li><code>@Component</code>를 포함하는 <code>@Controller</code>, <code>@Service</code>, <code>@Repository</code> 애노테이션도 스프링 빈으로 자동 등록</li>
</ul>
</li>
<li>자바 설정 파일<ul>
<li><code>@Configuration</code>과 <code>@Bean</code> 애노테이션을 이용해 스프링 빈을 등록<pre><code>@Configuration
public class AppConfig {
@Bean
public UserService userService() {
  return new UserService();
}
}</code></pre></li>
</ul>
</li>
</ul>
<hr>
<h1 id="스프링-컨테이너spring-container">스프링 컨테이너(Spring Container)</h1>
<ul>
<li><strong>빈의 생명주기를 관리</strong>(빈의 생성, 관리,제거)하며 생성된 빈에게 추가적인 기능을 제공하는 것</li>
<li>DI(의존성 주입)을 통해 애플리케이션의 컴포넌트를 관리</li>
<li>스프링 컨테이너는 서로 다른 빈을 연결하여 애플리케이션 빈을 연결하는 역할을 함</li>
<li>객체 간의 <strong>의존성을 낮추어</strong> <strong>결합도를 낮추고</strong> <strong>높은 캡슐화</strong>를 위해 스프링 컨테이너를 사용</li>
</ul>
<h3 id="스프링-컨테이너의-종류">스프링 컨테이너의 종류</h3>
<ul>
<li>Bean Factory<ul>
<li>스프링 컨테이너의 최상위 인터페이스</li>
<li>가장 기본적인 스프링 컨테이너로 설정된 빈을 관리하고 의존성을 주입함</li>
<li>주로 리소스가 제한적인 상황에서 사용됨</li>
</ul>
</li>
<li>Application Context<ul>
<li>BeanFactory를 확장한 컨테이너로 대부분의 스프링 애플리케이션에서 사용함
<img src="https://velog.velcdn.com/images/jv_hyvn/post/4d42fa80-b7a5-4771-9055-d7d0ffda971c/image.png" alt=""></li>
</ul>
</li>
</ul>
<hr>
<h1 id="계층형-디렉터리-구조">계층형 디렉터리 구조</h1>
<ul>
<li>src/main/java: 자바 소스 코드를 저장하는 디렉터리
컨트롤러,서비스,리포지토리, 도메일 모델 등의 자바 클래스 파일들이 저장됨</li>
<li>src/main/resources: 애플리케이션 설정 파일, 정적 리소스, 템플릿 등을 저장하는 디렉터리</li>
<li>src/test/java: 테스트용 자바 소스 코드를 저장하는 디렉터리</li>
<li>src/test/resources: 테스트에 필요한 리소스 파일을 저장하는 디렉터리</li>
</ul>
<hr>
<h1 id="간단한-api-개발">간단한 API 개발</h1>
<ul>
<li>/hello 요청이 들어오면 &quot;Hello,World!&quot;문자열을 반환하는 API 만들기
<img src="https://velog.velcdn.com/images/jv_hyvn/post/41e0161e-3209-4203-b3ff-cb7e74e55142/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C언어 백준] 8393번 - 합]]></title>
            <link>https://velog.io/@jv_hyvn/%EB%B0%B1%EC%A4%80-C%EC%96%B8%EC%96%B4-8393%EB%B2%88-%ED%95%A9</link>
            <guid>https://velog.io/@jv_hyvn/%EB%B0%B1%EC%A4%80-C%EC%96%B8%EC%96%B4-8393%EB%B2%88-%ED%95%A9</guid>
            <pubDate>Fri, 06 Oct 2023 06:55:59 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p>n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.</p>
<h1 id="입력">입력</h1>
<p>첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.</p>
<h1 id="출력">출력</h1>
<p>1부터 n까지 합을 출력한다.</p>
<h2 id="문제-접근-방법">문제 접근 방법</h2>
<p>for문을 통해 1부터 n까지의 값을 더한다.</p>
<h1 id="코드">코드</h1>
<pre><code>#include &lt;stdio.h&gt;

int main() {
    int n;
    int sum = 0;
    scanf(&quot;%d&quot;, &amp;n);

    for (int i = 1; i &lt;= n; i++) {
        sum += i; //sum = sum+i;
    }
    printf(&quot;%d&quot;, sum);
}</code></pre>]]></description>
        </item>
    </channel>
</rss>