diff --git a/src/main/java/com/yam/app/account/domain/Account.java b/src/main/java/com/yam/app/account/domain/Account.java index 4a75657..27a8d44 100644 --- a/src/main/java/com/yam/app/account/domain/Account.java +++ b/src/main/java/com/yam/app/account/domain/Account.java @@ -4,10 +4,12 @@ import com.yam.app.common.EntityStatus; import java.time.LocalDateTime; import java.util.UUID; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.ToString; @Getter @ToString(exclude = "password") +@NoArgsConstructor public final class Account { private Long id; diff --git a/src/main/java/com/yam/app/article/domain/Article.java b/src/main/java/com/yam/app/article/domain/Article.java index 68d1553..924cf8e 100644 --- a/src/main/java/com/yam/app/article/domain/Article.java +++ b/src/main/java/com/yam/app/article/domain/Article.java @@ -6,11 +6,15 @@ import com.yam.app.common.EntityStatus; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.ToString; @Getter @ToString +@NoArgsConstructor +@EqualsAndHashCode(of = "id") public final class Article { private Long id; diff --git a/src/main/java/com/yam/app/article/domain/ArticleReader.java b/src/main/java/com/yam/app/article/domain/ArticleReader.java index a57bf3e..d33947c 100644 --- a/src/main/java/com/yam/app/article/domain/ArticleReader.java +++ b/src/main/java/com/yam/app/article/domain/ArticleReader.java @@ -1,7 +1,10 @@ package com.yam.app.article.domain; +import java.util.Optional; + public interface ArticleReader { Article findByTitle(String title); + Optional
findById(Long articleId); } diff --git a/src/main/java/com/yam/app/article/domain/ArticleTag.java b/src/main/java/com/yam/app/article/domain/ArticleTag.java index a0ac60b..c40cf77 100644 --- a/src/main/java/com/yam/app/article/domain/ArticleTag.java +++ b/src/main/java/com/yam/app/article/domain/ArticleTag.java @@ -1,10 +1,12 @@ package com.yam.app.article.domain; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.ToString; @Getter @ToString +@NoArgsConstructor public final class ArticleTag { private Long id; diff --git a/src/main/java/com/yam/app/article/domain/Tag.java b/src/main/java/com/yam/app/article/domain/Tag.java index 6d81854..8a10d75 100644 --- a/src/main/java/com/yam/app/article/domain/Tag.java +++ b/src/main/java/com/yam/app/article/domain/Tag.java @@ -1,10 +1,12 @@ package com.yam.app.article.domain; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.ToString; @Getter @ToString +@NoArgsConstructor public final class Tag { private Long id; diff --git a/src/main/java/com/yam/app/article/infrastructure/MybatisArticleRepository.java b/src/main/java/com/yam/app/article/infrastructure/MybatisArticleRepository.java index 2327044..e05f09e 100644 --- a/src/main/java/com/yam/app/article/infrastructure/MybatisArticleRepository.java +++ b/src/main/java/com/yam/app/article/infrastructure/MybatisArticleRepository.java @@ -3,6 +3,7 @@ package com.yam.app.article.infrastructure; import com.yam.app.article.domain.Article; import com.yam.app.article.domain.ArticleReader; import com.yam.app.article.domain.ArticleRepository; +import java.util.Optional; import org.mybatis.spring.SqlSessionTemplate; public final class MybatisArticleRepository implements ArticleReader, ArticleRepository { @@ -28,4 +29,9 @@ public final class MybatisArticleRepository implements ArticleReader, ArticleRep public Article findByTitle(String title) { return template.getMapper(ArticleReader.class).findByTitle(title); } + + @Override + public Optional
findById(Long articleId) { + return template.getMapper(ArticleReader.class).findById(articleId); + } } diff --git a/src/main/java/com/yam/app/common/configuration/EntityStatusTypeHandler.java b/src/main/java/com/yam/app/common/configuration/EntityStatusTypeHandler.java index 33baf30..6528e4d 100644 --- a/src/main/java/com/yam/app/common/configuration/EntityStatusTypeHandler.java +++ b/src/main/java/com/yam/app/common/configuration/EntityStatusTypeHandler.java @@ -6,8 +6,10 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedTypes; import org.apache.ibatis.type.TypeHandler; +@MappedTypes(EntityStatusTypeHandler.class) public final class EntityStatusTypeHandler implements TypeHandler { @Override diff --git a/src/main/java/com/yam/app/member/domain/Member.java b/src/main/java/com/yam/app/member/domain/Member.java index 6252632..bcfb242 100644 --- a/src/main/java/com/yam/app/member/domain/Member.java +++ b/src/main/java/com/yam/app/member/domain/Member.java @@ -2,10 +2,12 @@ package com.yam.app.member.domain; import com.yam.app.common.EntityStatus; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.ToString; @Getter @ToString +@NoArgsConstructor public final class Member { private Long id; diff --git a/src/main/resources/mapper/xml/ArticleCommandMapper.xml b/src/main/resources/mapper/xml/ArticleCommandMapper.xml index e69de29..dcf93fc 100644 --- a/src/main/resources/mapper/xml/ArticleCommandMapper.xml +++ b/src/main/resources/mapper/xml/ArticleCommandMapper.xml @@ -0,0 +1,11 @@ + + + + + + + INSERT INTO ARTICLE(title, content, image, status, created_at, modified_at, member_id) + VALUES (#{title}, #{content}, #{image}, #{status}, #{createdAt}, #{modifiedAt}, #{authorId}) + + + diff --git a/src/main/resources/mapper/xml/ArticleQueryMapper.xml b/src/main/resources/mapper/xml/ArticleQueryMapper.xml index e69de29..d5863d8 100644 --- a/src/main/resources/mapper/xml/ArticleQueryMapper.xml +++ b/src/main/resources/mapper/xml/ArticleQueryMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/xml/ArticleTagMapper.xml b/src/main/resources/mapper/xml/ArticleTagMapper.xml index e69de29..15dd66b 100644 --- a/src/main/resources/mapper/xml/ArticleTagMapper.xml +++ b/src/main/resources/mapper/xml/ArticleTagMapper.xml @@ -0,0 +1,11 @@ + + + + + + + INSERT INTO ARTICLE_TAG(article_id, tag_id) + VALUES (#{articleId}, #{tag.id}) + + + diff --git a/src/main/resources/sql/dml.sql b/src/main/resources/sql/dml.sql index 6826056..ab5b238 100644 --- a/src/main/resources/sql/dml.sql +++ b/src/main/resources/sql/dml.sql @@ -14,3 +14,16 @@ insert into account(email, email_check_token, email_check_token_generated_at, em values ('rebwon@gmail.com', 'emailchecktoken1', now(), true, now(), now(), '$2a$10$EqbMbYB0vcZnuA5CClqa9uiLDnjA6pCjxn208ZchzA2q3ofqnkhcq', false, 'DEFAULT', 1, 'ALIVE'); + +insert into article(title, content, image, status, created_at, modified_at, member_id) +values ('sample-title', 'sample-content', 'sample.png', 'ALIVE', now(), now(), 1); + +insert into tag(name) +values ('hibernate'), + ('spring'), + ('jpa'); + +insert into article_tag(article_id, tag_id) +values (1, 1), + (1, 2), + (1, 3); diff --git a/src/test/java/com/yam/app/article/domain/FakeArticleRepository.java b/src/test/java/com/yam/app/article/domain/FakeArticleRepository.java index 7864887..6a6f986 100644 --- a/src/test/java/com/yam/app/article/domain/FakeArticleRepository.java +++ b/src/test/java/com/yam/app/article/domain/FakeArticleRepository.java @@ -1,6 +1,7 @@ package com.yam.app.article.domain; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; @@ -17,6 +18,13 @@ public final class FakeArticleRepository implements ArticleRepository, ArticleRe .get(); } + @Override + public Optional
findById(Long articleId) { + return data.values().stream() + .filter(a -> a.getId().equals(articleId)) + .findFirst(); + } + @Override public void save(Article entity) { entity.setId(idGenerator.incrementAndGet()); diff --git a/src/test/java/com/yam/app/article/infrastructure/MybatisArticleRepositoryTests.java b/src/test/java/com/yam/app/article/infrastructure/MybatisArticleRepositoryTests.java index 97b7b7f..48391c8 100644 --- a/src/test/java/com/yam/app/article/infrastructure/MybatisArticleRepositoryTests.java +++ b/src/test/java/com/yam/app/article/infrastructure/MybatisArticleRepositoryTests.java @@ -1,2 +1,34 @@ -package com.yam.app.article.infrastructure;public final class MybatisArticleRepositoryTests { +package com.yam.app.article.infrastructure; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.yam.app.article.domain.Article; +import com.yam.app.article.domain.ArticleReader; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest +@ActiveProfiles("test") +@Disabled +final class MybatisArticleRepositoryTests { + + @Autowired + private ArticleReader articleReader; + + @Test + void articleReader_find_by_title() { + Article article = articleReader.findByTitle("sample-title"); + + assertThat(article).isNotNull(); + } + + @Test + void articleReader_find_by_id() { + Article article = articleReader.findById(1L).get(); + + assertThat(article.getTags().size()).isEqualTo(3); + } }