KUKJIN LEE
posted 1 week ago
[Spring Boot] Hibernate ORM 가이드
Hibernate ORM(Object-Relational Mapping)은 Spring Boot에서 관계형 데이터베이스와 상호작용하는 데 널리 사용되는 프레임워크입니다.
객체 지향 프로그래밍 언어(Java)에서 관계형 데이터베이스를 사용할 수 있도록 지원하는 ORM 프레임워크입니다. SQL을 직접 작성하지 않고도 엔티티(Entity) 클래스를 통해 데이터베이스와 상호작용할 수 있습니다.
특징
-
자동 매핑: Java 클래스와 데이터베이스 테이블을 매핑.
-
HQL: SQL과 유사한 Hibernate Query Language 제공.
-
캐싱 지원: 1차 및 2차 캐싱을 통해 성능 최적화.
-
Lazy/Eager Loading: 데이터 로딩 방식을 제어 가능.
Spring Boot에서 Hibernate ORM 설정
Spring Boot는 Hibernate를 기본적으로 지원하며, 최소한의 설정으로 사용할 수 있습니다.
의존성 추가
spring-boot-starter-data-jpa
는 Hibernate를 기본적으로 포함합니다. Maven에서 추가하려면 다음과 같이 설정합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
application.properties
설정
Spring Boot의 application.properties
또는 application.yml
파일에서 데이터베이스 및 Hibernate 관련 설정을 추가합니다.
# 데이터베이스 설정
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
# JPA 및 Hibernate 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
주요 설정 옵션
-
spring.jpa.hibernate.ddl-auto
: 데이터베이스 스키마 자동 생성 (none
,update
,create
,create-drop
). -
spring.jpa.show-sql
: 실행되는 SQL 로그를 출력. -
hibernate.dialect
: 사용하는 데이터베이스에 맞는 방언(Dialect) 설정.
Hibernate ORM 주요 개념 및 사용법
엔티티(Entity) 클래스 정의
Hibernate는 Java 클래스와 데이터베이스 테이블을 매핑합니다.
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getter, Setter
}
Repository 인터페이스
Spring Data JPA는 기본적인 CRUD 메서드를 제공하는 Repository 인터페이스를 지원합니다.
(실제 코드 예제에서는 Hibernate를 명시적으로 사용하는 부분이 드러나지 않았습니다. 이는 Spring Data JPA가 Hibernate를 내부적으로 사용하기 때문입니다.)
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
}
Service와 Controller 연계
Service 계층에서 비즈니스 로직을 처리하고, Controller 계층에서 HTTP 요청을 처리합니다.
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User saveUser(User user) {
return userRepository.save(user);
}
}
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.saveUser(user);
}
}