JSP Model1, Model2, Spring MVC pattern ์ฐจ์ด

chamroroยท2022๋…„ 1์›” 21์ผ
0

spring

๋ชฉ๋ก ๋ณด๊ธฐ
1/1
post-thumbnail

๐Ÿ“ JSP Model1 vs Model2 vs Spring MVC pattern

Model, View, Controller์˜ ํ•ฉ์„ฑ์–ด๋กœ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

  • Model : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์ž‘ํ•˜๋Š” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • View : ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ฒŒ ๋  ๊ฒฐ๊ณผ ํ™”๋ฉด์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  • Controller : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ฒ˜๋ฆฌ์™€ ํ๋ฆ„ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

MVC ํŒจํ„ด์—๋Š” ๋ชจ๋ธ1 ๋ฐฉ์‹๊ณผ ๋ชจ๋ธ2 ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ ํŠนํžˆ ๋ชจ๋ธ2 ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์˜ MVCํŒจํ„ด ๊ตฌํ˜„์€ JSP ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ฌด์กฐ๊ฑด ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•  ๊ฐœ๋ฐœ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. JSP ์›น์‚ฌ์ดํŠธ ๊ตฌ์กฐ๋Š” ํฌ๊ฒŒ ๋ชจ๋ธ1 ๋ฐฉ์‹๊ณผ ๋ชจ๋ธ2 ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถ„๋ฅ˜ํ•˜์ž๋ฉด JSP์—์„œ ์ถœ๋ ฅ๊ณผ ๋กœ์ง์„ ์ „๋ถ€ ์ฒ˜๋ฆฌํ•˜๋Š๋ƒ(๋ชจ๋ธ 1) JSP์—์„œ ์ถœ๋ ฅ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š๋ƒ(๋ชจ๋ธ 2)๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Model1 ๋ฐฉ์‹

๋ชจ๋ธ 1 ๊ตฌ์กฐ๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ JSP๊ฐ€ ์ „๋ถ€ ๋‹ค ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์›น๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์€ JSP๋Š” ์ž๋ฐ” ๋นˆ์ด๋‚˜ ์„œ๋น„์Šค ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.

  • ์žฅ์ : html์•ˆ์— java์™€ ๊ฐ์ข… ํƒœ๊ทธ๋ฅผ ์ „๋ถ€ ๋„ฃ๋‹ค๋ณด๋‹ˆ ๊ฐœ๋ฐœ์ด ๋น ๋ฆ„.
  • ๋‹จ์ : ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€, ๊ฐ€๋…์„ฑ ์ข‹์ง€์•Š์Œ.
    -> ์œ ์ง€๋ณด์ˆ˜ ์‹œ, ๊ฐœ๋ฐœ์ž์˜ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์ฆ๊ฐ€.


Model2 ๋ฐฉ์‹


๋ชจ๋ธ2 ๊ตฌ์กฐ๋Š” ๋ชจ๋ธ1 ๊ตฌ์กฐ์™€ ๋‹ฌ๋ฆฌ ์›น๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ Servlet์ด ๋ฐ›์Šต๋‹ˆ๋‹ค. Servlet์€ ์›น๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ์„ ๋ฐ›์•„ View๋กœ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ์ง€ Model๋กœ ๋ณด๋‚ด์ค„ ๊ฒƒ์ธ์ง€ ์ •ํ•˜์—ฌ ์ „์†กํ•ด์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ViewํŽ˜์ด์ง€๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ๋งŒ ๋‹ด๋‹นํ•˜๊ณ  ์‹ค์งˆ์ ์ธ ๊ธฐ๋Šฅ์˜ ๋ถ€๋ถ„์€ Model์—์„œ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ2 ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ์‹ค์งˆ์ ์œผ๋กœ ๋ณด์ด๋Š” HTML๊ณผ JAVA ์†Œ์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋ธ1 ๋ฐฉ์‹์— ๋น„ํ•ด ๊ฐœ๋ฐœ์„ ํ™•์žฅ์‹œํ‚ค๊ธฐ๋„ ์‰ฝ๊ณ  ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ๋„ ์‰ฝ์Šต๋‹ˆ๋‹ค. (์ฝ”๋”ฉ์„ ์ข€ ๋” ๊น”๋”ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ์ด ๋ฐ›๊ณ  ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ๋ทฐ์—ญํ• ์˜ JSP๋กœ ๋ณด์—ฌ์ค€๋‹ค.

  • ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›€

  • ๊ตฌ์กฐ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ๊ฐœ๋ฐœ ์‹œ๊ฐ„ ์ถ”๊ฐ€

  • Client๊ฐ€ Server(was)์—๊ฒŒ requestํ•˜๋Š”๊ฒƒ์€ ๊ฐ™์€ ์ฒ˜์Œ์— ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ›๊ณ  ์š”์ฒญ์„ ์—ฌ์„œ ์„œ๋น„์Šค์ค‘ ํ•˜๋‚˜ ์–ด๋–ค์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ• ๊นŒ ์‹œํ‚ฌ๊นŒ ๊ฒฐ์ • ํ•˜๋Š” ๊ฒƒ

  • ์„œ๋น„์Šค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค๊ธฐ ๋–„๋ฌธ์— ๊ธฐ๋Šฅ์ด ๋งŽ์„ ์ˆ˜๋ก ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ๋ชจ๋“ˆํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • DB์ ‘๊ทผ์„ ์œ„ํ•ด dao๋ฅผ ๋งŒ๋“ ๋‹ค. model๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ DB์™€ ํ†ต์‹ ํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ๋„˜๊ฒจ์ค€๋‹ค.

  • model2๋Š” ์ฒ ์ €ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋œ ์‹œ์Šคํ…œ์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค.
    ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ˆ˜ํ›จํ•˜๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์›น์€ model2๋ฅผ ๋”ฐ๋ฅธ๋‹ค. spring mvc๋˜ํ•œ model2๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ ์žˆ๋‹ค.

Spring MVC Architecture๋ž€

๐ŸŒž Model, View, Controller๋ฅผ ๋ถ„๋ฆฌํ•œ ๋””์ž์ธ ํŒจํ„ด (๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ)

Model

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ(data)๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ POJO๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
Java Beans

View

๋””์Šคํ”Œ๋ ˆ์ด ๋ฐ์ดํ„ฐ ๋˜๋Š” ํ”„๋ฆฌ์  ํ…Œ์ด์…˜
Model data์˜ ๋ Œ๋”๋ง์„ ๋‹ด๋‹นํ•˜๋ฉฐ, HTML ouput์„ ์ƒ์„ฑํ•œ๋‹ค.
JSP
JSP ์ด์™ธ์—๋„ Thymeleaf, Groovy, Freemarker ๋“ฑ ์—ฌ๋Ÿฌ Template Engine์ด ์žˆ๋‹ค.

Controller

View์™€ Model ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• 
Model/View์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜์—ฌ ๊ทธ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๊ฒฐ๊ณผ๋ฅผ Model์— ๋‹ด์•„ View์— ์ „๋‹ฌํ•œ๋‹ค.
์ฆ‰, Model Object์™€ ์ด Model์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•  View Name์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
Controller โ€”> Service โ€”> Dao โ€”> DB
Servlet

๐ŸŒž Spring Framework๊ฐ€ ์ œ๊ณตํ•˜๋Š” Class

DispatcherServlet

Spring Framework๊ฐ€ ์ œ๊ณตํ•˜๋Š” Servlet ํด๋ž˜์Šค
์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค.
Dispatcher๊ฐ€ ๋ฐ›์€ ์š”์ฒญ์€ HandlerMapping์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

HandlerMapping

์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Controller๋ฅผ ์ฐพ๋Š”๋‹ค. (Controller URL Mapping)
์š”์ฒญ url์— ํ•ด๋‹นํ•˜๋Š” Controller ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” table์„ ๊ฐ€์ง„๋‹ค.
์ฆ‰, ํด๋ž˜์Šค์— @RequestMapping(โ€œ/urlโ€) annotaion์„ ๋ช…์‹œํ•˜๋ฉด ํ•ด๋‹น URL์— ๋Œ€ํ•œ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ table์— ์ €์žฅ๋œ ์ •๋ณด์— ๋”ฐ๋ผ ํ•ด๋‹น ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์„œ๋“œ์— Mappingํ•œ๋‹ค.

ViewResolver

Controller๊ฐ€ ๋ฐ˜ํ™˜ํ•œ View Name(the logical names)์— prefix, suffix๋ฅผ ์ ์šฉํ•˜์—ฌ View Object(the physical view files)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด view name: home, prefix: /WEB-INF/views/, suffix: .jsp๋Š” โ€œ/WEB-INF/views/home.jspโ€๋ผ๋Š” ์œ„์น˜์˜ View(JSP)์— Controller์—๊ฒŒ ๋ฐ›์€ Model์„ ์ „๋‹ฌํ•œ๋‹ค.
์ด ํ›„์— ํ•ด๋‹น View์—์„œ ์ด Model data๋ฅผ ์ด์šฉํ•˜์—ฌ ์ ์ ˆํ•œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค.


๊ธฐ๋ณธ Project Structure

๐ŸŒž Web Application Structure(์›น ์„œ๋น„์Šค ๊ธฐ๋ณธ ์„ค์ • ๊ตฌ์กฐ)

src

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ Servlet ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
  • Controller, Model, Service, Dao
  • src/main/java : ๊ฐœ๋ฐœ๋˜๋Š” Java ์ฝ”๋“œ์˜ ๊ฒฝ๋กœ
  • src/main/resources : ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ
  • src/test/java : ํ…Œ์ŠคํŠธ ์ „์šฉ ๊ฒฝ๋กœ (๊ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฒฝ๋กœ)
  • src/test/resource : ํ…Œ์ŠคํŠธ ์‹œ์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ

Libraries

  • Servlet์ด๋‚˜ JSP์—์„œ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋“œ๋ผ์ด๋ฒ„
  • jar๋กœ ์••์ถ•ํ•œ ํŒŒ์ผ์ด์–ด์•ผ ํ•œ๋‹ค.

WebContent (์ „์ฒด ROOT) - webapp

  • Deployํ•  ๋•Œ WebContent ๋””๋ ‰ํ„ฐ๋ฆฌ ์ „์ฒด๊ฐ€ .war๋กœ ๋ฌถ์–ด์„œ ๋ณด๋‚ด์ง„๋‹ค.
  • resources
    * ์ •์ ์ธ ๋ฐ์ดํ„ฐ (ex. image file, css, js, fonts)
  • WEB-INF
  • classes: ์ž‘์„ฑํ•œ Java Servlet ํŒŒ์ผ์ด ๋‚˜์ค‘์— .class๋กœ ์ด๊ณณ์— ๋ชจ๋‘ ์ €์žฅ๋œ๋‹ค.
  • lib: ์ถ”๊ฐ€ํ•œ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ด๊ณณ์— ๋ชจ๋‘ ์ €์žฅ๋œ๋‹ค.
  • props: property file์„ ์ €์žฅํ•œ๋‹ค.
  • spring: spring configuration files์„ ์ €์žฅํ•œ๋‹ค. (Spring๊ณผ ๊ด€๋ จ๋œ ์„ค์ • ํŒŒ์ผ์„ ๋ชจ์•„๋‘” ๊ฒƒ)
    • dispatcher-servlet.xml
    • applicationContext.xml
    • dao-context.xml, service-context.xml ๋“ฑ
  • views: Controller์™€ ๋งคํ•‘๋˜๋Š” .jsp ํŒŒ์ผ๋“ค์„ ์ €์žฅํ•œ๋‹ค. (JSP ํŒŒ์ผ์˜ ๊ฒฝ๋กœ)
  • web.xml: web application์˜ ์„ค์ •์„ ์œ„ํ•œ web deployment descriptor
    • DispatcherServlet, ContextLoadListener ์„ค์ •

pom.xml

  • maven configuration file
  • ์–ด๋–ค lib๋ฅผ ์“ธ์ง€ ๋ช…์‹œํ•œ๋‹ค.

Spring MVC์—์„œ Model, View, Controller

๐ŸŒž Model

  • Controller์—์„œ View๋กœ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ช…๋ช…๋œ ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Key-Value ํ˜•์‹์˜ ํ•˜๋‚˜์˜ ์Œ(ํ•˜๋‚˜์˜ ์—ด)์„ ๋ช…๋ช…๋œ ๊ฐ์ฒด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ๋˜ํ•œ ์ด ๋ช…๋ช…๋œ ๊ฐ์ฒด๋Š” model attribute๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ attribute๊ฐ€ ๋ชจ์—ฌ Table ํ˜•์‹์„ ์ด๋ฃฌ๋‹ค.
  • view์—์„œ attribute์˜ key ๊ฐ’์„ ํ†ตํ•ด value ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Model Inplementations

  • Model์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Controller ๋ฉ”์„œ๋“œ์— input argument๋กœ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด Spring Frmework๊ฐ€ ์ž๋™์œผ๋กœ Model์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ํ•ด๋‹น Model์˜ ์ฃผ์†Ÿ๊ฐ’๋งŒ ๋„˜๊ฒจ์ค€๋‹ค.
  1. java.util.map์˜ ๊ตฌํ˜„
@RequestMapping("/greeting")
public String getGreeting(Map<String, Object> model) { 
 String greeting = service.getRandomGreeting();
 model.put("greeting", greeting);

 return "home";
}
1. service ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
2. model์— ์ฒซ ๋ฒˆ์งธ ์ธ์ž โ€œnameโ€๊ณผ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๊ฐ’์ธ ๋‘ ๋ฒˆ์งธ ์ธ์ž value๋ฅผ ๋„ฃ๋Š”๋‹ค.
view์—์„œ ํ•ด๋‹น ์ด๋ฆ„(โ€œnameโ€)์œผ๋กœ value์— ์ ‘๊ทผํ•œ๋‹ค.
3. ํ•ด๋‹นํ•˜๋Š” value๋ฅผ ๋ณด์—ฌ์ค„ View name์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  1. Spring์—์„œ ์ œ๊ณตํ•˜๋Š” Model ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
@RequestMapping("/special-deals")
public String getSpecialDeals(Model model) { 

 List<SpecialDial> specialDeals = service.getSpecialDeals();
 model.addAttribute(specialDeals); // value๋งŒ ๋„ฃ์œผ๋ฉด name์€ ์ž๋™ ์ƒ์„ฑ

 return "home";
}
1. Map์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ๋‹จ์ ์€ โ€œnameโ€์„ ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
2. Model ์ธํ„ฐํŽ˜์ด์Šค๋Š” addAttribute()์™€ ๊ฐ™์€ ํŽธ๋ฆฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  * addAttribute()๋Š” Map ์†์„ฑ์˜ ์ด๋ฆ„(โ€œnameโ€)์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด Map์˜ put()๊ณผ ๋™์ผํ•˜๋‹ค.
  * ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ชจ๋ธ์˜ ์†์„ฑ ์ด๋ฆ„์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ ๊ฐ€๋Šฅํ•˜๋‹ค.
  * ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Model ํ˜•์‹
  1. Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ModelMap ๊ฐ์ฒด
@RequestMapping("/fullname")
public String getFullname(ModelMap model) { 

 // chained calls are handy!
 model.addAttribute("name", "Jon")
      .addAttribute("surname", "Snow");

 return "home";
}
  • ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
    * chain์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๐ŸŒž Controller

@Controller
public class HomeController {
    private static final Logget Logger = LoggerFactory.getLogger(HomeController.class);

    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        Logger.info("Welcome {}.", locale);

        // Business Logic
        Date date = new Date();
        DateFormat = dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
        String formattedDate = dateFormat.format(date);

        // BL์˜ ๊ฒฐ๊ณผ๋ฅผ Model์— ์ €์žฅ 
        model.addAttribute("serverTime", formattedDate);

        // Return logical view name
        return "home";
    }

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String doLogin(@RequestParam String username, @RequestParam String password) {
        ...
	    return success;
    }
}
  • @Controller

    • bean์œผ๋กœ ๋“ฑ๋ก
    • ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ Controller๋กœ ์‚ฌ์šฉ๋จ์„ Spring Framework์— ์•Œ๋ฆผ
    • @Component โ€”๊ตฌ์ฒดํ™”โ€”> @Controller, @Service, @Repository
  • @RequestMapping

    • value: ํ•ด๋‹น url๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.

    • method: ์š”์ฒญ method๋ฅผ ๋ช…์‹œํ•œ๋‹ค.

    • ์ฆ‰, ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” โ€œ/homeโ€ url๋กœ HTTP GET ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด home() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

      @Controller
        @RequestMapping("/home") // 1) Class Level
        public class HomeController {
            /* an HTTP GET for /home */ 
            @RequestMapping(method = RequestMethod.GET) // 2) Handler Level
            public String getAllEmployees(Model model) {
                ...
            }
            /* an HTTP POST for /home/employees */ 
            @RequestMapping(value = "/employees", method = RequestMethod.POST) 
            public String addEmployee(Employee employee) {
                ...
            }
        }
    • 1) Class Level Mapping

      • ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ
      • โ€œ/homeโ€๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • 2) Handler Level Mapping

      • ์š”์ฒญ url์— ๋Œ€ํ•ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ๋˜๋Š” ๊ฒฝ์šฐ
      • โ€œ/home/employeesโ€ POST ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ addEmployee()์—์„œ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • model.addAttribute()

    • Business Logic์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ’์„ model attribute์— ์ง€์ •ํ•˜๋ฉด Spring์ด Model ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ํ•ด๋‹น Model์˜ ์ฃผ์†Ÿ๊ฐ’์„ ๋„˜๊ฒจ์ค€๋‹ค.
    • ํ•˜๋‚˜์˜ ์š”์ฒญ ์•ˆ์—์„œ๋งŒ Controller์™€ View๊ฐ€ Model์„ ๊ณต์œ ํ•œ๋‹ค.
  • @RequestParam

    • HTTP GET ์š”์ฒญ์— ๋Œ€ํ•ด ๋งค์นญ๋˜๋Š” request parameter ๊ฐ’์ด ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
    • Ex) http://localhost:8080/login?username=scott&password=tiger

๐ŸŒž View

  • View๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
    • JSP ์ด์™ธ์—๋„ Thymeleaf, Groovy, Freemarker ๋“ฑ ์—ฌ๋Ÿฌ Tempate Engine์ด ์žˆ๋‹ค.
  • JSP(Java Server Pages)
    • JSP ์ œํ•œ ์‚ฌํ•ญ
    • Java EE์— ์ข…์†์ ์ด๋ผ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
    • SpringBoot์—์„œ๋Š” ๊ณต์‹์ ์œผ๋กœ jsp๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • SpringBoot์˜ ๋‚ด์žฅ Tomcat์— ํ•˜๋“œ์ฝ”๋”ฉ ํŒจํ„ด๋•Œ๋ฌธ์— jarํ˜•์‹์œผ๋กœ๋Š” webapp ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค.
      • ๋”ฐ๋ผ์„œ SpringBoot์—์„œ๋Š” war๊ฐ€ ์•„๋‹Œ jar๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” jsp๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • JSTL(JSP Standard Tag Library)
    • ๋งŽ์€ JSP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ณตํ†ต์ ์ธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์บก์Šํ™”ํ•˜๋Š” ์œ ์šฉํ•œ JSP ํƒœ๊ทธ ๋ชจ์Œ
    • ์ฆ‰, JSP ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ action๊ณผ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํƒœ๊ทธ ํ™•์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ์ž์‹ ๋งŒ์˜ Custom Tag๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
    • ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?
      • JSP์— Java Code๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
      • ์ฆ‰, Java Code(JSP Scriptlet)๋Œ€์‹  Tag๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ๋‹ค.

Spring MVC๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜ ์„ค์ •

1. Maven Configuration (pom.xml)

  • ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ณ ์œ ์˜ ์ขŒํ‘œ ์„ค์ •
  1. groupId
    • ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ, ์ตœ์†Œํ•œ ๋‚ด๊ฐ€ ์ปจํŠธ๋กคํ•˜๋Š” domain name์ด์–ด์•ผ ํ•œ๋‹ค.
    • package ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.
    • ํ•˜์œ„ ๊ทธ๋ฃน์€ ์–ผ๋งˆ๋“ ์ง€ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. artifactId
    • ์ œํ’ˆ์˜ ์ด๋ฆ„์œผ๋กœ, ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ƒ๋žตํ•œ jar ํŒŒ์ผ์˜ ์ด๋ฆ„์ด๋‹ค.
    • ํ”„๋กœ์ ํŠธ ์ด๋ฆ„๊ณผ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•œ๋‹ค.
    • ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ž‘์„ฑํ•˜๋ฉฐ ํŠน์ˆ˜๋ฌธ์ž๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. version
    • SNAPSHOT: ๊ฐœ๋ฐœ์šฉ, RELEASE: ๋ฐฐํฌ์šฉ
    • ์ˆซ์ž์™€ ์ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„์ „ ํ˜•ํƒœ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.(1.0, 1.1, 1.0.1, โ€ฆ)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.hee</groupId>
    <artifactId>projectName</artifactId>
	<name>projectName</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
    <!-- properties์— ๋ช…์‹œํ•œ version์ด ์•Œ์•„์„œ placeholder์— ์ฃผ์ž…๋œ๋‹ค. -->
	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>4.2.5.RELEASE</org.springframework-version>
		<spring-security-version>4.0.4.RELEASE</spring-security-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
    <dependencies>
    <!-- Spring -->
		<dependency>
            <!-- Spring core dependency -->
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
            <!-- Spring MVC dependency -->
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
    </dependencies>
</project>

์ฐธ๊ณ  Maven ์žฅ์ 

  • pom.xml์— ๋ช…์‹œํ•œ lib๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์šด
  • build process ์ž๋™ํ™”
    • compile -> test -> package(.war) -> install -> deploy

2. Web Deployment Descriptor (web.xml)

๊ฐœ๋…
web application์˜ ์„ค์ •์„ ์œ„ํ•œ deployment descriptor
SUN์—์„œ ์ •ํ•ด๋†“์€ ๊ทœ์น™์— ๋งž๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฉฐ ๋ชจ๋“  WAS์— ๋Œ€ํ•˜์—ฌ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์ด ๋™์ผํ•˜๋‹ค.

์—ญํ• 
Deployํ•  ๋•Œ Servlet์˜ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.
๋ธŒ๋ผ์šฐ์ €๊ฐ€ Java Servlet์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” WAS(Ex. Tomcat)์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ค˜์•ผ ํ•ด๋‹นํ•˜๋Š” Servlet์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
์ •๋ณด 1) ๋ฐฐํฌํ•  Servlet์ด ๋ฌด์—‡์ธ์ง€
์ •๋ณด 2) ํ•ด๋‹น Servlet์ด ์–ด๋–ค URL์— ๋งคํ•‘๋˜๋Š”์ง€

๊ตฌ์ฒด์ ์ธ ์„ค์ • ๋‚ด์šฉ
DispatcherServlet
ContextLoaderListener
Filter: encodingFilter, springSecurityFilterChain

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee; http://java.sun.com/xml/ns/javaee/web-app_2.5.xsd">

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring/service-context.xml
			/WEB-INF/spring/dao-context.xml
			/WEB-INF/spring/security-context.xml
			/WEB-INF/spring/applicationContext.xml
		</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/dispatcher-servlet.xml
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

3. Spring MVC Configuration Files

๐ŸŒž dispatcher-servlet.xml

  • ์ฃผ์š” ์„ค์ • ๋‚ด์šฉ: Controller ๊ด€๋ จ, ViewResolver, mvc:annotation-driven ์„ค์ • ๋“ฑ

  • Annotation ํ™œ์„ฑํ™”

<mvc:annotation-driven />
  • Component ํŒจํ‚ค์ง€ ์ง€์ •
<context:component-scan base-package="controller"/>
* ์ด ํŒจํ‚ค์ง€๋ฅผ ์Šค์บ”ํ•˜๋ฉฐ annotaion์ด ๋‹ฌ๋ฆฐ ๊ฒƒ์„ bean์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ Container์— ๋‹ด์•„๋‘”๋‹ค.
* ์ฐธ๊ณ ) ์ด ๋‚ด์šฉ์€ service, dao ์„ค์ •์—๋„ ํ•„์š”ํ•˜๋‹ค. 
<context:component-scan base-package="service"/>
<context:component-scan base-package="dao"/>
  • ์ •์ ์ธ data ์œ„์น˜ mapping
<mvc:resources mapping="/resources/**" location="/resources/" />
๋˜๋Š” 
<mvc:resources mapping="/static/**" location="/static/" />
* web/resources/ ํ•˜์œ„์— ์ •์ ์ธ ๋ฐ์ดํ„ฐ(css, js, img, font)๊ฐ€ ์กด์žฌ
* Controller๊ฐ€ ์ฒ˜๋ฆฌํ•  ํ•„์š” ์—†์ด ํ•ด๋‹น ์œ„์น˜์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
* HTTP GET ์š”์ฒญ์—์„œ์˜ ์ •์ ์ธ data์— ๋ฐ”๋กœ ๋งคํ•‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/"/>
  <property name="suffix" value=".jsp"/>
</bean>

๐ŸŒž applicationContext.xml

  • ์ฃผ์š” ์„ค์ • ๋‚ด์šฉ: DataSource ๊ด€๋ จ, properties ๋“ฑ๋ก, SessionFactory, TransactionManager ๋“ฑ
  • properties ๋“ฑ๋ก
<context:property-placeholder location="/WEB-INF/props/jdbc.properties" />
๋™์ผ 
<context:property-placeholder location="classpath:props/jdbc.properties" />
properties file์—์„œ ์ฝ์–ด์™€ ์ฃผ์ž…ํ•œ๋‹ค.
  • DataSource ์ฃผ์ž…
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
      destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>
  • ์–ด๋…ธํ…Œ์ด์…˜์— ๊ธฐ๋ฐ˜ํ•œ ํŠธ๋žœ์žญ์…˜ ๋™์ž‘์˜ ์„ค์ •์„ ํ™œ์„ฑํ™”
<tx:annotation-driven />
  • Session Factory ๋“ฑ๋ก ๋ฐ Transaction Manager ์„ค์ •
  <bean id="sessionFactory"
      class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource"></property>
      <property name="packagesToScan">
          <list>
              <value>com.spring.model</value>
          </list>
      </property>
      <property name="hibernateProperties">
          <props>
              <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
              <prop key="hibernate.hbm2ddl.auto">update</prop>
              <prop key="hibernate.show_sql">true</prop>
              <prop key="hibernate.format_sql">false</prop>
          </props>
      </property>
  </bean>

  <bean id="transactionManager"
      class="org.springframework.orm.hibernate5.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactory"></property>
  </bean>

๐ŸŒž service-context.xml

์ฃผ์š” ์„ค์ • ๋‚ด์šฉ: Service ๊ด€๋ จ
Component ํŒจํ‚ค์ง€ ์ง€์ •

<context:component-scan base-package="service"/>

์ด ํŒจํ‚ค์ง€๋ฅผ ์Šค์บ”ํ•˜๋ฉฐ annotaion์ด ๋‹ฌ๋ฆฐ ๊ฒƒ์„ bean์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ Container์— ๋‹ด์•„๋‘”๋‹ค.
๐ŸŒž dao-context.xml

์ฃผ์š” ์„ค์ • ๋‚ด์šฉ: DAO ๊ด€๋ จ
Component ํŒจํ‚ค์ง€ ์ง€์ •

<context:component-scan base-package="dao"/>

์ด ํŒจํ‚ค์ง€๋ฅผ ์Šค์บ”ํ•˜๋ฉฐ annotaion์ด ๋‹ฌ๋ฆฐ ๊ฒƒ์„ bean์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ Container์— ๋‹ด์•„๋‘”๋‹ค.
๐ŸŒž security-context.xml

์ฃผ์š” ์„ค์ • ๋‚ด์šฉ: Security ๊ด€๋ จ, BCryptPasswordEncoder ๋“ฑ

<security:authentication-manager>
    <security:authentication-provider>
        <security:jdbc-user-service
            data-source-ref="dataSource"
            users-by-username-query="select username, password, enabled from users where username=?"
            authorities-by-username-query="select username, authority from users where username=?" />
        <security:password-encoder ref="passwordEncoder"></security:password-encoder>
    </security:authentication-provider>
</security:authentication-manager>

<security:http auto-config="true" use-expressions="true">
    <security:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
    <security:form-login login-page="/login" authentication-failure-url="/login?error" />
</security:http>

<bean id="passwordEncoder"
    class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
</bean>

References
https://www.tutorialspoint.com/spring/spring_web_mvc_framework.htm
http://istoryful.tistory.com/5

profile
Why not change the world?

0๊ฐœ์˜ ๋Œ“๊ธ€