μœˆλ„μš°μ™€ λ¦¬λˆ…μŠ€μ˜ λ©€ν‹°ν”„λ‘œμ„Έμ‹± λ™μž‘ 방식 차이
Β·
πŸ’» 개발/πŸ–₯️ 운영체제
λ“€μ–΄κ°€λ©°μž‘λ…„μ— μ‹€λ¬΄μ—μ„œ νŒŒμ΄μ¬μ„ μ‚¬μš©ν•΄ λ©€ν‹°ν”„λ‘œμ„Έμ‹± μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄μ„œ λ¬Έμ œκ°€ λ°œμƒν•œ 적이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.νŠΉμ • μž‘μ—…μ—μ„œ SQLAlchemy(파이썬 ORM 라이브러리)의 DB 컀λ„₯μ…˜ 풀을 μ‚¬μš©ν•΄ 데이터λ₯Ό INSERTν•˜λŠ” 둜직이 μžˆμ—ˆλŠ”λ°, 둜컬 개발 ν™˜κ²½(μœˆλ„μš°)μ—μ„œλŠ” μ•„λ¬΄λŸ° λ¬Έμ œκ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ™μΌν•œ μ½”λ“œλ₯Ό 사내 개발 μ„œλ²„(λ¦¬λˆ…μŠ€)에 λ°°ν¬ν–ˆμ„ λ•Œ λ‹€μŒκ³Ό 같은 μ—λŸ¬ λ‘œκ·Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 2024-12-21 17:57:00,471 [ERROR ] [Process-21][Thread-140372676175552]: write_module:76: Error during bulk insert: ORA-01001: invalid cursorORA-03106: fatal two-task communicatio..
λΆ€ν•˜ ν…ŒμŠ€νŠΈ: μœ μ € 행동 기반 μ‹œλ‚˜λ¦¬μ˜€λ‘œ μ‹œμŠ€ν…œ ν•œκ³„ μΈ‘μ •κ³Ό SLA, SLO 검증
Β·
πŸ’» 개발/🎸 ETC
λ“€μ–΄κ°€λ©°λΆ€ν•˜ ν…ŒμŠ€νŠΈλŠ” μ‹œμŠ€ν…œμ˜ μ΅œλŒ€ μ²˜λ¦¬λŸ‰(TPS), μ•ˆμ •μ„±, SLA(μ„œλΉ„μŠ€ μˆ˜μ€€ 계약) 및 SLO(μ„œλΉ„μŠ€ μˆ˜μ€€ λͺ©ν‘œ)λ₯Ό κ²€μ¦ν•˜λŠ” μ€‘μš”ν•œ κ³Όμ •μž…λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” μ½˜μ„œνŠΈ μ˜ˆμ•½ μ„œλΉ„μŠ€μ—μ„œ μœ μ € 행동을 기반으둜 ν•œ 두 가지 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ€‘μ‹¬μœΌλ‘œ, Docker ν™˜κ²½μ—μ„œ μžμ›μ„ μ‘°μ ˆν•˜λ©° μ„±λŠ₯ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.   1. ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€ μ„€κ³„μœ μ €μ˜ 행동을 기반으둜 두 가지 ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ„€κ³„ν–ˆμŠ΅λ‹ˆλ‹€. 각각의 μ‹œλ‚˜λ¦¬μ˜€λŠ” μ‹œμŠ€ν…œμ˜ μ„œλ‘œ λ‹€λ₯Έ μƒνƒœ(μœ μ € λΉ„ν™œμ„±/μœ μ € ν™œμ„±)λ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄ μ„ μ •ν–ˆμŠ΅λ‹ˆλ‹€. - μ‹œλ‚˜λ¦¬μ˜€ 1 : μœ μ € λŒ€κΈ°μ—΄ λΉ„ν™œμ„±λͺ©ν‘œ: λŒ€κΈ°μ—΄ μ‹œμŠ€ν…œμ—μ„œ 토큰 λ°œκΈ‰ 및 μƒνƒœ 쑰회의 μ²˜λ¦¬λŸ‰ 츑정행동 νλ¦„μœ μ €κ°€ λŒ€κΈ°μ—΄ 토큰 λ°œκΈ‰ μš”μ²­μœ μ €κ°€ 1초 κ°„κ²©μœΌλ‘œ 토큰 μƒνƒœ μ‘°νšŒμ€‘μ λŒ€κΈ°μ—΄ μ‹œμŠ€ν…œμ˜..
μ„œλΉ„μŠ€ ν™•μž₯을 μœ„ν•œ νŠΈλžœμž­μ…˜ 뢄리와 이벀트 기반 섀계
Β·
πŸ’» 개발/πŸ€ Spring
λ“€μ–΄κ°€λ©°λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œ νŠΈλžœμž­μ…˜μ˜ λ²”μœ„μ™€ μ„œλΉ„μŠ€ κ°„μ˜ κ²°ν•©λ„λŠ” μ„±λŠ₯κ³Ό ν™•μž₯성에 큰 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. 특히, κΈ°μ‘΄ λ‘œμ§μ— 영ν–₯을 주지 μ•ŠμœΌλ©΄μ„œ λΆ€κ°€ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜, νŠΈλžœμž­μ…˜ 경계λ₯Ό μ΅œμ ν™”ν•˜λŠ” 것은 μ„œλΉ„μŠ€μ˜ μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ΄λŠ” μ€‘μš”ν•œ μž‘μ—…μž…λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” ν˜„μž¬ μ½˜μ„œνŠΈ μ˜ˆμ•½ μ„œλΉ„μŠ€μ˜ νŠΈλžœμž­μ…˜ λ²”μœ„λ₯Ό λΆ„μ„ν•˜κ³ , μ„œλΉ„μŠ€λ“€μ„ κΈ°λŠ₯λ³„λ‘œ λΆ„λ¦¬ν•˜λ©° 이벀트 기반 섀계λ₯Ό λ„μž…ν•˜λŠ” 과정에 λŒ€ν•΄ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.   ν˜„μž¬ μ½”λ“œμ˜ νŠΈλžœμž­μ…˜ λ²”μœ„ 뢄석 νŠΈλžœμž­μ…˜ λ²”μœ„ν˜„μž¬ μ½”λ“œμ—μ„œ @Transactional이 적용된 핡심 둜직 쀑 μ˜ˆμ•½ 생성과 결제 μ²˜λ¦¬μ— λŒ€ν•œ λ‘œμ§μ— λŒ€ν•΄ νŠΈλžœμž­μ…˜ λ²”μœ„λ₯Ό λΆ„μ„ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 두 λ‘œμ§μ€ μ•„λž˜κ³Ό 같은 λ°©μ‹μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€.   μ˜ˆμ•½ 생성@Serviceclass ReservationService( ..
μ½˜μ„œνŠΈ μ˜ˆμ•½ μ„œλΉ„μŠ€μ˜ 인덱슀 섀계와 μ„±λŠ₯ 비ꡐ
Β·
πŸ’» 개발/πŸ’Ύ Database
λ“€μ–΄κ°€λ©° μ΄λ²ˆ κΈ€μ—μ„œ μ½˜μ„œνŠΈ μ˜ˆμ•½ μ„œλΉ„μŠ€μ˜ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ μ‚¬μš©λœ 쿼리λ₯Ό λΆ„μ„ν•˜κ³ , 인덱슀 μΆ”κ°€ μ „ν›„μ˜ μ„±λŠ₯을 비ꡐ해 보며 μ΅œμ ν™” 과정을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. MariaDBλ₯Ό μ‚¬μš©ν•΄ 인덱슀 μΆ”κ°€ μ „ν›„μ˜ μ‹€ν–‰ κ³„νš(EXPLAIN) 및 μˆ˜ν–‰ 속도λ₯Ό λΉ„κ΅ν•œ κ²°κ³Όλ₯Ό 톡해, 쿼리의 μ„±λŠ₯을 μ΅œμ’…μ μœΌλ‘œ μ–΄λ–»κ²Œ κ°œμ„ ν•˜μ˜€λŠ”μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.   μ‹œλ‚˜λ¦¬μ˜€ λ‚΄ 쿼리먼저 μ½˜μ„œνŠΈ μ˜ˆμ•½ μ„œλΉ„μŠ€μ˜ 도메인 별 각 JpaRepositoryμ—μ„œ μ‚¬μš©λ˜λŠ” 쿼리λ₯Ό λͺ¨λ‘ μˆ˜μ§‘ν–ˆμŠ΅λ‹ˆλ‹€. 도메인 별 쿼리λ₯Ό μ•„λž˜ ν‘œλ‘œ μ •λ¦¬ν•΄λ΄€μŠ΅λ‹ˆλ‹€.  도메인 λ©”μ„œλ“œ ConcertfindAllByConcertId()ReservationfindByIdOrNullWithLock(), findAllByExpiresAtBeforeAndStatus()SeatfindByIdOrNu..
Redis 기반의 캐싱 및 λŒ€κΈ°μ—΄ 관리λ₯Ό ν†΅ν•œ μ½˜μ„œνŠΈ μ˜ˆμ•½ μ„œλΉ„μŠ€ μ„±λŠ₯ κ°œμ„ 
Β·
πŸ’» 개발/πŸ€ Spring
λ“€μ–΄κ°€λ©°μ΄λ²ˆ μ‹œκ°„μ—λŠ” μ½˜μ„œνŠΈ μ˜ˆμ•½ μ„œλΉ„μŠ€μ˜ μ„±λŠ₯을 κ°œμ„ ν•˜κΈ° μœ„ν•΄ ν˜„μž¬ μ‹œλ‚˜λ¦¬μ˜€μ˜ 쑰회 API 쀑 캐싱을 μ μš©ν•  뢀뢄에 λŒ€ν•΄ κ³ λ―Όν•΄ 보고, κΈ°μ‘΄ RDBμ—μ„œ μž‘λ™λ˜κ³  있던 λŒ€κΈ°μ—΄ λ‘œμ§μ„ Redis둜 μ΄κ΄€ν•˜λŠ” 과정에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 또 캐싱 μ „ν›„ ν…ŒμŠ€νŠΈ κ²°κ³Ό 비ꡐλ₯Ό 톡해 μ–Όλ§ˆλ‚˜ μ„±λŠ₯이 κ°œμ„ λ˜λŠ”μ§€λ„ 체크해 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.    μΊμ‹œ 적용 κΈ°μ€€μš°μ„  μΊμ‹œλ₯Ό μ μš©ν•  λ•Œ κ³ λ €ν•΄μ•Ό ν•  기쀀은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€. 1. 쑰회 λΉ„μš©μ΄ λ†’μ€μ§€λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό μ‘°νšŒν•˜λŠ” λΉ„μš©μ΄ 큰 경우 캐싱을 톡해 μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 2. μ–Όλ§ˆλ‚˜ 자주 μ‘°νšŒλ˜λŠ”μ§€λ°˜λ³΅μ μΈ μš”μ²­μ΄ λ§Žμ€ 경우 μΊμ‹œλ₯Ό ν™œμš©ν•˜μ—¬ νš¨μœ¨μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. 3. 데이터 정합성에 μ΄μŠˆκ°€ μ—†λŠ”μ§€μΊμ‹œλ₯Ό μ‚¬μš©ν•  경우, μΊμ‹œλœ 데이터와 원본 데이터 κ°„μ˜ μ •ν•©..
μ½˜μ„œνŠΈ μ˜ˆμ•½ μ„œλΉ„μŠ€μ—μ„œ Lock μ„±λŠ₯ 비ꡐ해보기 (feat. 낙관적 락, 비관적 락, λΆ„μ‚° 락)
Β·
πŸ’» 개발/🎸 ETC
λ“€μ–΄κ°€λ©°μ½˜μ„œνŠΈ μ˜ˆμ•½ μ„œλΉ„μŠ€μ™€ 같은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” λ™μ‹œμ„± 처리λ₯Ό κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ’Œμ„ 예맀 μ˜€ν”ˆ μ‹œ μ—¬λŸ¬ μ‚¬μš©μžκ°€ λ™μ‹œμ— μ˜ˆμ•½μ„ μ‹œλ„ν•˜λ©΄, μžμ›μ΄ μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬λ˜μ§€ μ•Šμ„ 경우 μ˜ˆμ•½μ΄ μ΄ˆκ³Όλ˜κ±°λ‚˜ 데이터 일관성이 깨질 μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. 이번 μ‹œκ°„μ— μ½”λ“œ 적용 및 ν…ŒμŠ€νŠΈλ₯Ό 톡해 각 λ™μ‹œμ„± 처리 λ°©μ‹μ˜ μž₯단점을 κ²€ν† ν•˜κ³ , μ΅œμ’…μ μœΌλ‘œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— μ ν•©ν•œ λ™μ‹œμ„± 처리 방식을 μ„ μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.  λ™μ‹œμ„± μ΄μŠˆκ°€ λ°œμƒν•  수 μžˆλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 μ„œλΉ„μŠ€μ—μ„œ λ™μ‹œμ„± μ΄μŠˆκ°€ λ°œμƒν•  수 μžˆλŠ” μ£Όμš” λ‘œμ§μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.μ’Œμ„ μ˜ˆμ•½λ½μ„ κ±Έμ–΄μ•Ό ν•˜λŠ” μžμ›seatν…Œμ΄λΈ”μ˜ statusconcert_scheduleν…Œμ΄λΈ”μ˜ available_seats포인트 μΆ©μ „ 및 κ²°μ œλ½μ„ κ±Έμ–΄μ•Ό ν•˜λŠ” μžμ›userν…Œμ΄λΈ”μ˜ balancereserv..
λ™μ‹œμ„± 처리 μ‰½κ²Œ μ΄ν•΄ν•˜κΈ° (synchronized, reentrantLock)
Β·
πŸ’» 개발/πŸ€ Spring
1. λ™μ‹œμ„± μ²˜λ¦¬λŠ” μ™œ ν•˜λŠ”κ±ΈκΉŒ?λ™μ‹œμ„± 처리λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄ μœ μ €κ°€ 포인트λ₯Ό λ™μ‹œμ— μΆ©μ „ λ˜λŠ” μ‚¬μš©ν•  λ•Œ 데이터 뢈일치 λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΄λŠ” μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ 같은 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜λ©΄μ„œ λ°œμƒν•˜λŠ” Race Condition(경쟁 μƒνƒœ) ν˜„μƒμ΄λΌ λ³Ό 수 μžˆλŠ”λ°, Race Conditionμ΄λž€ 곡유 μžμ›μ— λŒ€ν•΄ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— 접근을 μ‹œλ„ν•  λ•Œ, μ‹€ν–‰ μˆœμ„œλ‚˜ μ‹œκ°„μ— μ˜ν•΄ κ²°κ³Ό 값에 영ν–₯을 쀄 수 μžˆλŠ” μƒνƒœλ₯Ό λ§ν•©λ‹ˆλ‹€. μ•„λž˜ 그림을 톡해 Race Condition에 λŒ€ν•œ μ˜ˆμ‹œλ₯Ό λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.μœ„ κ·Έλ¦Όκ³Ό 같이 2개의 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λœ 각각의 νƒœμŠ€ν¬κ°€ pointλΌλŠ” λ³€μˆ˜μ— λ™μ‹œμ— μ ‘κ·Όν•˜μ—¬ μ΄ˆκΈ°κ°’ 0을 μ½μ–΄μ™”μŠ΅λ‹ˆλ‹€. 그리고 각각 500을 λ”ν•˜λŠ” 연산을 μˆ˜ν–‰ν•˜κ³ , point에 κ²°κ³Ό 값을 λŒ€μž…ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κΈ°λŒ€μ™€..
Spring Security λ‚΄λΆ€ 흐름 μ΄ν•΄ν•˜κΈ°
Β·
πŸ’» 개발/πŸ€ Spring
맀번 인증, 인가에 λŒ€ν•œ 뢀뢄에 λŒ€ν•΄ μ œλŒ€λ‘œ μˆ™μ§€ν•˜μ§€ μ•Šκ³ , μ½”λ“œλ§Œ κ°€μ Έλ‹€κ°€ μ‚¬μš©ν•œ κ²½μš°κ°€ λ§Žμ•˜λ‹€. νšŒμ‚¬μ—μ„œλ„ 이에 λŒ€ν•΄ λ‹€λ£° 수 μžˆλŠ” κΈ°νšŒκ°€ μ—†λ‹€ λ³΄λ‹ˆ 졜근 토이 ν”„λ‘œμ νŠΈλ‘œ νŒ¨μ…˜ 이컀머슀 ν”Œλž«νΌμ„ κ΅¬ν˜„ν•˜λ©΄μ„œ μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°μ— λŒ€ν•΄ 곡뢀도 해보고, μ–΄λŠ 정도 기본적인 이해λ₯Ό ν•˜λ©° μ μš©ν•˜κ²Œ λ˜μ—ˆλ‹€. 주둜 유데미(Udemy)의 μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° κ°•μ˜λ₯Ό λ“£κ³  μ΄ν•΄ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•˜μ˜€κ³ , μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°μ˜ κΈ°λ³Έ λ™μž‘ 흐름에 λŒ€ν•΄ μž‘μ„±ν•˜μ˜€λ‹€. Spring Securityλž€? Spring 곡식 ν™ˆνŽ˜μ΄μ§€(https://spring.io/projects/spring-security)μ—μ„œλŠ” Spring Securityλ₯Ό μ•„λž˜μ™€ 같이 μ†Œκ°œν•˜κ³  μžˆλ‹€. 곡식 ν™ˆνŽ˜μ΄μ§€κ°€ 제일 μ •ν™•ν•˜κ³  μžμ„Έν•˜κ²Œ μ„€λͺ…이 λ˜μ–΄μžˆμœΌλ‹ˆ λ§Œμ•½ 더 μ•Œκ³  μ‹Άλ‹€..