Sample App Features
Application 에서는 기본적으로 object 에 대한 Create, Read, Update, Delete 의 기능을 제공한다. 이러한 기능을 제공하는 App 을 CRUD Application 이라고도 부른다.
Data Access Obejct

DAO 는 Data Access Obejct, 즉 Database 접근을 위한 obejct 로, database 와 interfacing 하는 기능을 담당하는 object 또는 Design Pattern 을 의미한다.
주로 위에서 언급한 CRUD 작업을 처리하며, Business Logic 과 Data Access Logic 을 분리시키기 위하여 사용된다.
DAO 는 다음 몇 가지의 methods 를 가진다.
save(...)findById(...)findAll()findByLastName(...)update(...)delete(...)deleteAll()
또한 DAO 는 이전에 JPA 를 통하여 Database 의 data 를 save 하는 방법에서 언급한 JPA Entity Manager 라는 것을 필요로 하게 된다.
JPA Entity Manager
JPA Entity Manger 는 entity 들을 saving 하고 retrieving 하기 위한 핵심 Interface 이자 component 이다. 이를 통하여 entity 의 lifecycle 을 관리하고, Database 에 대한 CRUD 작업 및 JPQL query 를 실행할 수 있다.

또한 다시 JPA Entity Manager 는 Data Source 라는 것을 필요로 하게 되는데, Data Source 는 Database 와의 연결을 관리하기 위한 Interface 로, Java 에서 Database 연결을 설정하고 제공하는 역할을 수행한다.
이들 JPA Entity Manager 와 Data Source 는 application.properties file 에서의 설정(JDBC URL, user id, password 등)을 기반으로 Spring Boot 가 자동으로 생성한다.
이후 개발자는 Spring Boot 가 자동으로 생성한 Entity Manager 를, 원하는 DAO 에 autowire 하거나 inject 하여 사용할 수 있다.
Entity Manger vs JpaRepository
우선 JpaRepository 는 Spring Data JPA module 에서 제공하는 Interface 로, 최소한의 coding 으로 Database 에 대한 CRUD 작업을 매우 간단하게 처리할 수 있도록 도와준다.
다음은 Entity Manager 와 JpaRepository 에 대한 차이점이다.
| 항목 | EntityManager | JpaRepository |
|---|---|---|
| 정의 | JPA 표준 API 로, entity 의 lifecycle 관리 및 DB 와 직접 상호작용하는 Interface | Spring Data JPA 에서 제공하는 Interface 로, 기본 CRUD 작업과 Paging 및 Sorting 기능을 자동으로 구현 |
| 기능 | Entity 저장, 수정, 삭제, 조회 및 JPQL 작성 가능 | 기본 CRUD method(save, findById, findAll 등) 와 Paging 및 Sorting 기능 제공 |
| 복잡한 Query 처리 | 복잡한 동적 query 작성에 적합하며, native SQL 을 사용할 수 있음 | method 이름으로 간단한 query 작성 가능하지만 복잡한 쿼리는 제한적이며 @Query로 처리 가능. |
| 적합한 사용 사례 | 복잡한 query 나 native SQL을 사용해야 하는 경우 | 간단한 CRUD 작업 및 paginateion, sorring 처리가 필요한 경우 |
Data Access Layer 에서 사용할 수 있는 기술 중 어떤 것을 선택해야 할지는 project 의 spec 에 따라서 선택해야 한다. 아마 두 개 모두 사용하는 경우도 있을 것이다.