인프런 커뮤니티 질문&답변
강사님 스프링 데이터 JPA에 대해 질문있습니다.
해결된 질문
작성
·
702
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를 주입 받아서 작성할 것 같습니다.
감사합니다.






오! 정말 감사합니다!! 덕분에 해결됐습니다