ORM(Object Relational Mapping)
▫ 뜻 : 자바와 같은 객체지향 언어에서 의미하는 객체와 RDB(Relational Database)의 테이블을 자동으로 매핑하는 방법
⚠ 객체의 클래스와 데이터베이스의 테이블의 속성은 정확하게 일치하진 않는다.
➡️ ORM 이 이 둘의 불일치와 제약사항을 해결하는 역할을 해준다.
▫ ORM의 장점
- 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다.
- 쿼리문을 작성하는 양이 줄어든다.
- 객체 지향적으로 DB에 접근할 수 있어 코드의 가독성이 높아진다.
- 재사용 및 유지 보수가 편리하다.
- 객체들은 각 클래스로 나누어져 있어 재사용 및 유지보수가 수월하다.
- 데이터베이스에 대한 종속성이 줄어든다.
- ORM을 통해 자동 생성된 SQL문은 객체를 기반으로 DB 테이블을 관리하기 때문에 DB에 종속적이지 않다.
▫ ORM의 단점
- ORM만으론 온전한 서비스를 구현하는데 한계가 있다.
- 복잡한 로직이 들어가는 서비스의 경우 직접 쿼리를 구현하지 않고 코드로 구현하기 어렵다.
JPA(Java Persistence API)
▫ 뜻 : 자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음
ORM에서 더 구체화된 스펙을 포함하는 것으로 실제 동작이라기 보단, 어떻게 동작해야 하는지 매커니즘을 정리한 표준 명세로 생각할 수 있다.
JPA의 특징
▫ 내부적으로 JDBC를 사용한다.
➡️ 개발자가 직접 JDBC를 구현할 경우, SQL에 의존하게 되어 개발의 효율성이 떨어지게 된다. 그러나 JPA는 적절한 SQL을 생성해주고 DB를 조작해서 객체를 자동 매핑해주어 개발의 효율성을 높여준다.
▫ JPA 기반의 구현체로는 크게 하이버네이트(Hibernate), 이클립스 링크(EclipseLink), 데이터 뉴클리어스(Data Nucleus)가 있으며, 가장 많이 사용되는 구현체는 하이버네이트(Hibernate)이다.
Spring Data JPA
▫ 뜻 : JPA를 편리하게 사용할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나이다.
Spring Data JPA의 기능
▫ CRUD 처리에 필요한 인터페이스를 제공해준다.
▫ 하이버네이트의 엔티티 매니저(Entity Manager)를 직접 다루지 않고 리포지토리를 정의해 사용함으로써
스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 조작한다.
영속성 컨텍스트
▫ 역할 : 애플리케이션과 데이터베이스 사이에서 엔티티와 레코드의 괴리를 해소하는 기능과
객체를 보관하는 기능을 수행한다.
영속성 컨텍스트의 특징
▫ 세션 단위의 생명주기를 가진다.
➡️ DB에 접근하기 위한 세션이 생성되면 영속성 컨텍스트가 만들어지고, 세션이 종료되면 영속성 컨텍스트도 같이 없어진다.
위의 과정에서 영속성 컨텍스트에 접근하기 위한 수단으로 엔티티 매니저가 사용된다.
✅ 엔티티 매니저
▫ 역할 : 엔티티를 관리하는 객체로, 데이터베이스에 접근해서 CRUD 작업을 수행해준다.
➡️ Spring Data JPA에서 Repository를 사용해서 DB에 접근하는데, 실제 내부 구현체인 SimpleJpaRepository에서 EntiityManger를 사용하는 것을 확인해볼 수 있다.
▫ 엔티티의 생명주기 : 영속성 컨텍스트에서 다음과 같은 4가지 상태로 구분된다.
비영속(New)
▫ 영속성 컨텍스트에 추가되지 않은 엔티티 객체의 상태
영속(Managed)
▫ 영속성 컨텍스트에 의해 엔티티 객체가 관리되는 상태
준영속(Detached)
▫ 영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태
삭제(Removed)
▫ 데이터베이스에서 레코드를 삭제하기 위해 영속성 컨텍스트에 삭제 요청을 한 상태
출처 : 스프링 부트 핵심 가이드 [장정우 지음]
'Programming > Spring' 카테고리의 다른 글
[Spring 🤔] - @Autowired vs @RequiredArgsConstructor (2) | 2024.02.22 |
---|---|
[Spring 🤔] - lombok @Builder, @NoArgsConstructor, @AllArgsConstructor의 사용에 대해 (0) | 2024.02.19 |
[Spring] - 스프링 (gradle) springdoc으로 Swagger3 추가하기 (0) | 2024.02.06 |
[Spring] - 스프링부트 API 작성 방법 : Post, Put, Delete Mapping (0) | 2024.02.06 |
[Spring] - 스프링부트 API 작성 방법 : GetMapping (0) | 2024.02.04 |