๊ฐ์ ์ถ์ฒ: https://www.inflearn.com/course/%EC%9B%B9-mvc/dashboard
์คํ๋ง ์น MVC ๊ฐ์ - ์ธํ๋ฐ
์ด ๊ฐ์๋ ์๋ฐ ์๋ธ๋ฆฟ(Servlet) ๊ธฐ๋ฐ์ MVC ํ๋ ์์ํฌ์ธ ์คํ๋ง ์น MVC์ ๋ํด ํ์ตํฉ๋๋ค. ์ํ ํ ํ์ต์ ์ํด์ ใ์คํ๋ง ํ๋ ์์ํฌ ํต์ฌ ๊ธฐ์ ใ ๊ฐ์๋ฅผ ์๊ฐํด์ฃผ์ธ์., ์คํ๋ง ์น MVC์ ํต์ฌ ์
www.inflearn.com
๐ฉ๐ป WebMvcConfigurer
โ Formatter
- ์ด๋ ํ ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๊ฑฐ๋, ์ด๋ ํ ๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค
- Formatter๋ฅผ ์ฌ์ฉํ๋ฉด, http ์์ฒญ ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ๋ฐ์ ์ ์๋ค
- Printer : Locale ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ์ฌ, ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ์ด๋ป๊ฒ ์ถ๋ ฅํด ์ค ๊ฒ์ธ์ง ์ ์
- Parser : Locale ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ์ฌ, ์ด๋ค ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก ์ด๋ป๊ฒ ๋ณํํ ๊ฒ์ธ์ง ์ ์
๐ฅ Formatter ๊ตฌํ
@GetMapping("/hello/{name}")
public String hello(@PathVariable("name") Person person){ }
- ํ๋ผ๋ฏธํฐ name์ Person ๊ฐ์ฒด๋ก ๋ฐ๊ณ ์ถ์ ๋, formatter ํด๋์ค๋ฅผ ๊ตฌํํด์ผ ํจ
- PathVariable ๋ฟ๋ง์๋๋ผ RequestParam์ด์ด๋ formatter ์ ์ฉ๋จ
public class PersonFormatter implements Formatter<Person> {
// ๋ฌธ์์ด -> ๊ฐ์ฒด
@Override
public Person parse(String text, Locale locale) throws ParseException {
Person person = new Person();
person.setName(text);
return person;
}
// ๊ฐ์ฒด -> ๋ฌธ์์ด
@Override
public String print(Person object, Locale locale) {
return object.toString();
}
}
๊ตฌํํ formatter ์ ์ฉ๋ฒ: ํ๋ก์ ํธ์ WebConfig ํด๋์ค WebMvcConfigurer์ ๊ตฌํ๋ฐ๋๋ก ํ๊ณ ,
`void addFormatters(FormatterRegistry registry);` ๋ฅผ ๊ตฌํ
FormatterRegistry์๋ formatter๋ฟ๋ง์๋๋ผ converter๋ ์ถ๊ฐํ ์ ์์
Converter: ๋ฌธ์์ด ์๋ ๊ฐ์ฒด -> ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ณํํ๋๋ก ํด์ฃผ๋ ์ข ๋ ์ผ๋ฐ์ ์ธ ๋ฒ์ ๋ค๋ฃธ ใ ใ
์คํ๋ง๋ถํธ์์๋ Formatter๋ฅผ ๋น์ผ๋ก ์ค์ ํด์ฃผ๊ธฐ๋ง ํ๋ฉด,
addFormatters() ๋ฉ์๋๋ฅผ ํตํด ๋ฐ๋ก ์ถ๊ฐํด์ฃผ์ง ์์๋ ์ ์ฉ๋๋ค.
๐ฉ๐ป ๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ
- spring data jpa๊ฐ ์ ๊ณตํ๋ ์คํ๋ง mvc์ฉ ๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ
- ๊ทธ๋์ ๋๋ฉ์ธ์ ํฌ๋งคํ ๋๋ ์ปจ๋ฒํ ํ๊ธฐ ์ํด์ ํฌ๋งคํฐ๋ฅผ ๋ฐ๋ก ์ ์, ์ค์ ํ์ง๋ ์์๋ ๋๋ค.
- ์ปจ๋ฒํ ์ ์ํด์๋ JpaRepository ์ธํฐํ์ด์ค๋ฅผ ์ ์ํด์ผ ํ๋ค.
๐ฉ๐ป ํธ๋ค๋ฌ ์ธํฐ์ ํฐ
- ํธ๋ค๋ฌ ์ธํฐ์ ํฐ๋ก ํธ๋ค๋ฌ ๋งตํ์ ์ด๋ ํ ์ค์ ์ ํด์ค ์ ์๋ค.
- ํธ๋ค๋ฌ ๋งตํ์ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์, ๊ทธ ํธ๋ค๋ฌ์๊ฒ ์ธํฐ์ ํฐ๋ฅผ ์ ์ฉํด์ค๋ค
- ํธ๋ค๋ฌ๋ฅผ ์คํํ๊ธฐ ์ , ํธ๋ค๋ฌ ์คํ ํ ๋๋๋ง ํ๊ธฐ ์ , ๋๋๋ง๊น์ง ๋๋ ์ดํ ์์ ์ ์ฌ์ฉํ๋ค.
preHandle -> ์์ฒญ ์ฒ๋ฆฌ -> postHandler -> ๋ทฐ ๋๋๋ง -> afterCompletion
โ preHandle
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
- ์คํ ์์ : ํธ๋ค๋ฌ ๋งคํ์์ ํธ๋ค๋ฌ ์ฐพ์ ํ, ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์
- ๋ฆฌํด๊ฐ: ๊ณ์ ๋ค์ ์ธํฐ์ ํฐ ๋๋ ํธ๋ค๋ฌ๋ก ์์ฒญ๊ณผ ์๋ต์ ์ ๋ฌํ ์ง(true), ์๋ต์ฒ๋ฆฌ๊ฐ ์ด๊ณณ์์ ๋๋ฌ๋์ง(false) ์๋ฆผ
โ postHandle
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
- ์คํ ์์ : ํธ๋ค๋ฌ ์คํ์ด ๋๋ ์ดํ, ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๋ทฐ๋ฅผ ๋๋๋ง ํ๊ธฐ ์ด์
- ํ๋ผ๋ฏธํฐ๋ก ModelAndView ๋ฅผ ๋ฐ์ผ๋๊น, postHandle์์ ModelAndView๋ฅผ ์ปค์คํ ํ ์ ์๋ค.
- ๋ชจ๋ธ์ ์ถ๊ฐ ์ ๋ณด ์ ๋๋ค๊ฑฐ๋, ๋ทฐ๋ฅผ ๋ณ๊ฒฝํ๋ค๊ฑฐ๋, ์ฌ๋ฌ ํธ๋ค๋ฌ์ ๊ณตํต์ ์ธ ๋ชจ๋ธ ์ ๋ณด๋ฅผ ๋ด๋๋ฐ ์ฌ์ฉํ ์๋ ์๋ค
- ํธ๋ค๋ฌ ์ธํฐ์ ํฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ, ์ญ์์ผ๋ก ํธ์ถ๋๋ค.
๋ง์ฝ interceptor1 -> interceptor2 -> interceptor3 ์์ผ๋ก ์ฒด์ด๋ ๋์ด ์๋ค๋ฉด
interceptor1.preHandle() -> interceptor2.preHandle() -> interceptor3.preHandle() -> handler -> interceptor3.postHandle() -> interceptor2.postHandle() -> interceptor1.postHandle() ์์ผ๋ก ํธ์ถ๋จ
- ๋น๋๊ธฐ ์์ฒญ ์ฒ๋ฆฌ์์๋ ํธ์ถ๋์ง ์๋๋ค.
โ afterCompletion
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
- ์คํ ์์ : ๋ทฐ ๋๋๋ง ์ด ๋๋ ์ดํ
- ๋ง์ฐฌ๊ฐ์ง๋ก ์ธํฐ์ ํฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ, ์ญ์์ผ๋ก ํธ์ถ๋๋ค.
- ๋น๋๊ธฐ ์์ฒญ ์ฒ๋ฆฌ ์์๋ ํธ์ถ๋์ง ์๋๋ค.
โ ์๋ธ๋ฆฟํํฐ์์ ์ฐจ์ด์ ?
- ํธ๋ค๋ฌ ์ธํฐ์ ํฐ๊ฐ ์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด(ํธ๋ค๋ฌ ๊ฐ์ฒด, ๋ชจ๋ธ์ค๋ทฐ)๋ฅผ ๋ฐ์ ์ฌ์ฉํ๋ค.
- ์คํ๋ง์ ํนํ๋ ์ ๋ณด(ํธ๋ค๋ฌ ๋ฑ)์ ์๋ฌด๋ฐ ๊ด๋ จ์ด ์๋ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฅ์ ์๋ธ๋ฆฟํํฐ๋ก ๊ตฌํํด์ผ ํ๋ค
- ์๋ฅผ๋ค๋ฉด xss(cross-site scripting) ์ฐจ๋จ๊ธฐ๋ฅ
- ์ฐธ๊ณ ๋ก ์๋ธ๋ฆฟํํฐ ์ค์ : web.xml ๋๋ WebAppInitializer์
โ ๊ตฌํํ ์ธํฐ์ ํฐ ์ค์
- WebConfig ํ์ผ์ ์ค์
- ๋ณ๋ ์ค์ ์์ผ๋ฉด ๋ ์ง์คํธ๋ฆฌ์ ์ถ๊ฐํ ์์๋๋ก ์ฒด์ด๋๋๋ค.
- ๋ช ์์ ์ผ๋ก ์์ ์ง์ ํด์ฃผ๋๋ฒ:
registry.addInterceptor(new GreetingInterceptor()).order(-1);
registry.addInterceptor(new AnotherInterceptor()).order(2);
- order ๊ฐ์ ์ซ์๊ฐ ์์์๋ก ๋จผ์ ํธ์ถ๋๋ค.
- ์ํ๋ ํน์ ํจํด์๋ง ์ ์ฉํ๋๋ฒ: .addPathPatterns("ํจํด")
๐ฉ๐ป ๋ฆฌ์์ค ํธ๋ค๋ฌ
โ ๋ฆฌ์์ค ํธ๋ค๋ฌ
- ์ ์ ์ธ ๋ฆฌ์์ค(์ด๋ฏธ์ง, JS, CSS, HTML, ํ์ผ ๋ฑ)๋ฅผ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ
- ํธ๋ค๋ฌ๋ค ์ค ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ์
โ Default Servlet
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ์๋ธ๋ฆฟ
- ์ ์ ์ธ ๋ฆฌ์์ค๋ฅผ ์ฒ๋ฆฌํจ
- ํฐ์บฃ์ ์ด default servlet์ ์ ์ ์ธ ๋ฆฌ์์ค ์์ฒญ์ ์์ํด์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
์คํ๋ง๋ถํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ์ธ ๋ฆฌ์์ค ํธ๋ค๋ฌ์ ์บ์ฑ์ ์ ๊ณต: resources/static ๋๋ ํ ๋ฆฌ
โ ๋ฆฌ์์ค ํธ๋ค๋ฌ ์ค์ (์ปค์คํ ๋ฆฌ์์ค ํธ๋ค๋ฌ)
์ด๊ฑฐ ๋ฃ๋ค๊ฐ ์บ์ ๊ด๋ จ ๋ด์ฉ ๊ณต๋ถ๋ ํ์ - https://catromi.tistory.com/323
๐ฉ๐ป HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ
- @RequestBody์์ ์์ฒญ ๋ณธ๋ฌธ์ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ ๋, ๊ทธ๋ฆฌ๊ณ @ResponseBody์์ ๊ฐ์ฒด๋ฅผ ์์ฒญ ๋ณธ๋ฌธ์ ๋ฃ์ด์ค ๋
HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ๋ค
- ์คํ๋ง์ด 4๊ฐ์ ๊ธฐ๋ณธ ์ปจ๋ฒํฐ๋ฅผ ๋ฑ๋กํ ๋ค์, Classpath๋ฅผ ๋ณด๊ณ ํ์ํ ๋ฉ์์ง ์ปจ๋ฒํฐ๋ค์ ๋ฑ๋กํด์ค๋ค
- ์ด๋ค ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ ์ง๋ ์์ฒญ ํค๋์ Content-type์ ๋ณด๊ณ ๊ฒฐ์ ํ๋ค
โ WebConfig ์ค์
- configureMessageConverters ์ค๋ฒ๋ผ์ด๋ฉ
- ์ด ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ฉด, 4๊ฐ์ ๊ธฐ๋ณธ ์ปจ๋ฒํฐ๋ค์ ๋ฑ๋ก๋์ง ์๊ฒ ๋๋ค.
- 4๊ฐ์ ๊ธฐ๋ณธ ์ปจ๋ฒํฐ๋ ์ฌ์ฉํ๊ณ , ๋ค๋ฅธ ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋ผ๋ฉด
extendMessageConverters ์ค๋ฒ๋ผ์ด๋ฉ ํด์ผํ๋ค.
๐ฉ๐ป JSON์ฉ http ๋ฉ์์ง ์ปจ๋ฒํฐ
WebMvcConfigurationSupport์์
ํ์ํ ๋ฉ์์ง ์ปจ๋ฒํฐ๋ง ๋ฑ๋กํด์ฃผ๊ธฐ ์ํด์ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ด ์ถ๊ฐ๋์๋์ง ํ์ธํ๊ณ
๊ธฐ๋ณธ 4๊ฐ ์ปจ๋ฒํฐ ์ด์ธ์ ๋๋จธ์ง ์ปจ๋ฒํฐ๋ค์
ํ์ํ๋ฉด ๋ฑ๋กํด์ค๋ค
๋ฉ์์ง ์ปจ๋ฒํฐ๋ ๋ฉ์์ง ์ปจ๋ฒํฐ์ ํจ๊ป ๋ฑ๋ก๋๋ ObjectMapper๋ฅผ ์ฌ์ฉํด์ `http ๋ฉ์์ง ๋ณธ๋ฌธ <-> ์๋ฐ` ๊ฐ์ฒด ๊ฐ ๋ณํ ํด์ค๋ค.
์์ฒญ ํค๋ Content-type ์ด json์ด๋ผ๊ณ ๋ช ์๋์ด ์์ผ๋
์ด๊ฑธ ๋ณด๊ณ json converter๋ฅผ ์ฌ์ฉํด ๋ณํํ๊ฒ ๋๋ค.
๐ฉ๐ป ๊ทธ ์ธ WebMvcConfigurer ์ค์
โ ArgumentResolver
- ์ปจํธ๋กค๋ฌ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํด์ฃผ๋ argument ์ธ์ ์ธ์๋ค๋ ์ปค์คํฐ๋ง์ด์งํด์ ์ถ๊ฐํ ์ ์์
- Argument๋ค์ ์ด๋ป๊ฒ ์ธ์, ์ฒ๋ฆฌํ ์ง ์คํ๋ง์๊ฒ ์๋ ค์ฃผ๊ธฐ ์ํด์ argumentResolver ์ถ๊ฐ
โ ๋ทฐ ์ปจํธ๋กค๋ฌ
- ํธ๋ค๋ฌ ๊ตฌํํ์ง ์๊ณ ๋, ๋จ์ํ๊ฒ ์์ฒญ URL์ ํน์ ๋ทฐ๋ก ์ฐ๊ฒฐํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์๋ค.
๐ฉ๐ป ์คํ๋ง MVC ์ค์ ์ต์ข ์ ๋ฆฌ
- ์คํ๋ง MVC ์ค์ ์ ๊ฒฐ๊ตญ DispatcherServlet์ด ์ฌ์ฉํ ๋ชจ๋ ๋น๋ค์ ApplicationContext์ ๋ฑ๋ก, ์ค์ ํ๋ ๊ฒ์ด๋ค.
@EnableWebMVC
- ํ๋ํ๋ ๋ฑ๋ก ๋ฐ ์ค์ ํ์๋ ๋๋ฌด ๋ฒ๊ฑฐ๋ก์์ , ์คํ๋ง MVC ์ค์ ์ ๊ฐํธํํ๊ธฐ ์ํด์ ์ฌ์ฉ
- ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์คํ๋ง ์น MVC ์ค์ ์ ๋์์ค
- WebMvcConfigurer ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ฌ๋ฌ ์ค์ ์ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์๋ค.
์คํ๋ง ๋ถํธ๋ฅผ ์ด๋ค๋ฉด
- ์คํ๋ง๋ถํธ๋ ์๋ ์ค์ ์ ํตํด, ์๋ฌด๋ฐ ์ค์ ํ์ผ์ ๋ง๋ค์ง ์์๋ ๋ค์ํ ์คํ๋ง MVC ๊ธฐ๋ฅ์ ์ ๊ณต
- ์คํ๋ง๋ถํธ ํ๋ก์ ํธ์์ @EnableWebMvc๋ฅผ ์ฌ์ฉํ๋ฉด, ์คํ๋ง๋ถํธ ์๋ ์ค์ ์ ์ฌ์ฉํ์ง ๋ชปํ๋ค.
- ์คํ๋ง๋ถํธ ํ๋ก์ ํธ์์๋ application.properties๋ฅผ ํตํด ์คํ๋ง MVC ์ค์ ์ ํ๋ค.
- ๋๋ WebMvcConfigurer ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ค์ ํ๋ค
'๊ฐ์ธ ๊ณต๋ถ > WEB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
@ModelAttribute (0) | 2024.03.01 |
---|---|
[๊ฐ์ ์ ๋ฆฌ] ์คํ๋ง MVC ํ์ฉ (1) | 2024.02.29 |
304 NOT MODIFIED (0) | 2024.02.28 |
HTTP ํ๋กํ ์ฝ (0) | 2023.08.14 |
SOLID, ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ 5์์น (0) | 2023.03.24 |