๐[Spring] ๊ณ์ธตํ ์ํคํ ์ฒ์์ Repository์ ์ญํ .
Java ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ธตํ ์ํคํ ์ฒ์์ Repository ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
Repository๋ ๋ฐ์ดํฐ์ CRUD(Create, Read, Update, Delete) ์์ ์ ์ฒ๋ฆฌํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ์(์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค)์์ ๊ฐ์ ธ์ค๊ณ , ์์ ํ๋ฉฐ, ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ์บก์ํํฉ๋๋ค.
์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง์์ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ถ๋ฆฌํ๊ณ , ์ ์ง๋ณด์์ฑ๊ณผ ํ ์คํธ ๊ฐ๋ฅ์ฑ์ ๋์ ๋๋ค.
1๏ธโฃ Repository ๊ณ์ธต์ ์ฃผ์ ์ญํ .
1. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๊ด๋ฆฌ.
- Repository๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ค๊ฐ์ ์ญํ ์ ํ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ์์ , ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๋ชจ๋ ๋ฐ์ดํฐ ์ ๊ทผ ๋ก์ง์ Repository ๊ณ์ธต์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
2. CRUD ์์ ์ฒ๋ฆฌ.
- Repository๋ ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ ์ ๋ฐ์ ๊ฑธ์น CRUD ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- Java์ JPA๋ Hibernate ๊ฐ์ ORM(Object-Relational Mapping) ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋งคํ์ ์๋์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด,
save
,findById
,deleteById
๋ฑ์ ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ๋ ์์ ์ ์ํํฉ๋๋ค.
3. ๋ฐ์ดํฐ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ.
- Repository ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์คํํฉ๋๋ค.
- Spring Data JPA์ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ฐํธํ๊ฒ ์ ์ํ ์ ์์ผ๋ฉฐ, ๋ณต์กํ ์กฐ๊ฑด ๊ฒ์์ ์ํ JPQL(Java Persistence Query Language) ๋๋ ๋ค์ดํฐ๋ธ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ์ ์ธ ์ฟผ๋ฆฌ ๋ฉ์๋ ์ธ์๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ํน์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ ์ ์์ต๋๋ค.
4. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ถ์ํ.
- Repository๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๋ก์ง์ ์บก์ํํ์ฌ ์์ ๊ณ์ธต(Service ๋ฑ)์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์ฒด์ ์ธ ๋์ ๋ฐฉ์์ ์ ํ์๊ฐ ์๋๋ก ํฉ๋๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์์ ๊ณ์ธต์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
5. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฆฝ์ฑ.
- Repository๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ตฌ์ฒด์ ์ธ ์ข ์์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋, Repository ๊ณ์ธต๋ง ์ ์ ํ ์์ ํ๋ฉด ์์ ๊ณ์ธต์๋ ์ํฅ์ ์ฃผ์ง ์๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฆฝ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
6. ๊ฐ์ฒด์ ๋ฐ์ด๋ธ ๋งคํ ๊ด๋ฆฌ
- ORM์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๊ฐ์ฒด๋ฅผ ๋งคํํ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค.
- ๊ฐ์ฒด์ ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ(1, N)๋ฅผ ์ ์ํ๊ณ , ์ด๋ฌํ ๊ด๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ์ฐ์ ์ํํฉ๋๋ค.
2๏ธโฃ ์์ ์ฝ๋
Spring Data JPA๋ฅผ ์ฌ์ฉํ Repository ๊ณ์ธต์ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// ๊ธฐ๋ณธ์ ์ผ๋ก JpaRepository์์ ์ ๊ณตํ๋ CRUD ๋ฉ์๋๋ค
// save, fundById, findAll, deleteById ๋ฑ์ด ์ ๊ณต๋ฉ๋๋ค.
// ์ปค์คํ
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์
Optional<User> findByEmail(String email);
// ๋ณต์กํ JPQL ์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ ๊ฐ๋ฅ
@Query("SELECT u FROM User u WHERE u.name = :name AND u.status = :status")
List<User> findByNameAndStatus(@Param("name") String name, @Param("status") String status);
}
3๏ธโฃ ์ค๋ช
-
@Repository
- Spring์์ ์ด ์ธํฐํ์ด์ค๊ฐ ๋ฐ์ดํฐ ์์ธ์ค ๊ณ์ธต์ ๋ํ๋ธ๋ค๋ ๊ฒ์ ๋ช ์ํ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
-
@Repository
์ด๋ ธํ ์ด์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ธ๋ฅผ Spring์ ๋ฐ์ดํฐ ์์ธ์ค ์์ธ๋ก ๋ณํํ๋ ์ญํ ๋ ํฉ๋๋ค.
-
JpaRepository<User, Long>
- Spring Data JPA์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ก,
User
์ํฐํฐ์Long
ํ์ ์ ID๋ฅผ ์ฌ์ฉํด CRUD ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- Spring Data JPA์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ก,
-
๊ธฐ๋ณธ CRUD ๋ฉ์๋
-
save
,findById
,deleteById
๋ฑ์ ๋ฉ์๋๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.
-
-
์ปค์คํ
์ฟผ๋ฆฌ ๋ฉ์๋
- ๋งค์๋ ๋ช ๋ช ๊ท์น์ ํตํด ์๋์ผ๋ก SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ํน์ ํ๋๋ก ๊ฒ์ํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด,
findByEmail
์ ์ด๋ฉ์ผ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ์๋ฅผ ์กฐํํฉ๋๋ค.
-
JPQL ์ฌ์ฉ
- ๋ณต์กํ ์กฐ๊ฑด์ด ํ์ํ ๊ฒฝ์ฐ,
@Query
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด JPQL์ ์์ฑํ ์ ์์ต๋๋ค. - ์ด ์์์์๋ ์ด๋ฆ๊ณผ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ์ต๋๋ค.
- ๋ณต์กํ ์กฐ๊ฑด์ด ํ์ํ ๊ฒฝ์ฐ,
4๏ธโฃ Repository ๊ณ์ธต์ ์ด์ .
1. ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฐ์ดํฐ ์ ๊ทผ ๋ก์ง์ ๋ถ๋ฆฌ.
- Repository ๊ณ์ธต์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ๊ฐ ๊ณ์ธต์ด ์์ ์ ์ญํ์๋ง ์ง์คํ ์ ์๊ฒ ํฉ๋๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๋ ๋ชจ๋ํ๋๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์์ง๋๋ค.
2. ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ.
- Repository ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๋ก์ง์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด์ง๋๋ค.
- ์ฌ๋ฌ ์๋น์ค์์ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ ๋, ์ด๋ฅผ ์ค์์์ ๊ด๋ฆฌํจ์ผ๋ก์จ ์ฝ๋ ์ค๋ณต์ ์ค์ผ ์ ์์ต๋๋ค.
3. ํ ์คํธ ๊ฐ๋ฅ์ฑ ํฅ์.
- Repository ๊ณ์ธต์ ์ธํฐํ์ด์ค๋ก ์ ์ํจ์ผ๋ก์จ ํ ์คํธ ์ Mock ๊ฐ์ฒด๋ก ์ฝ๊ฒ ๋์ฒดํ ์ ์์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ง ์๊ณ ๋ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
4. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ ์ ์ฐ์ฑ.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ Repository ๊ณ์ธต๋ง ์์ ํ๋ฉด ์์ ๊ณ์ธต(Service๋ Controller)์ ์ ํ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์งํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฆฝ์ฑ์ ๋์ด๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
5๏ธโฃ ๊ฒฐ๋ก
Repository ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ ๋ชจ๋ ์์
์ ๋ด๋นํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ์กฐํ, ์
๋ฐ์ดํธ, ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ์บก์ํํฉ๋๋ค.
์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์ ๊ทผ ๋ก์ง์ด ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ, ์ฌ์ฌ์ฉ์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.