Home > Spring > ๐Ÿƒ[Spring] ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์—์„œ Repository์˜ ์—ญํ• .

๐Ÿƒ[Spring] ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์—์„œ Repository์˜ ์—ญํ• .
Spring Framework

๐Ÿƒ[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 ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ CRUD ๋ฉ”์„œ๋“œ
    • save, findById, deleteById ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ปค์Šคํ…€ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ
    • ๋งค์„œ๋“œ ๋ช…๋ช… ๊ทœ์น™์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ SQL ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํŠน์ • ํ•„๋“œ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, findByEmail์€ ์ด๋ฉ”์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
  • JPQL ์‚ฌ์šฉ
    • ๋ณต์žกํ•œ ์กฐ๊ฑด์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, @Query ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด JPQL์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด ์˜ˆ์‹œ์—์„œ๋Š” ์ด๋ฆ„๊ณผ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ Repository ๊ณ„์ธต์˜ ์ด์ .

1. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋กœ์ง์˜ ๋ถ„๋ฆฌ.

  • Repository ๊ณ„์ธต์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ ๊ณ„์ธต์ด ์ž์‹ ์˜ ์—ญํ™œ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ๋ชจ๋“ˆํ™”๋˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

2. ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ.

  • Repository ๊ณ„์ธต์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ, ์ด๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ ํ–ฅ์ƒ.

  • Repository ๊ณ„์ธต์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•จ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ ์‹œ Mock ๊ฐ์ฒด๋กœ ์‰ฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ ๋„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ์˜ ์œ ์—ฐ์„ฑ.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ Repository ๊ณ„์ธต๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ์ƒ์œ„ ๊ณ„์ธต(Service๋‚˜ Controller)์€ ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ๊ฒฐ๋ก 

Repository ๊ณ„์ธต์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ์กฐํšŒ, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์บก์Šํ™”ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋กœ์ง์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌ๋˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.