-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
- Loading branch information
There are no files selected for viewing
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
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\"><</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<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\"><</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\"><</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\"><</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\"><</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\"><</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\"><</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":{}} |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.