[백엔드] ORM - 엔티티

개발log·2024년 4월 19일

백엔드 기초지식

목록 보기
1/8
post-thumbnail

ORM

객체와 데이터베이스를 연결해 자바 언어로만 데이터베이스를 다룰 수 있게 하는 도구

  • ORM - 객체와 데이터베이스를 연결하는 프로그래밍 기법
  • JPA - 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
    • 엔티티는 영속성을 가진 객체를 의미
    • 엔티티 매니저는 엔티티를 관리하며 조회, 삭제, 수정, 생성하는 역할을 함
    • 엔티티 매니저를 만드는 곳이 엔티티 매니저 팩토리
    • 엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장한다는 특징이 있음
    • 영속성 컨텍스트는 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩의 특징을 가지고 있음
    • 엔티티의 상태는 분리, 관리, 삭제 상태로 나뉨
  • 하이버네이트 - JPA의 대표적인 구현체로, 자바 언어를 위한 ORM 프레임워크
  • 스프링 데이터 JPA - JPA를 쓰기 편하게 만들어놓은 모듈

장단점

장점

  • SQL을 직접 작성하지 않고 사용하는 언어로 데이터베이스에 접근 가능
  • 객체지향적으로 코드를 작성할 수 있기 때문에 비즈니스 로직에만 집중 가능
  • 데이터베이스 시스템이 추상화되어 있기 때문에 MySQL에서 PostgreSQL로 전환한다고 해도 추가로 드는 작업이 없음 - 데이터베이스 시스템에 대한 종속성이 줄어들음
  • 매핑하는 정보가 명확하기 때문에 ERD에 대한 의존도를 낮출 수 있고 유지보수할 때 유리

단점

  • 프로젝트의 복잡성이 커질수록 사용 난이도가 올라감
  • 복잡하고 무거운 쿼리는 ORM으로 해결이 불가능한 경우가 있음

JPA와 하이버네이트의 역할

  • JPA(Java Persistence API) : 자바 객체와 데이터베이스를 연결해 데이터를 관리, 객체 지향 도메인 모델과 데이터베이스의 다리 역할
  • 하이버네이트(Hibernate) : JPA의 인터페이스 구현, 내부적으로는 JDBC API를 사용

엔티티 매니저

엔티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할 수행, 엔티티를 영속성 컨텍스트에 저장

  • 엔티티 : 데이터베이스의 테이블과 직접 연결(매핑)되는 객체
  • 앤티티 매니저 팩토리 : 앤티티 매니저를 만드는 곳

스프링 부트가 엔티티 매니저를 사용하는 방법 예

  • 스프링 부트는 기본적으로 빈을 하나만 생성해서 공유하므로 동시성 문제가 발생할 수 있음
  • 그래서 실제로는 실제 엔티티 매니저와 연결하는 프록시(가짜) 엔티티 매니저 사용
@PersistenceContext
EntityManager em; /// 프록시 엔티티 매니저, 필요할 때 진짜 엔티티 매니저 호출

영속성 컨텍스트

엔티티를 관리하는 가상의 공간

특징

1차 캐시

내부에 1차 캐시를 가지고 있음

  • 캐시의 키 : @Id 애너테이션이 달린 기본키 역할을 하는 식별자
  • 값 : 엔티티

값이 없으면 데이터베이스에서 조회해 1차 캐시에 저장한 다음 반환

캐시된 데이터를 조회할 때는 데이터베이스를 거치지 않아도 되므로 매우 빠르게 데이터 조회 가능

쓰기 지연

트랜잭션을 커밋하기 전까지는 데이터베이스에 실제로 질의문을 보내지 않고 쿼리를 모았다가 트랜잭션을 커밋하면 모았던 쿼리를 한번에 실행하는 것

적당한 묶음으로 쿼리를 요청할 수 있어 데이터베이스 시스템의 부담을 줄일 수 있음

변경 감지

트랜잭션을 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 엔티티의 값을 비교해서 변경된 값이 있다면 변경 사항을 감지해 변경한 값을 데이터베이스에 자동으로 반영

적당한 묶음으로 쿼리 요청 가능, 데이터베이스 시스템의 부담을 줄일 수 있음

지연 로딩

쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 때 쿼리를 날려 데이터를 조회하는 것


이 특징들이 갖는 공통점은 모두 데이터베이스의 접근을 최소화해 성능을 높일 수 있다는 것이다.


엔티티의 상태

  • 분리 : 영속성 컨텍스트가 관리하고 있지 않음
  • 관리 : 영속성 컨텍스트가 관리함
  • 비영속 : 영속성 컨텍스트와 전혀 관계가 없음
  • 삭제

엔티티 상태 변경 예

public class EntityManagerTest {
	@Autowired
    EntityManager em;
    
    public void example() {
    	// 1. 엔티티 매니저가 엔티티를 관리하지 않는 상태(비영속 상태)
        Member member = new Member(1L, "홍길동");
        
        // 2. 엔티티가 관리되는 상태
        em.persist(member);
        
        //3. 엔티티 객체가 분리되는 상태
        em.detach(member);
        
        //4. 엔티티 객체가 삭제된 상태
        em.remove(member);
     }
}
profile
나의 개발 저장소

0개의 댓글