[PostgreSQL] ν•¨μˆ˜(Function)의 μ •μ˜ 및 상세 μ‚¬μš©λ²• (λ‹€μ–‘ν•œ 예제)

[PostgreSQL] ν•¨μˆ˜(Function)의 μ •μ˜ 및 상세 μ‚¬μš©λ²• (λ‹€μ–‘ν•œ 예제)

1. PostgreSQL Functionμ΄λž€? SQL ν•¨μˆ˜λŠ” μž„μ˜μ˜ SQL문듀을 μ‹€ν–‰ν•˜κ³  λ§ˆμ§€λ§‰ 쿼리의 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. λ‹¨μˆœν•œ ν˜•νƒœμ˜ ν•¨μˆ˜λŠ” λ§ˆμ§€λ§‰ 쿼리의 첫 번째 rowκ°€ λ¦¬ν„΄λœλ‹€. (order by λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 닀쀑 row의 첫 번째 행은 별도 μ •μ˜λ˜μ§€ μ•ŠκΈ°μ— κ²°κ³Ό rowκ°€ 맀번 λ‹€λ₯Ό 수 μžˆλ‹€.) λ§ˆμ§€λ§‰ 쿼리가 rowλ₯Ό ν•˜λ‚˜λ„ λ°˜ν™˜ν•˜μ§€ μ•Šμ„ 경우 null이 λ¦¬ν„΄λœλ‹€. SQL ν•¨μˆ˜λŠ” ν•¨μˆ˜μ˜ 리턴 μœ ν˜•μ„ νŠΉμ • νƒ€μž…μ˜ μ§‘ν•© (SET)으둜 μ„ μ–Έν•˜κ±°λ‚˜, ν…Œμ΄λΈ”λ‘œ μ„ μ–Έν•˜μ—¬ λ°˜ν™˜ν•  수 μžˆλ‹€. 이 κ²½μš°μ—λŠ” λ§ˆμ§€λ§‰ 쿼리의 λͺ¨λ“  ROWκ°€ λ¦¬ν„΄λœλ‹€. SQLν•¨μˆ˜μ˜ bodyλŠ” μ„Έλ―Έμ½œλ‘ (;)으둜 κ΅¬λΆ„λœ SQLꡬ문의 μ§‘ν•©μ΄μ–΄μ•Όλ§Œ ν•œλ‹€. λ§ˆμ§€λ§‰ ꡬ문 λ’€μ˜ μ„Έλ―Έμ½œλ‘ (;)은 μƒλž΅ν•˜μ—¬λ„λœλ‹€. ν•¨μˆ˜κ°€ voidλ₯Ό λ¦¬ν„΄ν•˜λŠ” κ²ƒμœΌλ‘œ μ„ μ–Έλ˜μ§€ μ•Šμ•˜λ‹€λ©΄, λ§ˆμ§€λ§‰ ꡬ문은 λ°˜ν™˜μ ˆμ΄ μ‘΄μž¬ν•˜λŠ” select, insert, update, delete μ—¬μ•Όλ§Œ ν•œλ‹€. λͺ¨λ“  μ’…λ₯˜μ˜ SQL μ–Έμ–΄μ˜ λͺ…λ Ή λͺ¨μŒμ€ νŒ¨ν‚€μ§• λ˜μ–΄ ν•¨μˆ˜λ‘œ μ •μ˜λ  수 μžˆλ‹€. select쿼리 외에도 insert, update, delete, merge λ“±μ˜ 데이터 μˆ˜μ •μΏΌλ¦¬ 및 기타 SQL을 포함할 수 μžˆμ§€λ§Œ, νŠΈλžœμž­μ…˜ μ œμ–΄ λͺ…λ Ή( ex. commit, savepoint) 및 vacutaion λ“±μ˜ 일뢀 μœ ν‹Έλ¦¬ν‹° λͺ…령은 μ‚¬μš©ν•  수 μ—†λ‹€. SQL이 μž‘λ™μ€ ν•˜μ§€λ§Œ νŠΉμ • 값을 λ¦¬ν„΄ν•˜μ§€ μ•ŠλŠ” SQL ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  μ‹Άλ‹€λ©΄, voidλ₯Ό λ¦¬ν„΄ν•˜λŠ” κ²ƒμœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€. β–ΆΒ 1-1. Function 간단 μ˜ˆμ‹œ λ‹€μŒμ€ emp ν…Œμ΄λΈ”μ—μ„œ 음수의 salaryλ₯Ό μ‚­μ œν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. ...

[Spring] λ‹¨μœ„ ν…ŒμŠ€νŠΈ, JUnit의 κ°œλ… 및 λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± 방법

[Spring] λ‹¨μœ„ ν…ŒμŠ€νŠΈ, JUnit의 κ°œλ… 및 λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± 방법

1. λ‹¨μœ„ ν…ŒμŠ€νŠΈ ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ„ κΈ°μ€€μœΌλ‘œ λ…λ¦½μ μœΌλ‘œ μ§„ν–‰λ˜λŠ” κ°€μž₯ μž‘μ€ λ‹¨μœ„μ˜ ν…ŒμŠ€νŠΈμ΄λ‹€. 톡합 ν…ŒμŠ€νŠΈμ˜ 경우 μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ“€μ΄ 컀질수둝 ν…ŒμŠ€νŠΈ μ‹œκ°„μ΄ κΈΈμ–΄μ§€μ§€λ§Œ, λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ 경우 ν•΄λ‹Ή λΆ€λΆ„λ§Œ λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜κΈ°μ— μ½”λ“œμ˜ 변경이 μžˆμ–΄λ„ λΉ λ₯΄κ²Œ 문제 μ—¬λΆ€λ₯Ό 확인할 수 μžˆλ‹€. CleanCode 책에 μ˜ν•˜λ©΄ κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” λ‹€μŒ 5κ°€μ§€ κ·œμΉ™μ„ 따라야 ν•œλ‹€. Fast -Β λΉ λ₯΄κ²Œ λ™μž‘ν•˜μ—¬ 자주 돌릴 수 μžˆμ–΄μ•Ό ν•œλ‹€. Independent -Β ν…ŒμŠ€νŠΈλŠ” 독립적이며 μ„œλ‘œ μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆλœλ‹€. Repeatable -Β μ–΄λŠ ν™˜κ²½μ—μ„œλ„ 반볡이 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€. Self-validating -Β ν…ŒμŠ€νŠΈλŠ” 성곡 λ˜λŠ” μ‹€νŒ¨λ‘œ κ²°κ³Όλ₯Ό λ‚΄μ–΄ 자체 κ²€μ¦λ˜μ–΄μ•Ό ν•œλ‹€. Timely -Β ν…ŒμŠ€νŠΈλŠ” μ μ‹œμ—, ν…ŒμŠ€νŠΈν•˜λ €λŠ” μ‹€μ œμ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜κΈ° 직전에 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. ...

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