Search

데이터 액세스 스택

1. 데이터 액세스 스택 (Data Access Stack)

1.1 성능 측정 단위

응답 시간 (Latency): 트랜잭션 매니저 수준에서 측정.
트랜잭션 응답 시간 구성:
1.
DB 연결 획득 시간
2.
Statement가 DB 엔진에 제출되는 시간
3.
Statement 실행 시간
4.
결과 집합을 가져오는 시간
5.
트랜잭션 종료 및 DB 연결 해제 전 애플리케이션 유휴 시간
처리량 (Throughput):
확장성의 측정 단위.
단위 시간당 실행된 트랜잭션 수.
처리량 분수의 역수 = 평균 응답 시간.
응답 시간 감소 → 성능 및 확장성 향상.

1.2 설계 고려사항

성능 고려 설계: 데이터 처리와 관련된 모든 계층 이해 필요.
객체-관계 불일치 (Object-Relational Impedance Mismatch):
객체 지향 도메인 모델과 관계형 DB 간 불일치.
데이터 액세스 계층에서 변환 책임.
JPA 명세:
JPA는 명세일 뿐, 성능은 구현 세부 사항에 의존.
JPQL은 데이터 조회용, 네이티브 SQL 대체 아님.

2. SQL Statement 로깅 (Logging SQL Statement)

2.1 필요성

JPA/Hibernate:
persist, merge, remove 등 엔티티 상태 변화에 따라 SQL 자동 생성.
로깅 없이는 생성된 SQL 확인 불가 → 성능 문제 발생 가능.
일반 JDBC: 전송되는 Statement 완전 제어 가능.

2.2 Hibernate 로그 설정

설정 옵션:
show_sql: 사용 권장하지 않음 (로깅 프레임워크 사용 권장).
format_sql: SQL을 여러 줄로 출력. 외부 로깅 프레임워크 사용 시 동작 안 함.
use_sql_comments:
엔티티 상태 전환, 조인 이유, 명시적 잠금 메커니즘 등 주석 추가.
주석은 JDBC 드라이버로 전송 → 네트워크 I/O 오버헤드 발생.
JBoss Logging:
Hibernate 내부 로깅 프레임워크.
외부 로깅 프레임워크와 연결 역할.
Prepared Statement 바인드 파라미터 로깅:
Hibernate SQL 타입 디스크립터에 새로운 Appender 추가 필요.

2.3 P6Spy

역할:
외부 JDBC Statement 프록시.
JDBC 드라이버 또는 DataSource 프록싱.
Statement 실행 가로채기, 바인드 파라미터 값 로깅.
기능:
장시간 실행 Statement 감지.
실행 Statement 수 검증.
횡단 관심사 (Cross-Cutting Concerns) 제공.
사용법:
P6Spy 설정을 통해 정확한 SQL 쿼리 확인.
설정 예: JDBC URL에 p6spy 추가, spy.properties 파일 구성.

3. 스키마 관리 (Schema Management)

3.1 스키마 변경 원칙

데이터베이스 주도: 스키마 변경은 DB가 주도해야 함.
권장사항:
1.
스키마 마이그레이션 수동 실행 금지.
2.
운영 환경에서 Hibernate HBM2DDL auto 사용 금지.
3.
HBM2DDL:
DB 스키마 프로토타입 또는 초기 스크립트 생성용.
프로덕션 환경 사용 부적합.

3.2 Flyway

역할: DDL 형상 관리 및 자동 적용.
장점:
애플리케이션에서 자동 스키마 적용 편리.
자동화 툴과 통합 시 이점 큼.
주의점:
실서버/베타서버에서 설정 위험.
신중한 테스트 및 롤백 전략 필요.

4. 통합 테스트 (Integration Test)

도커와 TempFS 활용:
인메모리 DB 테스트로 속도 향상.
예: H2, Testcontainers 활용.

5. 연결 관리 및 제공자 (Connection Management / Connection Provider)

5.1 연결 풀 사용

중요성: 특정 임계값 초과 시 연결 수 증가가 성능 악화 초래.
권장: Connection Pool 사용.

5.2 Hibernate 연결 제공자

DriverManagerConnectionProvider: 테스트용.
C3P0ConnectionProvider: 안정적.
HikariConnectionProvider: 빠름, Hibernate 전용 속성 미지원.
DatasourceConnectionProvider: 가장 유연.

5.3 Hibernate 연결 생명주기

리소스 로컬 트랜잭션: 트랜잭션 종료 시 연결 해제.
JTA: 각 Statement 실행 후 연결 해제.
연결 획득 지연:
연결 획득 시간 지연 → 더 많은 연결 가능.

6. 연결 모니터링 (Connection Monitoring)

6.1 풀 크기 중요성

공식: PDF 참고 (변칙적 상황 미고려).
실용적 접근:
1.
연결 사용량 모니터링:
연결 획득 시간 및 유지 시간 분석.
2.
풀 크기 자동화:
연결 획득 타임아웃 감지 시 풀 크기 자동 조정.

6.2 FlexyPool

역할:
DB Connection Pool 동적 관리.
로깅 지원 → 적절한 풀 크기 설정 가능.
설정:
FlexyPool 구성으로 동적 풀 크기 조정 및 모니터링.

7. Hibernate 통계 (Hibernate Statistic)

설명: Hibernate 내부 통계 수집으로 성능 병목 지점 파악.
활용: 쿼리 실행 시간, 캐시 히트율, 연결 사용량 분석.

8. JPA 및 Hibernate 타입 (JPA and Hibernate Types)

8.1 Enum vs String

Ordinal: Enum 값을 숫자로 저장.
String: Enum 값을 문자열로 저장.
개인 의견:
Enum 조인 불필요.
String 사용이 더 안전하고 간단.

9. 추가 참고사항

고성능 JPA & Hibernate 강의는 성능 최적화에 초점.
권장 자료:
강의 PDF 및 예제 코드.
Hibernate 공식 문서.
P6Spy, Flyway, FlexyPool 문서.

10. 사용자 메모

P6Spy: 정확한 쿼리 확인 도구.
Flyway: DDL 형상 관리, 자동화 툴 통합 시 이점 있으나 운영 환경 설정 주의.
FlexyPool: 동적 Connection Pool 관리 및 로깅.
Enum vs String: String 선호 (간단하고 안전).