λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

☘️ λ°±μ—”λ“œ: Backend8

[Spring] Slack API ν™œμš©ν•˜μ—¬ μ—λŸ¬ λͺ¨λ‹ˆν„°λ§ν•˜κΈ° μ„œλΉ„μŠ€λ₯Ό λ°°ν¬ν•œ ν›„, ν”„λ‘œμ νŠΈλ₯Ό μœ μ§€ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ μ—λŸ¬ λŒ€μ‘μ€ ν•„μˆ˜μ μž…λ‹ˆλ‹€. μ—λŸ¬λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜κΈ° μœ„ν•œ μˆ˜λ‹¨μ€ λ‹€μ–‘ν•˜μ§€λ§Œ, 이번 κΈ€μ—μ„œλŠ” Spring Boot μ—μ„œ μŠ¬λž™μ„ ν™œμš©ν•˜μ—¬ μ—λŸ¬λ₯Ό 확인할 수 μžˆλŠ” 방법을 μ†Œκ°œν•˜κ³ μž ν•©λ‹ˆλ‹€. ν•΄λ‹Ή κΈ€μ—μ„œ μ†Œκ°œν•œ 방법을 λ”°λΌμ˜€μ‹œλ©΄ λ‹€μŒκ³Ό 같이 μŠ¬λž™μœΌλ‘œ μ—λŸ¬λ₯Ό ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€! 😎 🎯 1. Slack 연동을 μœ„ν•œ 토큰 λ°œκΈ‰ λ¨Όμ € Slack 봇을 μƒμ„±ν•˜κΈ° μœ„ν•΄ https://api.slack.com/apps/ 에 μ ‘μ†ν•©λ‹ˆλ‹€. Create New App 클릭 -> From scratch 클릭 App Name 을 자유둭게 μ„€μ •ν•˜κ³  μŠ¬λž™ μ•Œλ¦Όμ„ 받을 μ›Œν¬μŠ€νŽ˜μ΄μŠ€λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. Permissions 클릭 Bot Token Scopes μ—μ„œ Add an Oauth Scop.. 2023. 8. 3.
[Spring] JPA μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ μ΄ν•΄ν•˜κΈ° πŸ€” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλž€? JPA μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ (Persistence Context) λž€ μ—”ν‹°ν‹°λ₯Ό 영ꡬ μ €μž₯ν•˜λŠ” ν™˜κ²½μ΄λΌλŠ” 뜻으둜, μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μ΄μ—μ„œ μ—”ν‹°ν‹°λ₯Ό κ΄€λ¦¬ν•˜λŠ” 논리적인 μ˜μ—­μž…λ‹ˆλ‹€. EntityManager 둜 μ—”ν‹°ν‹°λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ μ‘°νšŒν•˜λ©΄ EntityManager λŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ—”ν‹°ν‹°λ₯Ό λ³΄κ΄€ν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€. πŸ’« μ—”ν‹°ν‹°μ˜ 생λͺ…μ£ΌκΈ° μ—”ν‹°ν‹°μ˜ 생λͺ…μ£ΌκΈ° μ—”ν‹°ν‹°μ—λŠ” 4가지 μƒνƒœκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. λΉ„μ˜μ†(new/transient) : μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ™€ μ „ν˜€ 관계가 μ—†λŠ” μƒνƒœ μ˜μ†(managed) : μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯된 μƒνƒœ (μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ˜ν•΄ κ΄€λ¦¬λœλ‹€λŠ” 뜻) μ€€μ˜μ†(detached) : μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯λ˜μ—ˆλ‹€κ°€ λΆ„λ¦¬λœ μƒνƒœ μ‚­μ œ(removed) : μ‚­μ œλœ μƒνƒœ 🫧 λΉ„μ˜μ†.. 2023. 6. 27.
[Spring] ν˜Όλ™λ˜λŠ” JPA κ°œλ… 정리 (Hibernate, Spring Data JPA) 😱 이 글을 μ“°λŠ” 이유 μ·¨μ—… μ€€λΉ„λ₯Ό ν•˜λ©° 면접을 보닀보면 JPA 의 κ°œλ…μ€ 맀번 λ‚˜μ˜¬λ§ŒνΌ 단골 질문이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, 맀번 Hibernate λŠ” JPA 의 κ΅¬ν˜„μ²΄μž…λ‹ˆλ‹€! λΌλŠ” λŒ€λ‹΅λ§Œ ν•΄μ™”κ³ , μ†”μ§νžˆ 차이λ₯Ό μ œλŒ€λ‘œ μ΄ν•΄ν•˜κ³  μžˆμ§€ μ•Šλ‹€κ³  λŠκΌˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 이번 κΈ°νšŒμ— JPA, Hibernate, Spring Data JPA 의 차이에 λŒ€ν•΄ κ³΅λΆ€ν•˜κ³  μ •λ¦¬ν•΄λ³΄λŠ” μ‹œκ°„μ„ 가져보렀 ν•©λ‹ˆλ‹€. 😎 πŸ€” JPA λž€? JPA λŠ” Java Persistence API 의 μ•½μžλ‘œ, μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μ΄μ˜ 데이터 μ˜μ†μ„±μ„ κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ ν‘œμ€€ν™”λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€. JPA λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°κ³Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 뢈일치λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 객체와 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ§€ν•‘ν•˜λŠ” .. 2023. 6. 27.
[Spring] λ©€ν‹° λͺ¨λ“ˆ ν”„λ‘œμ νŠΈ 적용 😎 λ©€ν‹° λͺ¨λ“ˆμ„ λ„μž…ν•œ 이유 λ©€ν‹° λͺ¨λ“ˆ 적용 μ „ μœ„ μ΄λ―Έμ§€λŠ” 진행쀑인 ν•˜μš°μŠ€ ν”„λ‘œμ νŠΈμ—μ„œ λ©€ν‹° λͺ¨λ“ˆμ„ μ μš©ν•˜κΈ° μ „μ˜ νŒ¨ν‚€μ§€ κ΅¬μ‘°μž…λ‹ˆλ‹€. κΈ°μ‘΄μ—λŠ” μ„œλΉ„μŠ€μ˜ λͺ¨λ“  μ½”λ“œλ“€μ΄ 단일 λͺ¨λ“ˆμ— ν¬ν•¨λœ μƒνƒœμ˜€μŠ΅λ‹ˆλ‹€. ν•˜μš°μŠ€ ν”„λ‘œμ νŠΈλŠ” ν‘Έμ‹œ μ•Œλ¦Ό κΈ°λŠ₯을 ν¬ν•¨ν•˜κ³  μžˆλŠ”λ°, ν‘Έμ‹œ μ•Œλ¦Όμ„ μ „μ†‘ν•˜λŠ” μ„œλ²„λ₯Ό λΆ„λ¦¬ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μš°μŠ€ μ„œλ²„ → ν•˜μš°μŠ€ API μ„œλ²„, ν•˜μš°μŠ€ μ•Œλ¦Ό μ„œλ²„ 이 λ•Œ, API μ„œλ²„μ™€ μ•Œλ¦Ό μ„œλ²„ λͺ¨λ‘ domain νŒ¨ν‚€μ§€μ˜ μ½”λ“œ, external.client νŒ¨ν‚€μ§€μ˜ μ½”λ“œ, common νŒ¨ν‚€μ§€μ˜ μ½”λ“œλ₯Ό κ·ΈλŒ€λ‘œ μž¬μ‚¬μš©ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μœ μ§€ 보수 μΈ‘λ©΄μ—μ„œ 바라봀을 λ•Œ, μ„œλ²„κ°€ λ‘˜λ‘œ λΆ„λ¦¬λ˜λ©΄μ„œ κ³΅ν†΅λœ νŒ¨ν‚€μ§€μ˜ λ‚΄μš©μ΄ μˆ˜μ •λ˜λ©΄ 맀번 API μ„œλ²„μ™€ μ•Œλ¦Ό μ„œλ²„μ˜ μ½”λ“œλ₯Ό ν•¨κ»˜ μˆ˜μ •ν•΄μ€˜μ•Ό ν•˜λŠ” λΆˆνŽΈν•¨μ΄ λ°œμƒν•  수 .. 2023. 6. 26.
[Spring] JPA 비관적 락 적용으둜 λ™μ‹œμ„± 문제 ν•΄κ²°ν•˜κΈ° πŸ€” 문제 상황 진행쀑인 블라썸 ν”„λ‘œμ νŠΈμ—μ„œ 검색 κ²°κ³Ό 쑰회 횟수λ₯Ό μ¦κ°€μ‹œν‚€λŠ” λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” κ³Όμ •μ—μ„œ λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλŠ” 상황을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 검색 결과둜 꽃 A, B, C κ°€ 쑰회되면 A, B, C 의 쑰회 횟수λ₯Ό 각각 1μ”© μ¦κ°€μ‹œμΌœμ•Ό ν–ˆλŠ”λ°, λ§Œμ•½ A 의 ν˜„μž¬ 쑰회 νšŸμˆ˜κ°€ 1일 λ•Œ, λ™μ‹œμ— 3번 μ‘°νšŒλœλ‹€λ©΄ κ²°κ³ΌλŠ” 4νšŒκ°€ λ˜μ–΄μ•Ό ν•˜μ§€λ§Œ, 2νšŒκ°€ λ˜λŠ” μƒν™©μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μ›ν•˜λŠ” λ°©μ‹λŒ€λ‘œ λ™μž‘μ‹œν‚€κΈ° μœ„ν•΄ 비관적 락을 μ μš©ν•΄λ³΄κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€. πŸ‘» JPA λ™μ‹œμ„± μ œμ–΄ 방식 JPA λŠ” 엔티티에 λŒ€ν•œ 무결성을 μœ μ§€ν•  수 μžˆλ„λ‘ λ™μ‹œμ„± μ œμ–΄ λ©”μ»€λ‹ˆμ¦˜μ„ μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ©”μ»€λ‹ˆμ¦˜μ—λŠ” 낙관적 락과 비관적 락이 ν¬ν•¨λ©λ‹ˆλ‹€. ⛓️ 낙관적 락 (Optimistic Lock) 낙관적 락은 DB κ°€ .. 2023. 6. 15.
[Spring] MySQLκ³Ό mongoDB λ°μ΄ν„°λ² μ΄μŠ€ 2개 μ—°λ™ν•˜κΈ° 🧐 상황 ν˜„μž¬ μš΄μ˜μ€‘μΈ Hous- (ν•˜μš°μŠ€) κ³΅λ™μƒν™œ λ„μš°λ―Έ μ„œλΉ„μŠ€μ—μ„œ κΈ°μ‘΄μ—λŠ” MySQLλ§Œμ„ μ‚¬μš©ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λΆˆν•„μš”ν•˜κ²Œ μŒ“μ΄λŠ” 였래된 μ•Œλ¦Ό 데이터λ₯Ό μ§€μš°κΈ° μœ„ν•œ 방법을 κ³ λ―Όν•΄μ•Όν–ˆμŠ΅λ‹ˆλ‹€. κ°€λ‚œν•œ λŒ€ν•™μƒμ΄κΈ° λ•Œλ¬Έμ—.. μ‚¬μš©μžκ°€ μ•½ 200λͺ… 정도에 λΆˆκ³Όν•œλ° 잘 보지도 μ•ŠλŠ” μ•Œλ¦Ό 데이터가 10,000개 이상 μŒ“μ΄λ‹ˆ.. μ΄λ ‡κ²Œ 계속 ν•„μš”μ—†λŠ” 데이터가 μŒ“μ΄λ‹€ 보면 AWS 프리티어 기쀀을 μ΄ˆκ³Όν• κΉŒλ΄ κ²μ΄λ‚¬κ±°λ“ μš” πŸ₯² μ„œλ²„ 파트 νŒ€μ›κ³Ό λ…Όμ˜λ₯Ό 톡해 Spring Batchλ₯Ό ν™œμš©ν•˜λŠ” 방법 μŠ€μΌ€μ€„λŸ¬λ₯Ό μ‚¬μš©ν•΄ 였래된 데이터λ₯Ό μ§€μš°λŠ” 방법 그리고 mongoDBλ₯Ό λ„μž…ν•˜λŠ” 방법을 κ³ λ―Όν–ˆμŠ΅λ‹ˆλ‹€. mongoDBμ—μ„œλŠ” TTL indexλ₯Ό μ§€μ›ν•˜μ—¬ λ°μ΄ν„°μ˜ μœ νš¨κΈ°κ°„μ„ μ„€μ •ν•΄μ„œ 였래된 λ°μ΄ν„°λŠ” λ³„λ„μ˜ 처리 없이 μžλ™μœΌλ‘œ 지.. 2023. 5. 10.
Spring λ¬΄ν•œμŠ€ν¬λ‘€ κ΅¬ν˜„ (2) - μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜ 이전 κΈ€μ—μ„œ λ¬΄ν•œμŠ€ν¬λ‘€, μ»€μ„œ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ— λŒ€ν•΄ μ†Œκ°œν–ˆμŠ΅λ‹ˆλ‹€. πŸ€” μ˜€ν”„μ…‹ κΈ°λ°˜μ€ μ–Έμ œ μ‚¬μš©ν• κΉŒ? 이전 κΈ€μ—μ„œ μ–ΈκΈ‰ν–ˆλ˜ λŒ€λ‘œ μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ€ μ»€μ„œ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ— λΉ„ν•΄ μ„±λŠ₯상 λ–¨μ–΄μ§‘λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λŠ” offset 값이 컀짐에 따라 λ°œμƒν•˜λŠ” 단점이기 λ•Œλ¬Έμ— μ‘°νšŒν•  λ°μ΄ν„°μ˜ 양이 λ§Žμ§€ μ•Šλ‹€λ©΄ μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜λ„ μΆ©λΆ„νžˆ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ»€μ„œ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ€ μ •λ ¬ 쑰건이 λ³΅μž‘ν•΄μ§€λ©΄ λ³΅μž‘ν•΄μ§ˆμˆ˜λ‘ μ»€μ„œλ₯Ό μ„ μ •ν•˜λŠ”λ° 어렀움이 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ€ Pageable μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•΄ 데이터 정렬을 νŽΈλ¦¬ν•˜κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. πŸ‘‰ μ‘°νšŒν•  데이터가 λ§Žμ§€ μ•Šκ±°λ‚˜ μ •λ ¬ 쑰건이 λ³΅μž‘ν•  경우 μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ ν™œμš©ν•΄λ³΄μž. πŸ›  μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜ κ΅¬ν˜„ μ˜€ν”„μ…‹ .. 2023. 1. 1.
Spring λ¬΄ν•œμŠ€ν¬λ‘€ κ΅¬ν˜„ (1) - μ»€μ„œ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜ 🧐 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ΄λž€? μ½˜ν…μΈ λ₯Ό μ—¬λŸ¬ νŽ˜μ΄μ§€λ‘œ λ‚˜λˆ„κ³ , 이전 ν˜Ήμ€ λ‹€μŒ νŽ˜μ΄μ§€λ‘œ λ„˜μ–΄κ°€κ±°λ‚˜ νŠΉμ • νŽ˜μ΄μ§€λ‘œ λ„˜μ–΄κ°ˆ 수 μžˆλŠ” 링크λ₯Ό νŽ˜μ΄μ§€ μƒλ‹¨μ΄λ‚˜ ν•˜λ‹¨μ— λ°°μΉ˜ν•˜λŠ” 방법 μ‡Όν•‘λͺ° ν•˜λ‹¨, 검색 κ²°κ³Ό ν•˜λ‹¨μ—μ„œ μ΅μˆ™ν•˜κ²Œ 찾아보싀 수 μžˆμŠ΅λ‹ˆλ‹€. 🧐 λ¬΄ν•œμŠ€ν¬λ‘€μ΄λž€? λΈŒλΌμš°μ € λ˜λŠ” μŠ€λ§ˆνŠΈν°μ—μ„œ 슀크둀 λ§‰λŒ€κ°€ ν•˜λ‹¨μ— λ„λ‹¬ν•˜λŠ” 것을 λ°©μ§€ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€λ₯Ό 더 μ•„λž˜λ‘œ 슀크둀 ν•  λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ μ½˜ν…μΈ κ°€ μΆ”κ°€λ©λ‹ˆλ‹€. μΈμŠ€νƒ€κ·Έλž¨ ν”Όλ“œ, μ‡Όν•‘λͺ° μƒν’ˆ 리슀트λ₯Ό μ•„λž˜λ‘œ μŠ€ν¬λ‘€ν•˜λ‹€ 보면 잠깐의 λ‘œλ”©μ„ 거치고 컨텐츠가 μΆ”κ°€λ˜λŠ” κ²½ν—˜μ„ ν•˜μ‹ μ  있죠?! λ¬΄ν•œμŠ€ν¬λ‘€μ„ μ μš©ν•œ κ²½μš°μž…λ‹ˆλ‹€. 🧐 μ»€μ„œ 기반이 뭔데? ν”νžˆ λ¬΄ν•œ μŠ€ν¬λ‘€μ„ κ΅¬ν˜„ν•  λ•Œ 두 가지 방법을 μ‚¬μš©ν•©λ‹ˆλ‹€. 1. μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜ 2. μ»€μ„œ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜ .. 2023. 1. 1.