πŸ“š [Spring] μŠ€ν”„λ§ 데이터 JPA, API λ¬Έμ„œν™”, 컀밋과 이슈

이가은·2024λ…„ 6μ›” 19일
0

Spring

λͺ©λ‘ 보기
12/13
post-thumbnail

πŸ“• μŠ€ν”„λ§ 데이터 JPA

JPA(Java Persistent API)λŠ” μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ JPAλ₯Ό νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” ν”„λ‘œμ νŠΈ

  • CRUDλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 곡톡 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 제곡
  • Repository 계측에 κ΅¬ν˜„ 클래슀 없이 μΈν„°νŽ˜μ΄μŠ€λ§Œ μž‘μ„±ν•˜λ©΄ μ‹€ν–‰ μ‹œμ μ— μŠ€ν”„λ§ 데이터 JPAκ°€ κ΅¬ν˜„ 객체λ₯Ό λ™μ μœΌλ‘œ 생성 및 μ£Όμž…
  • 곡톡 λ©”μ†Œλ“œλŠ” μŠ€ν”„λ§ 데이터 JPAκ°€ μ œκ³΅ν•˜λŠ” org.springframework.date.jpa.repository.JpaRepository μΈν„°νŽ˜μ΄μŠ€μ— count, delete, deleteAll, deleteAll, deleteById, existsById, findById, save 등이 κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€

πŸ“– 곡톡 μΈν„°νŽ˜μ΄μŠ€ κΈ°λŠ₯

public interface SpringDataJpaItemRepository extends JpaRepository<Item,Long> {
    List<Item> findByItemNameLike(String itemName);
 
    List<Item> findByPriceLessThanEqual(Integer price);
 
    //쿼리 λ©”μ†Œλ“œ (μ•„λž˜ λ©”μ†Œλ“œμ™€ 같은 κΈ°λŠ₯ μˆ˜ν–‰)
    List<Item> findByItemNameLikeAndPriceLessThanEqual(String itemName, Integer price);
 
    //쿼리 직접 μ‹€ν–‰
    @Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
    List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);
}

βœ” μ΄λ ‡κ²Œ JpaRepository μΈν„°νŽ˜μ΄μŠ€λ§Œ 상속받아도 Spring Data JPAκ°€ ν”„λ‘μ‹œ κΈ°μˆ μ„ μ‚¬μš©ν•΄μ„œ κ΅¬ν˜„ 클래슀λ₯Ό λ§Œλ“€κ³  μŠ€ν”„λ§ 빈으둜 등둝해주기 λ•Œλ¬Έμ— κ°œλ°œμžλŠ” κ΅¬ν˜„ 클래슀 없이 μΈν„°νŽ˜μ΄μŠ€λ§Œ λ§Œλ“€λ©΄ κΈ°λ³Έ CRUD κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ‹€

πŸ“– 쿼리 λ©”μ†Œλ“œ κΈ°λŠ₯

//쿼리 λ©”μ†Œλ“œ
List<Item> findByItemNameLikeAndPriceLessThanEqual(String itemName, Integer price);

βœ” μŠ€ν”„λ§ 데이터 JPAλŠ” μΈν„°νŽ˜μ΄μŠ€μ— λ©”μ†Œλ“œ μ΄λ¦„λ§Œ 적어두면, λ©”μ†Œλ“œ 이름을 λΆ„μ„ν•΄μ„œ 쿼리λ₯Ό μžλ™μœΌλ‘œ λ§Œλ“€κ³  μ‹€ν–‰ν•΄μ£ΌλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€

//쿼리 직접 μ‹€ν–‰
@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);

βœ” 쿼리 λ©”μ†Œλ“œ κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  직접 JPQL을 μ‚¬μš©ν•˜κ³  싢을 λ•ŒλŠ” @Query에 직접 JPQL을 μž‘μ„±ν•˜λ©΄ λœλ‹€
βœ” @Queryλ₯Ό μ‚¬μš©ν•˜λ©΄ λ©”μ†Œλ“œ μ΄λ¦„μœΌλ‘œ μ‹€ν–‰ν•˜λŠ” κ·œμΉ™μ΄ λ¬΄μ‹œλœλ‹€

πŸ“™ JPQL

JPQL(Java Persistence Query Language)λŠ” μ—”ν‹°ν‹° 객체λ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” 쿼리 μ–Έμ–΄

//λ‚˜μ΄κ°€ 18μ‚΄ 이상인 μœ μ €λ₯Ό 쑰회
select u from User as u where u.age > 18

//쿼리 직접 μ‹€ν–‰
@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);

πŸ“’ API λͺ…μ„Έμ„œ

μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ μ‚¬μš©λ˜λŠ” λ¬Έμ„œλ‘œ API의 이름, νŒŒλΌλ―Έν„°(λ§€κ°œλ³€μˆ˜), μΈν„°νŽ˜μ΄μŠ€, λ°˜ν™˜ κ°’ λ“±μ˜ ꡬ문, 인증 및 인가방법(λ™μž‘λ°©μ‹), 데이터 전달 ν˜•μ‹ λ“± APIλ₯Ό μ •ν™•ν•˜κ²Œ ν˜ΈμΆœν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό λͺ…ν™•νžˆ ν•΄μ„ν•˜λŠ”λ° ν•„μš”ν•œ 정보듀을 μΌκ΄€λœ ν˜•μ‹μœΌλ‘œ κΈ°μˆ ν•œ 것

πŸ“– API λͺ…μ„Έμ„œ ν•„μš”μ„±

β—Ύ API의 섀계, 개발 및 λ¬Έμ„œν™” κ³Όμ •μ—μ„œ 용이
β—Ύ μ„œλ‘œ λ‹€λ₯Έ ν΄λΌμš°λ“œ μ„œλΉ„μŠ€ κ°„μ˜ API μ—°λ™μ—μ„œ ν•„μš”ν•¨

πŸ“— ERD

ERD(Entity Relationship Diagram)λŠ” 'Entity 개체'와 'Relationship 관계'λ₯Ό μ€‘μ μ μœΌλ‘œ ν‘œμ‹œν•˜λŠ”Β λ°μ΄ν„°λ² μ΄μŠ€ ꡬ쑰λ₯Ό ν•œ λˆˆμ— μ•Œμ•„λ³΄κΈ° μœ„ν•΄ κ·Έλ €λ†“λŠ” λ‹€μ΄μ–΄κ·Έλž¨

πŸ“˜ 컀밋 μ»¨λ²€μ…˜κ³Ό 이슈 μž‘μ„±ν•˜κΈ°

type: Subject

body

footer

βœ” 기본적인 컀밋 λ©”μ‹œμ§€ κ΅¬μ‘°λŠ” 제λͺ©, λ³Έλ¬Έ, 꼬리말 μ„Έκ°€μ§€ 파트둜 λ‚˜λˆ„κ³ , 각 νŒŒνŠΈλŠ” λΉˆμ€„μ„ 두어 κ΅¬λΆ„ν•œλ‹€

πŸ“– νƒ€μž…

feat : μƒˆλ‘œμš΄ κΈ°λŠ₯
fix : 버그 ν•΄κ²°
docs : λ¬Έμ„œ λ³€κ²½
style : formatting, λ†“μΉœ μ„Έλ―Έμ½œλ‘  λ“±... μ½”λ“œμ˜ 변경은 μ—†μŒ
refactor : μ½”λ“œ λ¦¬νŒ©ν† λ§
test : ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€ ν˜Ήμ€ ν…ŒμŠ€νŠΈ μ½”λ“œ λ¦¬νŒ©ν† λ§. μ½”λ“œμ˜ 변경은 μ—†μŒ
chore : νŒ¨ν‚€μ§€ λ§€λ‹ˆμ € ꡬ성, λΉŒλ“œ μž‘μ—… μ—…λ°μ΄νŠΈ. μ½”λ“œμ˜ 변경은 μ—†μŒ

πŸ“– Subject

  • 제λͺ©μ€ 50자λ₯Ό λ„˜μ–΄μ„œλŠ” μ•ˆλœλ‹€
  • λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•΄μ•Ό ν•œλ‹€
  • λ§ˆμΉ¨ν‘œλ‘œ λλ‚˜λ©΄ μ•ˆλœλ‹€
  • 컀밋이 μˆ˜ν–‰ ν•œ μž‘μ—…μ— λŒ€ν•΄ λͺ…λ Ήν˜•μœΌλ‘œ μž‘μ„±ν•œλ‹€

πŸ“– Body

  • λ°”λ””λŠ” μ˜΅μ…˜μ΄κ³ , 컀밋이 μ•½κ°„μ˜ μ„€λͺ…κ³Ό 문단이 ν•„μš”ν•  λ•Œ λ°”λ””κ°€ μ‚¬μš©λœλ‹€
  • 'μ–΄λ–»κ²Œ'κ°€ μ•„λ‹Œ '무엇을' 그리고 'μ™œ'에 λŒ€ν•œ μ„€λͺ…을 μœ„ν•΄ λ°”λ””λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€
  • λ°”λ””λ₯Ό 적을 λ•Œ, 타이틀과 λ°”λ”” 사이에 곡백을 적어야 ν•˜κ³  각 쀄에 κΈ€μžκ°€ 72자λ₯Ό λ„˜μ§€ μ•Šλ„λ‘ ν•΄μ•Όν•œλ‹€
  • 푸터도 μ˜΅μ…˜μ΄κ³ , 이슈트래컀 아이디 참쑰둜 μ‚¬μš©λœλ‹€
Feat: 관심지역 μ•Œλ¦Ό ON/OFF κΈ°λŠ₯ μΆ”κ°€(#123)

μ‹œκ΅°κ΅¬μ˜ μ•Œλ¦Όμ„ 각각 ON/OFF ν•  수 μžˆλ„λ‘ κΈ°λŠ₯을 좔가함
 - opnion0055: ꡬ뢄 μ½”λ“œ

ν•΄κ²°: close #123

πŸ“” νŒ¨ν‚€μ§€ ꡬ쑰 μ„€μ •

πŸ“– κ³„μΈ΅ν˜• 디렉터리 ꡬ쑰

com
 γ„΄ example
     γ„΄ sju
         γ„΄ config
         γ„΄ controller
         γ„΄ domain
         γ„΄ repository
         γ„΄ service
         γ„΄ security
         γ„΄ exception

βœ” μŠ€ν”„λ§ μ›Ή κ³„μΈ΅μ˜ λŒ€ν‘œ 클래슀 ν˜Ήμ€ 디렉터리듀을 기반으둜 νŒ¨ν‚€μ§•ν•˜λŠ” 방법
βœ” κ³„μΈ΅ν˜• κ΅¬μ‘°λŠ” 전체적인 ꡬ쑰λ₯Ό λΉ λ₯΄κ²Œ νŒŒμ•…ν•  수 μžˆλŠ” μž₯점이 μžˆμ§€λ§Œ, 각각의 νŒ¨ν‚€μ§€ 디렉터리에 ν΄λž˜μŠ€λ“€μ΄ λ„ˆλ¬΄ 많이 λͺ¨μ΄κ²Œ λœλ‹€λŠ” 단점이 μ‘΄μž¬ν•œλ‹€

πŸ“– λ„λ©”μΈν˜• 디렉터리 ꡬ쑰

com
 γ„΄ example
     γ„΄ vivid
         γ„΄ domain
         |   γ„΄ user
         |   |   γ„΄ api
         |   |   γ„΄ application
         |   |   γ„΄ dao
         |   |   γ„΄ domain
         |   |   γ„΄ dto
         |   |   γ„΄ exception
         |   γ„΄ video
         |   |   γ„΄ api
         |   |   γ„΄ application
         |   |   γ„΄ dao
         |   |   γ„΄ domain
         |   |   γ„΄ dto
         |   |   γ„΄ exception
         |   ...
         γ„΄ global
             γ„΄ auth
             γ„΄ common
             γ„΄ config
             γ„΄ error
             γ„΄ infra
             γ„΄ util

βœ” 각각의 도메인 λ³„λ‘œ νŒ¨ν‚€μ§€ 뢄리가 κ°€λŠ₯ν•˜μ—¬ 관리에 μžˆμ–΄μ„œ κ³„μΈ΅ν˜• 방식보닀 직관적이며, 각각의 도메인듀은 μ„œλ‘œλ₯Ό μ˜μ‘΄ν•˜λŠ” μ½”λ“œκ°€ 없도둝 μ„€κ³„ν•˜κΈ° μ ν•©ν•΄μ„œ μ½”λ“œμ˜ μž¬ν™œμš©μ„±μ΄ ν–₯μƒλœλ‹€

πŸ““ PR

PR(Pull Request)은 원격 μ €μž₯μ†Œμ— pushν•˜μ—¬ μƒˆλ‘œμš΄ 사항이 μ €μž₯λ˜μ—ˆμ„ λ•Œ, ν”„λ‘œμ νŠΈ κ΄€λ¦¬μžμ—κ²Œ μƒˆλ‘œμš΄ μ½”λ“œ 변경사항을 μ•Œλ¦¬κ³  원본 μ†ŒμŠ€ μ½”λ“œμ— 병합을 μš”μ²­ν•˜λŠ” 것이닀. μ½”λ“œλ₯Ό λ³‘ν•©ν•˜λŠ” κ³Όμ •μ—μ„œ μ„œλ‘œ μ½”λ“œλ„ 확인할 수 있고 μ–΄λ–€ 뢀뢄을 μˆ˜μ •ν–ˆλŠ”μ§€λ„ 확인할 수 μžˆλ„λ‘ Pull requestλ₯Ό μ§„ν–‰ν•œλ‹€.

πŸ“š 참고자료

πŸ“– ERD μž‘μ„± 방법
πŸ“– 컀밋 μ»¨λ²€μ…˜ μž‘μ„±ν•˜κΈ°
πŸ“– νŒ¨ν‚€μ§€ ꡬ쑰 μ„€μ •

profile
κ°€λΏ‘μ΄μ˜ 곡뢀 μƒμžπŸ“¦

0개의 λŒ“κΈ€