인덱슀, 캐싱 μ μš©ν•΄λ³΄κΈ°
Β·
DB
TL;DRAS-IS: λΈŒλžœλ“œλ³„ + μƒνƒœ ν•„ν„° + μ’‹μ•„μš”μˆœ 쑰회 μ‹œ Full Table Scan & Filesort둜 μ„±λŠ₯ μ €ν•˜TO-BE: 인덱슀 적용으둜 λΆˆν•„μš”ν•œ μŠ€μΊ”/μ •λ ¬ μ΅œμ†Œν™”, 응닡 속도 κ°œμ„ κ²°κ³Ό 미리 보기1. λΈŒλžœλ“œ + μƒνƒœ ν•„ν„°(ON_SALE) + μ’‹μ•„μš”μˆœ μƒμœ„ 20 쑰회인덱슀 적용 κ²°κ³Ό: 368ms -> 2ms (184λ°° ν–₯상)캐싱 적용 κ²°κ³Ό: 539ms -> 10ms (54λ°° ν–₯상)2. 전체 + μ’‹μ•„μš”μˆœ μƒμœ„ 20 쑰회인덱슀 적용 κ²°κ³Ό: 360ms -> 1ms (360λ°° ν–₯상)캐싱 적용 κ²°κ³Ό: 393ms -> 9ms (44λ°° ν–₯상)λ°°κ²½κ³Ό λͺ©ν‘œμš”ꡬ사항: μƒν’ˆ λͺ©λ‘μ—μ„œ λΈŒλžœλ“œλ³„ 필터링 + μ’‹μ•„μš”μˆœ μ •λ ¬ 제곡λͺ©ν‘œ: κΈ°λŠ₯ κ΅¬ν˜„ ν›„ AS-IS μ„±λŠ₯ μΈ‘μ • → 인덱슀 및 캐싱 적용 ν›„ TO-BE μ„±λŠ₯ λΉ„..
πŸ“ 처음 섀계λ₯Ό 해보며 λŠλ‚€ 회고
Β·
섀계
TL;DRμ„€κ³„λŠ” μ •ν•΄μ§„ 닡이 μ—†μ–΄μ„œ μ²˜μŒμ—” λ§‰λ§‰ν–ˆμ§€λ§Œ, λ¨Έλ¦Ώ 속 고민을 λ¬Έμ„œλ‘œ κΊΌλ‚΄λ‹ˆ 생각이 μ •λ¦¬λ˜μ—ˆλ‹€.잘 μ§œμ—¬μ§„ 섀계λ₯Ό λ°”νƒ•μœΌλ‘œ ν•œλ‹€λ©΄ μ½”λ“œ μž‘μ„±μ— 훨씬 더 집쀑할 수 μžˆμ„ 것 κ°™λ‹€λŠ” κΈ°λŒ€κ°μ΄ 생긴닀.μ™œ 이 글을 μ“°κ²Œ λ˜μ—ˆλŠ”κ°€?μ§€κΈˆκΉŒμ§€λŠ” ERD와 API λͺ…μ„Έμ„œ μ •λ„λ§Œ λ§Œλ“  ν›„ λ°”λ‘œ κ°œλ°œμ„ μ‹œμž‘ν•˜κ³€ ν–ˆμŠ΅λ‹ˆλ‹€.λ°μ΄ν„°λ² μ΄μŠ€ ꡬ쑰λ₯Ό 작고, API λͺ…μ„Έλ₯Ό 기반으둜 μ½”λ“œλ₯Ό μ­‰ μ¨λ‚΄λ €κ°€λŠ” 방식이 μ΅μˆ™ν–ˆμŠ΅λ‹ˆλ‹€. 그런데 이번 ν”„λ‘œμ νŠΈμ—μ„œλŠ” μš”κ΅¬μ‚¬ν•­ λͺ…μ„Έμ„œλΆ€ν„° 총 4λ‹¨κ³„μ˜ 섀계λ₯Ό κ±°μΉ˜λŠ” κ²½ν—˜μ„ 처음으둜 ν•΄λ΄€μŠ΅λ‹ˆλ‹€.막상 μ‹œμž‘ν•˜λ‹ˆ, μ–΄λ””μ„œλΆ€ν„° μ–΄λ–»κ²Œ μž‘μ„±ν•΄μ•Ό ν•˜λŠ”μ§€ λ„ˆλ¬΄ λ§‰λ§‰ν–ˆμŠ΅λ‹ˆλ‹€. 발제λ₯Ό λ°›κ³ , μ§€λ‚œ 주말에 호기둭게 λ…Έμ…˜μ„ μ—΄μ—ˆλŠ”λ°, 머리가 λ°±μ§€κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.κ·Έλž˜μ„œ μ§€κΈˆλΆ€ν„° 섀계λ₯Ό ν•˜λ©° κ²ͺ은 어렀움, μ‹œν–‰μ°©μ˜€, 그리고 ..
μ™œ νŒŒμ‚¬λ“œ 계측을 λ‘˜κΉŒ?
Β·
μ•„ν‚€ν…μ²˜ & λ””μžμΈ νŒ¨ν„΄
TL;DR톡합 ν…ŒμŠ€νŠΈ ν€˜μŠ€νŠΈ 달성을 μœ„ν•΄ μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λ˜ κΈ°μ‘΄ ꡬ쑰λ₯Ό νŒŒμ‚¬λ“œ κ³„μΈ΅μ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ λ¦¬νŒ©ν† λ§ν•˜μ˜€κ³  μ•„ν‚€ν…μ²˜μ™€ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±μ— λ―ΈμΉ˜λŠ” 영ν–₯에 λŒ€ν•΄ κ³ λ―Όν•˜κ³  μƒˆλ‘­κ²Œ μ•Œκ²Œλœ 것듀을 κ³΅μœ ν•΄λ³΄κ³ μž ν•©λ‹ˆλ‹€.νŒŒμ‚¬λ“œλž€?νŒŒμ‚¬λ“œ(Facade) 계측은 μ—¬λŸ¬ μ„œλΉ„μŠ€μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ‘°ν•©ν•΄ ν•˜λ‚˜μ˜ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ™„μ„±ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. # μ™œ 이 글을 μ“°κ²Œ λ˜μ—ˆλŠ”κ°€?User κ΄€λ ¨ κΈ°λŠ₯을 κ°œλ°œν•˜λ©°, νŠΉμ • ID의 νšŒμ›μ΄ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ null이 λ°˜ν™˜λ˜λŠ” 상황을 ν…ŒμŠ€νŠΈν•˜λ˜ 쀑 μ˜ˆμƒμΉ˜ λͺ»ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. κΈ°μ‘΄μ—λŠ” μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν–ˆμ§€λ§Œ, 이둜 인해 톡합 ν…ŒμŠ€νŠΈμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•΄ ν…ŒμŠ€νŠΈ λͺ©μ μ— λ§žμ§€ μ•ŠλŠ” κ²°κ³Όκ°€ λ‚˜μ™”μ—ˆμŠ΅λ‹ˆλ‹€.문제 λ°œμƒνŠΉμ • νšŒμ› ID둜 쑰회 μ‹œ, νšŒμ›μ΄ μ‘΄μž¬ν•˜μ§€ ..
μŠ€ν”„λ§μ€ μ™œ ν”„λ‘μ‹œ νŒ¨ν„΄μ„ μ‚¬μš©ν• κΉŒ?(AOP, νŠΈλžœμž­μ…˜)
Β·
Spring/Spring
ν”„λ‘μ‹œ, Spring ν”„λ‘μ‹œ νŒ¨ν„΄, AOP, νŠΈλžœμž­μ…˜ μ œλŒ€λ‘œ 이해해보기Spring을 μ“°λ‹€ 보면 λΉ μ§€μ§€ μ•Šκ³  λ“±μž₯ν•˜λŠ” κ°œλ…λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€.λ°”λ‘œ ν”„λ‘μ‹œ, AOP, 그리고 @Transactional νŠΈλžœμž­μ…˜ μ²˜λ¦¬μž…λ‹ˆλ‹€.이번 κΈ€μ—μ„œλŠ” 이 ν‚€μ›Œλ“œλ“€μ„ 기반으둜 Spring λ‚΄λΆ€μ—μ„œ μ–΄λ–€ 일이 λ²Œμ–΄μ§€λŠ”μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.ν”„λ‘μ‹œ(Proxy)λž€?ν”„λ‘μ‹œλŠ” μ§„μ§œ 객체 μ•žμ— μ„œμ„œ λŒ€μ‹  일을 μ²˜λ¦¬ν•˜λŠ” λŒ€λ¦¬ 객체.λͺ©μ : μ ‘κ·Ό μ œμ–΄, μ„±λŠ₯ ν–₯상, λΆ€κ°€κΈ°λŠ₯ 처리 λ“±λΉ„μœ λ‘œ μ΄ν•΄ν•˜κΈ°μ§„μ§œ 객체 = μ˜ν™”κ΄€ν”„λ‘μ‹œ = μž…κ΅¬μ— μžˆλŠ” 직원 (ν‹°μΌ“ ν™•μΈν•˜κ³  μž…μž₯μ‹œν‚΄)→ μš°λ¦¬λŠ” μ˜ν™”κ΄€μ„ λ°”λ‘œ μ΄μš©ν•˜μ§€ μ•Šκ³ , ν”„λ‘μ‹œλ₯Ό κ±°μ³μ„œ κ°„μ ‘μ μœΌλ‘œ μ ‘κ·Όν•˜κ²Œ λœλ‹€.ν”„λ‘μ‹œ νŒ¨ν„΄(Proxy Pattern)μ΄λž€?λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‘œ,μ‹€μ œ 객체에 λŒ€ν•œ 접근을 ν”„λ‘μ‹œ 객체가 ..
μ»΄ν“¨ν„°μ—μ„œ μˆ«μžμ™€ λ¬ΈμžλŠ” μ–΄λ–»κ²Œ 2μ§„μˆ˜λ‘œ ν‘œν˜„λ κΉŒ?
Β·
CS/기타
1. μ»΄ν“¨ν„°μ—μ„œ μˆ«μžμ™€ λ¬ΈμžλŠ” μ–΄λ–»κ²Œ 2μ§„μˆ˜λ‘œ ν‘œν˜„λ κΉŒ?κ°œλ°œμ„ ν•˜λ‹€ 보면 "이 μˆ«μžλ‚˜ λ¬ΈμžλŠ” 컴퓨터 μ•ˆμ—μ„œ μ–΄λ–»κ²Œ μ €μž₯될까?" κΆκΈˆν•΄μ§€λŠ” μˆœκ°„μ΄ μžˆμŠ΅λ‹ˆλ‹€.특히 float, double 같은 μ‹€μˆ˜λ₯Ό λ‹€λ£° λ•Œ μ˜€μ°¨κ°€ μƒκΈ°λŠ” 이유λ₯Ό μ΄ν•΄ν•˜λ €λ©΄,2μ§„μˆ˜ ν‘œν˜„κ³Ό IEEE 754 λΆ€λ™μ†Œμˆ˜μ  ν‘œμ€€μ— λŒ€ν•œ 이해가 κΌ­ ν•„μš”ν•©λ‹ˆλ‹€.이 κΈ€μ—μ„œλŠ” λ‹€μŒ λ‚΄μš©μ„ μ •λ¦¬ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.숫자λ₯Ό 2μ§„μˆ˜λ‘œ λ°”κΎΈλŠ” λ°©λ²•λ¬Έμžλ₯Ό 2μ§„μˆ˜λ‘œ λ°”κΎΈλŠ” λ°©λ²•μ •μˆ˜ λ‚˜λˆ—μ…ˆκ³Ό μ‹€μˆ˜ λ‚˜λˆ—μ…ˆμ˜ 차이1.0은 μ™œ 00000001이 μ•„λ‹κΉŒ?floatλŠ” μ™œ 32λΉ„νŠΈμΈλ° κ°€μˆ˜λŠ” 23λΉ„νŠΈκΉŒμ§€λ§Œ μ €μž₯ν• κΉŒ?IEEE 754λž€?2. 숫자λ₯Ό 2μ§„μˆ˜λ‘œ λ°”κΎΈλŠ” 방법2.1 μ •μˆ˜: 2둜 λ‚˜λˆ„κΈ° (λ‚˜λ¨Έμ§€ μ—­μˆœ)예: 13 → 2μ§„μˆ˜ 13 ÷ 2 = 6 ... 1 6 ÷ 2 = 3 ... 0 3 ..
컀λ„₯μ…˜μ΄λž€ (컀λ„₯μ…˜ ν’€, 컀λ„₯μ…˜ 고갈)
Β·
Spring/JPA
컀λ„₯μ…˜(Connection)μ΄λž€?DB와 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μž‡λŠ” 'ν†΅λ‘œ'일반적으둜 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μš”μ²­μ„ λ°›μœΌλ©΄ λ°μ΄ν„°λ² μ΄μŠ€(DB)에 정보λ₯Ό μ‘°νšŒν•˜κ±°λ‚˜ λ³€κ²½ν•œ λ’€ κ·Έ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. μ΄λ•Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ DB와 λŒ€ν™”ν•˜κΈ° μœ„ν•΄μ„œλŠ” 연결이 ν•„μš”ν•˜λ‹€. 이 ν†΅λ‘œκ°€ λ°”λ‘œ 컀λ„₯μ…˜(Connection)이닀. μ»€λ„₯μ…˜ μƒμ„±μ—”λŠ” λΉ„μš©μ΄ λ“ λ‹€.컀λ„₯μ…˜μ„ μƒμ„±ν•˜λŠ” λ°μ—λŠ” 생각보닀 λ§Žμ€ λΉ„μš©μ΄ λ“ λ‹€. 예λ₯Ό λ“€μ–΄,λ„€νŠΈμ›Œν¬ μ†ŒμΌ“μ„ 열고인증(μ‚¬μš©μžλͺ…/λΉ„λ°€λ²ˆν˜Έ) 과정을 거치고DB와 ν•Έλ“œμ…°μ΄ν¬(λŒ€ν™” μ€€λΉ„) ν•˜λŠ” 과정등이 ν•„μš”ν•˜λ‹€. 이런 과정을 λ§€ μš”μ²­λ§ˆλ‹€ μƒˆλ‘œ ν•˜λ©΄ λΆˆν•„μš”ν•œ μ‹œκ°„ λ‚­λΉ„κ°€ 컀진닀.컀λ„₯μ…˜ ν’€(Connection Pool)μ΄λž€?미리 컀λ„₯μ…˜μ„ λ§Œλ“€μ–΄λ‘λŠ” μ „λž΅μ»€λ„₯μ…˜μ„ 맀번 μƒˆλ‘œ λ§Œλ“œλŠ” λŒ€μ‹ , 컀λ„₯μ…˜ ν’€(Connection Pool)이..
@Transactional을 μ‚¬μš©ν•˜λŠ” 이유
Β·
Spring/JPA
@Transactional의 κΈ°λ³Έ κ°œλ…μ •μ˜@Transactional은 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ œκ³΅ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, ν•΄λ‹Ή λ©”μ†Œλ“œλ‚˜ ν΄λž˜μŠ€μ—μ„œ μ‹€ν–‰λ˜λŠ” DB μž‘μ—…(INSERT, UPDATE, DELETE λ“±)을 ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜ λ²”μœ„ μ•ˆμ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ ν•˜λŠ” 역할을 ν•œλ‹€.κΈ°λŠ₯λͺ¨λ“  DB 연산을 ν•˜λ‚˜μ˜ μ›μžμ  λ‹¨μœ„λ‘œ λ¬Άμ–΄ 성곡 μ‹œ 일괄 컀밋, μ‹€νŒ¨ μ‹œ 일괄 둀백을 톡해 데이터 무결성과 일관성을 보μž₯ν•œλ‹€.@Transactional을 μ‚¬μš©ν•˜λŠ” 이유1. μ›μžμ„±(Atomicity) 보μž₯λ©”μ†Œλ“œ μ‹€ν–‰ 쀑 ν•˜λ‚˜μ˜ μž‘μ—…μ΄λΌλ„ μ‹€νŒ¨ν•˜λ©΄, ν•΄λ‹Ή λ©”μ†Œλ“œ λ‚΄ λͺ¨λ“  λ³€κ²½ 사항을 λ‘€λ°±ν•œλ‹€. 예λ₯Ό λ“€μ–΄ INSERT ν›„ UPDATEμ—μ„œ μ˜ˆμ™Έ λ°œμƒ μ‹œ, INSERT λ˜ν•œ μ·¨μ†Œλ˜μ–΄ DB μƒνƒœκ°€ μ΄μ „μœΌλ‘œ λ³΅μ›λœλ‹€.2. 일관성(Consistency..
Dockerfile
Β·
Docker
Dockerfileμ΄λž€Dockerfile은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ‘œ λΉŒλ“œν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ λͺ…λ Ήμ–΄λ₯Ό μ •μ˜ν•˜λŠ” νŒŒμΌμž…λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈμ— μ΅œμ ν™”λœ Dockerfile 예제# 1. JDK 기반 이미지 μ„€μ •FROM openjdk:17-jdk-slim# 2. μž‘μ—… 디렉터리 μ„€μ •WORKDIR /app# 3. JAR νŒŒμΌμ„ μ»¨ν…Œμ΄λ„ˆμ— 볡사COPY build/libs/myapp-0.0.1-SNAPSHOT.jar app.jar# 4. ν™˜κ²½ λ³€μˆ˜ μ„€μ •ENV SPRING_PROFILES_ACTIVE=prod# 5. μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” 포트 λͺ…μ‹œEXPOSE 8080# 6. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ENTRYPOINT ["java", "-jar", "app.jar"] Dockerfile의 μ£Όμš” ꡬ성 μš”μ†ŒDockerfile은 특..