본문 바로가기

스프링 관련/스프링 프레임워크13

@Transactional 동작 원리 간략 설명 스프링에서는 @Transactional 어노테이션을 사용하면, 아래 이미지처럼 어노테이션이 붙은 클래스를 래핑한 클래스를 만들어서 실행하게 된다. (래핑한 클래스에는 해당 메서드 트랜잭션으로 처리하기 위한 로직이 들어가는 듯 하다.) @Transactional synchronized public void decrease(Long id, Long quantity){ Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(stock); } 2022. 9. 13.
API 만들 때 생길 수 있는 문제 (컬렉션 조회 최적화) public List findAllWithItem() { return em.createQuery( // JPA에서만의 기능으로 전체 row를 보는 것이 아닌 Order 엔티티만 봐서 중복 제거해서 보여준다. "select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", Order.class ).getResultList(); } 컬렉션 페치 조인을 사용하면 페이징이 불가능하다. 컬렉션 페치 조인은 1개만 사용할 수 있다. 컬렉션 조회 시 N + 1 문제 발생 해결 방법 1. 제약이 있는 fetch join .. 2022. 8. 28.
API 만들 때 생길 수 있는 문제 (지연 로딩과 조회 성능 최적화) 쿼리 방식 선택 권장 순서 1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다. 2. 필요시 페치 조인으로 성능을 최적화 한다. -> 대부분의 성능 이슈가 해결된다. 3. 그래도 안되면 DTO 로 직접 조회한다. 4. 그래도 안되면 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다. 1. Entity 순환참조 문제 (양방향 연관관계, 무한루프) 해결 -> 양방향 연관관계에서 한쪽은 @JsonIgnore 해야 한다. (json 응답 만들 때 관계를 끊어줘야 한다.) @JsonIgnore @OneToMany(mappedBy = "member") private List orders = new ArrayList(); 궁금증 : 그런데 이 문제는 HTTP R.. 2022. 8. 28.
springboot test data.sql 넣는 방법 https://wadekang.tistory.com/39 Spring JUnit5 Sql script로 테스트 데이터 불러오기 테스트를 할 때 sql로 미리 데이터를 insert 하고 해당 데이터로 테스트를 진행하고 싶을 경우 다음과 같이 설정하면 된다. 먼저 테스트 폴더에 resources 폴더를 만들어서 applciation.yml (or properties)을.. wadekang.tistory.com springboot test data.sql 넣는 방법 2022. 8. 25.