jpa
This commit is contained in:
@@ -1,50 +0,0 @@
|
||||
package com.example.oneul.domain.post.dao;
|
||||
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import com.example.oneul.domain.post.domain.Post;
|
||||
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
|
||||
|
||||
public class PostCommandJdbcRespositoryImpl implements PostCommandRepository {
|
||||
private final JdbcTemplate jdbcTemplate;
|
||||
|
||||
public PostCommandJdbcRespositoryImpl(DataSource dataSource){
|
||||
this.jdbcTemplate = new JdbcTemplate(dataSource);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Post save(Post post){
|
||||
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
|
||||
jdbcInsert.withTableName("post").usingGeneratedKeyColumns("id");
|
||||
|
||||
Map<String, Object> parameters = new HashMap<>();
|
||||
parameters.put("content", post.getContent());
|
||||
parameters.put("writer", post.getWriter());
|
||||
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
|
||||
post.setId(key.longValue());
|
||||
|
||||
return new Post();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Post update(Post post){
|
||||
return new Post();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteById(Long id){
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(Post post){
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
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 PostCommandJpaRepositoryImpl implements PostCommandRepository {
|
||||
private final EntityManager em;
|
||||
|
||||
public PostCommandJpaRepositoryImpl(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 deleteById(Long id){
|
||||
Post post = em.createQuery("select p from Post p where p.id = :id", Post.class)
|
||||
.setParameter("id", id)
|
||||
.getSingleResult();
|
||||
delete(post);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(Post post){
|
||||
em.remove(post);
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,10 @@ package com.example.oneul.domain.post.dao;
|
||||
|
||||
import com.example.oneul.domain.post.domain.Post;
|
||||
|
||||
public interface PostCommandRepository{
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
public interface PostCommandRepository extends CrudRepository<Post, Long> {
|
||||
Post save(Post post);
|
||||
Post update(Post post);
|
||||
void deleteById(Long id);
|
||||
void delete(Post post);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import javax.persistence.Entity;
|
||||
import javax.persistence.EntityListeners;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.ManyToOne;
|
||||
|
||||
@@ -21,7 +22,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||
@Entity
|
||||
@EntityListeners(AuditingEntityListener.class)
|
||||
public class Post {
|
||||
@Id @GeneratedValue
|
||||
@Id @GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Long id;
|
||||
@CreatedDate
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
package com.example.oneul.global.config;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import com.example.oneul.domain.post.dao.PostCommandJdbcRespositoryImpl;
|
||||
import com.example.oneul.domain.post.dao.PostCommandRepository;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class JdbcConfig {
|
||||
private final DataSource dataSource;
|
||||
|
||||
public JdbcConfig(DataSource dataSource){
|
||||
this.dataSource = dataSource;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PostCommandRepository postCommandRepository(){
|
||||
return new PostCommandJdbcRespositoryImpl(dataSource);
|
||||
}
|
||||
}
|
||||
@@ -7,14 +7,10 @@ import com.example.oneul.domain.post.dao.PostQueryRepository;
|
||||
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 com.example.oneul.global.config.JdbcConfig;
|
||||
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
import org.testcontainers.containers.GenericContainer;
|
||||
import org.testcontainers.junit.jupiter.Testcontainers;
|
||||
@@ -23,7 +19,7 @@ import org.testcontainers.junit.jupiter.Testcontainers;
|
||||
@ActiveProfiles("test")
|
||||
@SpringBootTest
|
||||
public class PostCommandRepositoryTest {
|
||||
private PostCommandRepository postCommandRepository;
|
||||
@Autowired private PostCommandRepository postCommandRepository;
|
||||
@Autowired private PostQueryRepository postQueryRepository;
|
||||
@Autowired private UserRepository userRepository;
|
||||
|
||||
@@ -35,23 +31,18 @@ public class PostCommandRepositoryTest {
|
||||
System.setProperty("spring.redis.host", redis.getContainerIpAddress());
|
||||
System.setProperty("spring.redis.port", redis.getFirstMappedPort() + "");
|
||||
}
|
||||
|
||||
@BeforeAll
|
||||
public void init(){
|
||||
ApplicationContext ac = new AnnotationConfigApplicationContext(JdbcConfig.class);
|
||||
postCommandRepository = ac.getBean("postCommandRepository", PostCommandRepository.class);
|
||||
}
|
||||
|
||||
private UserEntity createTestUser(){
|
||||
return userRepository.save(UserEntity.builder()
|
||||
.username("test user")
|
||||
private UserEntity getOrCreateTestUser(){
|
||||
return userRepository.findByUsername("test_user").orElseGet(() ->
|
||||
userRepository.save(UserEntity.builder()
|
||||
.username("test_user")
|
||||
.password("test pw")
|
||||
.build());
|
||||
.build()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveTest(){
|
||||
UserEntity testUser = createTestUser();
|
||||
UserEntity testUser = getOrCreateTestUser();
|
||||
|
||||
Post post = Post.builder()
|
||||
.content("test content")
|
||||
@@ -66,7 +57,7 @@ public class PostCommandRepositoryTest {
|
||||
|
||||
@Test
|
||||
public void updateTest(){
|
||||
UserEntity testUser = createTestUser();
|
||||
UserEntity testUser = getOrCreateTestUser();
|
||||
|
||||
Post post = Post.builder()
|
||||
.content("test content")
|
||||
@@ -76,28 +67,14 @@ public class PostCommandRepositoryTest {
|
||||
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);
|
||||
postCommandRepository.delete(createdPost);
|
||||
Post updatedPost = postCommandRepository.save(createdPost);
|
||||
Post savedPost = postQueryRepository.findById(updatedPost.getId()).orElse(null);
|
||||
assertEquals(updatedPost, savedPost);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deleteByIdTest(){
|
||||
UserEntity testUser = createTestUser();
|
||||
UserEntity testUser = getOrCreateTestUser();
|
||||
|
||||
Post post = Post.builder()
|
||||
.content("test content")
|
||||
@@ -107,5 +84,6 @@ public class PostCommandRepositoryTest {
|
||||
Post createdPost = postCommandRepository.save(post);
|
||||
System.out.println("post id: " + post.getId());
|
||||
postCommandRepository.deleteById(createdPost.getId());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user