JPA Repository
JPA란 ?
JPA 사용 이유
프로젝트를 진행하면서 JPA 를 사용하는 이유는 SQL문을 작성할 필요가 없다는 이유였다. 즉, 편리해서였다.
근데 나중에 면접에서 왜 “JPA 를 사용하셨어요?” 라는 질문에 “편리해서요” 라고 답하는 걸 상상했을 때, 이건 아니다 싶었다. 그래서 JPA를 사용하는 이유에 대해 알아보고싶어졌다.
1. 생산성이 증가하기 때문이다.
- 반복되는 SQL 코드를 JPA 가 내부에서 알아서 처리하기 때문에 코드를 간소화 할 수 있다.
- JPA 가 제공하는 매우 간단한 메서드로 CRUD 가 가능하다.
- 따라서 비즈니스 로직에 집중을 할 수 있다.
2. 유지보수 및 리팩토링에 유리하기 때문이다.
- 기존에는 필드가 변경되거나, 추가가 될 경우 모든 SQL 코드와 JDBC 코드를 수정해야한다.
- JPA 를 사용하면 그냥 필드만 추가해주면 SQL 은 JPA 가 알아서 처리해준다.
3. 객체와 관계형 데이터베이스 사이의 패러다임 불일치를 해결하기 때문이다.
패러다임 불일치란 ?
객체는 상속, 추상화, 캡슐화, 다형성 등과 같은 특징이 존재한다. 하지만 객체를 저장할 때 상속을 받았거나, 다른 객체를 참조하고 있을 경우 참조가 되지 않거나, 상속을 받지 못하는 경우가 발생한다. 즉, 관계형 DB 는 객체가 가지고 있는 특징들을 가지고 있지 않기에 발생하는 문제이다.
- JPA 는 이러한 상속, 연관관계, 객체 그래프 탐색, 비교와 같은 패러다임 불일치를 해결한다.
4. 성능 최적화가 가능하다.
- 엔티티를 영속성 컨텍스트에 저장하기 때문이다.
영속석 컨텍스트 특징
- 1차 캐시 : 엔티티를 조회할 경우, 1차 캐시에서 데이터를 조회하고 값이 있으면 반환, 없으면 DB 에서 1차 캐시로 저장하여 반환한다 → 빠른 조회가 가능하다.
- 추가로 같은 트랜잭션 안에서 식별자가 같을 경우 같은 엔티티로 인식한다.
- 예시
@Test @Transactional public void testMember() throws Exception { // given Member member = new Member(); member.setUsername("memberA"); // when Long findId = memberRepository.save(member); Member findMember = memberRepository.find(findId); // then Assertions.assertThat(member).isEqualTo(findMember); // 이 테스트는 통과됨 }
- 쓰기 지연 : 트랜잭션 ( 작업 ) 을 commit ( 완료 ) 하기 전까지 쿼리를 모았다가 한 번에 실행한다 → DB의 부담을 줄일 수 있다.
- 변경 감지 : commit 이 되면 1차 캐시에 저장되어 있는 값과, 현재의 값을 비교하여 DB에 자동으로 반영한다. → DB의 부담을 줄일 수 있다.
- 지연 로딩 : 쿼리로 요청한 데이터를 바로 가져오는 것이 아닌, 사용하는 시점에 불러와 사용하는 방식이다.
TMI
프로젝트를 진행하면서 특정 카테고리에 해당하는 목록들을 출력해야 하는 상황이 있었는데 JPARepository 를 상속받는 Repository 인터페이스에 아래 코드 한 줄만 추가해주니 알아서 쿼리문을 날려주었다… 신기했다.
List<TodoEntity> findByCategoryId(Long categoryId);
'waffle' 카테고리의 다른 글
[waffle] 아이셔팀 중간정리 - Backend (0) | 2024.01.07 |
---|---|
[waffle] 아이셔팀 중간정리 - Android (0) | 2024.01.07 |
[waffle] 아이셔팀 중간정리 - FrontEnd (1) | 2024.01.07 |
[waffle] Bibs 팀 중간정리 - iOS client (UIkit/SwiftUI) (2) | 2024.01.06 |
[waffle] Bibs 팀 중간정리 - Design (1) | 2024.01.06 |