자바 최대 절전 모드 (2) - 구성 · 코어 API · 운영
프로젝트 중 느낀 자바 기초의 부족함을 보완하고자 핵심 주제를 순차적으로 복습할 예정입니다.
자바 코어 → 자바 스레드 → 자바 OOP → 자바의 예외 → 자바의 컬렉션 → 최대 절전 모드 순으로 정리할 예정입니다.
Hibernate (2) – 구성 · 코어 API · 운영
- Hibernate 프레임워크의 핵심 인터페이스와 클래스는 무엇입니까?
- RDBMS와의 Hibernate 통신의 일반적인 흐름은 무엇입니까?
- hibernate.cfg.xml의 중요한 태그는 무엇입니까?
- Hibernate 구성 속성을 지정하는 가장 일반적인 방법은 무엇입니까?
- Session 인터페이스는 어떤 역할을 합니까?
- SessionFactory 인터페이스는 어떤 역할을 합니까?
- 코드 변경 없이 관계형 데이터베이스 간에 어떻게 전환합니까?
- 콘솔에서 Hibernate가 생성한 SQL 문을 보는 방법은 무엇입니까?
- 트랜잭션 파일이란 무엇입니까?
Hibernate 프레임워크의 핵심 인터페이스와 클래스는 무엇입니까?
Hibernate에서 실제로 다루는 핵심 인터페이스는 SessionFactory, Session, Transaction이며, 배치 작업용 StatelessSession이 추가로 존재합니다.
SessionFactory는 애플리케이션 전역에 하나만 두는 싱글턴 팩토리로 매핑 메타데이터와 2차 캐시를 보관하고, Session은 1차 캐시·더티체크를 수행하며 쿼리를 실행합니다. 트랜잭션 제어는 session.beginTransaction()으로 얻는 Transaction이 맡고, 1차 캐시·더티체크를 생략한 StatelessSession은 대량 INSERT·로그 적재처럼 “쓰고 다시 읽지 않는” 시나리오에 적합합니다.
RDBMS와의 Hibernate 통신의 일반적인 흐름은 무엇입니까?
엔티티를 Session에 로드 및 변경하고 flush() 시점에 SQL이 자동 생성되어 JDBC 배치로 전송됩니다. 이를 DB가 응답하면 결과게 엔티티 필드에 반영되고 1차 캐시가 업데이됩니다. 마지막으로 트랜잭션을 커밋해 변경을 확정합니다.
hibernate.cfg.xml의 중요한 태그는 무엇입니까?
hibernate.cfg.xml에서 <property> 태그는 Dialect, JDBC URL, 캐시 전략 등 실행 환경 설정을 넣는 곳이고, <mapping> 태그는 엔티티 클래스나 HBM(XML) 매핑 파일을 등록해 Hibernate에 매핑 정보를 제공합니다. 스프링 부트를 사용할 경우 동일 키를 application.yml 또는 application.properties로 옮겨서 설정하는 방식이 일반적입니다.
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="com.example.Member"/>
</session-factory>
</hibernate-configuration>
Hibernate 구성 속성을 지정하는 가장 일반적인 방법은 무엇입니까?
hibernate 속성 지정은 hibernate.cfg.xml, 자바 코드(Map), 스프링 application.yml, 또는 SessionFactoryBuilder.applySetting()으로 동적 설정이 가능합니다. 현재 개발 시엔 주로 환경별 YAML 프로파일을 분리하고 있으며, 이를 통해 배포 파이프라인이 단순해집니다.
Session 인터페이스는 어떤 역할을 합니까?
Session은 Hibernate가 트랜잭션 범위마다 생성하는 영속성 컨텍스트(1차 캐시) 입니다. 한 트랜잭션 안에서 동일 ID의 엔티티를 여러 번 조회하면 첫 번째 SELECT 결과가 메모리에 저장되고, 이후 호출은 캐시에서 즉시 반환되므로 DB 왕복이 사라집니다. 또한 Session은 엔티티가 로드될 때 만든 스냅샷을 보관해 두었다가 flush() 시점에 현재 필드 값과 비교합니다. 달라진 부분이 있으면 필요한 INSERT·UPDATE·DELETE SQL만 생성해 JDBC로 전송합니다.
SessionFactory 인터페이스는 어떤 역할을 합니까?
SessionFactory는 세션 생성 팩토리이자 전역 메타캐시 저장소입니다. 애플리케이션이 실행될 때 단 한 번만 생성되는 스레드-세이프 싱글톤으로, 엔티티-테이블 매핑 메타데이터,SQL 생성 전략, DB방언(dialect), 2차 캐시 설정을 로딩해 보관합니다.
요청 처리 시에는 openSession()으로 가벼운 Session을 찍어내 트랜잭션 작업을 수행하게 하고, JMX 통계를 통해 캐시 히트율, 쿼리 건수 같은 운영지표를 노출합니다. 따라서 서비스당(DB당) 하나만 유지하고 재사용해야 메모리와 부팅 시간을 최소화할 수 있습니다. 정리하면, SessionFactory는 무거운 초기 설정을 보관하고 가벼운 Session을 찍어내는 공장이자 Hibernate 전체 설정, 캐시, 통계를 한 곳에서 관리하는 허브 역할을 수행합니다.
코드 변경 없이 관계형 데이터베이스 간에 어떻게 전환합니까?
hibernate 애플리케이션은 SQl 방언을 담당하는 Hibernate.dialect와 커넥션 풀에 전달되는 JDBC URL, 드라이버만 교체하면 대부분의 비즈니스 코드를 수정하지 않고도 다른 RDBMS로 이동할 수 있습니다. JPA 표준 API만 사용하고 네이티브 쿼리, DB 전용함수, 트리거를 피했다면 엔티티 클래스와 서비스 로직은 그대로 둔 채 설정 파일만 바꾸면 전환 가능합니다.
# application.yml
spring:
datasource:
url: jdbc:postgresql://db-prod:5432/appdb # JDBC URL 교체
username: app
password: secret
driver-class-name: org.postgresql.Driver # 드라이버 교체
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect # Dialect 교체
ddl-auto: validate # 스키마 검증만
콘솔에서 Hibernate가 생성한 SQL 문을 보는 방법은 무엇입니까?
Hibernate가 생성한 SQL문은 hibernate.show_sql과 hibernate.format_sql 속성을 설정하면 표준 풀력에 SQL이 찍힙니다. hibernate. format_sql을 true로 설정하면, 출력되는 SQL문이 정렬되어 가독성이 좋아지며, hibernate. show_sql만 설정하면 SQL이 한 줄로 출력되지만, format_sql을 활성화하면 예쁘게 정렬한 SQL을 볼 수 있습니다. 파라미터 값도 확인하려면 org.hibernate.type.descriptor로그 레벨을 DEBUG로 올리면 됩니다.
# application.yml (Spring Boot 예시)
spring:
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
트랜잭션 파일이란 무엇입니까?
트랜잭션 파일(트랜잭션 로그)은 관계형 데이터베이스가 각 트랜잭션 동안 일어난 INSERT·UPDATE·DELETE 등을 순차적으로 기록해 두는 전용 로그로, 커밋 시 최종 변경 사항을 확정하고 롤백·장애 복구(UNDO/REDO), 시점 복구(PITR)·복제·감사까지 책임지는 핵심 데이터 무결성 장치입니다.