Skip to content

[🌱 JPA λ°©νƒˆμΆœ μ˜ˆμ•½ λŒ€κΈ°] 제제(μ†‘λ―Όμ„œ) λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#584

Open
alstj2384 wants to merge 27 commits into
woowacourse:alstj2384from
alstj2384:jpa
Open

[🌱 JPA λ°©νƒˆμΆœ μ˜ˆμ•½ λŒ€κΈ°] 제제(μ†‘λ―Όμ„œ) λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#584
alstj2384 wants to merge 27 commits into
woowacourse:alstj2384from
alstj2384:jpa

Conversation

@alstj2384

Copy link
Copy Markdown

체크 리슀트

  • λ―Έμ…˜μ˜ ν•„μˆ˜ μš”κ΅¬μ‚¬ν•­μ„ λͺ¨λ‘ κ΅¬ν˜„ν–ˆλ‚˜μš”?
  • Gradle testλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ, λͺ¨λ“  ν…ŒμŠ€νŠΈκ°€ μ •μƒμ μœΌλ‘œ ν†΅κ³Όν–ˆλ‚˜μš”?
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λ‚˜μš”?

베이슀 μ½”λ“œ 선택 체크

  • 이전 λ―Έμ…˜μ˜ λ‚΄ μ½”λ“œμ—μ„œ μ‹œμž‘
  • 이전 λ―Έμ…˜μ˜ νŽ˜μ–΄μ˜ μ½”λ“œμ—μ„œ μ‹œμž‘

도달 지점

4단계 μžλ™ 승인

μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ κ΄€μ°°

λ°œν–‰ SQL을 직접 λ³΄λ©΄μ„œ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ λ™μž‘μ„ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

1μ°¨ μΊμ‹œ: 같은 νŠΈλžœμž­μ…˜μ—μ„œ findByIdλ₯Ό 5번 호좜 β†’ SELECT 1번만 λ°œν–‰
dirty checking: μˆ˜μ • λ‘œμ§μ—μ„œ update/saveλ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•˜μ§€ μ•Šμ•„λ„, μ˜μ† 객체 ν•„λ“œλ§Œ λ°”κΎΈλ©΄ commit μ‹œμ μ— UPDATE μžλ™ λ°œν–‰. κΈ°μ‘΄ JdbcTemplate μ½”λ“œμ˜ reservationRepository.update(...) 호좜 μžμ²΄κ°€ 사라짐
DDL κ΄€μ°°: @column(length = 20)은 μ˜λ„λŒ€λ‘œ varchar(20), ν•˜μ§€λ§Œ μ œμ•½μ„ μ•ˆ μ£Όλ©΄ 기본이 nullable이라 start_at이 μ˜λ„μ™€ 달리 null ν—ˆμš©μœΌλ‘œ λ‚˜μ˜΄ β†’ @column(nullable = false) μΆ”κ°€λ‘œ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.
LocalTime은 time(6)둜 μ €μž₯λ˜μ—ˆλŠ”λ°, DB의 μ‹œκ°„ λ‹¨μœ„μ™€ μžλ°”μ˜ μ‹œκ°„ λ‹¨μœ„ 정밀도λ₯Ό λ§žμΆ”λ €κ³  μ΄λ ‡κ²Œ μˆ˜μ •λ¨μ„ μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€

2단계 연관관계 λ§€ν•‘

단방ν–₯ @manytoone으둜 λ§€ν•‘ν•˜λ‹ˆ, FK μ œμ•½μ΄ ν…Œμ΄λΈ” 생성 ν›„ alter table둜 λ‚˜μ€‘μ— μΆ”κ°€λ˜κ³ , FK 이름은 ν•˜μ΄λ²„λ„€μ΄νŠΈκ°€ FK + ν•΄μ‹œλ‘œ μžλ™ μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.

findById(id).getTime().getStartAt()의 λ°œν–‰ SQL을 확인 μ‹œ LAZY둜 두면 ν”„λ‘μ‹œλ‘œ 두고 μ‹€μ œ μ ‘κ·Ό μ‹œμ μ— μΆ”κ°€ SELECTν•˜λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

3단계 N+1을 직접 λͺ©κ²©

findAll둜 μ˜ˆμ•½μ„ λ‹€ κ°€μ Έμ˜¨ λ’€, Reservations 일급 μ»¬λ ‰μ…˜ μ•ˆμ—μ„œ 각 Reservation의 slot ν”„λ‘μ‹œμ— μ ‘κ·Όν•˜λ‹ˆ 쿼리가 μ—„μ²­ λ§Žμ•˜μŠ΅λ‹ˆλ‹€.
μ˜ˆμ•½ 4건 쑰회 β†’ Reservation 전체 쑰회 1번 + λ ˆμ½”λ“œ 수만큼 slot 쑰회 N번 + DTO λ³€ν™˜ μ‹œ time + theme μ˜ˆμ•½μž record λ‹Ή 2번
= μ˜λ„ν•˜μ§€ μ•Šμ€ μˆ˜μ‹­ 번의 쿼리

@query둜 fetch join을 λ„£μ–΄ slot을 ν•œ 방에 λŒμ–΄μ™”μŠ΅λ‹ˆλ‹€.

java@Query("SELECT r FROM Reservation r JOIN FETCH r.slot s")
List<Reservation> findAll();

흔듀린 ν•œ μž₯λ©΄: "μ™œ @transactional이 μ—†λŠ”λ° 1μ°¨ μΊμ‹œκ°€ λ¨Ήμ§€?"

1μ°¨ μΊμ‹œλ₯Ό ν™•μΈν•˜λ‹€κ°€, Serviceμ—μ„œ @transactional을 λ–Όκ³  findByIdλ₯Ό 5번 ν˜ΈμΆœν–ˆλŠ”λ°μš”, 제 κ°€μ„€λŒ€λ‘œλ©΄ 쿼리가 5번 λ‚˜κ°€μ•Ό ν–ˆλŠ”λ°, ν•œ 번만 λ‚˜κ°”μŠ΅λ‹ˆλ‹€. μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” νŠΈλžœμž­μ…˜ λ²”μœ„μ—μ„œλ§Œ μ‚°λ‹€κ³  μ•Œκ³  μžˆμ—ˆλŠ”λ°, νŠΈλžœμž­μ…˜μ΄ μ—†λŠ”λ°λ„ μΊμ‹œκ°€ μ‚΄μ•„μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
κ·Έ μ΄μœ λŠ” OSIVμ˜€μŠ΅λ‹ˆλ‹€. HTTP μš”μ²­ μ§„μž… ~ μ‘λ‹΅κΉŒμ§€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό μ‚΄λ €λ‘λ‹ˆ, νŠΈλžœμž­μ…˜μ΄ 없어도 μ›Ή μš”μ²­ ν•œ 사이클 λ™μ•ˆ 1μ°¨ μΊμ‹œκ°€ μœ μ§€λœ κ²λ‹ˆλ‹€. spring.jpa.open-in-view=false둜 λ„λ‹ˆ, μ˜λ„λŒ€λ‘œ SELECTκ°€ 5번 λ‚˜κ°”μŠ΅λ‹ˆλ‹€.

μ™œ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ 생λͺ…μ£ΌκΈ°λŠ” νŠΈλžœμž­μ…˜μΈκ°€?

  • 1μ°¨ μΊμ‹œλ₯Ό μ–Έμ œκΉŒμ§€ μœ μ§€ν• μ§€μ˜ 기쀀이 ν•„μš”ν•˜λ‹€.
  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” μŠ€λ ˆλ“œ μ•ˆμ „ν•˜μ§€ μ•Šλ‹€ β€” μŠ€λ ˆλ“œ 격리 기쀀이 ν•„μš”ν•˜λ‹€.
  • μ“°κΈ° μ§€μ—°μ˜ flush μ‹œμ  기쀀이 ν•„μš”ν•˜λ‹€.

μœ„ 기쀀에 μ˜ν•΄ μ»¨ν…μŠ€νŠΈ 생λͺ…μ£ΌκΈ°κ°€ 섀정됨을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
OSIVλŠ” 이 경계λ₯Ό μΈμœ„μ μœΌλ‘œ 늘렀 잠깐의 편의λ₯Ό μ£ΌλŠ” λŒ€μ‹ , 컀λ„₯μ…˜μ„ 응닡 λκΉŒμ§€ μœ μ§€ν•˜μ—¬ 컀λ„₯μ…˜ 고갈 μœ„ν—˜μ΄ μžˆλ‹€λŠ” 단점이 μžˆλŠ” 점을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

alstj2384 added 27 commits June 2, 2026 17:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant