Week 11
: Statement, PreparedStatement, MVC, DispatcherServlet
βοΈ λ²μ¨ 7μ μ€μ, μ΄ν λ²μ§Έ λ©ν λ§μ λ§μ³€λ€.
μ λ² μ£Όμ μ΄λ² μ£Όλ λΈλ‘κ·Έλ λ Έμ μ μ 리ν λ΄μ©λ μκ³ μ€λ‘μ§ μμ΄ν¨λμλ λμ κ±°λ¦° λ΄μ© λ°μ μμ΄μ λ©ν λ§ μκ°μ΄ κ°κΉμμ§ λ λ§λ€ λ무 κΈ΄μ₯ λκ³ , κ·Έ λ§νΌ κΈ΄μ₯ νλ€λ 건 λ΄κ° μ ννκ² μ΄ν΄νκ³ μλκ² μ λ€λ μ΄μΌκΈ°λΌκ³ ν μ μκ² λ€.
μ΄λ² λ©ν λ§λ μ΄λ»κ² μ§λκ°κΈ°λ νμ§λ§ λ΄κ° κ²μΌλ₯΄κ³ λ λ Έλ ₯νμ§ λͺ»ν΄μ μ‘°κΈ μμ¬μ΄ μκ°μ΄μλ€. λ μκ°μ λ΄μ μ΄ν΄νλ μκ°μ λλ €μΌκ² λ€.
μ΄λ² λ©ν λ§ μκ°μλ JSP κ΄λ ¨ν λ΄μ©λ€μ λν΄μ μ£Όλ‘ μ΄μΌκΈ° λλμλλ°, ν΄λΉ λ΄μ©μ μ 리ν΄λ³΄κ³ μ νλ€!
1. Statement, PreparedStatement
Connection κ°μ²΄λ₯Ό ν΅ν΄μ μμ± ν μ μμΌλ©°, λ°μ΄ν° λ² μ΄μ€μκ² μΏΌλ¦¬λ¬Έμ ν΅ν΄ μ§μ κ°λ₯ν κ°μ²΄λ₯Ό StatementλΌκ³ νλ€. 쿼리문μ μ λ¬νλ μν μ νμ§ μΏΌλ¦¬λ¬Έμ ν΄μνκ±°λ λ°μ΄ν° λ² μ΄μ€λ₯Ό κ΄λ¦¬νμ§λ λͺ»νλ€.
π Statement
Statement κ°μ²΄λ 맀 λ² μμ²μ΄ λ€μ΄ μ¬ λ λ§λ€ μ»΄νμΌνλ κ³Όμ μ κ°μ§λ€. λλ¬Έμ 맀 μμ²λ§λ€ μ»΄νμΌ νλ κ³Όμ μ΄ μ‘΄μ¬νκΈ° λλ¬Έμ μμμ΄ λλΉ λ μ μλ€. λ§μ½ κ°μ 쿼리λ₯Ό μ§μμ μΌλ‘ λ°λ³΅νλ€κ³ νμ λ, ν΄λΉ μμ²μ΄ λ€μ΄μ¬ λ λ§λ€ μ»΄νμΌμ κ±°μΉ λ€μ λ°μ΄ν° λ² μ΄μ€μ μ κ·Όνλλ°, λκ°μ 쿼리λ₯Ό κ³μ μ»΄νμΌ νλ κ²μ μμμ λλΉνλ κ²μ΄λ€. λν, λ°μ΄ν° λ² μ΄μ€μμ λ³λλ‘ μΊμ± μμ μ μννμ§ μκΈ° λλ¬Έμ PreparedStatement κ°μ²΄λ³΄λ€ μ§μ μ±λ₯μ΄ λ¨μ΄μ§ μ μλ€.
π PreparedStatement
λ§ κ·Έλλ‘ λ―Έλ¦¬ μ€λΉλμ΄μ§ Statement κ°μ²΄λ₯Ό μλ―Ένλ€.
ν λ² μ»΄νμΌνκ³ λλ©΄ κ·Έ λ€λ‘λ λ°μ΄ν° λ² μ΄μ€μ μΊμ λ©λͺ¨λ¦¬μ μ μ¬λμ΄ λΉ λ₯΄κ² λ°μ΄ν°λ₯Ό λ°μ μ¬ μ μλ€. μ¦, Statement κ°μ²΄μ λ¬λ¦¬ κ°μ 쿼리λ₯Ό μμ£Ό λ°λ³΅νλ κ²½μ°μλ μ»΄νμΌμ ν λ²λ§ μννκ³ , μ΄ λ§μ λ μΊμ±νκΈ° λλ¬Έμ Statement λ³΄λ€ μ±λ₯ μ μ΄μ μ κ°μ§λ€.
λν, νλ μ΄μ€ νλλ₯Ό μ΄μ©νμ¬ μΏΌλ¦¬μ μΌλΆλΆμ μλνκΈ° λλ¬Έμ μνμ λ°λΌ λμ μΌλ‘ 쿼리λ₯Ό μ¬μ© ν μ μμΌλ©°, 보μ μμλ μ 리νλ€. (SQL Injection μ λν΄μ μ‘°κΈ λ μμ보μ. -> μ PreparedStatement κ°μ²΄λ 쿼리λ₯Ό μλν¨μΌλ‘μ¨ λ³΄μμ μ΄μ μ κ°μ§κΉ?)
λ€λ§, μμ μ€λͺ ν κ² μ²λΌ PreparedStatement κ°μ²΄λ μΊμ±μ κ³Όμ μ΄ μλ€κ³ νλλ°, μ΄λ¬ν PreparedStatement κ°μ²΄μ μΏΌλ¦¬κ° μμ ν λ€λ°λλλ‘ μ½λλ₯Ό μμ±νλ€λ©΄ (νλ μ΄μ€ νλλ₯Ό μ¬μ©ν κ²μ΄ μλ 쿼리문 μμ²΄κ° λ³κ²½λλ κ²½μ°) μΏΌλ¦¬λ¬Έμ΄ λ°λ λ λ§λ€ λ€μ μ»΄νμΌνλ κ³Όμ μ κ±°μ³μΌ νκ³ , ν΄λΉ μΏΌλ¦¬λ¬Έμ΄ μΊμ λ©λͺ¨λ¦¬μ μ μ¬λμ§ μμ μΊμ± μμ λ μννκ² λλ€.
μ΄ λ λ°μ ν μ μλ λ¬Έμ μ μ νμ μ μΈ μΊμ λ©λͺ¨λ¦¬μ μ΄λ° μμΌλ‘ PreparedStatement κ°μ²΄μ μν 쿼리 λ°μ΄ν°κ° μμ΄κ² λλ€λ©΄ λΆνμνκ² μμμ λλΉνκ² λλ κ²μ΄λ€. κ·Έλ¬λ―λ‘ μΏΌλ¦¬λ¬Έμ₯ μ체λ₯Ό μμ£Ό λ³κ²½λλ κ²½μ°μλ Statement κ°μ²΄λ₯Ό μ΄μ©ν΄ μ μ μΏΌλ¦¬λ‘ κ΅¬ννμ.
π₯ SQL Injection 곡λΆνκΈ°
2. WAS <-> DB ν΅μ κ°, λ€νΈμν¬ νΈλν½ λ°μ μ λ°μ ν μ μλ λ¬Έμ μ
Thread Pool κ³Ό Connection Pool μ λν μ΄ν΄κ° μ‘°κΈμ΄λΌλ μμ΄μΌ νλ€κ³ μκ°νλ€.
λν, μ΄λ€ μ΄μ μμ WAS μ λ°μ΄ν° λ² μ΄μ€ κ° λ€νΈμν¬ νΈλν½μ΄ λ°μνλμ§ νμ νλκ² μ€μνλ€.
λ¨Όμ λ°μ΄ν° λ² μ΄μ€λ μ‘°ν 쿼리μ λν IO μμ μ μννκ² λλλ°, μ΄ λ 보ν΅μ Blocking λ°©μμ μ΄μ©ν΄μ λ°μ΄ν°μ λμμ±μ 보μ₯νλ€.
κ·Έλ°λ° 짧μ μκ°μ μλ§μ μ‘°ν 쿼리 μμ²μ΄ λ€μ΄ μλ€κ³ κ°μ νμ.
λ§μ½ ν΄λΉ 쿼리λ₯Ό ν λ² μ‘°ννλλ° 3μ΄κ° κ±Έλ¦°λ€λ©΄ μμ²μ΄ λ€μ΄μ¨ μμ (Queue) λλ‘ μ»€λ₯μ μ΄ μλ΅μ κ°μ Έκ°ν λ° μ΄λ΄ κ²½μ° λ€λ¦κ² λ€μ΄μ¨ μμ²λ€μ μμμ μλ΅μ λκΈ°νκ³ μλ 컀λ₯μ λ€μ΄ λͺ¨λ λμκ° λ κΉμ§ λκΈ°ν΄μΌ νλ μν©μ΄ λ°μ ν μ μλ€.
μ΄λ κ² λλ©΄ κ³μ μμ²μ΄ μμ΄κ² λλκΉ μ»€λ₯μ νμ μ€λΉλ 컀λ₯μ λ νΉμ κ°μ λλ¬νλ©΄ 컀λ₯μ μ ν λΉ ν μ μλ μνκ° λκ³ , 컀λ₯μ μ΄ μμ΄κ² λλ©΄ κ²°κ΅ μ€λ λ νλ λκ°μ΄ ν΄λΌμ΄μΈνΈ μμ²μ΄ λ€μ΄μλ μ€λ λλ₯Ό ν λΉ λ°μ§ λͺ»νκΈ° λλ¬Έμ HTTP μλ¬ μ½λλ₯Ό μλ΅ λ°μ μλ μλ€.
κ·Έλμ LeadTimeOut μ΄λ ConnectionTimeOut μ€μ λ±μ μ΄μ©ν΄ μ€λ λμ 컀λ₯μ μ΄ νΉμ μκ° λμ μ¬μ©λμ§ μμΌλ©΄ (νΉμ μμ²μ λν μλ΅μ λ°μ§ λͺ»ν΄ λκΈ°νκ³ μμΌλ©΄) ν΄λΉ μ€λ λ νΉμ 컀λ₯μ μ λ€μ νλ‘ λ°νλλλ‘ νλ€λ©΄ ν΄λΉ μμμ λ¬Έμ λ₯Ό μΌλΆλΆ ν΄κ²° ν μ μλ€. κ·Έλ λ€λ©΄ κ³Όμ° μ΄ λ°©λ²μ΄ λͺ¨λμκ² κ³΅νν λ°©λ²μΌκΉ? λΌλ μλ¬Έμ΄ λλλ° μ‘°κΈ λ 곡λΆν΄λ΄μΌκ² λ€!
3. MVC
κΈ°μ‘΄μ μλ° μ§μμμ μ¬μ©λλ μΉ νλ‘μ νΈ λμμΈ ν¨ν΄μ νμ νκ³ μμ΄μΌ MVC λμμΈ ν¨ν΄μ μ΄ν΄νκΈ° μ½λ€.
Servlet μ΄λ JSP λ₯Ό μ΄μ©νλ κ³Όκ±°μλ νλμ κ°μ²΄λ₯Ό ν΅ν΄μ ν΄λΌμ΄μΈνΈμ λΉμ¦λμ€ λ‘μ§κ³Ό νλ©΄μ λ³΄μ¬ μ€μΌ ν λ΄μ©λ€μ ν¨κ» λ΄λΉνλ€. μ¦, ν μ¬λμ΄ κ°κΈ° λ€λ₯Έ μΌμ λμμ μ§ννλ€κ³ μκ°νλ©΄ μ’μΌλ €λ?
μ΄λ¬ν λ°©λ²μ΄ Pattern 1 μ ν΄λΉνλ€. Pattern 1 μ νλμ κ°μ²΄μμ μ¬λ¬ κ°μ§ μμμ μΌμ μννκΈ° λλ¬Έμ κ°νΈνκ² μλΉμ€λ₯Ό ꡬν ν μ μλ€λ μ₯μ μ΄ μλ€. νμ§λ§ μ΄λ λ¨μ μΌλ‘ μ°κ²° λ μ μλλ°, μλΉμ€κ° λΉλν΄μ§ μλ‘ κ° κ°μ²΄μ λΉμ¦λμ€ λ‘μ§κ³Ό νλ©΄ μ½λκ° λμ΄λκ² λκ³ , λ€μμ΄κ² λλ©΄μ μ μ§λ³΄μ νκΈ°κ° μ λ§ νλ€μ΄μ§λ€λ λ¨μ μ΄ μλ€.
μ΄μ κ°μ Pattern 1 μ λ¨μ μ 극볡νκ³ μ Pattern 2 κ° λ±μ₯νκ² λλλ°, μ΄ Pattern 2 μμλ νλμ κ°μ²΄μμ μ¬λ¬ μΌμ λ맑μ νλ κ²μ κ°μμ μν μ λ§κ² λΆμ νλλ‘ λλ κ²μ μλ―Ένλ€. μ¦, λΉμ¦λμ€ λ‘μ§μ A κ° μννκ³ νλ©΄μ λ§λλ μΌμ B κ° μννλ κ²μ μλ―Ένλ€. μ¬κΈ°μ A λ Controller, B λ View λ₯Ό μλ―Ένλ€.
λκ° MVC ν¨ν΄κ³Ό λΉμ·ν κ² κ°λ€! λ§λ€. MVC ν¨ν΄μ Pattern 2 λΌκ³ λ³Ό μλ μλ€. λ€λ§ MVC ν¨ν΄μ΄λΌλ κ²μ λͺ μΈμ κ·ΈμΉ λΏ, μλ° μΉ νλ‘κ·Έλλ°μ μλ―Ένμ§ μλλ€λ κ²μ λͺ μ¬νμ. (MVC ν¨ν΄μ κ°μ§λ μ¬λ¬ μΈμ΄μ νλ μ μν¬λ€μ μκ°ν΄λ³΄μ. κ°μ MVC ν¨ν΄μ κ°μ§κ³ μλ€.)
μ¦, MVC ν¨ν΄μ λ°μ΄ν°λ₯Ό μ΄λ»κ² μ²λ¦¬ν μ§ μν μ λλκ³ μνν μ§λ₯Ό κ΅¬λΆ ν΄λμ κ²μ μλ―Ένλ€.
Spring MVC μ 컨νΈλ‘€λ¬, μλΉμ€, λ νΌμ§ν 리μ μν°ν° κ°μ κ΄κ³λ₯Ό MVC ν¨ν΄μΌλ‘ λ°λΌλ³Έλ€λ©΄, 컨νΈλ‘€λ¬λ View, μλΉμ€λ Controller, λ νΌμ§ν 리μ μν°ν°λ Model μ μν μ μννλ€κ³ λ³Ό μ μλ€.
μ Spring MVC μ 컨νΈλ‘€λ¬λ₯Ό View μ μν λ‘ λ°λΌλ³΄λκ±ΈκΉ? λλ¨Έμ§ μμλ€μ?
μμ λμλ λ΄μ©μ²λΌ MVC ν¨ν΄μ΄ ꡬ체νλ μ΄λ€ κ²μ μλ―Ένλ κ²μ΄ μλ MVC μ κΈ°μ€μ μΆ©μ‘±νλ λͺ¨λ κ²μ MVC ν¨ν΄μ΄ λ μ μλ€. μ¦, Spring MVC μ 컨νΈλ‘€λ¬λ μμ²μ μν λΉμ¦λμ€ λ‘μ§μ μννκΈ° 보λ€λ μλΉμ€μμ ν΄λΉ μμ²μ μ²λ¦¬ν κ²°κ³Όκ°μ ν΄λΌμ΄μΈνΈμκ² μ λ¬ν΄μ£Όλ μν μ νκΈ° λλ¬Έμ View λΌκ³ ν μ μλ κ²μ΄λ€. λλ¨Έμ§ μμλ€λ λ§μ°¬κ°μ§λ€.
4. Front-Controller Pattern, DispathcerServlet
μ‘°κΈ λ μ΄ν΄ λ΄μΌ ν λ΄μ©μ΄λ€.
λ¨Όμ κΈ°μ‘΄μ Pattern 2 λ°©μμ νλ‘κ·Έλλ°μ λͺ¨λ ν΄λΌμ΄μΈνΈμ μμ²μ λν λΉμ¦λμ€ λ‘μ§μ μννλ μ£Όμ²΄κ° μλΈλ¦Ώμ΄κ³ , κ²°κ΅ λͺ¨λ ν΄λμ€λ€μ μλΈλ¦Ώμ μ’ μλ μ λ°μ μλ€.
λ§μ½ λͺ¨λ μλΈλ¦Ώμμ κ³΅ν΅ μμκ° μλ€κ³ κ°μ νμ λ, ν΄λΉ μμκ° λ³κ²½λλ€λ©΄ λͺ¨λ μλΈλ¦Ώμ μμ±λ μ½λλ₯Ό μΌμΌν μμ ν΄μ€μΌ νλ€. λλ HttpServlet μ μμ λ°μ service() λ doGet(), doPost() λ₯Ό μ€λ²λΌμ΄λ©νμ¬ λΉμ¦λμ€ λ‘μ§μ ꡬν νλ€κ³ νμ λ,
νΉμ λΉμ¦λμ€ λ‘μ§μμλ μ€λ²λΌμ΄λ©μ ν΅ν΄ μ λ¬ λ°μ HttpServletRequest λ HttpServletResponse νλΌλ―Έν°λ₯Ό μ¬μ©νμ§ μμ μ μλ€. κ·Έλ λ€λ©΄ μ΄ μ½λμ νλΌλ―Έν°λ ν΄λΉ μλΈλ¦Ώμμ μ¬μ©νμ§ μλλ° μ‘΄μ¬νκ² λλ κ²μ΄λ λ©λͺ¨λ¦¬ μμμ λλΉνκ³ , λΆνμν μ½λλ‘ μΈν΄ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ λ¨μ΄ νΈλ¦΄ μ μλ€.
μ΄ λ°μλ λ€μν μ΄μ κ° μ‘΄μ¬νμ§λ§, μ΄λ¬ν λ¬Έμ λ€μ κ²°κ΅ λͺ¨λ λΉμ¦λμ€ λ‘μ§μ μννλ ν΄λμ€λ€μ΄ ν΄λΌμ΄μΈνΈμκ² κ²°κ³Όλ₯Ό μλ΅νκΈ° μν΄μ HttpServlet, GenericServlet μ μμ λ°μΌλ©΄μ μκΈ°λ λ¬Έμ μ΄λ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ Front-Controller Pattern μ΄ λ±μ₯νκ² λμλλ°, Front-Controller λ μμ μ΄ μλΈλ¦Ώμ΄ λμ΄ ν΄λΌμ΄μΈνΈ μμ²μ μ²λ¦¬νλ ν΄λμ€λ₯Ό νΉμ URL λ±μ κΈ°μ€μΌλ‘ μ°Ύκ³ , ν΄λΉ ν΄λμ€μμ κ²°κ³Όλ§ λ°μ Front-Controller μμ ν΄λΌμ΄μΈνΈμκ² μλ΅νλ€.
μ΄λ κ² λμ λμ μ₯μ μ λͺ¨λ ν΄λΌμ΄μΈνΈ μμ²μ΄ Front-Controller λ₯Ό κ±°μΉκ² λκ³ , μ€μ§ Front-Controller λ§ μλΈλ¦Ώμ μμ λ°κΈ° λλ¬Έμ κΈ°μ‘΄μ μλΈλ¦Ώ ν΄λμ€λ€μ μλΈλ¦Ώμ μ’ μλμ§ μλλ€λ μ₯μ μ΄ μλ€.
μ΄λ¬ν ν¨ν΄μ λ°νμΌλ‘ λ°μ λμ΄ λμ¨ κ²μ΄ Spring νλ μμν¬μ μ½μ΄λΌκ³ ν μ μλ DispatcherServletμ΄ μλ€.
5. J2EE
μλΈλ¦Ώκ³Ό JSP κ΄λ ¨νμ¬ κ³΅λΆνκ±°λ μ 무 μ€μ νΉμ ν΄λμ€λ₯Ό import νμ λ μμ£Ό 보λ μ΄λ¦μ΄μλλ°, μ μ λνλ μΉκ΅¬μΈμ§λ μμ§ λͺ»νκ³ , μ¬μ€ μ§κΈλ λμ§λ μ λͺ¨λ₯Έλ€.
λ€λ§ J2EE λ μ΄λ ν κΈ°μ€μ κ°μ§λ μλ° μν°νλΌμ΄μ¦λ‘ μ΄λ€ νΉμ κΈ°μ μ μλ―Ένλ κ²μ΄ μλ J2EE κ° λͺ μΈν λ΄μ©λ€μ κ°κ°μ λ²€λμ¬μμ κ·Έ κΈ°μ€μ λ°λΌ μ νλ€μ μΆμνλλ°, μ΄ λ μΆμνλ μ νλ€μ΄ J2EE μ νμ€ κ·μ½μ λ°λΌμ κ°λ°λ κ²μ΄λ€.
μ΄λ¬ν J2EE μλ λ΄κ° 곡λΆνκ³ μλ Servlet, JDBC, JDNI λ±μ΄ μ‘΄μ¬νλ€. ν΄λΉ λΆλΆμ μ‘°κΈ λ μ΄ν΄ λ΄μΌκ² λ€!
π₯ J2EE
π₯ LeadTimeOut, ConnectionTimeOut λ± μ€λ λ νκ³Ό 컀λ₯μ νμ 컨νΈλ‘€νκΈ° μν λ°©λ²λ€
π₯ Filter μ Spring Interceptor μ μ°¨μ΄ > κ²°κ΅ λͺ μΈμ κΈ°μ€μ μ΄λ€ κ²μ λ°λ₯΄λμ μ°¨μ΄λ₯Ό κ°μ§λ€. Filter λ J2EE, Spring Interceptor λ Spring Framework
π₯ SQL Injection > μ€ν°λ νλ©΄μ νλ² μ΄ν΄λ³Έ λ΄μ©μΈ κ² κ°μλ° κΈ°μ΅μ΄ νλ°λλ€. λ€μ 곡λΆνμ!