객체 모델과 관계형 데이터베이스 모델은 지향하는 패러다임이 서로 다르다. 문제는 이 차이를 극복하려고 개발자가 너무 많은 시간과 코드를 소비한다는 점이다. 자바 진영에서는 오랜 기간 이 문제에 대한 숙제를 안고 있었고, 패러다임의 불일치 문제를 해결하기 위해 많은 노력을 기울였다. 그 결과물이 바로 JPA이며, 패러다임의 불일치 문제를 해결재주고 정교한 객체 모델링을 유지하게 도와준다.
JPA(Java Persistence API) 자바 진영의 ORM 기술에 대한 API 표준 명세다. 애플리케이션과 JDBC 사이에서 동작한다.
JDBC(Java Database Connectivity) Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트하거나, 데이터베이스에 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API
ORM(Object-Relational Mapping) 객체와 관계형 데이터베이스를 매핑한다는 뜻.
ORM 프레임워크는 단순히 SQL을 개발자 대신 생성해서 데이터베이스에 전달해주는 것뿐만 아니라 다양한 패러다임의 불일치 문제들도 해결해준다. 자바 진영에도 다양한 ORM 프레임워크들이 있는데 그중에 하이버네이트 프레임워크가 가장 많이 사용된다.
하이버네이트라는 오픈소스 ORM 프레임워크는 EJB의 ORM 기술과 비교해서 가볍고 실용적이었다. 또한 자바 엔터프라이즈 서버 없이도 동작해서 많은 인기를 끄는데, 결국 EJB에서 하이버네이트를 기반으로 새로운 자바 ORM 기술 표준이 만들어졌는데 이것이 바로 JPA다. JPA는 쉽게 얘기해 인터페이스를 모아놓은 것이고, JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 선택해야 하는데 하이버네이트가 많이 사용된다.
왜 사용해야 하나?
1) 생산성 : JDBC API를 사용하는 지루하고 반복적인 일을 JPA가 대신 해준다. CRUD 같은... , 2) 유지보수, 3)패러다임의 불일치 해결, 4) 성능 5) 데이터 접근 추상화와 벤더 독립성 : 특정 데이터베이스 기술에 종속되지 않고, 변경이 자유롭다.
영속성 관리
엔티티 매니저는 엔티티를 저장, 수정, 삭제, 조회하는 등 엔티티와 관련된 모든 일을 처리한다. 개발자 입장에서 엔티티 매니저는 엔티티를 관리하는 관리자다. 엔티티 메니저는 엔티티를 저장하는 가상의 데이터베이스로 생각하면 된다. 데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 EntityManager Factory 하나만 생성한다.
// 공장 만들기, 비용이 큼.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook")
호출하면 .xml 정보를 바탕으로 생성한다. 이제부터 매니저를 생성하면 된다.
// 공장에서 엔티티 매니저 생성, 비용이 거의 안듬
EntityManager em = emf.createEntityManager();
엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드간 공유해도 되지만, 엔티티 메니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안된다.
엔티티 매니저는 DB 연결이 필요한 시점까지 커넥션을 얻지 않는다. 즉 트랙잭션을 시작할 때 커넥션을 획득한다. 하이버네이트를 포함한 JPA 구현체들은 emf를 성생할 때 커넥션풀도 만드는데 이것은 J2SE 환경에서 사용하는 방법이다.
영속성 컨텍스트 : 엔티티를 영구 저장하는 환경 엔티티 메니저로 엔티티를 저장하거나 조회하면 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
em.persist(member); 이 persist() 메서드는 엔티티 메니저를 사용해서 회원 엔티티를 영속성 컨텍스트에 저장한다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다. 그리고 엔티티 매니저를 통해 이에 접근할 수 있고, 관리할 수 있다.
엔티티에는 4가지 상태가 존재한다.
1. 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태
Member member = new Memeber();
member.setId("member1");
member.setUsername("회원1");
엔티티 객체를 생성하고, 순수한 객체 상태이다. 이는 비영속 상태다.
2. 영속 : 영속성 컨텍스트에 저장된 상태
em.persist(member);
엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장했다. 이렇게 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라고 한다.
3. 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태
em.detach(member);
em.close();
em.clear()
호출을 통해 영속성 컨텍스트를 관리하던 영속 상태의 엔티티는 준영속 상태가 된다.
4. 삭제 : 삭제된 상태
em.remove(member);
엔티티를 영속성 컨텍스트와 DB에서 삭제한다.
'Tech Interview > Interview' 카테고리의 다른 글
5. 질문 (웹 브라우저에 URL 전체 동작과정) (0) | 2024.03.09 |
---|---|
4. 질문 (Middleware) (0) | 2023.12.06 |
3. 질문 (Proxy & SpringBoot) (1) | 2023.11.30 |
2. 질문 (0) | 2023.11.27 |
1. 질문 (0) | 2022.07.20 |