Skip to content

Commit

Permalink
Updates
Browse files Browse the repository at this point in the history
  • Loading branch information
hyeonic committed Mar 18, 2024
1 parent 34d3df8 commit 714066f
Show file tree
Hide file tree
Showing 38 changed files with 1,680 additions and 32 deletions.
2 changes: 1 addition & 1 deletion basic-tomcat/index.html

Large diffs are not rendered by default.

544 changes: 544 additions & 0 deletions enum/index.html

Large diffs are not rendered by default.

294 changes: 294 additions & 0 deletions first-class-collection/index.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion google-refresh-token/index.html

Large diffs are not rendered by default.

435 changes: 435 additions & 0 deletions immutable-object/index.html

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions index.html

Large diffs are not rendered by default.

364 changes: 364 additions & 0 deletions mappedsuperclass-vs-embedded/index.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion page-data/2022-retrospect/page-data.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion page-data/basic-tomcat/page-data.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion page-data/covering-index/page-data.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions page-data/enum/page-data.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions page-data/first-class-collection/page-data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"componentChunkName":"component---src-templates-post-jsx","path":"/first-class-collection/","result":{"data":{"site":{"siteMetadata":{"title":"나누면 배가 되고"}},"markdownRemark":{"id":"fa92531f-b76e-587c-a42b-14dedd6e2cb1","excerpt":"일급 컬렉션 이란 을 하며 그외 다른 인스턴스 변수가 없는 상태를 말한다. 이러한 Wrapping이 가져오는 은 아래와 같다. 로 사용이 가능하다. Collection의 할 수 있다. 해당 Collection에 대한 할 수 있다. 간단히 정리하면 이다. 간단한 예시를 들어보면 스터디 개설 및 운영을 위한 시스템 개발을 진행한다고 가정한다. 한 스터디에는 …","html":"<h2>일급 컬렉션</h2>\n<p><code class=\"language-text\">일급 컬렉션(First Class Collection)</code>이란 <code class=\"language-text\">Collection</code>을 <code class=\"language-text\">Wrapping</code>하며 그외 다른 인스턴스 변수가 없는 상태를 말한다. 이러한 Wrapping이 가져오는 <code class=\"language-text\">이점</code>은 아래와 같다.</p>\n<ol>\n<li><code class=\"language-text\">비즈니스에 종속적인 자료구조</code>로 사용이 가능하다.</li>\n<li>Collection의 <code class=\"language-text\">불변성을 보장하도록 구현</code>할 수 있다.</li>\n<li>해당 Collection에 대한 <code class=\"language-text\">행위 까지 한 곳에서 관리</code>할 수 있다.</li>\n</ol>\n<p>간단히 정리하면 <code class=\"language-text\">비즈니스에 맞는 이름을 가지는 Collection을 만드는 것</code>이다.</p>\n<p>간단한 예시를 들어보면 스터디 개설 및 운영을 위한 시스템 개발을 진행한다고 가정한다. 한 스터디에는 다수의 스터디원을 등록할 수 있다. </p>\n<p>스터디원을 나타내는 <code class=\"language-text\">Student</code>이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Student</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>한 스터디에는 다수의 스터디원을 가질 수 있다. 간단히 표시하면 아래와 같이 단순히 <code class=\"language-text\">List</code>를 활용하여 표현할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Study</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">private</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Student</span><span class=\"token punctuation\">></span></span> students<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>일급 컬렉션은 이러한 <code class=\"language-text\">List&lt;Student> students</code>를 Wrapping하여 구현한다. 앞서 언급한 것 처럼 인스턴스 변수는 students <code class=\"language-text\">오직 하나</code>이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Students</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">private</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Student</span><span class=\"token punctuation\">></span></span> students<span class=\"token punctuation\">;</span>\n\n <span class=\"token keyword\">public</span> <span class=\"token class-name\">Students</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Student</span><span class=\"token punctuation\">></span></span> students<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>students <span class=\"token operator\">=</span> students<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>일급 컬렉션으로 개선한 Study 이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Study</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">private</span> <span class=\"token class-name\">Students</span> students<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>이점 살펴보기</h2>\n<p>위에서 작성한 스터디 개설 및 운영 시스템 활용한다. 스터디 개설을 위해서는 아래와 같은 조건이 필요하다고 가정한다.</p>\n<ul>\n<li>스터디 개설을 위해서는 <code class=\"language-text\">적어도 5명</code>의 스터디원이 필요하다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Students</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> <span class=\"token constant\">STUDENTS_MIN_SIZE</span> <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n \n <span class=\"token keyword\">private</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Student</span><span class=\"token punctuation\">></span></span> students<span class=\"token punctuation\">;</span>\n\n <span class=\"token keyword\">public</span> <span class=\"token class-name\">Students</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Student</span><span class=\"token punctuation\">></span></span> students<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token function\">validateSize</span><span class=\"token punctuation\">(</span>students<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>students <span class=\"token operator\">=</span> students<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n\n <span class=\"token keyword\">private</span> <span class=\"token keyword\">void</span> <span class=\"token function\">validateSize</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Student</span><span class=\"token punctuation\">></span></span> students<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>students<span class=\"token punctuation\">.</span><span class=\"token function\">size</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> <span class=\"token constant\">STUDENS_MIN_SIZE</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>스터디원의 수가 적절한지 <code class=\"language-text\">직접 검증</code>한다. 외부에 의존하여 검증을 진행하는 것이 아니라 상태와 행위를 일급 컬렉션 안에서 모두 진행할 수 있다.</p>\n<p>또한 <code class=\"language-text\">적어도 5명이 필요한 Student List</code>는 기존에 제공되는 자료구조가 아니다. 해당 비즈니스(스터디 개설 및 운영 시스템)에 <code class=\"language-text\">종속된 자료구조</code>로 <code class=\"language-text\">추가적인 요구사항</code>에 유연하게 대처할 수 있다.</p>\n<p>이제 Students에 대한 로직은 <code class=\"language-text\">자체적으로 처리</code>가 가능하다. Students는 오직 <code class=\"language-text\">스터디원에 대한 책임(검증 행위 등)</code>만 가질 수 있다.</p>\n<h2>References</h2>\n<p><a href=\"https://jojoldu.tistory.com/412\">일급 컬렉션 (First Class Collection)의 소개와 써야할 이유</a><br>\n<a href=\"https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/\">일급 컬렉션을 사용하는 이유</a></p>","frontmatter":{"title":"일급 컬렉션","date":"April 15, 2022","update":"April 15, 2022","tags":["java","일급 컬렉션"],"series":null},"fields":{"slug":"/first-class-collection/","readingTime":{"minutes":3.54}}},"seriesList":{"edges":[{"node":{"id":"984809e6-d465-5dfd-9c59-579d12581fac","fields":{"slug":"/immutable-object/"},"frontmatter":{"title":"불변 객체"}}},{"node":{"id":"fa92531f-b76e-587c-a42b-14dedd6e2cb1","fields":{"slug":"/first-class-collection/"},"frontmatter":{"title":"일급 컬렉션"}}},{"node":{"id":"2dac6856-47a1-5ef0-9c9f-d69d4234afcf","fields":{"slug":"/why-jdbc-template/"},"frontmatter":{"title":"JdbcTemplate는 어디에?"}}},{"node":{"id":"ab71a72e-f8d9-55e6-bdd4-66e8778b0b67","fields":{"slug":"/enum/"},"frontmatter":{"title":"enum"}}},{"node":{"id":"b77737b7-c888-54d0-8901-9921b4bbb703","fields":{"slug":"/spring-jdbc-batch/"},"frontmatter":{"title":"Spring JDBC로 batch 활용하기"}}},{"node":{"id":"59e94329-3d48-53b9-9995-90d61432234d","fields":{"slug":"/local-date-time/"},"frontmatter":{"title":"java에서 날짜, 시간 제대로 사용하기"}}},{"node":{"id":"c8dda97d-41c7-5596-a0c8-703fd69d92e7","fields":{"slug":"/identity-strategy/"},"frontmatter":{"title":"IDENTITY 전략는 추가 조회를 하지 않을 수 있다."}}},{"node":{"id":"c50af7e8-5953-5168-b4af-1d186a4254a7","fields":{"slug":"/separated-interface/"},"frontmatter":{"title":"외부와 의존성 분리하기"}}},{"node":{"id":"ba9d009e-d6e8-574f-9f7b-89819e3e57ca","fields":{"slug":"/properties-to-object/"},"frontmatter":{"title":"properties 객체로 다루기"}}},{"node":{"id":"7b780208-a850-5305-a51c-f0937cbdaf93","fields":{"slug":"/google-refresh-token/"},"frontmatter":{"title":"Google은 Refresh Token을 쉽게 내주지 않는다."}}},{"node":{"id":"b886feb1-ab24-59f0-8972-2d2b510ea407","fields":{"slug":"/mappedsuperclass-vs-embedded/"},"frontmatter":{"title":"@MappedSuperclass vs @Embedded"}}},{"node":{"id":"58f32f4d-b2d6-54d6-b3dd-cb4cf4da1d70","fields":{"slug":"/basic-tomcat/"},"frontmatter":{"title":"Tomcat"}}},{"node":{"id":"d26e840e-0646-5dd9-a2d5-5670ddc81ede","fields":{"slug":"/jdbc/"},"frontmatter":{"title":"JDBC"}}},{"node":{"id":"e0a32367-096e-595a-9580-0d3d2fc6e9aa","fields":{"slug":"/template-callback/"},"frontmatter":{"title":"jdbcTemplate을 만들며 마주한 Template Callback 패턴"}}},{"node":{"id":"fa938264-2615-556e-bcfa-d749c30aa8fe","fields":{"slug":"/covering-index/"},"frontmatter":{"title":"커버링 인덱스"}}},{"node":{"id":"cf3a2936-1b1f-5d11-832e-dbb9f8051755","fields":{"slug":"/osiv/"},"frontmatter":{"title":"OSIV와 사용하며 직면한 문제"}}},{"node":{"id":"53859931-2807-5303-a90d-33df33a856de","fields":{"slug":"/save-persist-merge/"},"frontmatter":{"title":"SimpleJpaRepository의 save()는 어떻게 새로운 엔티티를 판단할까?"}}},{"node":{"id":"09a96ca9-bb95-55ab-83cf-d9d053b2ad70","fields":{"slug":"/optimistic-locking/"},"frontmatter":{"title":"낙관적 락과 동시성 테스트"}}},{"node":{"id":"647737e4-08ec-5813-a092-c27ef1da4292","fields":{"slug":"/java-string/"},"frontmatter":{"title":"문자열 생성 방식 비교하기"}}},{"node":{"id":"696ee6ba-c2ea-5e8b-a25f-aaa4eccfa5e9","fields":{"slug":"/2022-retrospect/"},"frontmatter":{"title":"조금 늦은 2022년 회고"}}},{"node":{"id":"5a61e41a-16ff-5669-bf0e-028ea40e0af3","fields":{"slug":"/jpa-auditing/"},"frontmatter":{"title":"Spring Data JPA Auditing"}}}]},"previous":{"fields":{"slug":"/immutable-object/"},"frontmatter":{"title":"불변 객체"}},"next":{"fields":{"slug":"/why-jdbc-template/"},"frontmatter":{"title":"JdbcTemplate는 어디에?"}}},"pageContext":{"id":"fa92531f-b76e-587c-a42b-14dedd6e2cb1","series":null,"previousPostId":"984809e6-d465-5dfd-9c59-579d12581fac","nextPostId":"2dac6856-47a1-5ef0-9c9f-d69d4234afcf"}},"staticQueryHashes":[],"slicesMap":{}}
2 changes: 1 addition & 1 deletion page-data/google-refresh-token/page-data.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion page-data/identity-strategy/page-data.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions page-data/immutable-object/page-data.json

Large diffs are not rendered by default.

Loading

0 comments on commit 714066f

Please sign in to comment.