Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

발전하는 개발자가 되자

JPA, ORM 그리고 영속성 본문

개발공부/CS

JPA, ORM 그리고 영속성

백경훈 2019. 2. 9. 15:27

jpa,orm 에 대해 알아보자

  1. jpa 와 orm 이란
  2. entity 와 데이터베이스 맵핑 방법
  3. 영속성

jpa 와 orm

jpa 와 orm에 대해 맛보기로 알아보자.

JPA란 무엇인가?

Java Persistence API 자바진영의 ORM 기술 표준이다. Hibernate, EclipesLink, dataNucleus

ORM이란 무엇인가?

Object-Relational Mapping

  • ORM이란 객체와 DB의 테이블이 매핑을 이루는 것을 말합니다. 객체를 데이터베이스에 저장할 때 INSERT SQL 을 직접 작성하는게 아니라 객체를 마치 자바 컬렉션에 저장하듯이 ORM프레임워크에 저장하면 된다.

JPA 사용하면 장점

  • 생산성
  • 유지보수
  • 패러다임의 불일치 해결
  • 성능

jpa 를 사용하는 이유

객체 모델과 관계형 데이터베이스 모델은 지향하는 패러다임이 서로 다르다. 이 패러다임의 차이를 극복하려고 개발자가 너무 많은 기회비용을 사용한다. 정교한 객체 모델링을 할수록 패러다임의 불일치 문제가 더 커진다. 이 패러다임의 불일치 문제를 해결하기 위해 나온 것이 JPA 이다.

  • sql 명령어를 jpa 대신 해주고 entity 객체와 DB 를 맵핑 해준다.
class Member {

    String id;      //MEMBE_ID 컬럼 사용
    Long teamId;    //TEAM_ID FK 컬럼 사용
    String userName;//USERNAME 컬럼 사용

}

class Team {
    Long id;    //TEAM_ID PK 사용
    String name;//NAME 컬럼 사용
}

//Team team = member.getTeam(); 와 같이 참조 해 사용 불가능

class Member {

    String id;      //MEMBE_ID 컬럼 사용
    Team teamId;    //참조로 연관관계를 맺는다.
    String userName;//USERNAME 컬럼 사용

}

class Team {
    Long id;    //TEAM_ID PK 사용
    String name;//NAME 컬럼 사용
}

Team team = member.getTeam(); // 사용 가능

ENTITY 의 생명주기

엔티티는 4가지 상태가 존재한다.

  • 비영속 : 엔티티 객체를 생성만 하고 영속 컨텍스트에 저장하지 않은 상태 DB와 연결이 안되있다. 순수 객체 상태

  • 영속 : 영속성 컨텍스트에 저장된 상태

  • 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태

  • 삭제: 삭제된 상태


영속성

엔티티 매니저를 통해서 엔티티를 영속성 컨텍스트에 저장한 것.

  • 영속성 컨텍스트(persistence context) : 엔티티를 영구 저장하는 환경 데이터베이스와 영속성 컨텍스트를 통해 연결되있는 엔티티(객체)

영속성 컨텍스트의 특징

  1. 영속성 컨텍스트는 엔티티를 식별자 값 으로 구분한다 (@Id로 테이블의 기본 키와 매핑한 값)
  2. 영속성 컨텍스트와 데이터베이스 저장
    • 영속성 컨텍스트에 엔티티를 저장하면 트랜잭션을 커밋하는 순간 DB에 반영한다. 이것을 flush 라 한다. 변기 물 내리는거다.
  3. 장점
    • 1차 캐시
    • 동일성 보장
    • 트랜잭션을 지원하는 쓰기 지연
    • 변경 감지
    • 지연 로딩

1차 캐시

영속성 컨텍스트에는 캐시를 가지고 있는데 이걸 1차 캐시라 한다. map으로 @id로 맵핑한 식별자를 key, 엔티티 인스턴스를 값으로 가진다. 엔티티 메니져를 통해 엔티티 값을 찾을 때 1차케시를 먼저 찾고 없으면 DB에서 찾아 1차 캐시로 가져와 사용한다.

동일성 보장

영속성 컨텍스트는 성능상 이점과 엔티티의 동일성을 보장한다. 동일성 : 실제 인스턴스가 같다. == 동등성 : equals() 매소드로 비교

  • ex
String memberId = "100";
Memner memner1 = memberDAO.getMember(memberId);
Memner memner2 = memberDAO.getMember(memberId);
member1 == member2; // fales 다르다.
// JPA는 같은 트랜젝션일 때 같은 객체가 조회되는 것을 보장한다.
String memberId = "100";
Memner memner1 = memberDAO.getMember(memberId);
Memner memner2 = memberDAO.getMember(memberId);
member1 == member2; // ture

변경 감지

변경감지란 영속성 컨텍스트가 관리하는 엔티티 객체를 수정하고 트랜젝션을 커밋하면 DB에 자동으로 반영이 되는 것을 말한다.

지연 로딩

데이터를 저장하면 등록 쿼리를 모아 트랜젝션을 커밋할때 한번에 보낸후 커밋한다. 이걸 통해 성능 최적화가 가능하다.

영속성 전이

question 과 answer 이 있다. question 을 save 하면 cascade 되어있는 answer 도 같이 영속화 된다. 이걸 영속성 전이 라고 한다. CascadeType enum에 정의 되어 있으며 enum값에는 ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH 가 있다.

  • all : 모든 동작허용
  • persist : 부모를 persist 하면 자식도 같이 persist (영속화 한다)
  • merge : 부모를 수정하면 자식도 수정된다.
  • remove : 부모를 지우면 자식도 지워진다.
  • refresh :
  • detach

출처

출처: 주니어를 탈출하고 싶은 개발자의 블로그
출처: 머루의개발블로그

Comments