
์คํ๋ง ํจํค์ง๋ฅผ ๋๋ ๋ ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์ ์ผ๋ฐ์ ์ผ๋ก [๊ทธ๋ฆผ 1]๊ณผ ๊ฐ๋ค. ์ด๋ ๊ฒ ๊ณ์ธต์ ๋๋์ด ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ ์ง ๋ณด์ํ๊ธฐ์ ์ฉ์ดํ๋ฉฐ ๋๋ฒ๊น ํ๊ธฐ๋ ์ฝ๋ค. DTO, DAO, Repository ๋ฑ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ๊ณผ ์ญํ ์ ๋ํด์ ์์๋ณด์.
โ๏ธEntity๋?
Entity๋ DB์ ํ ์ด๋ธ์ ์กด์ฌํ๋ Column๋ค์ ํ๋๋ก ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ปํ๋ค. Entity๋ DB์ ํ ์ด๋ธ๊ณผ 1๋1 ๋์์ด๋ฉฐ, ํ ์ด๋ธ์ ๊ฐ์ง์ง ์๋ ์นผ๋ผ์ ํ๋๋ก ๊ฐ์ ธ์๋ ์ ๋๋ค. ๋ํ Entity ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์๋ฐ๊ฑฐ๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ฌ์๋ ์๋๊ณ ์์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด์ธ ๊ฒ์ด ์ข๋ค. (์ฌ์ค ์ค๋ณต๋๋ ๋ด์ฉ์ด ์์ ๊ฒฝ์ฐ baseEntity๋ฅผ ๋ง๋ค์ด ์์ํ ์ ์๋ค)
์๋ฅผ ๋ค์ด DB์ Employee ๋ผ๋ ํ ์ด๋ธ์ id, name, age ์นผ๋ผ์ด ์๋ค๊ณ ํ์.
@Entity
public class Employee{
@Id
private Long id;
private String name;
private int age;
}
์ด์ ๋์ํ๋ Entity ํด๋์ค Employee๋ ์์ ๊ฐ์ ํ๋๋ค๋ง ๊ฐ์ ธ์ผ ํ๋ค.
๋ง์ฝ ์คํ๋ง์์ JPA๋ฅผ ์ฌ์ฉํ๋ค๋ฉด Entity ํด๋์ค์ @Entity ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ ํด๋น ํด๋์ค๊ฐ Entity ํด๋์ค์์ ๋ช ์ํ ์ ์๋ค. ๋ํ id ์นผ๋ผ์๋ @Id ์ด๋ ธํ ์ด์ ์ ๋ถ์ผ ์ ์๊ณ ๋ค๋ฅธ ์นผ๋ผ์๋ @Column ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ ๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
โ๏ธDTO(Data Transfer Object)๋?
DTO๋ ๋ง ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฅผ Transfer(์ด๋)ํ๊ธฐ ์ํ ๊ฐ์ฒด์ด๋ค. Client๊ฐ Controller์ ์์ฒญ์ ๋ณด๋ผ ๋๋ RequestDto์ ํ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ด๋ํ๊ณ , Controller๊ฐ Client์๊ฒ ์๋ต์ ๋ณด๋ผ ๋๋ ResponseDto์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ฒ ๋๋ค.
Controller์ Service, Repository ๊ณ์ธต ์ฌ์ด์ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ ๋๋ ๋ฐ์ดํฐ๋ DTO์ ํํ๋ก ์ด๋ํ๊ฒ ๋๋ค.
DTO๋ ๋ก์ง์ ๊ฐ๊ณ ์์ง ์๋ ์์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด์ด๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก getter/setter ๋ฉ์๋๋ง์ ๊ฐ์ง๋ค. ํ์ง๋ง DTO๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธฐ๋ ์ฉ๋์ด๊ธฐ ๋๋ฌธ์ ๊ตณ์ด Setter๋ฅผ ์ด์ฉํด ๊ฐ์ ์์ ํ ํ์๊ฐ ์์ด, ์์ฑ์๋ง์ ์ฌ์ฉํ์ฌ ๊ฐ์ ํ ๋นํ๋ ๊ฒ ์ข๋ค.
โ๏ธDTO๋ฅผ ์ฌ์ฉํ๋ ์ด์
๊ทธ๋ฐ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์์ง์ผ๋ ์ Entity ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ์๊ณ ๊ตณ์ด DTO๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๊น?
๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. View Layer์ DB Layer์ ์ญํ ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด์
-> ๊ฐ์ฒด๋ฅผ ํํํ๊ธฐ ์ํ ๊ณ์ธต๊ณผ ์ ์ฅํ๋ ๊ณ์ธต์ ์ญํ ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด์ DTO๋ฅผ ์ฌ์ฉํ๋ค.
2. Entity ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ํผํ๊ธฐ ์ํ์ฌ
-> Entity ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋จธ์ ์๋์ ๋ค๋ฅด๊ฒ ๋ฐ์ดํฐ๊ฐ ๋ณ์ง๋ ์ ์๋ค.
3. View์ ํต์ ํ๋ DTO ํด๋์ค๋ ์์ฃผ ๋ณ๊ฒฝ๋๋ค
-> View(ํด๋ผ์ด์ธํธ)์ ํต์ ํ๋ DTO ํด๋์ค, ์๋ฅผ ๋ค์ด ResponseDTO, RequestDTO๋ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์์ฃผ ๋ณ๊ฒฝ๋๋ค. ์ด๋ค ์์ฒญ์์๋ ํน์ ๊ฐ์ด ์ถ๊ฐ๋ ์๋ ์๊ณ , ํน์ ๊ฐ์ด ์์ ์๋ ์๋ค. ๋ฐ๋ผ์ Entity ํด๋์ค์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํด์ผ ํ๋ค.
4. ๋๋ฉ์ธ ๋ชจ๋ธ๋ง์ ์งํค๊ธฐ ์ํ์ฌ
๋๋ฉ์ธ ์ค๊ณ๋ฅผ ์ํ์๋ค๊ณ ํ๋๋ผ๋ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ธฐ๊ฐ ์ฝ์ง ์์ ์ ์๋ค. ์๋ฅผ ๋ค์ด Entity ํด๋์ค์ ํน์ ์ปฌ๋ผ๋ค์ ์กฐํฉํ์ฌ ํน์ ํฌ๋งท์ ์ถ๋ ฅํ๊ณ ์ถ๋ค๊ณ ํ์. Entity ํด๋์ค์ ํํ์ ์ํ ํ๋๋ ๋ก์ง์ด ์ถ๊ฐ๋๋ฉด ๊ฐ์ฒด ์ค๊ณ๋ฅผ ๋ง๊ฐ๋จ๋ฆด ์ ์๋ค. ๋ฐ๋ผ์ DTO์ ํํ์ ์ํ ๋ก์ง์ ์ถ๊ฐํด์ ์ฌ์ฉํ๋ ๊ฒ์ด Entity์ ๋๋ฉ์ธ ๋ชจ๋ธ๋ง์ ์งํฌ ์ ์๋ค.
โ๏ธDAO(Data Access Object)๋?
DAO๋ ๋ง ๊ทธ๋๋ก ์ค์ DB์ ์ ๊ทผํ๋ ๊ฐ์ฒด๋ฅผ ๋ปํ๋ค. DAO๋ Service์ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๋ ์ญํ ์ ํ๊ฒ ๋๋ค. ์ฆ, DB์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ค๊ฑฐ๋ ๋ฃ๋ ์ญํ ์ DAO๊ฐ ๋ด๋นํ๋ค.
JPA์ ๊ฒฝ์ฐ Repository๊ฐ DAO์ ์ญํ ์ ํ๋ค๊ณ ๋ณผ ์ ์๋ค. ํ์ง๋ง DAO์ Repository๊ฐ ๊ฐ์ ๊ฒ์ ์๋๋ค.
์ฐธ๊ณ : DAO์ Repository์ ์ฐจ์ด์
DAO์ REPOSITORY ๋ชจ๋ ํผ์์คํด์ค ๋ก์ง์ ๋ํ ๊ฐ์ฒด-์งํฅ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ ๋๋ฉ์ธ ๋ก์ง๊ณผ ํผ์์คํด์ค ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๊ด์ฌ์ ๋ถ๋ฆฌ(separation of concerns) ์๋ฆฌ๋ฅผ ๋ง์กฑ์ํค๋๋ฐ ๋ชฉ์ ์ด ์๋ค. ๊ทธ๋ฌ๋ ๋น๋ก ์๋์ ์ธํฐํ์ด์ค์ ๋ฉ์๋ ์๊ทธ๋์ฒ์ ์ ์ฌ์ฑ์ด ์กด์ฌํ๋ค๊ณ ํด์ DAO์ REPOSITORY๋ฅผ ๋์ผํ ํจํด์ผ๋ก ์ทจ๊ธํ๋ ๊ฒ์ ์ฑ๊ธํ ์ผ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฒํ๋ ๊ฒ์ด๋ค.
DAO๋ ํผ์์คํด์ค ๋ก์ง์ธ Entity Bean์ ๋์ฒดํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ฐ๋ ์ด๋ค. DAO๊ฐ ๋น๋ก ๊ฐ์ฒด-์งํฅ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ค๋ ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ๋๋ผ๋ ์ค์ ๊ฐ๋ฐ ์์๋ ํ๋ถ์ ํผ์์คํด์ค ๋ฉ์ปค๋์ฆ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ผ๋ ์ฌ์ค์ ์จ๊ธฐ๋ ค๊ณ ํ์ง ์๋๋ค. DAO์ ์ธํฐํ์ด์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ CRUD ์ฟผ๋ฆฌ์ 1:1 ๋งค์นญ ๋๋ ์ธ๋ฐํ ๋จ์์ ์คํผ๋ ์ด์ ์ ์ ๊ณตํ๋ค. ๋ฐ๋ฉด REPOSITORY๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ๊ฐ์ฒด ์ปฌ๋ ์ ์ ๋ํ ์งํฉ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. DAO๊ฐ ์ ๊ณตํ๋ ์คํผ๋ ์ด์ ์ด REPOSITORY ๊ฐ ์ ๊ณตํ๋ ์คํผ๋ ์ด์ ๋ณด๋ค ๋ ์ธ๋ฐํ๋ฉฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก REPOSITORY์์ ์ ๊ณตํ๋ ํ๋์ ์คํผ๋ ์ด์ ์ด DAO์ ์ฌ๋ฌ ์คํผ๋ ์ด์ ์ ๋งคํ๋๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ๋ฐ๋ผ์ ํ๋์ REPOSITORY ๋ด๋ถ์์ ๋ค์์ DAO๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก REPOSITORY๋ฅผ ๊ตฌํํ ์ ์๋ค.
โ๏ธController
Controller๋ Client์ ์์ฒญ์ DTO์ ํํ๋ก ๋ฐ์ Service์ ๊ธฐ๋ฅ์ ํธ์ถํ๊ณ , ์ ์ ํ ์๋ต์ DTO์ ํํ๋ก ๋ฐํํ๋ ์ญํ ์ ํ๋ค. ์ฆ, ์์ฒญ๊ณผ ์๋ต์ ๊ด๋ฆฌํ๋ ๊ณ์ธต์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
โ๏ธService
Service ๊ณ์ธต์ DTO๋ฅผ ํตํด ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ , DAO(ํน์ Repository)๋ฅผ ํตํด DB์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
โ๏ธRepository(DAO)
JPA๋ฅผ ์ฌ์ฉํ๋ฉด Repository๋ฅผ ํตํด DB์ ์ค์ ๋ก ์ ๊ทผํ ์ ์๋ค. Service์ DB๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํ๋ฉฐ, Service ๊ณ์ธต์์ Repository๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
'Backend๐ฑ > Spring JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [JPA] EntityManager and Persistence Context (0) | 2023.04.02 |
|---|---|
| JPA ๊ธฐ์ด (1) + etc (0) | 2023.04.02 |
| [JPA] @GetMapping๊ณผ @PostMapping (0) | 2023.04.02 |
| [JPA] @Embedded, @Embeddable - ๋๋น (0) | 2023.04.02 |
| [JPA] ์คํ๋ง ๋ถํธ์ JPA ํ์ฉ (0) | 2023.03.31 |