인프런 커뮤니티 질문&답변

djeuskwiwhe님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

@Query, 값, DTO 조회하기

테스트 코드 문의

작성

·

97

·

수정됨

0

  1. DTO 쿼리 작성 시 join fetch로 작성하는 경우는 에러가 발생하고 join으로 작성하는 경우에는 에러가 발생하지 않았는데요. join fetch의 개념은 결국 지연로딩을 작동시키지 않고 한 번에 연관된 것들 다 가져온다는 것인데 왜 여기선 안 되는 것인지 궁금합니다.

  2. 엔티티 @Query문하고 DTO @Query 테스트 코드를 돌렸는데 서로 영향을 미쳐 테스트가 실패라고 뜹니다. @Transactional을 붙여 롤백이 되게끔 하여 해결은 했지만 궁금한 점이 있습니다. 스프링 데이터 JPA 테스트를 돌릴 때 @SpringBootTest 어노테이션 붙이면 자동으로 롤백이 되는 것이 아닌가요?

package study.springdatajpa.repository;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.springdatajpa.domain.Member;
import study.springdatajpa.domain.Team;
import study.springdatajpa.dto.MemberDto;

import java.util.List;

@SpringBootTest
class MemberRepositoryTest {

	@Autowired private MemberRepository memberRepository;
	@Autowired private TeamRepository teamRepository;

	@Test
	@Transactional
	void testQuery() {
		Member m1 = new Member("AAA", 10);
		Member m2 = new Member("BBB", 20);

		memberRepository.save(m1);
		memberRepository.save(m2);

		List<Member> result = memberRepository.findUser("AAA", 10);
		Assertions.assertThat(result.get(0)).isEqualTo(m1);
	}

	@Test
	@Transactional
	void testDtoQuery() {
		Team team = new Team("teamA");
		teamRepository.save(team);

		Member m1 = new Member("AAA", 10);
		Member m2 = new Member("BBB", 20);
		m1.setTeam(team);
		m2.setTeam(team);
		memberRepository.save(m1);
		memberRepository.save(m2);

		List<MemberDto> dtoList = memberRepository.findUserDto();
		Assertions.assertThat(dtoList.size()).isEqualTo(2);
	}
}

답변 1

0

안녕하세요. dhwiwnwnf님, 공식 서포터즈 y2gcoder입니다.

 

  1. 간단하게 말씀드리면 fetch join 은 대상이 되는 연관 엔티티 까지 같이 영속화해주는 기능입니다. 즉 엔티티 대상으로 하는 기능이기 때문에 기본적으로 DTO는 대상이 아닙니다!

  2. 테스트 시 자동 롤백 기능은 테스트 코드의 @Transactional 에 달려 있습니다!

 

감사합니다.

djeuskwiwhe님의 프로필 이미지
djeuskwiwhe
질문자

감사합니다
다시 한 번 짚고 넘어갈 수 있었습니다