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

승윤님의 프로필 이미지
승윤

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

스프링 데이터 JPA 소개

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

해결된 질문

작성

·

626

3

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

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

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

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

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

 

 

답변 1

3

안녕하세요. 승윤님, 공식 서포터즈 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

 

감사합니다.

승윤님의 프로필 이미지
승윤
질문자

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

승윤님의 프로필 이미지
승윤

작성한 질문수

질문하기