📍 ORM (Object-Relational Mapping) 이란?
객체 지향 프로그래밍 언어에서 데이터베이스와 상호 작용하기 위한 기술이다. ORM은 객체와 데이터베이스 테이블을 매핑하여 SQL 쿼리를 작성하지 않고도 데이터베이스 작업을 수행할 수 있도록 돕는다.
즉, ORM을 사용하면 데이터베이스의 테이블을 클래스, 레코드를 객체, 필드를 객체의 속성으로 취급하여 프로그래밍 언어에서 직접 데이터베이스 조작을 수행할 수 있다.
► ORM의 장점
- 생산성 향상: SQL을 직접 작성하지 않고 메서드 호출을 통해 데이터 조작이 가능하므로 개발 속도가 빨라진다.
- 유지보수성 향상: 코드와 데이터베이스가 객체 중심으로 통일되어 이해와 수정이 쉽다.
- 보안성 강화: SQL 인젝션과 같은 보안 문제를 줄이는 데 도움이 된다.
Spring Boot에서는 대표적으로 JPA와 Hibernate가 ORM 프레임워크로 많이 사용된다.
① JPA (Java Persistence API) :: 개발자들이 일관되게 사용할 수 있는 ORM의 공통된 규칙이나 방법을 제시
자바 객체와 데이터베이스를 연결해 데이터를 관리한다. JPA의 주요 기능은 엔티티(Entity) 매핑, 영속성 관리(Persistence Context), 데이터베이스 작업을 위한 CRUD 메서드 제공 등이 있다. JPA를 사용하면 인터페이스에 기반한 표준화된 방식으로 데이터베이스를 다룰 수 있다.
② Hibernate :: JPA에서 정한 규칙을 구현한 실제 동작하는 ORM 프레임워크
JPA 명세를 구현한 ORM 프레임워크 중 하나이다. 즉, JPA의 인터페이스를 구현하며 내부적으로는 JDBC API를 사용한다. 대표적으로 캐싱 기능, 지연 로딩(Lazy Loading), 배치 처리, 복잡한 쿼리 작성 등을 지원하며, Java 개발자들 사이에서 널리 사용되고 있다.
예시 코드 ↘️
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getters and setters
}
Spring Boot에서는 주로 JPA 인터페이스와 Hibernate 구현체를 함께 사용하여 개발한다. 예를 들어, JPA 엔티티 클래스와 JpaRepository 인터페이스를 정의해 데이터베이스와 상호작용할 수 있다.
위의 User 엔티티는 JPA로 매핑되며, 이를 통해 Hibernate는 SQL 쿼리를 생성하고 데이터베이스와 상호작용하게 된다.
예시 코드 ↘️
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Column;
@Entity
public class User {
// 기본 생성자
public User() {}
// 기본 키로 지정된 id 필드
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// name 컬럼, null을 허용하지 않음
@Column(nullable = false)
private String name;
// email 컬럼, 유일한 값으로 지정
@Column(unique = true)
private String email;
// Getter와 Setter 메서드
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
코드 설명
- @Entity
- @Entity는 이 클래스가 JPA 엔티티임을 나타낸다. 데이터베이스 테이블에 매핑되며, Spring Boot가 이 클래스를 기반으로 테이블을 생성하거나 관리한다.
- 기본 생성자
- JPA는 기본 생성자를 필요로 한다. 이는 JPA가 객체를 생성할 때 리플렉션(reflection)을 사용하기 때문에 필수적이다.
- @Id
- @Id는 엔티티의 기본 키(primary key)를 지정하는 어노테이션이다. 여기서는 id 필드가 기본 키 역할을 한다.
- @GeneratedValue
- @GeneratedValue(strategy = GenerationType.IDENTITY)는 id 필드가 데이터베이스에 의해 자동 생성됨을 의미한다. GenerationType.IDENTITY는 주로 MySQL과 같이 AUTO_INCREMENT 기능이 있는 데이터베이스에서 사용된다.
- @Column
- @Column 어노테이션은 특정 필드가 데이터베이스의 컬럼과 매핑됨을 나타낸다.
- nullable = false 옵션은 해당 필드가 NULL을 허용하지 않음을 지정한다.
- unique = true 옵션은 해당 컬럼의 값이 유일해야 함을 의미한다. 이 예시에서는 email이 유일해야 하므로 다른 행에서 같은 값을 가질 수 없다.
- Getter와 Setter 메서드
- 엔티티의 각 필드에 접근하기 위해 필요한 메서드들이다. JPA는 내부적으로 이러한 메서드를 통해 데이터에 접근한다.
'CS' 카테고리의 다른 글
[Spring] 03. AOP(관점 지향 프로그래밍)과 PSA(서비스 추상화) (0) | 2025.02.20 |
---|---|
[Spring] 04. 스프링 부트 요청 - 응답 과정 ( HTTP 요청 처리 과정) (0) | 2025.02.20 |
[HTTP - 3 ] HTTP의 특징:쿠키(Cookie)와 세션(Session)의 차이점 (0) | 2025.02.20 |
[HTTP - 2 ] URL 입력에서 웹 페이지 출력까지: HTTP 요청과 응답 과정 이해하기 (0) | 2025.02.20 |
[HTTP - 1 ] HTTP란? : PUT과 PATCH의 역할과 차이점 (0) | 2025.02.20 |