데이터 액세스 계층-JDBC
JDBC
: Java Database Connectivity
Java 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를 데이터베이스에 저장 및 업데이트하거나 반대로 데이터베이스에 저장된 데이터를 Java코드 레벨에서 사용할 수 있도록 해주는 Java에서 제공하는 표준 API
- JDBC 드라이버 : 데이버베이스와의 통신을 담당하는 인터페이스
- Oracle, MySQL과 같은 다양한 벤더에서 해당 벤더에 맞는 JDBC드라이버를 구현해 제공하고 우리는 제공된 구현체를 이용해 사용한다.
Connection Pool
- 애플리케이션 로딩 시점에서 Connection 객체를 미리 생성해두고 데이터베이스에 연결이 필요한 경우, 미리 만들어 둔 Connection 객체를 사용하하면서 애플리케이션의 성능 향상은 물론이고 객체를 생성하는데에 사용되는 비용을 절감할 수 있다.
- Connection Pool : Connection객체를 미리 만들어 저장하고 필요할 때, 해당 객체를 제공해주는 역할을 하는 일종의 Connection 관리자
Spring Data JDBC
- Spring JDBC를 ORM기술로 더 편리하게 사용하기 위해 만들어진 기술
SQL 중심 기술과 ORM 중심 기술
SQL 중심 기술
- Spring JDBC가 대표적인 SQL 중심 기술이다.
- 데이터베이스에 접근하기 위해 애플리케이션 내부에서 직접적으로 SQL문을 작성한다.
- 현재도 사용되고 있는 기술이기는 하나 Java는 객체 지향 프로그래밍 언어이므로 SQL 중심 기술보다는 객체 중심 기술인 ORM으로 이전하고 있는 추세이다.
ORM 중심 기술
: Object-Relational Mapping
- 직접 SQL 쿼리문을 작성하는 것이 아니라 Java 객체를 이용해 애플리케이션 내부에서 해당 객체를 SQL 쿼리문으로 자동 변환해 데이터베이스에 접근하는 기술
- 대표적으로 JPA가 있다.
엔티티(Entity) 클래스 설계
: Spring Data JDBC기반의 데이터 액세스 계층을 연동하기 위해서 가장 먼저 해야 할 인은 데이터베이스의 데이블과 도메인 엔티티 클래스의 설계이다.
@Entity
: 클래스 레벨에 추가하는 애너테이션으로 해당 클래스는 데이버베이스의 테이블과, 해당 클래스의 필드 변수는 데이터베이스 테이블의 컬럼과 매핑된다.
- name 애트리뷰트를 추가하지 않으면 클래스이름으로 테이블 명이 생성된다.
☝️ Order 클래스의 경우
Order 클래스는 이름 그대로 테이블 명으로 들어간다면, SQL 쿼리문에 ORDER BY
와 겹쳐 오류가 발생할 수 있다. 따라서 주의해서 사용해야 한다!
@ID
: 엔티티 클래스 내의 필드 변수 중 하나에 추가하는 애너테이션으로 데이터베이스 테이블의 기본키(Primary Key)컬럼과 매핑된다.
DDD(Domain Driven Design)
: 도메인 주도 설계
도메인(Domain)
: 비즈니스적인 어떤 업무의 한 영역
애그리거트(Aggregate)
: 비슷한 범주의 업무 영역을 가진 도메인들의 집합
애그리거트 루트(Aggregate Root)
: 애그리거트의 대장!
💡 애그리거트 루트는 해당 애그리거트에 속해있는 모든 도메인들과 연관이 있어야 한다.
애그리거트 루트는 데이터베이스 테이블에서 부모테이블 역할을, 그 외의 도메인들은 자식테이블 역할을 한다.
Spring Data JDBC에서의 애그리거트(Aggregate) 객체 매핑 규칙
- 모든 엔티티 객체의 상태는 애그리거트 루트를 통해서만 변경할 수 있다.
- 하나의 동일한 애그리거트 내에서의 엔티티 객체 참조
- 동일한 하나의 애그리거트 내에서는 엔티티 간에 객체로 참조한다.
- 애그리거트 루트 대 애그리거트 루트 간의 엔티티 객체 참조
- 애그리거트 루트 간의 참조는 객체 참조 대신에 ID로 참조한다.
- 1대1과 1대N 관계일 때는 테이블 간의 외래키 방식과 동일하다.
- N대N 관계일 때는 외래키 방식인 ID 참조와 객체 참조 방식이 함께 사용된다.