1) 개념
1-1) ORM(Object Relational Mapping)
JPA의 본격적인 설명에 앞서 설명을 드려야 할 부분이 있습니다.
JPA가
ORM은 하나의 프레임워크로
Java 환경에서 구현하기 위한 표준 명세이기 때문입니다.
ORM(Object Relational Mapping)은 객체지향 언어 의 DB 와의 연결 단순화하여 간편한 사용을 돕는 역할을 수행합니다.
기존의
DB와의 연결을 도와주는 역할은 주로
MyBatis가 수행했습니다만 전형적인
ORM인
JPA나
Hibernate와는 다르게
SQL 구문을 직접 관리하였습니다.
1-2) JPA(Java Persistent API)
JPA(Java Persistent API)는 ORM 프레임워크의 일종으로 DBMS에서 받아오는 데이터와 Java 기반의 개발환경에서 객체 와 일치시켜 값을 받아오는 기능을 수행합니다.
즉, 인터페이스 역할을 수행하기 때문에
DAO 에서의 별다른
SQL 구문에 대한 관리가 필요하지 않게 된것입니다.
2) 장단점
2-1) 장점
-
유지보수
- SQL구문이 따로 작성되지 않아 가독성이 좋고 간편하게 수정이 가능
- 컬럼이 추가될 경우 해당 칼럼만 DTO 혹은 VO 에 추가
- DBMS의 종류가 변경되더라도 SQL 구문의 수정이 필요없음
-
객체지향 프로그래밍
- SQL이 중심이 아닌 객체가 중심이 되어 개발이 진행
-
생산성 향상
- 객체만 전달하면 되므로 SQL 구문을 직접 작성하지 않아 프로그래밍의 생산성이 향상
2-2) 단점
-
성능문제
- 필요 시점에만 데이터를 가져오기 위해 쿼리가 여러번 실행되어 해당 쿼리와 연관된 엔티티들을 가져오기 위해 DB 에 부담 발생
- 규모가 커질 수록 메모리 소비가 높아질 수 있음
-
쿼리 작성
- 특정 상황에서 기능을 지원하지 않을 수 있기 때문에 한계가 존재
- 복잡한 쿼리 작성에 있어 직관적이지 않을 수 있음
3) 사용방식
3-1) Entity
Entity는 테이블과 매핑하여 데이터를 저장하는 클래스입니다.
Entity를 구성하기위해 사용되는
어노테이션은 아래와 같습니다.
- @Entity
- @Table
- @Column
또한
Entity는 다음과 같은 생명주기를 가지게 됩니다.
- 비영속 : 영속성 컨텍스트와 관계가 없는 상태
- 영속 : 영속성 컨텍스트에 저장된 상태
- 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제 : 엔티티를 관련 메서드를 통해 데이터와 함께 삭제
3-2) Entity Manager
Entity Manager는 Entity를 CRUD를 기반으로 하는 관리 역할을 수행합니다.
3-2-1) Create(생성)
EntityManager entityManager;
VelogEntity velogEntity = new VelogEntity();
velogEntity.setUserId("velog");
velogEntity.setUserPw("Qwer");
eintityManager.getTransaction().begin();
eintityManager.merge(velogEntity);
entityManager.getTransaction().commit();
3-2-2) Read(조회)
EntityManager entityManager;
VelogEntity velogEntity = entityManager.find(VelogEntity.class, entityId);
System.out.println(velogEntity.getUserId());
System.out.println(velogEntity.getUserPw());
3-2-3) Update(수정)
EntityManager entityManager;
VelogEntity velogEntity = entityManager.find(VelogEntity.class, entityId);
velogEntity.setUserId("git");
velogEntity.setUserPw("github12");
velogEntity.getTransaction().begin();
velogEntity.merge(velogEntity);
velogEntity.getTransaction().commit();
3-2-4) Delete(삭제)
EntityManager entityManager;
VelogEntity velogEntity = entityManager.find(VelogEntity.class, entityId);
velogEntity.getTransaction().begin();
velogEntity.remove(velogEntity);
velogEntity.getTransaction().commit();