📘 Backend/Spring
Aggregate & JDBC
신건우
2023. 4. 3. 07:58
📘Aggregate
- 비슷한 업무 도메인들의 집합
- Aggregate Root = 각각의 도메인 대표, root의 key를 다른 도메인이 foreign키로 가지고 있음
- Aggregate Root 선정 기준 = 다른 도메인과 연관성이 있는 도메인 (1:N)
- 설계중 Aggregate Root역할을 할 엔티티 클래스를 잘 선정해야함
엔티티 설계
- 1:N의 관계에서 1은 N의 객체를 참조할 수 있도록 List를 멤버변수로 가진다
- N:N의 관계에서, 1:N - N:1로 변환하도록 N쪽의 객체를 참조하도록 1쪽에서 List를 멤버 변수로 가짐
ex) private AggregateReference<User, long> userId; - 객체 참조 = 테이블에서의 외래키 참조
테이블 설계
- 각 테이블의 컬럼은 엔티티의 멤버변수와 1:1 매핑됨
- 테이블의 이름을 SQL의 예약어와 겹치지 않게 설정
- 1:N의 관계에서 N은 1의 Key를 외래키로 조인한다
- N:N의 관계에서, 1:N - N:1 관계로 변환하도록 조인테이블을 생성
Aggregate 객체 매핑
- Spring Data JDBC를 사용하려면 설계한 도메인 엔티티 클래스들의 관계를
DDD의 Aggregate 매핑 규칙에 맞게 변경해야함 - * Aggregate 객체 매핑 규칙 *
- 모든 엔티티 객체의 status는 Aggregate Root를 통해서만 변경허용
- 동일한 Aggregate 내에서의 객체 참조는 엔티티간 객체로 참조
- Root - Root 간 참조는 ID로 참조
Query Method
- find + By + SQL Query
내부적으로는 테이블의 컬럼명으로 매핑되지만 Spring에선 엔티티의 멤버변수명으로 입력해줘야함 - 조건 컬럼을 여러개를 지정하고 싶으면 'And' 사용
- @Query("")를 이용한 동적 쿼리 파라미터를 이용해도 좋지만 일반적으로 쿼리 메소드를 이용하는것을 권장
📘JDBC
JDCB API 동작 흐름
- JDBC 드라이버 로딩 - DriveManager 클래스 통해서 로딩
- Connection 객체 생성 - DriverManagerfmf 통해 DB와 연결되는 세션인 객체 생성
- Statement 객체 생성 - 작성된 쿼리문을 실행하기 위한 객체로, 객체 생성 후 정적 퀴리 문자열을 입력으로 가짐
- 쿼리 실행 - 생성된 Statement 객체를 이용해서 쿼리 실행
- ResultSet 객체로부터 데이터 조회 - 실행된 쿼리문에 대한 데이터 Set
- ResultSet -> Statement -> Connection 순으로 객체 Close
Connection Pool (DBCP)
- Connection 객체 생성은 리소스를 많이 요구한다.
- 그래서, 미리 Connection 객체를 생성해두고 DB 연결 요청이 오면 만들어둔 객체 사용
- 성능 향상
- 이러한 작업을 해두는 툴을 스프링 부트에선 Default로 HikariCP를 DBCP로 지정
ORM (Object-Relational Mapping) 객체 중심 기술
- 이전에는 SQL 쿼리 중심의 기술로 SQL 쿼리문이 중심이었지만, 요즘은 객체 중심이라고 하여
객체를 전달하면 자동으로 SQL문으로 매핑후 DB에서 데이터를 조작할 수 있다. - 자바에서 대표적인 ORM 기술은 JPA.
Spring Data JDBC 적용 순서
- build.gradle 라이브러리 추가
- application.yml에 DB설정 추가
- resourse에 sql파일 생성 후 sql script 작성
- application.yml에 스크립트 파일 매핑
- DB와 연동할 Entity 생성
- Repository 생성
- Service에 Repo를 DI주입
- Repo에 상속된 crud인터페이스의 메소드를 이용해서 DB작업 수행