Home
>
Spring
>
๐[Spring] JPA๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๊ฐ๋ฐํ๋ค๋ ์๋ฏธ.
Spring
Framework
๐[Spring] JPA๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๊ฐ๋ฐํ๋ค๋ ์๋ฏธ.
JPA(Java Persistence API)๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๊ฐ๋ฐํ๋ค๋ ์๋ฏธ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ์ง์ ๋ค๋ฃจ๋ ๋ฐฉ์์์ ๋ฒ์ด๋, ๊ฐ์ฒด ์งํฅ์ ์ธ ๊ฐ๋
์ ์ฌ์ฉํด ๋ฐ์ดํฐ์ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
JPA๋ฅผ ํ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฒด ๋ชจ๋ธ ๊ฐ์ ๊ฐ๊ทน์ ์ค์ฌ ๋ ์ง๊ด์ ์ด๊ณ ์ ์ฐํ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํด์ง๋๋ค.
์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ ํ๋ฉด์๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ์์น์ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
1๏ธโฃ ์ฃผ์ ๊ฐ๋
๊ณผ ํน์ง.
1๏ธโฃ ์ํฐํฐ์ ๊ด๊ณ ์ค์ฌ ์ค๊ณ.
JPA๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ์๋ฐ ๊ฐ์ฒด(์ํฐํฐ)๋ก ๋งคํํ๋ฉฐ, ํ
์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ก ๋ํ๋
๋๋ค.
์๋ฅผ ๋ค์ด, @OneToMany
, @ManyToOne
, @OneToOne
๋ฑ์ ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ค์ ํ๊ณ , ์ด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ๋ ํค, ์กฐ์ธ ๋ฑ์ ํตํด ํํํฉ๋๋ค.
2๏ธโฃ ๊ฐ์ฒด์งํฅ์ CRUD ์์
.
JPA๋ EntityManager๋ CrudRepository์ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ธ CRUD ์์
(Create, Read, Update, Delete)์ ๋ฉ์๋๋ก ์ ๊ณตํฉ๋๋ค.
๊ฐ๋ฐ์๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ๋ ๋์ ๋ฉ์๋ ํธ์ถ์ ํตํด ๋ฐ์ดํฐ ์กฐ์์ ์ํํ๋ฉฐ, ์ด๋ ๊ฐ์ฒด๋ฅผ ์กฐ์ํ๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค.
3๏ธโฃ ์ถ์ํ๋ ๋ฐ์ดํฐ ์์ธ์ค ๊ณ์ธต.
JPA๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ ์ถ์ํํ์ฌ ํน์ DBMS์ ์ข
์๋์ง ์๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ํฉ๋๋ค.
์ด๋ฅผ ํตํด ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์ด์์ฑ์ด ๋์์ง๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๊ฒฝ์ฐ์๋ ์ต์ํ์ ์์ ์ผ๋ก ๋์ฒด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
4๏ธโฃ ์์์ฑ ์ปจํ
์คํธ(Persistence Context)
JPA๋ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ๋ก ๊ด๋ฆฌํ์ฌ 1์ฐจ ์บ์๋ฅผ ํ์ฉํ ์ต์ ํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋์ผํ ํธ๋์ญ์
๋ด์์๋ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ฌ ๊ฐ์ฒด ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ผ๋ฉฐ, ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ
์คํธ์ ์๋ ๋์ ์๋์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ด ๊ฐ์ง๋๊ณ ๋ฐ์๋ฉ๋๋ค.
5๏ธโฃ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด(JPQL)
JPA๋ JPQL(Java Persistence Query Language)์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์งํฅ์ ์ฟผ๋ฆฌ ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
JPQL์ SQL๊ณผ ์ ์ฌํ์ง๋ง ํ
์ด๋ธ๊ณผ ์ปฌ๋ผ์ด ์๋ ์ํฐํฐ์ ํ๋๋ฅผ ๋์์ผ๋ก ์๋ํ์ฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
6๏ธโฃ ์ง์ฐ ๋ก๋ฉ(Lazy Loading)
JPA๋ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํ์ํ ์์ ์ ๋ก๋ํ๋ ์ง์ฐ ๋ก๋ฉ์ ์ง์ํ์ฌ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ก๋ํ ์ ์๋๋ก ํฉ๋๋ค.
๋ถํ์ํ ์ฟผ๋ฆฌ ์คํ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ผ๋ฉฐ, ํ์ํ ๋๋ง ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
2๏ธโฃ JPA์ ๊ฐ์ฒด์งํฅ ๊ฐ๋ฐ ์ฅ์ .
1๏ธโฃ ๋์ ๊ฐ๋
์ฑ.
์ฝ๋๊ฐ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ตฌ์ฑ๋๋ฏ๋ก ๊ฐ๋
์ฑ์ด ๋์์ ธ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ช
ํํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
2๏ธโฃ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์ค.
SQL ์์ฑ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋งคํ ์ฝ๋ ์์ฑ์ ์๊ฐ์ ๋ ๋ค์ด๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์์ต๋๋ค.
3๏ธโฃ ์ฌ์ฌ์ฉ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ ์ฆ๊ฐ.
๊ฐ์ฒด ์งํฅ์ ์ธ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ์ฌ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์์ง๋๋ค.
4๏ธโฃ ์์
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ ํ
์ด๋ธ ์ค์ฌ์ด ์๋ ๊ฐ์ฒด ์ค์ฌ์ ์ค๊ณ๋ฅผ ํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ ๊ฐ๋ฐ
-- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ ์ ์
CREATE TABLE employee (
employee_id BIGINT AUTO_INCREMENT PRIMARY KEY ,
name VARCHAR ( 50 ),
department_id BIGINT ,
FOREIGN KEY ( department_id ) REFERENCES department ( department_id )
)
JPA ๊ฐ์ฒด์งํฅ ๊ฐ๋ฐ
@Enity
public class Employee {
@Id
@GeneratedValue ( stratege = GenerationType . IDENTITY )
private Long id ;
private String name ;
@ManyToOne
@JoinColumn ( name = "department_id" )
private Department department ;
// getters and setters
}
๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๊ฐ๋ฐํ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ฌ์ด ์๋ ๋น์ฆ๋์ค ๋ก์ง ์ค์ฌ์ผ๋ก ์ฝ๋๋ฅผ ์ค๊ณํ ์ ์์ด, ๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋ถํ์ํ ๋งคํ ๋ณต์ก์ฑ์ ์ค์ด๊ณ , ์ฝ๋๊ฐ ๋ ์ง๊ด์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.