Post

๐Ÿฅœ [Spring] ํŽ˜์ด์ง€ ์ด๋™๊ณผ Attribute, ResourceFactory

Servlet-API

image-14

init(config) ์— ์˜ํ•ด Servlet๊ณผ ServletConfig์™€ ๊ด€๊ณ„๊ฐ€ ์ด๋ค„์ง„๋‹ค.(has a Relation)

Servlet์€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ Container์— ์˜ํ•ด ์ƒ์„ฑ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Servlet์„ ์ดˆ๊ธฐํ™” ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

ServletConfig๋Š” ํ•œ๊ฐœ์˜ Servlet์„ ์ดˆ๊ธฐํ™”(= A Servlet instance initilization)

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ์ด getInitParameter() ์ด๋‹ค.

getInitParameter()๋Š” Container์—์„œ ์ดˆ๊ธฐ์— ์„ค์ •ํ•œ ๊ฐ’์œผ๋กœ Servlet๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

โ‡’(web.xml) ์ดˆ๊ธฐ์„ค์ •ํ•œ DD ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด

init() ๋‚ด์— getInitParameter() ๊ฐ€ ๋“ค์–ด๊ฐ€ init() ์ด ํ˜ธ์ถœ ๋  ๋•Œ ์ด๋Ÿฌํ•œ ๊ณผ์ •์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

ServletContext

ServletContext๋Š” ๋” ๋„“์€ ServletConfig ์ด๋‹ค.

globalํ•œ ์ดˆ๊ธฐํ™”๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. โ‡’ getInitParameter()

ServletConfig์˜ getInitParameter() ์€ ํ•œ ๊ฐœ์˜ Servlet์„ ์ดˆ๊ธฐํ™”

ServletContext์˜ getInitParamter() ์€ ๊ธ€๋กœ๋ฒŒํ•œ Servlet์„ ์ดˆ๊ธฐํ™”

ServletRequest

ServletRequest( = Client โ†’ Server)

getParameter(String name) return String(ํ•œ๊ฐœ์˜ ๊ฐ’)

getParameterValues(String name) return String[] (์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’)

setAttribute(String name, Object o) return void (name์ด key, o๊ฐ€ value)

getAttrubute(String name) return Object (name์ด key์ด๋ฏ€๋กœ ์ด๊ฒƒ์œผ๋กœ value ๋ฐ›์•„์˜ด)

ServletResponse

ServletResponse(= Response โ† Server)

getWriter() return PrintWriter

HttpServletRequest

HttpServletRequest (HTTP ํ†ต์‹ ์— ํŠนํ™”)

getSession()

getCookie()

Servlet ์ฃผ์š” ๋กœ์ง ์ˆœ์„œ

  1. Client ๋กœ ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Œ
  2. ๋ฐ›์€ ๊ฐ’์œผ๋กœ VO ์ƒ์„ฑ (pvo)
  3. DAO ๋ฅผ DB ๋กœ ๋ถ€ํ„ฐ return ๋ฐ›๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ˜ธ์ถœ (rvo)
  4. ๋ฐ˜ํ™˜ ๊ฐ’ Attribute ์— ๋ฐ”์ธ๋”ฉ (vo)
  5. ํŽ˜์ด์ง€ ์ด๋™, ๋„ค๋น„๊ฒŒ์ด์…˜ ์ฒ˜๋ฆฌ (jsp)


ํŽ˜์ด์ง€ ์ด๋™

Servlet ์€ logic ์ค‘์‹ฌ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ถœ๋ ฅ๋ถ€๋ถ„์€ JSP ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.

๊ทธ๋Ÿผ Servlet์—์„œ ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ JSP๋กœ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์„ Attribute ๋ผ๊ณ  ํ•œ๋‹ค.

Servlet์—์„œ setAttribute() ํ˜ธ์ถœํ•ด Attribute ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

Attribute ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ JSP์—์„œ getAttribute()๋ฅผ ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

Servlet์€ getAttribute()๋ฅผ ์“ธ์ผ์ด ์—†๋‹ค.

getAttribute() ๋Š” ๊ฒฐ๊ณผํŽ˜์ด์ง€์—์„œ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.

image-15

doProcess()๋Š” ํ•˜๋‚˜์˜ thread์ด๋‹ค.

์ฆ‰, client์—์„œ ์š”์ฒญ์„ ์‘๋‹ต ํ•˜๋ฉด request, response์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ข€ ๋” global ํ•œ scope ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. (ServletContext)


image-17

์ด์ „์—๋Š”

1
request.getRequestDispatcher("result.jsp").forward(request, response);

๋ฅผ ์‚ฌ์šฉํ•ด์„œ MemberServlet์ด ์‘๋‹ตํ•˜๊ธฐ ์ „์— result.jsp๋กœ ํŽ˜์ด์ง€ ์ด๋™์„ ํ•˜๊ฒŒ ๋˜์–ด

req, res๊ฐ€ ์‚ด์•„์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, Client ์— ์‘๋‹ต์„ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ result.jsp ์ด๋‹ค.

์ง€๊ธˆ๊ณผ ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋กœ์ง์ด๋ฉด request.setAttribute()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

session์„ ๊ตณ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ MemberServlet ์—์„œ result.jsp ๋กœ ๊ฐ€๋Š” ๊ฒƒ์€ ๋˜๋‹ค๋ฅธ Requst ์™€ Response ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ผ๊นŒ?

์•„๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ find.html ์—์„œ MemberServlet ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ๋•Œ๋Š” Request ์™€ Response ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

ํ•˜์ง€๋งŒ MemberServlet ์—์„œ result.jsp ๋กœ ๊ฐ€๋Š”๊ฒƒ์€

Request ์™€ Response ๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

์™œ๋ƒํ•˜๋Š” MembertServlet ์—์„œ result.jsp ์— ์š”์ฒญ์„ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์š”์ฒญ์ด๋ž€ ๋ธŒ๋ผ์šฐ์ €์—์„œ Server๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, MemberServlet์—์„œ result.jsp ๋กœ ๊ฐ€๋Š” ๊ฒƒ์€ ์ด๋™์ด ์•„๋‹ˆ๋ผ ์š”์ฒญ์ด๋‹ค.

Container ๋‚ด์—์„œ ์„œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ ๊ทธ๋Ÿผ result.jsp๊ฐ€ ์ ‘๊ทผํ•˜๋Š” attribute ๋Š” MemberServlet ์˜ ๊ฒƒ

result.jsp ๋Š” Attribute ์— ์ €์žฅ๋œ MemberService ์˜ request ๋ฅผ ๋ฐ›์•„์„œ find ๋กœ ์‘๋‹ตํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋•Œ Attribute ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.


Forward

๊ฐ™์€ ์„œ๋ฒ„ ์ƒ์—์„œ ๋ฐ”๋กœ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹

image-15

Redirect

๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ

image-18

C๋Š” A์— ์žˆ๋Š” Request, Response ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ServletRequest ๋ณด๋‹ค ์ข€ ๋” ๋„“์€ Scope๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

Redirect ๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฑฐ์น˜๊ณ  ๋‹ค์‹œ ์„œ๋ฒ„๋กœ ์ด๋™ํ•œ๋‹ค.

์ด ๋•Œ ์„œ๋ฒ„๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.


์›น ์„œ๋น„์Šค ์‹คํ–‰์ˆœ์„œ

image-16

  1. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ

    Static Document / Dynamic Document

  2. ํ”„๋กœ๊ทธ๋žจ Dynamic Document

    โ†’ ์ปดํŒŒ์ผ ์„ฑ๊ณต(์‹คํ–‰ํŒŒ์ผ ~.class)

  3. ์„œ๋ฒ„ ๊ฐ€๋™ start
  4. ์†Œ์Šค์ฝ”๋“œ ์„œ๋ฒ„์•ˆ์œผ๋กœ ๋ฐฐํฌ

    WEB-INF ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜์œ„์—๋Š” ํ”„๋กœ๊ทธ๋žจ(Dynamic Document)๋“ค์–ด๊ฐ€๊ณ 

    ์ƒ์œ„์—๋Š” ์ •์ ์ธ ํŒŒ์ผ(Static Document)

  5. ๋ธŒ๋ผ์šฐ์ €๋กœ ์š”์ฒญ

    http://server IP:port/ContextPath/์š”์ฒญ์ด๋ฆ„


JSP๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ๋ณด์ด๋Š” ๊ฒƒ๋งŒ ํƒœ๊ทธ๋กœ ๋˜์žˆ์–ด์„œ Static Document๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋Š” logic ์ค‘์‹ฌ์ด๋‹ค. ๋”ฐ๋ผ์„œ tag ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ด๊ฒƒ์„ tomcat ์ด Servlet ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์•Œ์•„์„œ ๋ฒ ํฌํ•œ๋‹ค.

result_jsp.java(Servlet ๋ณ€ํ™˜) โ†’ ์ปดํŒŒ์ผ(~.class) โ†’ Servlet์ƒ์„ฑ โ†’ init() โ†’ Service()

Attribute ์˜ Scope

Attribute ์„œ๋ฒ„์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ผ์ข…์˜ ๊ณต๊ฐ„

  1. ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉ (setAttribute(โ€์ด๋ฆ„โ€, ๊ฐ์ฒด))
  2. ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์˜ค๋Š” (getAttribute(โ€์ด๋ฆ„โ€) โ€œ์ด๋ฆ„โ€์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ์ฒด๊ฐ€ return (Object๊ฐ€ return ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์ŠคํŒ…์„ ํ•ด์ค˜์„œ ์ฐพ์•„์™€์•ผ ํ•œ๋‹ค.)

Attribute ์˜ ์„ธ๊ฐ€์ง€ ์ข…๋ฅ˜

์•„๋ž˜ 3๊ฐ€์ง€๊ฐ€ Attribute์˜ ์ข…๋ฅ˜์ด๋‹ค. (๋ชจ๋‘ setAttribute, getAttribute ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.)

์ €์žฅ ์œ ํšจ๊ธฐ๊ฐ„์— ๋”ฐ๋ผ ์ข…๋ฅ˜๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

ServletRequest

์‘๋‹ต์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์‚ฌ๋ผ์ง„๋‹ค. ์ฆ‰, ์‘๋‹ตํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ ์œ ํšจ

HttpSession

๋กœ๊ทธ์ธ ๋˜๋Š” ๋™์•ˆ์—๋งŒ ๋ฐ์ดํ„ฐ ์œ ํšจ

ServletContext

์„œ๋ฒ„๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”ํ•œ ๋ฐ์ดํ„ฐ ์œ ํšจ


DriverManager๋ฐฉ์‹์˜ Connection

image-19

๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉํ•˜๊ณ , Connection ์ƒ์„ฑํ•˜๋ฉด ๋น„์šฉ๋„ ๋งŽ์ด ๋“ค๊ณ  ๋น„ํšจ์œจ์ ์ด๋‹ค

๋”ฐ๋ผ์„œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” Connection ๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๊ณต๊ฐ„์„ Resource Factory๋ผ๊ณ  ํ•œ๋‹ค.

Resource Factory

Resource Factory๋Š” WAS์— ์กด์žฌํ•œ๋‹ค.

WAS ์™€ ํ†ต์‹  ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ๋Š” xml ์ธ๋ฐ

Connection ์„ WAS์— ๋“ฑ๋กํ•˜๋Š” ๋ฌธ์„œ๋Š” Context(name, auth(์–ด๋–ค container์ธ์ง€), url, user/pass)๋ผ๊ณ  ํ•œ๋‹ค.

JNDI(Naming) ๊ธฐ์ˆ ์„ ์ด์šฉํ•ด Resource Factory์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.


ํ•ด์‹œ์™€ ๊ตฌ์กฐ๊ฐ€ ๋น„์Šทํ•˜๋‹ค.

key = jdbc/oracle

value = Resource Factory์— ์ €์žฅ๋œ Connection ์˜ ์ฃผ์†Œ๊ฐ’


์ฒ˜์Œ์— Resource Factory์— ์ €์žฅ๋œ Connection๋“ค์€ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” DB์— ๋ชจ๋‘ ์—ฐ๊ฒฐ

์ด๊ฒƒ์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—

๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๊ณ  close() ํ•˜๋ฉด ๋‹ค์‹œ Resource Factory์— Connection ์„ ๋‹ค์‹œ ๋„ฃ์–ด๋‘”๋‹ค.

๋งŒ์•ฝ close๋ฅผ ์•ˆํ•˜๊ฒŒ ๋˜๋ฉด Connection ์ด ๋™๋‚˜๊ฒŒ ๋œ๋‹ค.

WAS ์™€ DB ์‚ฌ์ด์— ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š์–ด์ง€๊ฒŒ ๋œ๋‹ค.


Connection ์„ ๋งŒ๋“ค ๋•Œ๋Š” DataSource(์ธํ„ฐํŽ˜์ด์Šค) ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ ๋‹ค. (Sun ํšŒ์‚ฌ์—์„œ ๋งŒ๋“ฆ)

์ด๊ฒƒ์„ ์ƒ์†ํ•ด ๋งŒ๋“ ๊ฒƒ์ด BasicDataSource ํƒ€์ž…์ด๋‹ค.(Apache ํšŒ์‚ฌ์—์„œ ๋งŒ๋“ฆ)

BasicDataSource ๋ฅผ ์ด์ œ ๋งŒ๋“ค์–ด Context ์— ์˜ํ•ด Resource Factory์— ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.

BasicDataSource Resource Factory ๋“ฑ๋ก ๋ฐฉ๋ฒ•

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>

<Context>
    <Resource
        name="jdbc/oracleDB"
        auth="Container"
        type="javax.sql.DataSource"
        username="mykb"
        password="1234"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
        url="jdbc:oracle:thin:@127.0.0.1:1521:XE"
        maxActive="500"
	      maxIdle="30"
    />
</Context>

Context ๋ฅผ META-INF ์— ์ƒ์„ฑ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%@page import="java.sql.Connection"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.naming.Context"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>Connection Pooling Test..... Using JNDI Service</h2>
<%
    Context ic = new InitialContext();
    DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/oracleDB");

    out.println("<b>1. DataSource Lookup....</b>");

    Connection conn =ds.getConnection(); //Resource Factory๋กœ ๋ถ€ํ„ฐ Connection๋นŒ๋ ค์˜จ๋‹ค..
    out.println("<b>2. Connection Rent Success!!.....</b><br>");
%>
</body>
</html>

connectionPool.jsp๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค

This post is licensed under CC BY 4.0 by the author.