해결된 질문
작성
·
626
3
안녕하세요 강사님 항상 강의 잘 보고 복습하고 있습니다.
다름이 아니고 책 463p중에 find() VS JPQL이라는 목차가 있습니다.
그리고 이번 회차에서 설명하진 스프링 데이터 JPA를 듣고, 궁금한점이 생겨서 질문드립니다.
책 545p중 '스프링 데이터 JPA는 메소드이름을 분석해서 JPQL 생성하고 실행한다' 라고 하셨으니 그럼 JpaRepository를 상속받은 Repository에 만든 모든 메소드는 먼저 영속성컨텍스트를 확인하지 않고 DB의 sql를 보낸 뒤 결과값을 영속성컨텍스트에 존재하는지 비교하는게 맞나요?
스프링데이터 JPA의 사용을 적극 권장한다는 문구도 책에 있어서, 그렇다면 강사님은 따로 em을 필드선언후 find하는 경우는 없으신가요? 있다면 em하고 Repository도 동시에 필드생성해서 사용하는 상황은 어떤경우일까요?
답변 1
3
안녕하세요. 승윤님, 공식 서포터즈 David입니다.
findById의 경우 내부적으로 entity manager의 find를 사용합니다. 따라서 모든 메서드가 jpql로 변환되어 데이터베이스에 쿼리하진 않습니다.
이와 달리 Query Method인 findByName을 만들어 테스트 해보면 데이터베이스로 쿼리 하는 걸 확인하실 수 있습니다.
@Entity
public class SpringDataJpaMember {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public interface SpringDataJpaMemberRepository extends JpaRepository<SpringDataJpaMember, Long> {
Optional<SpringDataJpaMember> findByName(String name);
}
@SpringBootTest
public class SpringDataJpaJpqlTest {
@Autowired
SpringDataJpaMemberRepository springDataJpaMemberRepository;
@Test
@Transactional
void SpringDataJpa의_QueryMethod는_JPQL로_변환되기_때문에_DB에_쿼리를_날린다() {
SpringDataJpaMember member = new SpringDataJpaMember();
member.setName("member1");
springDataJpaMemberRepository.save(member);
System.out.println("Called Save()");
springDataJpaMemberRepository.findById(member.getId());
System.out.println("Called FindById()");
springDataJpaMemberRepository.findByName(member.getName());
System.out.println("Called FindByName()");
}
}
대부분 Spring Data Jpa, JPQL을 통해 해결하시고 복잡한 통계성 쿼리나 특정 DB에 종속된 것들은 native query, jdbc template을 사용하십니다.
https://www.inflearn.com/questions/250523
https://www.inflearn.com/questions/14863
의존관계의 경우 repository 내에 entity manager를 주입 받아서 작성할 것 같습니다.
감사합니다.
오! 정말 감사합니다!! 덕분에 해결됐습니다