μ‚Ά/F-Lab

Week 11

osean 2021. 7. 16. 01:38

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 > μŠ€ν„°λ”” ν•˜λ©΄μ„œ ν•œλ²ˆ μ‚΄νŽ΄λ³Έ λ‚΄μš©μΈ 것 같은데 기얡이 νœ˜λ°œλλ‹€. λ‹€μ‹œ κ³΅λΆ€ν•˜μž!

'μ‚Ά > F-Lab' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Week 12  (1) 2021.07.24
Week 10  (0) 2021.07.10
Week 9  (0) 2021.07.02
Week 8  (0) 2021.06.25
Week 7  (0) 2021.06.18