ORM - JPA

바그다드·2023년 3월 27일
0

ORM

  • Object Relation Mapping(객체 관계 매핑)

    객체는 객체대로 관계형 데이터베이스는 관계형 데이터베이스대로 설계를 하고, ORM프레임워크가 중간에서 매핑해주는 기술

  • 예를 들어 ORM으로 JPA를 사용한다고 했을 때
  1. DAO가 찾고자 하는 객체를 요청하면,
  2. jpa가 필요한 slq을 작성하여 db에 요청한다.
  3. db가 결과 엔티티를 반환하면,
  4. jpa가 결과 엔티티를 자바 객체와 매핑하여 반환해준다.
    • 여기서 패러다임의 불일치를 해결해주는데 이건 아래에서 설명하겠다.

JPA (Java Persistence API)

JPA는 인터페이스의 모음으로서 Hibernate, EclipseLinke, DataNucleus라는 3가지 구현체가 있다.

JPA를 사용 이유

1.SQL중심 개발에서 객체 중심 개발

생산성

저장: jpa.persist(member)
조회: Member member = jpa.find(memberId)
수정: member.setName(“변경할 이름”)
삭제: jpa.remove(member)
  • 이처럼 엔티티로 관리하는 객체를 간단한 메서드를 이용하여 CRUD를 구현할 수 있다!!!
  • 덕분에 생산성을 높이고, 유지보수가 용이해졌다.
    - 예를 들어 컬럼을 하나 추가해야 하는 상황이 발생하면 관련된 쿼리문을 수정하려면 머리가 아찔해진다. 그 컬럼에 영향을 받는 쿼리는 다 수정을 해야한다ㅜㅜ

2.패러다임의 불일치

1. 상속


위와 같은 데이터가 있다고 가정하였을 때,

  • 자바는 상속 관계가 발생하는 반면에
  • DB는 다른 테이블의 기본키를 가져와 이 외래키를 기본키로서 활용하는 방식을 활용한다.

때문에 코드를 작성한다고 하면 자바에서는 album이 필요하면 album만 가져다 쓰면 되지만,
db에서는 item과 album테이블 모두를 참조해야 하는데,
이를 JPA같은 ORM이 해결해 준다.

// jpa
jpa.persist(album);
//sql
INSERT INTO ITEM ...
INSERT INTO ALBUM ...

2. 연관관계와 객체 그래프 탐색

  • 자바 객체 Member가 Team이라는 객체와 연관관계가 있을때(예를 들어 필드로 Team을 가지고 있을때) 자바에서는 Member를 이용해 Team에 쉽게 접근이 가능하다.
  • DB에서는 member가 가지고 있는 team의 참조 값을 이용하여 조인을 해야 team에 접근할 수 있다.

3. 캐시와 동일성 보장

String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
  • 이러한 코드를 이용하여 값을 비교한다고 했을때, MyBatis의 경우 new(), setter()등을 이용하여 객체를 생성하기 때문에 값을 두 개의 값을 비교해보면 false를 반환한다.
    하지만 jpa는 동일한 트랜잭션 안에서 조회한 엔티티는 true를 반환한다.
    - 이는 jpa의 캐시 기능 덕분인데, 같은 트랜잭션 안에서 같은 엔티티를 조회한다면, 캐시를 이용하여 같은 엔티티를 반환하기 때문이다.

4. 지연

  • jpa는 insert문을 바로 커밋하지 않고 모았다가 커밋을 할 때 한꺼번에 sql문을 전송한다.

5. 지연로딩과 즉시 로딩

Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName();
  • 위와 같이 Jpa를 이용하여 Member와 Team을 조회한다고 하였을 때, 두 개의 select문을 이용하여 조회하거나 join을 이용하여 하나의 select문으로 조회할 수 있을 것이다.
  • Jpa는 여기서 두 개의 방법을 지원하는데,
  1. 지연 로딩(lazy)
    코드를 보면 Member를 먼저 조회하는 것을 확인할 수 있는데, 지연 로딩을 사용하면 Member에 관한 쿼리를 먼저 수행하고, Team을 조회할 때 추가로 Team에 관한 쿼리를 수행한다.
    - 이 때 Team엔티티는 프록시를 이용하여 임시로 값을 저장해준다.
  2. 즉시 로딩(eager)
    반먼에 즉시 로딩으로 설정을 하면, join을 통해 Member와 Team을 한번에 가져올 수 있다.
    - 다만 이 경우, 조회하는 한번에 조회하는 데이터가 많아진다.
profile
꾸준히 하자!

0개의 댓글