JPA란?
Java Persistence API의 약자로 자바 진영의 ORM 기술 표준이다.
JPA는 애플리케이션과 JDBC 사이에서 동작함
JPA를 왜 사용해야 하는가?
1. SQL 중심적인 개발에서 객체 중심으로 개발
2. 생산성 및 유지보수
3. 패러다임의 불일치 해결
4. 성능 등이 있다.
보통 SQL에서 저장, 조회, 수정 삭제 등을 하게 되면 아래와 같이 쿼리문을 작성해야 했다면
INSERT .. INTO ..
SELECT .. FROM ..
UPDATE .. SET ..
DELETE .. FROM ..
JPA에서는 아래와 같이 저장, 조회, 수정, 삭제가 가능하므로 생산성이 높아졌다.
jpa.persist(member); // 저장
Member member = jpa.find(memberId); // 조회
member.setName("변경할 이름"); // 수정
jpa.remove(member); // 삭제
또한, DB에서 필드가 변경된다면 모든 SQL을 수정해야했지만 JPA에서는 클래스 필드 하나만 추가해주면 된다.
JPA와 상속
만약 아래와 같은 DB 구조가 있다고 가정했을때의 저장 및 조회를 생각해보자
만약 개발자가 JPA를 통해 앨범을 저장한다고 하면 아래와 같이 호출하게 될 것이다.
jpa.persist(album);
이렇게 호출하게 되면 아래와 같이 쿼리문을 JPA가 자동으로 생성하고 실행을 해준다.
INSERT INTO ITEM ..
INSERT INTO ALBUM ..
만약 개발자가 JPA를 통해 앨범을 조회한다고 하면 아래와 같이 호출하게 될 것이다.
Album album = jpa.find(Album.class, albumId);
이렇게 호출하게 되면 아래와 같이 쿼리문을 JPA가 자동으로 생성하고 실행을 해준다.
SELECT I.*, A.*
FROM ITEM I
JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID
이뿐만 아니라 JPA에서는 연관관계를 통해 객체 그래프 탐색이 가능하다는점인데 아래의 예제를 보자.
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
조회된 member에서 team을 가져오기 위해 단순히 getTeam()을 사용한다는 점이다.
만약 SQL을 사용했다면 아래와 같이 Member라는 테이블에서 가지고 있는 teamId 컬럼(FK) JOIN을 사용해 Team을 조회했을 것이다.
SELECT t.*
FROM TEAM t
JOIN MEMBER m on m.team_id = t.team_id
복잡해 보이는 쿼리문에 비해 JPA가 더 직관적이고 간단해보인다. JPA는 성능면에서도 최적화를 보여준다.
JPA의 성능 최적화 기능
1. 1차 캐시와 동일성(identity) 보장
2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
3. 지연 로딩(Lazy Loading)
1차 캐시와 동일성 보장이라는것은 같은 트랜잭션 안에서는 같은 엔티티를 반환해준다는 점이다.
쓰기 지연이라는것은 트랜잭션을 커밋할 때까지 INSERT SQL을 모으고, JDBC BATCH SQL 기능을 사용해서 한번에 SQL을 전송한다.
보통 commit 전에 flush라는 과정을 거쳐 모아놓은 SQL을 DB에 보내주는 과정을 거치게 된다.
지연 로딩이라는것은 객체가 실제 사용될때 로딩된다는 것인데 즉시로딩과 비교하면 이해가 잘 될 것이다.
즉시 로딩은 JOIN SQL로 한번에 연관된 객체까지 미리 조회하는 것이다.
위의 예제를 본다면 지연 로딩의 경우 team.getName()을 호출할때 SELET * FROM TEAM 쿼리가 날라가는 반면,
즉시 로딩의 경우 memberDAO.find(memberId)를 호출할때 JOIN 문과 함께 TEAM의 정보를 가져오는걸 알 수 있다.
보통 지연 로딩으로 JPA를 설계하고 튜닝이 필요한 부분에 대하여 즉시 로딩을 한다고 한다..
출처: 인프런 자바 ORM 표준 JPA 강의
'JPA' 카테고리의 다른 글
영속성 컨텍스트의 개념 (0) | 2022.02.17 |
---|---|
엔티티(Entity)의 개념 (0) | 2022.02.17 |