Model, View, Controller์ ํฉ์ฑ์ด๋ก ์ํํธ์จ์ด ๊ณตํ์์ ์ฌ์ฉ๋๋ ์ํํธ์จ์ด ๋์์ธ ํจํด์ ๋๋ค.
Model : ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์ํ๋ ๋ก์ง์ ์ฒ๋ฆฌํฉ๋๋ค.
View : ์ฌ์ฉ์๊ฐ ๋ณด๊ฒ ๋ ๊ฒฐ๊ณผ ํ๋ฉด์ ์ถ๋ ฅํฉ๋๋ค.
Controller : ์ฌ์ฉ์์ ์ ๋ ฅ์ฒ๋ฆฌ์ ํ๋ฆ ์ ์ด๋ฅผ ๋ด๋นํฉ๋๋ค.
MVC ํจํด์๋ ๋ชจ๋ธ1 ๋ฐฉ์๊ณผ ๋ชจ๋ธ2 ๋ฐฉ์์ด ์๋๋ฐ ํนํ ๋ชจ๋ธ2 ๊ตฌ์กฐ ๊ธฐ๋ฐ์ MVCํจํด ๊ตฌํ์ JSP ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฌด์กฐ๊ฑด ์๊ณ ์์ด์ผ ํ ๊ฐ๋ฐ ๋ฐฉ์์ ๋๋ค. JSP ์น์ฌ์ดํธ ๊ตฌ์กฐ๋ ํฌ๊ฒ ๋ชจ๋ธ1 ๋ฐฉ์๊ณผ ๋ชจ๋ธ2 ๋ฐฉ์์ผ๋ก ๋๋ฉ๋๋ค. ๊ฐ๋จํ๊ฒ ๋ถ๋ฅํ์๋ฉด JSP์์ ์ถ๋ ฅ๊ณผ ๋ก์ง์ ์ ๋ถ ์ฒ๋ฆฌํ๋๋(๋ชจ๋ธ 1) JSP์์ ์ถ๋ ฅ๋ง ์ฒ๋ฆฌํ๋๋(๋ชจ๋ธ 2)๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค.
๋ชจ๋ธ 1 ๊ตฌ์กฐ๋ ์ฌ์ฉ์์ ์์ฒญ์ JSP๊ฐ ์ ๋ถ ๋ค ์ฒ๋ฆฌํฉ๋๋ค. ์น๋ธ๋ผ์ฐ์ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ์ JSP๋ ์๋ฐ ๋น์ด๋ ์๋น์ค ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์น๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญํ ์์ ์ ์ฒ๋ฆฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด์ค๋๋ค.
- ์ฅ์ : html์์ java์ ๊ฐ์ข ํ๊ทธ๋ฅผ ์ ๋ถ ๋ฃ๋ค๋ณด๋ ๊ฐ๋ฐ์ด ๋น ๋ฆ.
- ๋จ์ : ์ ์ง๋ณด์ ์ด๋ ค์, ๊ฐ๋ ์ฑ ์ข์ง์์.
-> ์ ์ง๋ณด์ ์, ๊ฐ๋ฐ์์ ์คํธ๋ ์ค๋ฅผ ์ฆ๊ฐ.
๋ชจ๋ธ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๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์๋ค.
๐ Model, View, Controller๋ฅผ ๋ถ๋ฆฌํ ๋์์ธ ํจํด (๊ฐ๋ฐ์๊ฐ ์ง์ ๊ตฌํํด์ผ ํ๋ ๊ฒ)
์ ํ๋ฆฌ์ผ์ด์
์ ์ํ(data)๋ฅผ ๋ํ๋ธ๋ค.
์ผ๋ฐ์ ์ผ๋ก POJO๋ก ๊ตฌ์ฑ๋๋ค.
Java Beans
๋์คํ๋ ์ด ๋ฐ์ดํฐ ๋๋ ํ๋ฆฌ์ ํ
์ด์
Model data์ ๋ ๋๋ง์ ๋ด๋นํ๋ฉฐ, HTML ouput์ ์์ฑํ๋ค.
JSP
JSP ์ด์ธ์๋ Thymeleaf, Groovy, Freemarker ๋ฑ ์ฌ๋ฌ Template Engine์ด ์๋ค.
View์ Model ์ฌ์ด์ ์ธํฐํ์ด์ค ์ญํ
Model/View์ ๋ํ ์ฌ์ฉ์ ์
๋ ฅ ๋ฐ ์์ฒญ์ ์์ ํ์ฌ ๊ทธ์ ๋ฐ๋ผ ์ ์ ํ ๊ฒฐ๊ณผ๋ฅผ Model์ ๋ด์ View์ ์ ๋ฌํ๋ค.
์ฆ, Model Object์ ์ด Model์ ํ๋ฉด์ ์ถ๋ ฅํ View Name์ ๋ฐํํ๋ค.
Controller โ> Service โ> Dao โ> DB
Servlet
Spring Framework๊ฐ ์ ๊ณตํ๋ Servlet ํด๋์ค
์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋๋ค.
Dispatcher๊ฐ ๋ฐ์ ์์ฒญ์ HandlerMapping์ผ๋ก ๋์ด๊ฐ๋ค.
์ฌ์ฉ์์ ์์ฒญ์ ์ฒ๋ฆฌํ Controller๋ฅผ ์ฐพ๋๋ค. (Controller URL Mapping)
์์ฒญ url์ ํด๋นํ๋ Controller ์ ๋ณด๋ฅผ ์ ์ฅํ๋ table์ ๊ฐ์ง๋ค.
์ฆ, ํด๋์ค์ @RequestMapping(โ/urlโ) annotaion์ ๋ช
์ํ๋ฉด ํด๋น URL์ ๋ํ ์์ฒญ์ด ๋ค์ด์์ ๋ table์ ์ ์ฅ๋ ์ ๋ณด์ ๋ฐ๋ผ ํด๋น ํด๋์ค ๋๋ ๋ฉ์๋์ Mappingํ๋ค.
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๋ฅผ ์ด์ฉํ์ฌ ์ ์ ํ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋ค.
๐ Web Application Structure(์น ์๋น์ค ๊ธฐ๋ณธ ์ค์ ๊ตฌ์กฐ)
Model Inplementations
@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์ ๋ฐํํ๋ค.
@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 ํ์
@RequestMapping("/fullname")
public String getFullname(ModelMap model) {
// chained calls are handy!
model.addAttribute("name", "Jon")
.addAttribute("surname", "Snow");
return "home";
}
@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
@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
2) Handler Level Mapping
model.addAttribute()
@RequestParam
http://localhost:8080/login?username=scott&password=tiger
<?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 ์ฅ์
๊ฐ๋
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>
๐ dispatcher-servlet.xml
์ฃผ์ ์ค์ ๋ด์ฉ: Controller ๊ด๋ จ, ViewResolver, mvc:annotation-driven ์ค์ ๋ฑ
Annotation ํ์ฑํ
<mvc:annotation-driven />
<context:component-scan base-package="controller"/>
* ์ด ํจํค์ง๋ฅผ ์ค์บํ๋ฉฐ annotaion์ด ๋ฌ๋ฆฐ ๊ฒ์ bean์ผ๋ก ์์ฑํ์ฌ Container์ ๋ด์๋๋ค.
* ์ฐธ๊ณ ) ์ด ๋ด์ฉ์ service, dao ์ค์ ์๋ ํ์ํ๋ค.
<context:component-scan base-package="service"/>
<context:component-scan base-package="dao"/>
<mvc:resources mapping="/resources/**" location="/resources/" />
๋๋
<mvc:resources mapping="/static/**" location="/static/" />
* web/resources/ ํ์์ ์ ์ ์ธ ๋ฐ์ดํฐ(css, js, img, font)๊ฐ ์กด์ฌ
* Controller๊ฐ ์ฒ๋ฆฌํ ํ์ ์์ด ํด๋น ์์น์ ๋๋ ํฐ๋ฆฌ์์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค.
* HTTP GET ์์ฒญ์์์ ์ ์ ์ธ data์ ๋ฐ๋ก ๋งคํ์ด ๊ฐ๋ฅํ๋ค.
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
๐ applicationContext.xml
<context:property-placeholder location="/WEB-INF/props/jdbc.properties" />
๋์ผ
<context:property-placeholder location="classpath:props/jdbc.properties" />
properties file์์ ์ฝ์ด์ ์ฃผ์
ํ๋ค.
<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 />
<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