โถ 3์ผ ๊ณํ
=> ๊ณต๋ถ ๊ด๋ จ
1) ์์ ๋ด์ฉ ๋ณต์ต
2) MVC ๊ฐ์ฒด์งํฅ ๋ฆฌํฉํ ๋ง
3) ์คํ๋ง ๊ฐ์ ์๊ฐ
=> ํ์ด๋ ํ๋ก์ ํธ ๊ด๋ จ
1) ๋ ธ์ ์ ํผ๋๋ฐฑ ์ ๋ฆฌ
โถ ๋ฌธ์ ์ ๋ฆฌ
1. ์ธํ ๋ฆฌ์ ์ด ๋ฉ์ด๋ธ ๋น๋ ํ jar ํ์ผ์ ์ฐพ๋ ๋์ค ์๋ฌ ๋ฐ์
> ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ ํด๊ฒฐ
2. ์ด๋ฆ ๊ฒ์์ FirstName์ผ๋ก ๋ฐ๊พธ๊ธฐ
@GetMapping("/owners")
public String processFindForm(@RequestParam(defaultValue = "1") int page, Owner owner, BindingResult result,
Model model) {
// allow parameterless GET request for /owners to return all records
if (owner.getFirstName() == null) {
owner.setFirstName(""); // empty string signifies broadest possible search
}
// find owners by first name
String firstName = owner.getFirstName();
Page<Owner> ownersResults = findPaginatedForOwnersFirstName(page, firstName);
if (ownersResults.isEmpty()) {
// no owners found
result.rejectValue("lastName", "notFound", "not found");
return "owners/findOwners";
}
else if (ownersResults.getTotalElements() == 1) {
// 1 owner found
owner = ownersResults.iterator().next();
return "redirect:/owners/" + owner.getId();
}
else {
// multiple owners found
firstName = owner.getLastName();
return addPaginationModel(page, model, firstName, ownersResults);
}
}
=> ํ๋ผ๋ฏธํฐ ๊ฐ๊ณผ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ๋ณ๊ฒฝ
@Query("SELECT DISTINCT owner FROM Owner owner left join owner.pets WHERE owner.firstName LIKE :firstName% ")
@Transactional(readOnly = true)
Page<Owner> findByFirstName(String firstName, Pageable pageable);
=> ์ธํฐํ์ด์ค SQL๋ฌธ ๋ณ๊ฒฝ
โถ ๊ฐ์ธ ๊ณต๋ถ
1. ์ฝ๋์ flow๋ฅผ ์ฝ๋ ๋ฐฉ๋ฒ
โถ ์์ ๋ด์ฉ
Spring DAO
- Data Access Framework
- Templete Method Pattern
DAO ํด๋์ค ์์ฑ
- spring - jdbc ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๋ ์ฒ๋ฆฌ
- ⇒ JdbcTemplate ํด๋์ค์ ํ ํ๋ฆฟ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ DAO ํด๋์ค ์์ฑ
JdbcTemplate ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
- ⇒ JdbcTemplate ๊ฐ์ฒด๋ฅผ Spring Container์๊ฒ ์ ๊ณต๋ฐ์ ํ๋์ ์ ์ฅ - DI
- ⇒ JdbcDaoSupport ํด๋์ค ์์๋ฐ์ JdbcTemplate ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ํ๋ ์ ์ธ
JdbcTemplate.update(String sql, Object ... object)
- SQL ๋ช ๋ น (CRUD)๋ฅผ DBMS ์๋ฒ์ ์ ๋ฌํ์ฌ ์คํํ๋ ๋ฉ์๋ - ์กฐ์ํ์ ๊ฐฏ์ ๋ฐํ
- ⇒ ๋งค๊ฐ๋ณ์์ SQL ๋ช ๋ น๊ณผ InParameter(?)์ ์ ์ฅ๋ ๊ฐ์ ์ฐจ๋ก๋๋ก ๋์ดํ์ฌ ๋ฉ์๋ ํธ์ถ
JdbcTemplate.queryForObject(String sql, RowMapper<T> rowMapper, Object... args )
- ⇒ SQL ๋ช ๋ น(Select)์ DBMS ์๋ฒ์ ์ ๋ฌํ์ฌ ์คํํ๋ ๋ฉ์๋
- ⇒ ๋จ์ผํ์ ๊ฒ์๊ฒฐ๊ณผ๋ฅผ ํ๋์ ๊ฐ์ฒด(๊ฐ)๋ก ๋ฐํํ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ ๋ฉ์๋
- ⇒ SQL ๋ช
๋ น, RowMapper ๊ฐ์ฒด, InParameter ์ ๋ฌ ๊ฐ์ ๋งค๊ฐ๋ณ์์ ์ฐจ๋ก๋๋ก ๋์ดํ์ฌ ์ ๋ฌ
- ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋ก ๋งคํํ์ฌ ๋ฐํํ๊ธฐ ์ํ ๊ฐ์ฒด - ๋งคํ ์ ๋ณด ์ ๊ณต (ResultSet ๊ณผ ๊ฐ์ ์ญํ )
- ⇒ mapRow ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ์ ์ธํ์ฌ ๋งคํ์ ๋ณด ์ ๊ณต
- ⇒ ์ ๋๋ฆญ์ ๊ฒ์ํ์ java ๊ฐ์ฒด๋ก ํํํ๊ธฐ ์ํ ์๋ฃํ(ํด๋์ค) ์ค์
- RowMapper
EmptyResultDataAccessException
- QueryForObject() ๋ฉ์๋์ ์ํด ์ ๋ฌ๋ SQL ๋ช ๋ น์ ๊ฒ์๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ๋ฐ์๋๋ ์์ธ
JdbcTemplate.query(String sql, RowMapper<T> rowMapper, Object... args)
- ⇒ SQL ๋ช ๋ น(Select)์ DBMS ์๋ฒ์ ์ ๋ฌํ์ฌ ์คํํ๋ ๋ฉ์๋
- ⇒ ๋ค์คํ์ ๊ฒ์๊ฒฐ๊ณผ๋ฅผ List ๊ฐ์ฒด๋ก ๋ฐํํ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ ๋ฉ์๋
- ⇒ SQL ๋ช ๋ น, RowMapper ๊ฐ์ฒด, InParameter ์ ๋ฌ ๊ฐ์ ๋งค๊ฐ๋ณ์์ ์ฐจ๋ก๋๋ก ๋์ดํ์ฌ ์ ๋ฌ
Spring MVC
Command Controller : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํด๋์ค - Model
- => Spring Framework์์ ์ ๊ณตํ๋ Controller ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์ ์์ฑ
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ช ๋ น์ ์์ฑํ๋ ๋ฉ์๋
- ⇒ Front Controller(DispatcherServlet)์ ์ํด ์๋ ํธ์ถ๋๋ ๋ฉ์๋
- ⇒ HttpServletRequest ๊ฐ์น์ HttpSerlvetResponse ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณต ๋ฐ์ ์์ฒญ ์ฒ๋ฆฌ (WAS ๊ฐ ์ค - ์ปจํ ์ด๋๊ฐ )
- ⇒ View ๊ด๋ จ ์ ๋ณด๋ฅผ ModelAndView ํด๋์ค์ ๊ฐ์ฒด์ ์ ์ฅํ์ฌ ๋ฐํ
- ์๋ต ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ํด๋์ค
- ⇒ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ทฐ ํ์ด์ง ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ์ฅํ์ฌ Front Controller(DispatcherServlet)์๊ฒ ์ ๋ฌ
- ModelAndView.addObject(String attributeName, Object attributeValue)
- ⇒ ModelAndView ๊ฐ์ฒด์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ์๋
- ⇒ HttpServletRequest.setAttribute() ๋ฉ์๋์ ์ ์ฌํ ๊ธฐ๋ฅ ์ ๊ณต (๊ธฐ๋ณธ์ด request scope์)
- ๋ทฐํ์ด์ง(JSP)์์ EL๊ณผ JSTL์ ์ฌ์ฉํ์ฌ ์๋ต ์ฒ๋ฆฌ
- ModelAndView.ViewName(String viewName)
- ๋ทฐ ํ์ด์ง ๊ด๋ จ ์ ๋ณด(viewName)์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋
- handleRequest
pom.xml
https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc11
- ⇒ JDBC ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํ Oracle Driver ๋ผ์ด๋ธ๋ฌ๋ฆฌ
https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2
- ⇒ Apache ๊ทธ๋ฃน์์ ์ ๊ณตํ๋ Data Source ๋ผ์ด๋ธ๋ฌ๋ฆฌ
https://mvnrepository.com/artifact/org.springframework/spring-jdbc
- ⇒ SpringDAO ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ - DataSource ๊ด๋ จ ๊ธฐ๋ฅ
- ⇒ spring-tx ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์กด๊ด๊ณ์ ์ํด ๋น๋ ์ฒ๋ฆฌ : ํธ๋์ญ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Spring Configuration File
Apache ๊ทธ๋ฃน์์ ์ ๊ณตํ๋ commons-dbcp2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ BasicDataSource ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋ก
- ⇒ Connection ๊ฐ์ฒด ์์ฑ ๊ด๋ จ ์ ๋ณด๋ฅผ ํ๋์ ์ ๋ฌํ์ฌ ์ ์ฅ - Setter Injection
Spring Framework์์ ์ ๊ณตํ๋ spring-jdbc ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ DriverManagerDataSource ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋ก
- => Connection ๊ฐ์ฒด ์์ฑ ๊ด๋ จ ์ ๋ณด๋ฅผ ํ๋์ ์ ๋ฌํ์ฌ ์ ์ฅ - Setter Injection
์คํ๋ง ๋น → ์ฐธ์กฐ(์ฃผ์ ) jdbctemplate - > ์ฐธ์กฐ(์ฃผ์ ) dao → ์ฐธ์กฐ(์ฃผ์ ) service
Web.xml
- WAS ์คํ ์ ํ๋ก์ ํธ ์์์ ์ปจํ ์คํธ(์น์์)๋ก ์ ๊ณตํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ์ค์ ํ ํ์ผ
- ⇒ ๋ฆฌ์ค๋ ์ค์ , ํํฐ ์ค์ , ์๋ธ๋ฆฟ ์ค์ , ์๋ฌ ํ์ด์ง ์ค์ ๋ฑ
context-param
- ์ปจํ ์คํธ๋ก ์กด์ฌํ๋ ๋ชจ๋ ํด๋์ค์ ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- ๋ชจ๋ ์นํ๋ก๊ทธ๋จ(Front Controller)์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ Spring Bean์ ๋ฑ๋กํ๊ธฐ ์ํด ์ ๊ณต๋๋ Bean Configuration File
listener
- WAS ์คํ ์ Listener ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ก ์์ฑํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- Listener ํด๋์ค : ServletContextListener ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์์ํด๋์ค⇒ contextDestroyed() ๋ฉ์๋ : Listener ๊ฐ์ฒด ์๋ฉธ ์ ์๋์ผ๋ก ํธ์ถ๋๋ ๋ฉ์๋ - ๋ง๋ฌด๋ฆฌ ์์
- Listener ํด๋์ค๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- WebApplicationContext ๊ฐ์ฒด(Spring Container)๋ฅผ ์์ฑํ๊ณ Bean Configuration File์ ์ฝ์ด Spring Bean์ผ๋ก ๋ฑ๋ก๋ ๋ชจ๋ ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ก ์์ฑํ์ฌ ์ปจํ ์คํธ๋ก ์กด์ฌํ๋ ๋ชจ๋ ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ณตํ๋ Listener ํด๋์ค
- ⇒ ๋๊ตด ์ฝ์ด? : context-param ์๋ฆฌ๋จผํธ์ contextConfigLocation ์ด๋ฆ์ผ๋ก ์ ๊ณต๋๋ ๊ฐ์ด Bean Configuration File์ด๋ค.
- ⇒ Bean Configuration File ์ ์ํฐ or , or ; ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ค์
- ⇒ Annotation ๊ธฐ๋ฐ์ Bean Configuration File์ ํ๋๋ง ์ธ์๋์ด ์ฒ๋ฆฌ
- Listener-class
- ⇒ contextInitialized() ๋ฉ์๋ : Listener ๊ฐ์ฒด ์์ฑ ํ ์๋์ผ๋ก ํธ์ถ๋๋ ๋ฉ์๋ - ์ด๊ธฐํ ์์
servlet
- ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์นํ๋ก๊ทธ๋จ(์๋ธ๋ฆฟ)์ผ๋ก ๋ฑ๋กํ๋ ์๋ฆฌ๋จผํธ
- ⇒ Servlet ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ์ฌ Front Controller ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์นํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ๊ฐ ๋ฑ๋ก ๊ฐ๋ฅ
- ⇒ DispatcherServlet ํด๋์ค(Front Controller)๋ฅผ ์นํ๋ก๊ทธ๋จ์ผ๋ก ๋ฑ๋ก
- Servlet ํด๋์ค์์ ํ์ํ ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด Spring Framework์์ ์ ๊ณตํ๋ Front Controller ํด๋์ค
- ⇒ WebApplicationContext ๊ฐ์ฒด๋ก Bean Configuration File์ ์ฝ์ด Spring Bean์ผ๋ก ๋ฑ๋ก๋ ๋ชจ๋ ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ก ์์ฑํ์ฌ ์๋ธ๋ฆฟ์์ ์ฌ์ฉ๋๋๋ก ์ ๊ณต
- init-param
load-on-startup
- WAS ์คํ ์ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ก ์์ฑํ๊ธฐ ์ํ ์๋ฆฌ๋จผํธ
- ⇒ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์์ด WAS ์คํ ์ ๋ฏธ๋ฆฌ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ก ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉ
- ⇒ ์๋ฆฌ๋จผํธ ๊ฐ์ 0๋ณด๋ค ํฐ ์ ์๊ฐ์ ์ฌ์ฉํ๋ฉฐ ๊ฐ์ด ์์ ์๋ก ๋จผ์ ๊ฐ์ฒด๋ก ์์ฑ
servlet-mapping
- ์นํ๋ก๊ทธ๋จ(์๋ธ๋ฆฟ) ์คํ์ ์ํด ์์ฒญํ URL ์ฃผ์๋ฅผ ์ค์ ํ๋ ์๋ฆฌ๋จผํธ
param bean configuration File
SimpleUrlHandlerMapping
- Front Controller(DispatcherServlet)์๊ฒ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ Command Controller ํด๋์ค์ Spring Bean์ beanName์ ์ ๊ณตํ๊ธฐ ์ํ ํด๋์ค
- ⇒ mappings ํ๋์ Map ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ธ์ ์ ์ฒ๋ฆฌ
- ⇒ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์ ๋ณด (Key : String)์ Command Controller ํด๋์ค์ Spring Bean(Value : String)์ Map ๊ฐ์ฒด์ ์ํธ๋ฆฌ๋ก ์ถ๊ฐ
Spring Framework์์ ์ ๊ณตํ๋ InternalResourceViewResolver ํด๋์ค๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋ก
- InternalResourceViewResolver : ๋ทฐ ์ด๋ฆ(View Name)์ ์ ๋ฌ๋ฐ์ ์๋ตํ ๋ทฐํ์ด์ง๋ก(JSP)๋ก ๋ณํํ์ฌ ์ ๊ณตํ๋ ํด๋์ค
- prefix ํ๋์๋ ๋ทฐ์ด๋ฆ ์๋ถ๋ถ์ ์ถ๊ฐ๋ ๊ฐ์ ์ธ์ ์ ์ฒ๋ฆฌ
- suffix ํ๋์๋ ๋ทฐ์ด๋ฆ ๋ท๋ถ๋ถ์ ์ถ๊ฐ๋ ๊ฐ์ ์ธ์ ์ ์ฒ๋ฆฌ
'Legacy' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2022.03.16์ ๊ธฐ๋ก (0) | 2022.03.16 |
---|---|
2022.03.15์ ๊ธฐ๋ก (0) | 2022.03.15 |
2022.03.11~03.13์ ๊ธฐ๋ก (2) | 2022.03.12 |
2022.03.08~03.10 ์ ๊ธฐ๋ก (0) | 2022.03.09 |
2022.03.07 ์ ๊ธฐ๋ก (0) | 2022.03.07 |