스프링/스프링 기초DB
-
스프링 트랜잭션 전파 - REQUIREDS_NEW (물리 트랜잭션 분리)스프링/스프링 기초DB 2023. 4. 2. 15:10
외부 트랜잭션과 내부 트랜잭션을 분리해서 사용하는 방법이 있다. 내부 트랜잭션에서 문제가 발생하여 롤백해도 외부 트랜잭션에 영향을 주지 않는다거나 반대로 외부 트랜잭션에 문제가 발생해도 내부 트랜잭션에 영향을 주지 않고 각각의 물리 트랜잭션을 사용하는 방법이다. @Test void inner_rollback_requires_new() { log.info("외부 트랜잭션 시작"); TransactionStatus outer = txManger.getTransaction(new DefaultTransactionDefinition()); log.info("outer.isNewTransaction()={}", outer.isNewTransaction()); log.info("내부 트랜잭션 시작"); Defaul..
-
스프링 트랜잭션 전파(propagation)스프링/스프링 기초DB 2023. 4. 2. 14:38
트랜잭션을 하는 도중에 트랜잭션 안에서 또 다른 트랜잭션이 중첩으로 사용해야 할 경우가 있다. 이러한 것을 트랜잭션 전파(propagation)이라고 한다. 로직1 안에서 로직2이 수행되고 두 로직 다 트랜잭션을 사용한다면 로직2는 내부 트랜잭션이 된다. 이러한 경우에는 두 로직을 하나의 물리 트랜잭션으로 설정하고 그 안의 로직들은 논리 트랜잭션으로 간주한다. 여기서 중요한 것은 둘 중 어떠한 로직이라도 롤백되면 전체의 트랜잭션이 롤백되고, 모든 로직이 커밋되어야지만 커밋된다는 것이다. 외부 트랜잭션이나 내부 트랜잭션 둘 중 하나라도 롤백되면 하나만 롤백되는 것이 아니라 전체가 롤백된다는 뜻이다. 트랜잭션은 커밋을 하면 끝나기 때문에 내부 트랜잭션이 커밋되어도 commit을 하지않고 무시된다. 내부 트랜..
-
체크예외와 언체크(런타임) 예외에서의 트랜잭션스프링/스프링 기초DB 2023. 4. 1. 15:48
스프링에서 체크 예외와 언체크 예외에서의 트랜잭션이 다르게 진행된다. 체크 예외 : 비즈니스 의미가 있을 때 사용 언체크 예외 : 복구 불가능한 예외 체크 예외일 때는 트랜잭션이 커밋되고 언체크 예외에서는 트랜잭션이 롤백된다. @Transactional(rollbackFor = MyException.class) 물론 체크 예외에서도 롤백을 하고 싶다면 위와 같이 rollbackFor을 넣어주면 롤백을 하게된다. OrderService.class @Slf4j @Service @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepository; // JPA는 트랜잭션 커밋 시점에 Order 데이터를 ..
-
트랜잭션 AOP 주의사항 - 프록시 내부 호출스프링/스프링 기초DB 2023. 4. 1. 14:09
@Slf4j @SpringBootTest public class InternalCallV1Test { @Autowired CallService callService; @Test void printProxy() { log.info("callService class={}", callService.getClass()); } @Test void internalCall() { callService.internal(); } @Test void externalCall() { callService.external(); } @TestConfiguration static class InternalCallV1TestConfig { @Bean CallService callService() { return new CallSer..
-
데이터 접근 기술 - Querydsl스프링/스프링 기초DB 2023. 3. 28. 14:04
스프링 데이터 JPA로 db를 작성했더니 훨씬 편해진 것을 확인할 수 있다. 하지만 동적 쿼리는 아직도 복잡하고 어렵기 때문에 이런 것들을 간편하게 해주는 Querydsl라는 기능이 있다. @Repository @Transactional public class JpaItemRepositoryV3 implements ItemRepository { private final EntityManager em; private final JPAQueryFactory query; public JpaItemRepositoryV3(EntityManager em) { this.em = em; this.query = new JPAQueryFactory(em); } Querydsl이라는 기능을 사용하기 위해서는 EntityMa..
-
스프링 데이터 JPA스프링/스프링 기초DB 2023. 3. 26. 17:03
스프링 데이터 JPA는 JPA 기술을 더 편리하게 사용할 수 있도록 스프링 프레임워크에서 지원하는 기능이다. public interface SpringDataJpaItemRepository extends JpaRepository { List findByItemNameLike(String itemName); List findByPriceLessThanEqual(Integer price); // 쿼리 메서드 (아래 메서드와 같은 기능 수행) List findByItemNameLikeAndPriceLessThanEqual(String itemName, Integer price); // 너무 길어서 좋지 않은 방법이다 // 쿼리 직접 실행 @Query("select i from Item i where i.ite..
-
데이터 접근 기술 - JPA스프링/스프링 기초DB 2023. 3. 26. 15:41
데이터 접근을 할 때 가장 많이 사용되는 JPA라는 것을 공부할 것인데, 내용이 방대하기 때문에 블로그를 따로 만들어서 정리하고 여기서는 기본적인 내용만 살짝 공부할 것이다. db와 자바 객체간의 융합으로 쿼리를 일일이 짜지 않아도 JPA가 db에 쿼리를 넘겨주는 기술이다. @Data @Entity public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // db에서 값을 넣어주는거니까 뒤와같이 IDENTITY private Long id; @Column(name = "item_name", length = 10) private String itemName; private Integer price; private Integer..
-
db 테스트에서의 트랜잭션스프링/스프링 기초DB 2023. 3. 25. 16:18
db를 테스트코드를 이용해서 테스트해 볼 것이다. test에 있는 application.properties에 spring.profiles.active=test spring.datasource.url=jdbc:h2:tcp://localhost/~/testcase spring.datasource.username=sa spring.datasource.password= 를 추가해줘서 데이터베이스에 연결할 수 있도록 해줬다. class ItemRepositoryTest { @Autowired ItemRepository itemRepository; @AfterEach void afterEach() { //MemoryItemRepository 의 경우 제한적으로 사용 if (itemRepository instance..