1. Persistence 영속성
- 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성
- 일반적으로 데이터베이스에 저장하면 영속성이 생긴다.
Persistence Layer
- 프로그램 아키텍쳐에서 데이터에 영속성을 부여해주는 계층
- 데이터베이스 역할과 관련된 계층이라고 보면 된다.
- java에서는 jdbc를 이용한 직접 구현과 framework를 이용한 개발 두 가지가 존재하지만 후자를 더 많이 사용한다.
2. Persistence Framework
- JDBC보다 간단하게 데이터베이스와 연동가능. 빠른 개발과 안정적인 구동이 장점
- 두 종류가 존재한다. SQL Mapper와 ORM
- 예시: JPA, Hibernate, Mybatis
1) SQL Mapper와 ORM
- ORM은 디비 객체를 자바 객체로 매핑함으로써 SQL이 자동 생성되지만 SQL Mapper는 SQL을 명시해 주어야 한다.
- ORM은 RDB의 관계를 객체에 반영하는 것이 목적. SQL Mapper는 단순히 필드를 매핑시키는 것이 목적
SQL Mapper
- SQL <-- 매핑 --> Object 필드
- sql 문장으로 직접 디비를 다룬다.
ex) Mybatis, JdbcTemplates
ORM
- 디비 데이터 <--매핑--> Object 필드
- 객체를 통해 간접적으로 디비 데이터를 다룸
- sql이 아닌 메서드로 데이터 조작 가능
- persistant API라고도 할 수 있다.
ex) JPA, Hibernate
3. JDBC , JPA/Hibernate, Mybatis
1) JDBC(Java Database Connectivity)
- Java에서 DB에 접근할 수 있도록 하는 API
- 모든 Persistance Framework은 내부적으로 JDBC API를 사용함.
2) JPA(Java Persistent API)
- 자바 ORM 기술에 대한 API표준 명세로 Java에서 제공하는 API
- ORM을 사용하기 위한 표준 인터페이스를 모아둔 것 -> Hibernate도 JPA 구현체의 일부임
- 기존에 Entity Bean을 대체하는 기술이다.
- 구성요소 3가지
: javax.persistance 패키지로 정의된 api 그 자체, JPQL(Java Persistence Query Language), 객체/관계 메타 데이터
- 사용자가 원하는 JPA 구현체를 선택해서 사용할 수 있다. 이 때 구현체들을 ORM Framework라고 부름.
ex) Hibernate, EclipseLink, DataNucleus, OpenJPA 등
3) Hibernate
- JPA 구현체 중 하나
- 내부에선 JDBC API가 쓰이고 있음. 개발자 대신에 Hibernate가 대신 해주는 것 뿐
- HQL(Hibernate Query Language)라 불리는 강력한 쿼리 언어를 포함한다.
- HQL의 특징
- SQL과 비슷하며 추가적인 컨벤션 정의 가능
- 완전히 객체 지향적. 상속, 다형성, 관계 등 객체 지향의 강점을 누릴 수 있다.
- 자바 클래스와 property를 제외하고 대소문자를 구분한다.
- 쿼리 결과로 객체를 반환. 프로그래머에 의해 생성되고 직접 접근 가능.
- 여러 테이블 작업 시 명시적인 join을 요구하지 않는다.
- 장점
- 비즈니스 로직에 집중 가능. 객체 지향 개발이 용이
- 테이블 생성, 변경, 관리가 쉽다.
- 쿼리보다는 객체자체에 집중한 로직 개발 가능
- 빠른 개발 가능
- 단점
- 어렵다.
- 잘못 사용시 데이터 손실이 있을 수 있음
- 성능 문제가 있을 수도
4) Mybatis
- SQL Mapper의 일종
- 자바 객체를 실제 sql문에 연결함으로써 빠른 개발과 편리한 테스트 환경을 제공
- 장점
- sql에 대한 모든 컨트롤을 하고자 할 때 매우 적합
- sql 쿼리들이 최적화되어 있을 때 유용
- 단점
- 어플리케이션과 데이터베이스 간의 설계에 대한 모든 조작을 하고자 할 때에는 적합하지 않다.
참고:
gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html
'개발 > java spring' 카테고리의 다른 글
[java spring] maven 이란 (0) | 2020.09.22 |
---|---|
[java spring] Bean: Scope와 Injection (0) | 2020.03.25 |
댓글