spring boot

    Repository 단위 테스트

    Repository 단위 테스트

    @DataJpaTest와 @AutoConfigureTestDatabase를 이용해 Repository 메서드를 단위 테스트해보자. @DataJpaTest 기본적으로 JPA 관련 설정들을 로드한다. 기본적으로 인메모리 테스트 데이터베이스를 이용해 실제 데이터베이스를 이용하지 않고 사용하는 것이 가능하다. 또한, @Tranasactional을 가지고 있기 때문에 테스트가 진행된 이후 자동으로 롤백하는 것이 가능하다. @AutoConfigureTestDatabase 애노테이션 뜻 그대로 테스트 데이터베이스의 구성정보를 자동으로 설정해주는 애노테이션이다. 이 또한, @DataJpaTest에 가지고 있다. 위에서 기본적으로 인메모리 테스트 데이터베이스를 이용한다고 한 부분이 @AutoConfigureTestDat..

    [API 고급] 컬렉션 조회 최적화

    [API 고급] 컬렉션 조회 최적화

    “김영한 강사님의 JPA 활용편 2 - API 개발과 성능 최적화"를 듣고 간단하게 정리하기” OneToOne, ManyToOne과 같은 경우는 Fetch Join을 해주는 것으로 성능을 최적화 하는 것이 가능하다. ToMany(OneToMany)의 경우에는 Join을 하는 경우 N개의 컬럼으로 늘어나기 때문에 최적화에 어려움이 있다. Ex. 주문과 주문상품 관계로 주문 조회를 최적화 주문과 배송, 회원(ToOne관계), 주문상품(ToMany)을 조회한다. V1 : 엔티티를 직접 노출 (안좋은 방법) 주문상품과 주문한 상품의 상세 정보를 가져오기 위해서 Lazy 로딩이 설정되어 있는 프록시의 강제 초기화가 필요하다. 아래의 방법은 엔티티를 직접 노출하기 때문에 DTO로 변환해서 데이터를 화면에 전달해야한..

    [API 개발 고급] 지연 로딩과 조회 성능 최적화

    [API 개발 고급] 지연 로딩과 조회 성능 최적화

    “김영한 강사님의 JPA 활용편 2 - API 개발과 성능 최적화"를 듣고 간단하게 정리하기” 양방향 연관관계에서 직접 데이터를 반환하는 경우 서로가 서로를 참조하기 때문에 무한루프가 발생한다. Order -> Member -> Order -> Member ... 무한루프발생! 양방향 연관관계가 매핑된 엔티티 한 쪽에는 @JsonIgnore를 사용한다. 지연로딩으로 설정된 값은 DB에서 가져오지 않고 가짜 Proxy 객체를 생성하고 실제 객체에 접근하고자 할때 그 때 프록시가 쿼리를 날려서 DB에서 값을 가져온다. Hibernate5Module와 @JsonIgnore를 이용해 엔티티를 넘긴 경우 무한루프 없이 데이터를 조회해 오는 것이 가능하다. 지연 로딩을 피하기 위해서 즉시 로딩 (EAGER)로 변경..

    API 개발 기본 간단 정리

    API 개발 기본 간단 정리

    “김영한 강사님의 JPA 활용편 2- API 개발과 성능 최적화"를 듣고 간단하게 정리하기” @RestController는 기존 @Controller와 @ResponseBody가 합쳐진 형태이다. @RequestBody는 JSON으로 들어온 데이터를 받은 객체로 매핑해서 변환해준다. @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @Valid는 javax.validation을 검증한다. @Entity public class..

    도메인 개발 팁 간단 정리

    도메인 개발 팁 간단 정리

    "김영한 강사님의 JPA 활용편 1을 듣고 필요한 부분 간단하게 정리하기." JPA는 트랜잭션 안에서 이뤄지기 때문에 @Transactional을 선언해준다. 조회 시에는 @Transactional(readOnly = true)를 설정해주는 것이 조회 성능에 있어서 장점을 가진다. 따라서, 클래스 레벨에서 @Transaction(readOnly = true)로 설정해주고 C, U, D 부분에서 @Transactional을 사용해 메서드 레벨에서 관리한다. 메서드 레벨의 애노테이션이 클래스 레벨의 애노테이션보다 우선순위가 높다. @Transactional(readOnly = true) // 조회 성능에서 장점을 가진다. @Service public class Service { ... @Transaction..