티스토리 뷰
1. ORM(Object Relational Mapping)이란?
ORM은 객체와 관계형 데이터베이스를 매핑해주는 기술이다. 이는 객체 간의 관계를 바탕으로 SQL 자동 생성하여 객체 지향과 관계형 데이터베이스 간의 패러다임 불일치 문제를 해결해준다. ORM의 장단점은 아래와 같다.
- 장점
- 객체지향적인 코드
- SQL Query가 아닌 메소드로 데이터 조작 가능하기 때문에 생산성 증가
- 객체에 대한 코드를 별도로 작성하여 코드 가독성 증가
- 재사용 및 유지보수 편리성 증가
- DBMS에 대한 종속성 저하
- RDBMS의 데이터 구조와 객체지향 모델 사이의 간격 좁힐 수 있음
- DBMS를 교체하는 큰 작업에도 리스크가 적고 드는 시간이 줄어듦
- 객체지향적인 코드
- 단점
- 복잡한 쿼리문의 경우 SQL문으로의 사용이 더 직관적일 수 있음
- 프로젝트 규모가 커질 경우 속도 저하 및 일관성을 무너뜨리는 문제점 발생 가능 → 결국 SQL문을 써야할 수 있음
2. JPA(Java Persistence API)와 Hibernate
JPA는 Java에서 ORM을 위한 기술 표준이다. 이는 라이브러리가 아니라 ORM을 사용하기 위한 인터페이스 모음이다. 이때 JPA가 적절한 SQL을 생성해서 데이터베이스에 전달하고 객체를 자동으로 매핑해준다. 따라서, JPA가 제공하는 API를 사용하면 객체를 데이터베이스에 저장하고 관리할 때 직접 SQL을 작성하지 않아도 된다. JPA를 이용하면 생산성과 유지보수성 측면에서 좋다. Spring data JPA는 JPA를 사용하기 편하도록 만들어놓은 모듈이다.
Hibernate는 JPA를 구현한 대표적인 오픈소스의 일종으로 JPA를 사용하기 위해서는 Hibernate을 사용하면 된다.
3. Entity
Entity는 데이터베이스의 테이블과 매핑되는 객체이다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity annotation을 필수로 붙여야 한다. 실제로 student 객체를 만들어서 데이터베이스에 저장하려고 할 때 Entity를 이용하는 코드 사례를 살펴보자.
1) Entity annotation
- name을 “student”으로 설정
- entity는 no-arg constructor와 primary key를 가져야 함
- entity 객체는 final로 선언되면 안 됨
@Entity(name="student")
public class Student {
// fields, getters and setters
}
2) Id annotation
- Id annotation은 primary key를 정의함
- GeneratedValue는 자동으로 Id가 생성되도록 함
@Entity
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
// getters and setters
}
3) Table annotation
- 일반적인 경우에는 데이터베이스의 테이블의 이름과 entity의 이름은 다를 것임 → @Table로 테이블의 이름 설정 가능
- 아래와 같이 요소의 schema도 추가 가능
@Entity
@Table(name="STUDENT", schema="SCHOOL")
public class Student {
// fields, getters and setters
}
4) Column Annotation
- 테이블의 열에 대한 상세 정보를 설정해 줄 수 있음
- column annotation은 이름, 길이, nullable, unique 등 여러 요소를 가지고 있음
@Entity
@Table(name="STUDENT")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
private String name;
// other fields, getters and setters
}
5) Transient Annotation
- 필드를 데이터베이스 테이블에 저장하지 않고 런타임 동안만 사용하고 싶을 때 이용
- 예를 들어 학생의 나이를 출생연도로부터 계산하고 싶을 때 age field를 @Trasient annotation을 이용해서 정의
@Entity
@Table(name="STUDENT")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
private String name;
@Transient
private Integer age;
// other fields, getters and setters
}
6) Temporal Annotation
- 일시적으로 사용하는 값들을 정의할 때 사용
- 예를 들어 위에 언급한 예시에서 출생연도에 해당한다고 생각 가능
@Entity
@Table(name="STUDENT")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
private String name;
@Transient
private Integer age;
@Temporal(TemporalType.DATE)
private Date birthDate;
// other fields, getters and setters
}
7) Enumerated Annotation
- 객체가 Java enum type을 유지하도록 하고 싶을 때 이용
public enum Gender {
MALE,
FEMALE
}
@Entity
@Table(name="STUDENT")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
private String name;
@Transient
private Integer age;
@Temporal(TemporalType.DATE)
private Date birthDate;
@Enumerated(EnumType.STRING)
private Gender gender;
// other fields, getters and setters
}
'Backend > Spring Boot' 카테고리의 다른 글
[Spring] OAuth 2.0이란? (0) | 2023.11.26 |
---|---|
[Spring] Spring Security 정의, 등록 및 기본 사용법 (1) | 2023.11.26 |
[Spring] RDBMS의 이해 (0) | 2023.09.22 |
[Spring] 스프링 의존성 주입 3가지 방법 (0) | 2023.09.15 |
[Spring] REST API 설계 및 Controller 작성 & 설계 (0) | 2023.09.14 |