728x90

java 98

페치 조인(fetch join) 의 활용

(JPA) 페치 조인(fetch join) 의 활용 JPQL에서 성능 최적화를 위해 제공하는기능입니다. 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능입니다. join fetch 명령어를 사용합니다. 페치 조인 예(v1(안쓴 버전), v2(쓴 버전) 비교) /** * V1. 엔티티를 조회해서 DTO로 변환(fetch join 사용X) * - 단점: 지연로딩으로 쿼리 N번 호출 */ @GetMapping("/api/v1/simple-orders") public List ordersV1() { List orders = orderRepository.findAll(); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(t..

JPA 2022.02.14

회원등록 API v1, v2 차이

회원등록 API v1, v2 차이 비교 회원등록 V1: 요청 값으로 Member 엔티티를 직접 받습니다. 문제점 엔티티에 프레젠테이션 계층을 위한 로직이 추가됩니다. 엔티티에 API 검증을 위한 로직이 들어갑니다. (@NotEmpty 등등) 실무에서는 회원 엔티티를 위한 API가 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 모든 요청 요구사항을 담기는 어렵습니다. 엔티티가 변경되면 API 스펙이 변합니다. 결론 - API 요청 스펙에 맞추어 별도의 DTO를 파라미터로 따로 생성하여 받는것이 좋습니다. @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){..

JPA 2022.02.14

변경 감지(dirty check)와 병합(merge)

(JPA)변경 감지와 병합(merge) 엔티티를 수정하는 2가지 방법으로 변경 감지(dirty checking)와 병합(merge)이 있습니다. 변경 감지 기능 사용 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법입니다. 트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 트랜잭션 커밋 시점에 변경 감지(Dirty Checking) 이 동작해서 데이터베이스에 UPDATE SQL 실행합니다. @Transactional void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티 Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한다. findItem.setP..

JPA 2022.02.14

스프링 부트 Test 예제(feat. assertj)

스프링 부트 Test 예제 @RunWith(SpringRunner.class) @SpringBootTest @Transactional @Rollback public class OrderServiceTest { @PersistenceContext EntityManager em; @Autowired OrderService orderService; @Autowired OrderRepository orderRepository; @Test public void 상품주문() throws Exception { //Given Member member = createMember(); Item item = createBook("시골 JPA", 10000, 10); //이름, 가격, 재고 int orderCount = 2;..

Spring 2022.02.14

(Querydsl) ON 절을 활용한 조인

(Querydsl) ON 절을 활용한 조인 /** * 예) 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 조회 * SQL: SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='teamA' */ @Test public void join_on_filtering() throws Exception { List result = queryFactory .select(member, team) .from(member) .leftJoin(member.team, team).on(team.name.eq("teamA")) .fetch(); for (Tuple tuple : result) { System.out.pr..

JPA 2022.02.14

queryDsl 기본 조인에 대해

(querydsl) 조인 - 기본 조인 조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정합니다. join(조인 대상, 별칭으로 사용할 Q타입) 예제 /** * 팀 A에 소속된 모든 회원 조회 */ @Test public void join() throws Exception { QMember member = QMember.member; QTeam team = QTeam.team; List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); assertThat(result) .extracting(..

JPA 2022.02.14

Q클래스 인스턴스 사용 방법 두가지

(JPA - Querydsl) Q클래스 인스턴스를 사용하는 방법에는 두 가지가 있습니다. QMember qMember = new QMember("m"); //별칭 직접 지정 (As-is) QMember qMember = QMember.member; //기본 인스턴스 사용 (To-be) 별칭 직접 지정 (As-is) 방법 @Test public void startQuerydsl2() { QMember m = new QMember("m"); Member findMember = queryFactory .select(m) .from(m) .where(m.username.eq("member1")) .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("memb..

JPA 2022.02.14

JPQL과 QueryDSL의 차이

JPQL과 Querydsl의 정의 JPQL(Java Persistence Query Language) JPA에서 제공하는 메서드 호출만으로 섬세한 쿼리 작성이 어려워서 생겨났습니다. JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회합니다. Querydsl SQL을 java로 type-safe하게 개발 할 수 있게 해주는 프레임워크 Querydsl -> JPQL -> SQL 와 같이 동작 JPQL을 편하게 사용할 수 있게 도와주는 빌더의 역할 @SpringBootTest @Transactional public class QuerydslBasicTest { @Autowired EntityManager em; JPAQueryFactory queryFactory; @BeforeEach //클래스에 ..

JPA 2022.02.14
728x90