ORM(Object Relational Mapping)
ORM(Object Relational Mapping)
๊ฐ์ฒด์งํฅ ์ธ์ด๋ก ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ด์ฉํด ๊ฐ๋ฐํ ๋ ํ์ํ ORM์ ์์๋ณด์.
ORM ์ด๋?
Object Relational Mapping
: ๊ฐ์ฒด ๊ด๊ณ ๋งคํ
์ด๋ฆ ๊ทธ๋๋ก ๊ฐ์ฒด๋ฅผ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ง๊ฒ ๋งคํํด์ฃผ๋ ๊ฒ์ด๋ค.
๋ ํ์ด์ ์๊ธฐํ๋ฉด ๊ฐ์ฒด์งํฅ๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํด ์ฃผ๊ณ ๊ฐ์ฒด๋ก ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๋ชจ๋ธ์ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด๋ค.
๊ฐ์ฒด์งํฅ๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น
์น์ฌ์ดํธ๋ฅผ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์น์ฌ์ดํธ๋ฅผ ์ด์ฉํ User๊ฐ ์๊ณ , ๊ทธ User๋ ์น์ฌ์ดํธ์์ ์๊ธฐ๊ฐ ๊ด๋ฆฌํด์ผ ํ๋ ์ผ(Task)์ด ํ์ํ๋ค๊ณ ํ์.
RDB์์ User Table๊ณผ Task Table์ ๋ง๋ค๊ณ , Task ํ
์ด๋ธ์์ User์ PK(Primary Key)
๋ฅผ FK(Foreign Key)
๋ก ์ ์ฅํ์ฌ ํ์ํ ๋ Join์ ํตํด Task๋ฅผ ์์ฑํ ์ ์ ๋ฅผ ์กฐํํ ์ ์๋ค.
๊ฐ์ฒด์งํฅ์์๋ User์ Task์ ๋ํ ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค๊น?
User.java
public class User{
private Long id;
// ...
}
Task.java
public class Task{
private Long id;
private User user;
// ...
}
RDB์์ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ด์ ์ ์๊ธฐ ๋๋ฌธ์ FK๋ก ์ฐธ์กฐํด์ผ ํ์ง๋ง, ๊ฐ์ฒด์งํฅ์์ ์์ ์ฝ๋์ฒ๋ผ User ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด ์์ฒด๋ก ๋ ํผ๋ฐ์ค์ ์ํ ์ฐธ์กฐ๋ฅผ ํ ์ ์๋ค.
์ด๋ฐ ๊ฐ์ฒด์งํฅ๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ORM์ ์ฌ์ฉํ๋ค.
ORM์ ์ฌ์ฉ
ORM์ด ๋ฑ์ฅํ๊ธฐ ์ ๊ธฐ์กด์ ๋ฐฉ์์ ๋จผ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ๋ชจ๋ธ๋ง ํ ํ ๊ทธ์ ๋ง์ถฐ์ ๊ฐ์ฒด์งํฅ์์ ์ฝ๋๋ก ๊ตฌํํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์์ฒ๋ผ ๋ ํผ๋ฐ์ค๋ก ์ฐธ์กฐํ๋ ๋ฐฉ์์ด ์๋, User ํ
์ด๋ธ์ FK๋ฅผ Task ๊ฐ์ฒด์ ์ ์ฅํด ์ฃผ์๋ค.
RDB์ ๋ง์ถฐ์ง ๊ฐ์ฒด ์ค๊ณ
public class Task{
private Long id;
private Long user_id;
// ...
}
๊ฐ์ฒด์งํฅ์ ์ด์ง ๋ชปํ ์ฝ๋๊ฐ ๋ฐ์ํ๊ฒ ๋ ๊ฒ์ด๋ค.
ORM์ Object Relational Mapping, ๋ง ๊ทธ๋๋ก ๊ฐ์ฒด๋ฅผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋งคํํด์ฃผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ๋ฐฉ์์ฒ๋ผ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ๋ง๋๋ ๊ฒ์ด ์๋๋ค.
๊ฐ์ฒด์งํฅ์์ Entity๋ฅผ ๋จผ์ ์ค๊ณํ๋ฉด, ORM์ด ๊ทธ์ ๋ง์ถฐ RDB์ ํ
์ด๋ธ์ ๋ง๋ค์ด์ค๋ค.
JPA ์์
JPA์์ User์ Task ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ทธ์ ๋งคํ๋ FK๋ฅผ ๊ฐ๊ณ ์๋ ํ ์ด๋ธ์ด ๋ง๋ค์ด์ง๋์ง ํ์ธํ์.
User.java
package com.vividswan.studymate.model;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import org.springframework.data.annotation.CreatedDate;
import javax.persistence.*;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Builder
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100, unique = true)
private String username;
@Column(nullable = false, length = 100)
private String nickname;
@Column(nullable = false, length = 50)
private String email;
@Column(nullable = false, length = 100)
private String password;
@Enumerated(EnumType.STRING)
private RoleType role;
@CreationTimestamp
private LocalDateTime createDate;
public void update(String password, String nickname, String email){
this.password = password;
this.nickname = nickname;
this.email=email;
}
}
Task.java
package com.vividswan.studymate.model;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Entity
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false,length = 100)
private String title;
@Lob
private String content;
@CreationTimestamp
private LocalDateTime createDate;
private LocalDateTime deadline;
@ManyToOne
@JoinColumn(name="userId")
private User user;
private int isSuccess;
}
๋ค์๊ณผ ๊ฐ์ด User์ Task ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
Task ์ฝ๋์์ User๋ฅผ ์ฐธ์กฐํ๋ ๋ถ๋ถ์ ํ์ธํด๋ณด์.
//...
@ManyToOne
@JoinColumn(name="userId")
private User user;
//...
์ด๋ ธํ ์ด์ ์ ๊ฐ๋จํ ์ดํด๋ณด์๋ฉด,
@ManyToOne : ๋ค์์ Task๊ฐ ํ ๋ช ์ User์ ์ํด ์์ฑ๋ ์ ์์ผ๋ฏ๋ก Many(Task)toOne(User)์ด๋ค.
@JoinColumn(name="userId") : ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์์ฑํ ๋ ์นผ๋ผ์ ์ด๋ฆ์userId
์ธ user๋ฅผ ์ฐธ์กฐํ ์ ์๋ PK๋ฅผ ์์ฑํด๋ฌ๋ผ๋ ๊ฒ์ด๋ค.
private User user;
์์ ์ ์ ์๋ฏ์ด, ๊ฐ์ฒด์งํฅ์ ์ค๊ณ์ ๋ง๊ฒ PK๊ฐ ์๋ ๊ฐ์ฒด ๋ํผ๋ฐ์ค๋ก ์ฐธ์กฐํ๊ณ ์๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์ธ
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋งคํ์ด ๋์๋์ง ํ์ธํด๋ณด์.
User์ ๋ํ PK๊ฐ ๋งคํ๋์์ ํ์ธํ ์ ์๋ค.
์ด์ฒ๋ผ ORM์ ์๋ฐ๊ฐ ์ฃผ๋๊ถ์ด ์๋ ๋ชจ๋ธ์ ๋ง๋ค์ด์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํด ์ค ์ ์๊ฒ ํด์ค๋ค.