[PostgreSQL] λͺ…μ‹œμ  JOIN 절둜 ν”Œλž˜λ„ˆ(Planner) μ œμ–΄, μ„±λŠ₯ ν–₯상

[PostgreSQL] λͺ…μ‹œμ  JOIN 절둜 ν”Œλž˜λ„ˆ(Planner) μ œμ–΄, μ„±λŠ₯ ν–₯상

1. κ°œμš” PostgreSQL은 쿼리 Plannerκ°€ κ°€μž₯ 효율적인 쿼리 ν”Œλžœμ„ μ„Έμ›Œ 쿼리λ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€. 이번 ν¬μŠ€νŠΈλŠ” 쿼리 Plannerκ°€ ν”Œλžœμ„ κ²€μƒ‰ν•˜λŠ” 과정을 μ˜λ„μ μœΌλ‘œ μ œν•œν•˜μ—¬ ν”Œλžœ 검색 μ‹œκ°„μ„ λ‹¨μΆ•μ‹œν‚€λŠ” 방법에 λŒ€ν•œ λ‚΄μš©μ΄λ‹€. 쿼리 선택지λ₯Ό μ œν•œν•¨μœΌλ‘œμ¨ μ‹œκ°„μ„ μ€„μ΄μ§€λ§Œ, 그만큼 λͺ¨λ“  경우λ₯Ό λΉ„κ΅ν•˜λŠ” 것이기 μ•„λ‹ˆλΌμ„œ 졜고의 ν”Œλžœμ„ 찾을 수 없기에, ν…Œμ΄λΈ” scan 방식 및 인덱슀 λ“± 쿼리의 μž‘λ™λ°©μ‹μ„ λͺ…ν™•νžˆ μ΄ν•΄ν•œ ν›„ 섀정이 ν•„μš”ν•˜λ©°, μ„€μ •μ „ μ„±λŠ₯비ꡐ, μ„€μ • ν›„μ˜ 데이터 증감에 λ”°λ₯Έ 지속적인 λͺ¨λ‹ˆν„°λ§μ΄ ν•„μš”ν•˜λ‹€. 2. ν”Œλž˜λ„ˆμ˜ μž‘λ™ 2-1. JOIN Planner의 μž‘λ™λ°©μ‹μ„ 보기 μœ„ν•΄ κ°„λ‹¨ν•œ 쑰인 쿼리λ₯Ό 확인해 보자 ...

[Spring] μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ(Spring container)의 κ°œλ…

[Spring] μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ(Spring container)의 κ°œλ…

1. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ(Spring container)λž€? μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ 핡심 μ»΄ν¬λ„ŒνŠΈμ΄λ©° μ£Όμš”ν•œ μš©λ„λŠ” λ‹€μŒκ³Ό κ°™λ‹€. 객체의 생λͺ…μ£ΌκΈ° 관리 μƒμ„±λœ κ°μ²΄λ“€μ˜ 좔가적인 κΈ°λŠ₯ 제곡 μŠ€ν”„λ§μ—μ„œλŠ” μžλ°” 객체λ₯Ό 빈(Bean)이라고 ν•˜λ©° μ»¨ν…Œμ΄λ„ˆλŠ” λ‚΄λΆ€μ˜ 빈 라이프사이클(생성, 제거 λ“±)을 ν•˜λ©° μΆ”κ°€ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. κΈ°μ‘΄ μŠ€ν”„λ§μ—μ„œλŠ” xml 파일둜 μ„€μ •ν•˜λ‚˜ μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œλŠ” μžλ°” ν΄λž˜μŠ€μ—μ„œ μ„€μ •κ°€λŠ₯ν•˜λ‹€. μ£Όμš” μ„€μ •μœΌλ‘œλŠ” [μˆ˜λ™] @Configuration - μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ성정보λ₯Ό 등둝 @Bean - λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ ν˜ΈμΆœν•˜μ—¬ λ°˜ν™˜λœ 객체λ₯Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— 등둝 [μžλ™] @ComponentScan - ν•΄λ‹Ή 클레슀클래슀 νŒ¨ν‚€μ§€μ™€ ν•˜μœ„μ˜ @Component, @Service, @Repository, @Controller 클래슀λ₯Ό νƒμƒ‰ν•˜μ—¬ λΉˆλ“±λ‘Β ...

[Spring] IoC(μ œμ–΄μ˜ μ—­μ „) & DI(μ˜μ‘΄μ„± μ£Όμž…)의 κ°œλ…

[Spring] IoC(μ œμ–΄μ˜ μ—­μ „) & DI(μ˜μ‘΄μ„± μ£Όμž…)의 κ°œλ…

1. IoC (Inversion of Control) μ œμ–΄μ˜ μ—­μ „ IoCλž€ 메인 ν”„λ‘œκ·Έλž¨μ—μ„œ μ»¨ν…Œμ΄λ„ˆλ‚˜ ν”„λ ˆμž„μ›Œν¬λ‘œ 객체와 객체의 μ˜μ‘΄μ„±μ— λŒ€ν•œ μ œμ–΄λ₯Ό λ„˜κΈ°λŠ” 것을 λ§ν•œλ‹€. ν”„λ ˆμž„μ›Œν¬ 없이 κ°œλ°œν•  λ•ŒλŠ” 각 객체에 λŒ€ν•œ 라이프사이클 (생성, μ„€μ •, μ΄ˆκΈ°ν™”, 호좜 λ“±)을 κ°œλ°œμžκ°€ 직접 κ΄€λ¦¬ν•œλ‹€. ν•˜μ§€λ§Œ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λ©΄ 객체의 생λͺ…μ£ΌκΈ°λ₯Ό ν”„λ ˆμž„μ›Œν¬μ— μœ„μž„ν•˜μ—¬, ν”„λ ˆμž„μ›Œν¬κ°€ 개발자의 μ½”λ“œλ₯Ό ν˜ΈμΆœν•˜κ³  흐름을 μ œμ–΄ν•˜κ²Œ ν•  수 μžˆλ‹€. 이처럼, μ œμ–΄μ˜ 역전은 객체λ₯Ό 직접 μƒμ„±ν•˜κ±°λ‚˜ μ œμ–΄ν•˜λŠ” κ²ƒμ΄μ•„λ‹ˆλΌ μ™ΈλΆ€μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 객체λ₯Ό κ°€μ Έμ™€μ„œ μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ, 클레슀 κ°„μ˜ 결합을 λŠμŠ¨ν•˜κ²Œ ν•˜μ—¬ ν…ŒμŠ€νŠΈμ™€ μœ μ§€κ΄€λ¦¬λ₯Ό 더 μ‰½κ²Œ μ„€κ³„ν•˜λŠ” 원칙이닀. ...

[WEB] JWT 토큰 인증의 κ°œλ…κ³Ό μž₯단점

[WEB] JWT 토큰 인증의 κ°œλ…κ³Ό μž₯단점

1. JWT의 κ°œλ… JWTλŠ” μ›Ήμ—μ„œ μ‚¬μš©μž 인증/인가에 μ‚¬μš©ν•˜λŠ” ν† ν°μœΌλ‘œ Json Web Token의 μ€„μž„λ§μ΄λ‹€. μ›Ήμ—μ„œ μ‚¬μš©λ˜λŠ” JSON ν˜•νƒœμ˜ 토큰 ν‘œμ€€ 규격이며 쿠킀와 μœ μ‚¬ν•˜μ§€λ§Œ, μ„œλͺ…λœ ν† ν°μ΄λΌλŠ” 차이점이 μžˆλ‹€. κ³΅κ°œν‚€, κ°œμΈν‚€μ˜ 쌍으둜 μ‚¬μš©ν•  경우 μ„œλͺ…λœ 토큰은 κ°œμΈν‚€λ₯Ό λ³΄μœ ν•œ μ„œλ²„μ—μ„œλ§Œ λ³΅ν˜Έν™”κ°€ κ°€λŠ₯ν•˜λ‹€. 보톡 Authorization HTTP 헀더λ₯Ό Bearer <토큰> ν˜•νƒœλ‘œ μ„€μ •ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ μ „μ†‘ν•œλ‹€. μ„œλ²„μ—μ„œλŠ” 토큰에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” μ„œλͺ…μ •λ³΄λ‘œ μœ„λ³€μ‘°λ₯Ό κ²€μ¦ν•˜λ©° 토큰은 Base64 인코딩 λ˜μ–΄μžˆλ‹€. 2. JWT ꡬ쑰 header, payload, signatureκ°€ 각각 . 으둜 κ΅¬λΆ„λ˜μ–΄ μžˆλ‹€ ...

[PostgreSQL] μœˆλ„μš° ν•¨μˆ˜(Window Functions)의 κ°œλ…, μ„±λŠ₯ 및 μ‚¬μš©λ²• (over, sum/rank/ntitle/cume_dist λ“±...)

[PostgreSQL] μœˆλ„μš° ν•¨μˆ˜(Window Functions)의 κ°œλ…, μ„±λŠ₯ 및 μ‚¬μš©λ²• (over, sum/rank/ntitle/cume_dist λ“±...)

1. μœˆλ„μš° ν•¨μˆ˜ (Window Functions)λž€? μœˆλ„μš° ν•¨μˆ˜λŠ” ν–‰κ³Ό ν–‰ κ°„μ˜ 관계λ₯Ό μ‰½κ²Œ μ •μ˜ν•˜κΈ° μœ„ν•΄ λ§Œλ“  ν•¨μˆ˜μ΄λ‹€. 이 κΈ°λŠ₯μ€Β μΌλ°˜ μ§‘κ³„ν•¨μˆ˜μ˜ μ—°μ‚°κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ, 일반 μ§‘κ³„ν•¨μˆ˜κ°€ ν–‰ 각각을 단일 κ·Έλ£Ήν™”ν•΄μ„œ 좜λ ₯ν•˜λŠ” λ°˜λ©΄μ—, μœˆλ„μš° ν•¨μˆ˜λŠ” 각각의 행듀이 κ·Έλ£Ήν™”λ˜μ§€ μ•ŠμœΌλ©° λ³„λ„μ˜ IDλ₯Ό 가진닀. 그렇기에 μœˆλ„μš° ν•¨μˆ˜λŠ” ν˜„μž¬ row의 정보보닀 더 λ§Žμ€ 정보에 접근이 κ°€λŠ₯ν•˜λ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. μΌλ°˜μ§‘κ³„ν•¨μˆ˜ : COUNT() + GROUP BY-> 그룹별 1개의 ν–‰ 좜λ ₯ (κ·Έλ£Ή 개수만큼 좜λ ₯, 자λ₯΄κΈ° + 집약) μœˆλ„μš°μ§‘κ³„ν•¨μˆ˜ : COUNT() OVER (PARTITION BY) -> ID개수만큼 ν–‰ 좜λ ₯ (ν–‰μ˜ κ°œμˆ˜κ°€ 쀄어듀지 μ•ŠλŠ”λ‹€, 자λ₯΄κΈ°) ...