처음엔 ORM과 JPA가 다른 내용인줄 알았지만, 공부를 해보니 ORM을 구현하기위해 JPA를 사용한다는걸 알았습니다.
ORM(Object-Relational Mapping)과 JPA(Java Persistence API)의 차이점, 그리고 JPA와 Hibernate의 관계에 대해 적어보겠습니다.
ORM은 객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 데이터 간의 변환을 자동으로 처리해주는 기술입니다. 즉, 객체와 데이터베이스 테이블 간의 매핑을 통해 개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 상호작용할 수 있게 해줍니다.
JPA는 자바에서 ORM을 구현하기 위한 표준 인터페이스입니다. JPA는 객체 상태를 데이터베이스에 저장하고, 데이터베이스에서 객체를 불러오는 방법을 정의합니다. JPA는 개발자가 ORM을 사용할 수 있게 해주는 API로, 다양한 ORM 프레임워크가 JPA를 구현할 수 있습니다.
Hibernate는 JPA의 구현체 중 하나입니다. 즉, Hibernate는 JPA의 규격을 따르면서 ORM 기능을 제공하는 프레임워크입니다. JPA를 사용하면 Hibernate와 같은 다양한 ORM 구현체를 선택할 수 있지만, Hibernate는 JPA의 기능을 확장하여 더 많은 기능을 제공하기 때문에 많은 개발자들이 선호합니다.
예를 들어, User라는 엔티티가 있다고 가정해봅시다. 이 엔티티는 데이터베이스의 users 테이블과 매핑됩니다.
1. JPA를 사용한 예시:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getters and setters
}
위 코드는 JPA에서 제공하는 어노테이션을 사용하여 User 클래스를 데이터베이스의 users 테이블과 매핑합니다.
2. Hibernate를 사용한 예시:
Hibernate를 사용할 때도 JPA와 동일한 방식으로 엔티티를 정의할 수 있습니다. 하지만 Hibernate의 특정 기능을 사용하고 싶다면 다음과 같이 코드를 작성할 수 있습니다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
@Version
private Integer version; // Hibernate의 낙관적 락을 위한 버전 필드
// getters and setters
}
위 예시에서 @Version 어노테이션은 Hibernate의 낙관적 락 기능을 활용하기 위해 추가된 것입니다.