From d630c568e49f03235fa1aafdde090deb783f9a08 Mon Sep 17 00:00:00 2001 From: jinho jeong Date: Tue, 3 May 2022 16:43:58 +0900 Subject: [PATCH] post command repository --- .../post/dao/PostCommandRepository.java | 9 ++ .../domain/post/dao/PostQueryRepository.java | 14 +++ .../post/dao/PostQueryRepositoryImpl.java | 40 +++++++++ .../oneul/domain/post/domain/Post.java | 6 +- .../service/command/PostCommandService.java | 14 +++ .../command/PostCommnadServiceImpl.java | 44 ++++++++++ .../repository/PostCommandServiceTest.java | 86 +++++++++++++++++++ 7 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/oneul/domain/post/dao/PostCommandRepository.java create mode 100644 src/main/java/com/example/oneul/domain/post/dao/PostQueryRepository.java create mode 100644 src/main/java/com/example/oneul/domain/post/dao/PostQueryRepositoryImpl.java create mode 100644 src/main/java/com/example/oneul/domain/post/service/command/PostCommandService.java create mode 100644 src/main/java/com/example/oneul/domain/post/service/command/PostCommnadServiceImpl.java create mode 100644 src/test/java/com/example/oneul/repository/PostCommandServiceTest.java diff --git a/src/main/java/com/example/oneul/domain/post/dao/PostCommandRepository.java b/src/main/java/com/example/oneul/domain/post/dao/PostCommandRepository.java new file mode 100644 index 0000000..28044fd --- /dev/null +++ b/src/main/java/com/example/oneul/domain/post/dao/PostCommandRepository.java @@ -0,0 +1,9 @@ +package com.example.oneul.domain.post.dao; + +import com.example.oneul.domain.post.domain.Post; + +public interface PostCommandRepository{ + Post save(Post post); + Post update(Post post); + void delete(Long id); +} diff --git a/src/main/java/com/example/oneul/domain/post/dao/PostQueryRepository.java b/src/main/java/com/example/oneul/domain/post/dao/PostQueryRepository.java new file mode 100644 index 0000000..c4bd437 --- /dev/null +++ b/src/main/java/com/example/oneul/domain/post/dao/PostQueryRepository.java @@ -0,0 +1,14 @@ +package com.example.oneul.domain.post.dao; + +import java.util.Optional; + +import com.example.oneul.domain.post.domain.Post; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PostQueryRepository extends CrudRepository{ + Optional findById(Long id); + Iterable findAll(); +} diff --git a/src/main/java/com/example/oneul/domain/post/dao/PostQueryRepositoryImpl.java b/src/main/java/com/example/oneul/domain/post/dao/PostQueryRepositoryImpl.java new file mode 100644 index 0000000..b5ea4bd --- /dev/null +++ b/src/main/java/com/example/oneul/domain/post/dao/PostQueryRepositoryImpl.java @@ -0,0 +1,40 @@ +package com.example.oneul.domain.post.dao; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.LockModeType; +import javax.transaction.Transactional; + +import com.example.oneul.domain.post.domain.Post; + +import org.springframework.data.jpa.repository.Lock; +import org.springframework.stereotype.Repository; + +@Repository +@Transactional +public class PostQueryRepositoryImpl implements PostCommandRepository { + private final EntityManager em; + + public PostQueryRepositoryImpl(EntityManagerFactory entityManagerFactory){ + this.em = entityManagerFactory.createEntityManager(); + } + + @Override + public Post save(Post post) { + em.persist(post); + return post; + } + + @Override + @Lock(LockModeType.PESSIMISTIC_WRITE) + public Post update(Post post){ + return em.merge(post); + } + + @Override + public void delete(Long id){ + em.createQuery("delete from Post where id = :id") + .setParameter("id", id) + .executeUpdate(); + } +} diff --git a/src/main/java/com/example/oneul/domain/post/domain/Post.java b/src/main/java/com/example/oneul/domain/post/domain/Post.java index c7190a0..40e3731 100644 --- a/src/main/java/com/example/oneul/domain/post/domain/Post.java +++ b/src/main/java/com/example/oneul/domain/post/domain/Post.java @@ -30,7 +30,7 @@ public class Post { @Access(AccessType.PROPERTY) @ManyToOne(fetch = FetchType.LAZY, optional = false) private UserEntity writer; - + public Post() {} public Post(Long id, LocalDateTime createdAt, String content, UserEntity writer){ @@ -99,6 +99,10 @@ public class Post { + "]"; } + public static Builder builder() { + return new Builder(); + } + public static class Builder { private Long id; private String content; diff --git a/src/main/java/com/example/oneul/domain/post/service/command/PostCommandService.java b/src/main/java/com/example/oneul/domain/post/service/command/PostCommandService.java new file mode 100644 index 0000000..d255339 --- /dev/null +++ b/src/main/java/com/example/oneul/domain/post/service/command/PostCommandService.java @@ -0,0 +1,14 @@ +package com.example.oneul.domain.post.service.command; + +import javax.servlet.http.HttpSession; + +import com.example.oneul.domain.post.domain.Post; + +import org.springframework.stereotype.Service; + +@Service +public interface PostCommandService { + Post createPost(Post post, HttpSession httpSession); + Post updatePost(Long id, Post post, HttpSession httpSession); + void deletePost(Long id, HttpSession httpSession); +} diff --git a/src/main/java/com/example/oneul/domain/post/service/command/PostCommnadServiceImpl.java b/src/main/java/com/example/oneul/domain/post/service/command/PostCommnadServiceImpl.java new file mode 100644 index 0000000..c06e640 --- /dev/null +++ b/src/main/java/com/example/oneul/domain/post/service/command/PostCommnadServiceImpl.java @@ -0,0 +1,44 @@ +package com.example.oneul.domain.post.service.command; + +import javax.servlet.http.HttpSession; + +import com.example.oneul.domain.post.dao.PostCommandRepository; +import com.example.oneul.domain.post.domain.Post; +import com.example.oneul.domain.user.domain.UserEntity; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class PostCommnadServiceImpl implements PostCommandService{ + private final PostCommandRepository postCommandRepository; + + private final Logger log = LoggerFactory.getLogger(PostCommnadServiceImpl.class); + + public PostCommnadServiceImpl(PostCommandRepository postCommandRepository){ + this.postCommandRepository = postCommandRepository; + } + + @Override + public Post createPost(Post post, HttpSession httpSession){ + UserEntity userEntity = (UserEntity) httpSession.getAttribute("user"); + return postCommandRepository.save( + Post.builder() + .content(post.getContent()) + .writer(userEntity) + .build()); + } + + @Override + public Post updatePost(Long id, Post post, HttpSession httpSession){ + return new Post(); + } + + @Override + public void deletePost(Long id, HttpSession httpSession){ + + } +} diff --git a/src/test/java/com/example/oneul/repository/PostCommandServiceTest.java b/src/test/java/com/example/oneul/repository/PostCommandServiceTest.java new file mode 100644 index 0000000..3e2d2af --- /dev/null +++ b/src/test/java/com/example/oneul/repository/PostCommandServiceTest.java @@ -0,0 +1,86 @@ +package com.example.oneul.repository; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.example.oneul.domain.post.dao.PostCommandRepository; +import com.example.oneul.domain.post.domain.Post; +import com.example.oneul.domain.user.dao.UserRepository; +import com.example.oneul.domain.user.domain.UserEntity; + +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; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.junit.jupiter.Testcontainers; + +@Testcontainers +@ActiveProfiles("test") +@SpringBootTest +public class PostCommandServiceTest { + @Autowired private PostCommandRepository postCommandRepository; + @Autowired private UserRepository userRepository; + + static { + GenericContainer redis = new GenericContainer("redis:3-alpine") + .withExposedPorts(6379); + redis.start(); + + System.setProperty("spring.redis.host", redis.getContainerIpAddress()); + System.setProperty("spring.redis.port", redis.getFirstMappedPort() + ""); + } + + private UserEntity createTestUser(){ + return userRepository.save(UserEntity.builder() + .username("test user") + .password("test pw") + .build()); + } + + @Test + public void saveTest(){ + UserEntity testUser = createTestUser(); + + Post post = Post.builder() + .content("test content") + .writer(testUser) + .build(); + + Post createdPost = postCommandRepository.save(post); + + assertEquals(false, createdPost.getId() == null); + assertEquals(post, createdPost); + } + + @Test + public void updateTest(){ + UserEntity testUser = createTestUser(); + + Post post = Post.builder() + .content("test content") + .writer(testUser) + .build(); + + Post createdPost = postCommandRepository.save(post); + createdPost.setConent("updated"); + + Post updatedPost = postCommandRepository.update(createdPost); + + assertEquals(createdPost, updatedPost);; + } + + // TODO: 왜 Transaction이 없다고 할까 + @Test + public void deleteTest(){ + UserEntity testUser = createTestUser(); + + Post post = Post.builder() + .content("test content") + .writer(testUser) + .build(); + + Post createdPost = postCommandRepository.save(post); + Long id = createdPost.getId(); + postCommandRepository.delete(id); + } +}