<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>g_ryu.log</title>
        <link>https://velog.io/</link>
        <description>web3.. web3.. web3..</description>
        <lastBuildDate>Thu, 08 Jun 2023 14:10:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>g_ryu.log</title>
            <url>https://velog.velcdn.com/images/g_ryu/profile/b2b4fcc8-7cf2-4523-90b3-06cbdb21c00a/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. g_ryu.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/g_ryu" rel="self" type="application/rss+xml"/>
        <item>
            <link>https://velog.io/@g_ryu/t5ecu6qh</link>
            <guid>https://velog.io/@g_ryu/t5ecu6qh</guid>
            <pubDate>Thu, 08 Jun 2023 14:10:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/g_ryu/post/27833e1d-e858-40f3-bd03-b44312e45eda/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[헌집줄게 새집다오 Project #1]]></title>
            <link>https://velog.io/@g_ryu/%ED%97%8C%EC%A7%91%EC%A4%84%EA%B2%8C-%EC%83%88%EC%A7%91%EB%8B%A4%EC%98%A4-Project-1</link>
            <guid>https://velog.io/@g_ryu/%ED%97%8C%EC%A7%91%EC%A4%84%EA%B2%8C-%EC%83%88%EC%A7%91%EB%8B%A4%EC%98%A4-Project-1</guid>
            <pubDate>Sat, 22 Apr 2023 12:41:23 GMT</pubDate>
            <description><![CDATA[<h1 id="목차">목차</h1>
<h2 id="계속-업데이트-중-last-update-230422">계속 업데이트 중.... Last Update 23.04.22</h2>
<h3 id="개요">개요</h3>
<p> G.ryu&#39;s Dev Blog는 개인 학업과, 실제 풀스택 웹 개발 과정을 경험 해보고자 만들었습니다.</p>
<h3 id="개발-환경">개발 환경</h3>
<ul>
<li>Window 10</li>
<li>IntelliJ</li>
<li>Vidual Studio Code</li>
<li>GitHub<h3 id="사용-기술">사용 기술</h3>
<h4 id="back">Back</h4>
</li>
<li>Java 17</li>
<li>Spring Boot</li>
<li>Spring Security</li>
<li>OAuth2.0</li>
<li>SpringDataJPA<h4 id="front">Front</h4>
</li>
<li>React.js</li>
<li>Meterial UI<h4 id="build-tool">Build Tool</h4>
</li>
<li>Gradle<h4 id="database">DataBase</h4>
</li>
<li>H2<h4 id="인프라">인프라</h4>
</li>
<li>미정<h4 id="블록체인">블록체인</h4>
</li>
<li>미정<h4 id="아키텍쳐">아키텍쳐</h4>
<ul>
<li>시스템 아키텍쳐
정리중</li>
<li>서버 아키텍쳐
<img src="https://velog.velcdn.com/images/g_ryu/post/edb05d3d-b7ad-4b04-bf1d-9e95fc4bb7f7/image.jpg" alt=""></li>
</ul>
</li>
</ul>
<h4 id="e-r-다이어그램">E-R 다이어그램</h4>
<p><img src="https://velog.velcdn.com/images/g_ryu/post/0bde338b-50f1-415e-bd38-aa17d21f0967/image.jpg" alt=""></p>
<h4 id="프로젝트-목적">프로젝트 목적</h4>
<p> 실제 배포 및 운영, Dapp 구현 , WebApp 구현, Block Chain 결제 구현, 학업에 대한 커스텀 플랫폼의 필요성 등등을 목적으로 함.</p>
<h4 id="핵심-기능">핵심 기능</h4>
<ul>
<li>로그인.</li>
<li>Post기능.</li>
<li>ToDo-list.</li>
<li>Routine 관리 및 통계 기능.</li>
<li>개인 미니룸 꾸미기 기능.</li>
<li>Smart Contract.</li>
<li>토큰 발매.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Repository Layer]]></title>
            <link>https://velog.io/@g_ryu/Repository-Layer</link>
            <guid>https://velog.io/@g_ryu/Repository-Layer</guid>
            <pubDate>Thu, 20 Apr 2023 05:27:25 GMT</pubDate>
            <description><![CDATA[<h2 id="--리포지터리란">- 리포지터리란?</h2>
<p>리포지터리는 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들을 사용하기 위한 인터페이스이다. 
데이터 처리를 위해서는 테이블에 어떤 값을 넣거나 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)가 필요하다.
이 때 이러한 CRUD를 어떻게 처리할지 정의하는 계층이 바로 리포지터리이다.</p>
<p>EX)
findAll, save, findById
findBySubject
findBySubjectAndContent
findBySubjectLike 등</p>
<h2 id="--리포지터리-장점">- 리포지터리 장점</h2>
<p>(1) 데이터 로직과 비즈니스 로직을 분리할 수 있다
(2) Domain에서는 일관된 인터페이스를 통해 데이터를 요청할 수 있다.
(3) 데이터 저장소의 데이터를 캡슐화할 수 있다. 객체지향적인 프로그래밍에 더 적합하다.
(4) 단위 테스트를 통한 검증이 가능하다.
(5) 객체 간의 결합도가 감소한다.
(6) 어플리케이션의 전체적인 디자인이 바뀌더라도 적용할 수 있는 유연한 아키텍쳐이다.</p>
<h3 id="자료출처">자료출처</h3>
<p><a href="https://4z7l.github.io/2020/11/24/repository-pattern.html">https://4z7l.github.io/2020/11/24/repository-pattern.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Business Logic, Domain Logic, Data Logic]]></title>
            <link>https://velog.io/@g_ryu/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A1%9C%EC%A7%81-vs-%EB%B9%84%EC%A7%80%EB%8B%88%EC%8A%A4%EB%A1%9C%EC%A7%81</link>
            <guid>https://velog.io/@g_ryu/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A1%9C%EC%A7%81-vs-%EB%B9%84%EC%A7%80%EB%8B%88%EC%8A%A4%EB%A1%9C%EC%A7%81</guid>
            <pubDate>Thu, 20 Apr 2023 03:39:18 GMT</pubDate>
            <description><![CDATA[<h1 id="business-logic">Business Logic?</h1>
<h4 id="비즈니스-로직business-logic은-컴퓨터-프로그램에서-실세계의-규칙에-따라-데이터를-생성·표시·저장·변경하는-부분을-일컫는다-이-용어는-특히-데이터베이스-표시장치-등-프로그램의-다른-부분과-대조되는-개념으로-쓰인다">비즈니스 로직(Business logic)은 컴퓨터 프로그램에서 실세계의 규칙에 따라 데이터를 생성·표시·저장·변경하는 부분을 일컫는다. 이 용어는 특히 데이터베이스, 표시장치 등 프로그램의 다른 부분과 대조되는 개념으로 쓰인다.</h4>
<h1 id="domain-logic">Domain Logic?</h1>
<h4 id="도메인-로직domain-logic은-소프트웨어에서-가장-핵심적인-부분-중-하나로-소프트웨어-시스템의-핵심-비즈니스-규칙을-포함하는-부분으로-비즈니스-로직과-유사한-개념이지만-보다-추상적인-개념입니다">도메인 로직(Domain Logic)은 소프트웨어에서 가장 핵심적인 부분 중 하나로, 소프트웨어 시스템의 핵심 비즈니스 규칙을 포함하는 부분으로, 비즈니스 로직과 유사한 개념이지만 보다 추상적인 개념입니다.</h4>
<h1 id="data-logic">Data Logic?</h1>
<h4 id="데이터-로직은-데이터의-저장-검색-수정-삭제-등과-같은-데이터-관련-작업을-수행하는-코드를-말합니다-이는-데이터베이스와-관련된-작업을-처리하는-데에-사용되며-데이터에-대한-유효성-검사-데이터-편집-데이터베이스-연결-등을-수행합니다">데이터 로직은 데이터의 저장, 검색, 수정, 삭제 등과 같은 데이터 관련 작업을 수행하는 코드를 말합니다. 이는 데이터베이스와 관련된 작업을 처리하는 데에 사용되며, 데이터에 대한 유효성 검사, 데이터 편집, 데이터베이스 연결 등을 수행합니다.</h4>
<p>기본적인 CRUD 기능이라 생각하면 좋다!</p>
<h1 id="비교-예시">비교 예시</h1>
<p>은행 시스템에서 계좌 이체 기능을 구현한다고 가정해보면, </p>
<ul>
<li>도메인 로직은 계좌 잔액 체크, 이체 가능 여부 판단, 이체 기록 작성 등과 같은 비즈니스 규칙을 구현합니다.</li>
<li>비즈니스 로직은 도메인 로직을 이용하여 계좌 이체 프로세스를 처리하고, </li>
<li>데이터 로직은 도메인 모델을 이용하여 계좌 정보와 이체 기록을 데이터베이스에 저장합니다.</li>
</ul>
<h2 id="참고자료">참고자료</h2>
<p><a href="https://ko.wikipedia.org/wiki/%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4_%EB%A1%9C%EC%A7%81">https://ko.wikipedia.org/wiki/%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4_%EB%A1%9C%EC%A7%81</a>
<a href="https://mommoo.tistory.com/67">https://mommoo.tistory.com/67</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[헌집줄게 새집다오 Project #0]]></title>
            <link>https://velog.io/@g_ryu/%ED%97%8C%EC%A7%91%EC%A4%84%EA%B2%8C-%EC%83%88%EC%A7%91%EB%8B%A4%EC%98%A4-Project-0</link>
            <guid>https://velog.io/@g_ryu/%ED%97%8C%EC%A7%91%EC%A4%84%EA%B2%8C-%EC%83%88%EC%A7%91%EB%8B%A4%EC%98%A4-Project-0</guid>
            <pubDate>Wed, 19 Apr 2023 13:51:38 GMT</pubDate>
            <description><![CDATA[<p>개인의 블로그를 만들어 보려합니다.</p>
<p>개인적으로 좋아하는 열품타 + 블로그로
커스텀 학업 툴 만들기 도전 합니다.</p>
<p>Next is 계획서 작성</p>
<p>To be countinue....</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DAO vs DTO vs VO vs Entity]]></title>
            <link>https://velog.io/@g_ryu/DAO-vs-DTO-vs-VO-vs-Entity</link>
            <guid>https://velog.io/@g_ryu/DAO-vs-DTO-vs-VO-vs-Entity</guid>
            <pubDate>Wed, 19 Apr 2023 10:26:17 GMT</pubDate>
            <description><![CDATA[<h3 id="오늘의-공부-거리--dao-vs-dto-vs-vo-vs-entity">오늘의 공부 거리 : DAO vs DTO vs VO vs Entity</h3>
<ul>
<li>목표1) DAO는 무엇인가.</li>
<li>목표2) DTO는 무엇인가.</li>
<li>목표3) VO는 무엇인가.</li>
<li>목표4) Entity는 무엇인가.</li>
<li>정리</li>
</ul>
<h2 id="목표1-dao란">목표1) DAO란?</h2>
<ul>
<li><p>Data Access Object
데이터 베이스의 data에 접근하기 위한 객체.
Database 접근 로직(CRUD)과 Business로직을 구분하기 위해 사용한다.</p>
<p>과거 로우레벨 API 때문에 데이터베이스에 접속해서 데이터베이스와 교류하는지에 더 초점을 기울였고 그 결과 자신이 필요한 인터페이스를 DAO에게 던지고 DAO는 이 인터페이스를 구현한 객체를 사용자에게 편리하게 사용 할 수 있도록 반환 해준다.</p>
<p>지금은 Mybatis등등을 사용하여 DAO를 별도로 만드는 경우는 드물다고 한다.</p>
</li>
</ul>
<h2 id="목표2-dto란">목표2) DTO란?</h2>
<ul>
<li>Data Transfer Object
계층(Layer)간의 데이터 교환을 위해 사용하는 객체다.
로직을 갖고 있지 않는 순수한 데이터 객체이며, getter 와 setter 메서드만 갖는다.</li>
</ul>
<p><strong>Clinet</strong> &lt;-<em>DTO</em>-&gt; <strong>Controller</strong> &lt;-<em>DTO</em>-&gt; <strong>Service</strong> &lt;-<em>DTO</em>-&gt; <strong>Repository</strong></p>
<ul>
<li>Example code</li>
</ul>
<pre><code>public class User {

    String UserID;
    String Password;

    public String getUserID() {
        return UserID;
    }
    public void setUserID(String userID) {
        UserID = userID;
    }
    public String getPassword() {
        return Password;
    }
    public void setPassword(String password) {
        Password = password;
    }

}
</code></pre><h2 id="목표3-vo란">목표3) VO란?</h2>
<ul>
<li>Value Object
값 그 자체를 표현하는 객체</li>
</ul>
<ul>
<li>마틴 파울러의 블로그 속 VO 개요.<pre><code>When programming, I often find it&#39;s useful to represent things as a compound. 
</code></pre></li>
</ul>
<p>A 2D coordinate consists of an x value and y value. An amount of money consists of a number and a currency. 
A date range consists of start and end dates, which themselves can be compounds of year, month, and day.</p>
<pre><code>
이처럼 **&quot;객체&quot;** 그 자체에 주목해야 한다.
즉, 객체의 같고 다름, 불변성 에 집중하여야 한다.
그렇다면 당연히?
- 객체의 같고 다름 &gt; hashcode % equals 메소드 오버라이딩 **필수!**
- 불!변!성! &gt; Setter 메소드가 존재하지 않는다.

VO를 사용함으로써
1. 예상되는 인스턴스를 미리 만들어 인스턴스를 생성해놓고 캐싱하여 성능을 높이는 방법도 있다고 한다. (나의 응애 레벨에서는 이게 무슨소리지? 하는 중이다.)
2. Entity의 원시값들을 VO로 포장하면 Entity의 거대화를 막아 테이블관점에서 객체지향관점으로 프로그래밍 가능하다. (1.을 읽고 느낀 감정과 유사하다.)

## 목표4) Entity란?
DB 테이블과 1:1 매핑되는 객체
비지니스 로직을 포함할수도, setter 메소드를 포함 할수도 있다.

&quot;Entity를 데이터를 전달하는 클래스로 사용하면 안된다&quot;
-&gt;DB와 맵핑됨으로

**Clinet** &lt;-_DTO_-&gt; **Controller** &lt;-_DTO_-&gt; **Service** &lt;-_DTO_-&gt; **Repository** &lt;-_Entity_-&gt; **DB**

## 정리)

나의 github에 있는 회원가입 기능에서의 VO는 사실 DTO를 사용해버린 것을 알았다.
많은 VO들이 DTO로 혼용되는 경우 또한 많다고 한다.

|  | DTO | VO | Entity |
| :-: | :-:| :-: |  :-: |
| 용도 | 레이어 간의 데이터 전송(DB직접X). | 객체 지향의 관점. | DB와 직접 맵핑 되는 클래스. |
| 가변/불변 | 가변 | 불변 | 가변 |
| 로직 포함 여부 | 불포함 | 포함 | 포함 |

나의 갈증이였던, 개인 프로젝트에서 클래스 생성에 대하여 정리가 좀 되었다.


### 참고자료
https://velog.io/@ha0kim/DAO-DTO-VO-%EC%B0%A8%EC%9D%B4
https://www.youtube.com/watch?v=J_Dr6R0Ov8E
https://tecoble.techcourse.co.kr/post/2020-06-11-value-object/
https://melonicedlatte.com/2021/07/24/231500.html</code></pre>]]></description>
        </item>
    </channel>
</rss>