• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

강사님 스프링 데이터 JPA에 대해 질문있습니다.

22.11.04 10:58 작성 조회수 488

3

안녕하세요 강사님 항상 강의 잘 보고 복습하고 있습니다.

다름이 아니고 책 463p중에 find() VS JPQL이라는 목차가 있습니다.

그리고 이번 회차에서 설명하진 스프링 데이터 JPA를 듣고, 궁금한점이 생겨서 질문드립니다.

책 545p중 '스프링 데이터 JPA는 메소드이름을 분석해서 JPQL 생성하고 실행한다' 라고 하셨으니 그럼 JpaRepository를 상속받은 Repository에 만든 모든 메소드는 먼저 영속성컨텍스트를 확인하지 않고 DB의 sql를 보낸 뒤 결과값을 영속성컨텍스트에 존재하는지 비교하는게 맞나요?

스프링데이터 JPA의 사용을 적극 권장한다는 문구도 책에 있어서, 그렇다면 강사님은 따로 em을 필드선언후 find하는 경우는 없으신가요? 있다면 em하고 Repository도 동시에 필드생성해서 사용하는 상황은 어떤경우일까요?

 

 

답변 1

답변을 작성해보세요.

3

David님의 프로필

David

2022.11.04

안녕하세요. 승윤님, 공식 서포터즈 David입니다.

  1. findById의 경우 내부적으로 entity manager의 find를 사용합니다. 따라서 모든 메서드가 jpql로 변환되어 데이터베이스에 쿼리하진 않습니다.image

    이와 달리 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()");
        }
    }


    image

  2. 대부분 Spring Data Jpa, JPQL을 통해 해결하시고 복잡한 통계성 쿼리나 특정 DB에 종속된 것들은 native query, jdbc template을 사용하십니다.

    https://www.inflearn.com/questions/250523

    https://www.inflearn.com/questions/14863

     

    의존관계의 경우 repository 내에 entity manager를 주입 받아서 작성할 것 같습니다.

    https://www.baeldung.com/spring-data-entitymanager

 

감사합니다.

승윤님의 프로필

승윤

질문자

2022.11.04

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