์น์ 6์ ์คํ๋ง MVC ๊ตฌ์กฐ๋ฅผ ์ ํํ ์ดํดํด ๋ณด๊ธฐ ์ํด ๊ฐ๊ฐ์ ๋ถ๋ถ๋ค์ด ์ด๋ป๊ฒ ๋ณํํ๋์ง ์ดํด๋ดค๋ค. ์น์ 5๋ ์ง์ MVC ํจํด์ ๋ง๋ค์๊ณ , ์น์ 6์ ์คํ๋ง์ด ์ด๋ป๊ฒ MVC๋ฅผ ์ ๊ณตํ๊ณ ์๋์ง ์์๋ดค๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๊ณต๋๋ ํ์ฌ์ ์คํ๋ง MVC๊ฐ ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ์ ์ค๊ฒ ๋๋ ์ง๋ ๋ฐฐ์ ๋ค.
โ๏ธ
์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค
โ๏ธ ๊ณผ๊ฑฐ ๋ฒ์ ์คํ๋ง ์ปจํธ๋กค๋ฌ
- ์ง๊ธ์ ์ ํ ์ฌ์ฉํ์ง ์๋, ๊ณผ๊ฑฐ์ ์ฌ์ฉํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํด๋ณด์.
โบ OldController.class
@Component
: ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController.handleRequest");
return new ModelAndView("new-form");
}
}
@Component๋ /springmvc/old-controller๋ผ๋ ์ด๋ฆ์ ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ค. ์ด ์ฝ๋์์ ์ค์ํ ์ ์ ์ ๋ ธํ ์ด์ Controller๊ฐ ์๋ ์ธํฐํ์ด์ค Controller๋ผ๋ ๊ฒ์ด๋ค. ์ธํฐํ์ด์ค Controller๋ ์์ฒญ์ด ๋ค์ด์ค๋ฉด handleRequest ๋ฉ์๋๊ฐ ์คํ๋๊ณ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ์์, ์ด๋ค ํ๋ฉด์ ๋ณด์ฌ์ค์ง ModelAndView ๊ฐ์ฒด๋ก ๋ฐํํ๋ค.
โ๏ธ ์๋ธ๋ฆฟ๊ณผ ๊ฐ์ฅ ์ ์ฌํ ํํ์ ํธ๋ค๋ฌ
- HttpRequestHandler ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ)์ ๋ํด์ ์์๋ณด์.
โบ MyHttpRequestHandler.class
@Component("/springmvc/request-handler")
public class MyHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MyHttpRequestHandler.handleRequest");
}
}
MyHttpRequestHandler ํด๋์ค๋ ์ธํฐํ์ด์ค์ธ HttpRequestHandler๋ฅผ ๊ตฌํํ๋ค. OldController๋ ์ธํฐํ์ด์ค Controller๋ฅผ ๊ตฌํํ์ฌ ModelAndView ํ์ ์ ๋ฐํํ๋ค๋ฉด, HttpRequestHandler๋ ๋ฐํํ์ ์ด void๋ก ์ง์ ์๋ต์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ OldController์์ ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ์ฌ์ฉํ์ง๋ง, HttpRequestHandler๋ ์ฌ์ฉํ์ง ์๋๋ค.
Q. ์ HttpRequestHandler๊ฐ ๋ ์๋ธ๋ฆฟ ์คํ์ผ์ผ๊น?
A. ์ผ๋จ ์๋ธ๋ฆฟ์ ๋ํด ๋ค์ ๋ณต์ตํด ๋ณด๋ฉด, ์๋ธ๋ฆฟ์ ์๋ฐ๋ก ์์ฑ๋ ์น ์๋ฒ ํ๋ก๊ทธ๋จ์ด๋ค. ์น ๋ธ๋ผ์ฐ์ ์์ HTTP ์์ฒญ์ ๋ณด๋ด๋ฉด, ํฐ์บฃ์ด ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์คํํด์ ์์ฒญ์ ์ง์ ๋ฐ๊ณ , ์๋ต์ ์ง์ ๋ง๋ค์ด ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋๋ค. ์ด๊ฒ ์๋ง ์น์ 3 ํน์ ์น์ 4์์ ํ๋ ๋ถ๋ถ์ผ ๊ฒ์ด๋ค. ์๋๋ ์๋ธ๋ฆฟ ์ฝ๋์ด๋ค.
@WebServlet("/hello") public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/plain"); response.getWriter().write("Hello, Servlet!"); } }โ
๊ทธ๋ ๋ค๋ฉด HttpRequestHandler๋ฅผ ์ดํด๋ณด์.
@Component("/springmvc/request-handler") public class MyHttpRequestHandler implements HttpRequestHandler { @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("MyHttpRequestHandler.handleRequest"); } }
๋ฑ ๋ด๋ HttpRequestHandler์ ๋ฉ์๋์ธ handleRequest(HttpServletRequest, HttpServletResponse)๋ ์๋ธ๋ฆฟ์ ์๋ doGet ๋ฉ์๋์ ๋งค์ฐ ์ ์ฌํ๋ค. doGet ๋ฉ์๋์ handleRequest ๋ฉ์๋ ๋ชจ๋ ์์ฒญ๊ณผ ์๋ต์ ์ง์ ๋ฐ๊ณ , ์ง์ ๋ง๋ค์ด ๋ฐํํ๋ค. ์ฆ, ์๋ธ๋ฆฟ ์คํ์ผ์ด๋ผ๋ ๊ฒ์ ์์ฒญ๊ณผ ์๋ต ๊ฐ์ฒด๋ฅผ ์ง์ ๋ค๋ฃจ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ์์ฑํ๋ค๋ ์๋ฏธ๋ผ๊ณ ๋ณผ ์ ์๋ค.
โ๏ธ V1_ SpringMVC ์์ํ๊ธฐ.
- @RequestMapping์ ์ฌ์ฉํด ๋ณด์.
โบ SpringMemberFormControllerV1.class
@RequestMapping
: ๋ค์ด์จ ์์ฒญ์ ํน์ ๋ฉ์๋์ ๋งคํํด ์ค๋ค.
@Controller
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
@Controller ๋ด๋ถ์ @Component ์ ๋ ธํ ์ด์ ์ด ์์ด์ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋ค. @RequestMapping์ ํด๋น URL์ด ๋ค์ด์ค๋ฉด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค. ์ด๋ป๊ฒ ๊ทธ๋ฐ ๊ฑด์ง ๊ฐ๋จํ๊ฒ ์ดํด๋ณด์. @RequestMapping ๋ด๋ถ์๋ RequestMappingHandlerMapping๊ฐ ์๋ค. RequestMappingHandlerMapping๊ฐ ์์ฒญ URL์ด ์ด๋ค ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ ๋ฉ์๋)์ ์ฐ๊ฒฐํด์ผ ํ๋์ง ์ฐพ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๋ถ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ์ธ RequestMappingHandlerAdapter๋ก ์ฐพ์ ํธ๋ค๋ฌ๋ฅผ ์ค์ ๋ก ํธ์ถํ๋ ์ญํ ์ ํ๋ค.
โ๏ธ V2_ ์ปจํธ๋กค๋ฌ ํตํฉํ๊ธฐ.
- ๋ฉ์๋ ๋จ์๋ก ์ ์ฉ๋ @RequestMapping์ ํด๋์ค ๋จ์์ ๋ฃ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํตํฉํด ๋ณด์.
โบ SpringMemberControllerV2.class
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/new-form")
public ModelAndView newForm() {
return new ModelAndView("new-form");
}
@RequestMapping("/save")
public ModelAndView save(HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
ModelAndView mv = new ModelAndView("save-result");
mv.addObject("member", member);
return mv;
}
...
}
V1์์๋ Form, Save, Members๋ฅผ ๋ชจ๋ ๋๋ ํด๋์ค๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฐ๋ฐ V2์์๋ ํด๋์ค ๋จ์์ ๊ณตํต๋ ๊ฒฝ๋ก๋ฅผ @RequestMapping์ผ๋ก ์์ฑํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ฉ์๋์ ๋ถ๋ @RequestMapping์ ์์ฑํ ๊ฒฝ๋ก๋ ๊ฐ๋จํด์ง๋ค.
โ๏ธ V3_ ์ค์ฉ์ ์ธ ๋ฐฉ์.
- ์ค๋ฌด์์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ ์์๋ณด์.
โบ SpringMemberControllerV3.class
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
...
@RequestMapping(value = "/save")
@PostMapping
public String save(
@RequestParam("username") String username,
@RequestParam("age") int age,
Model model) {
Member member = new Member(username, age);
memberRepository.save(member);
model.addAttribute("member", member);
return "save-result";
}
...
}
๋ณํ ๋ถ๋ถ์ ๋จผ์ ์ฐพ์๋ณด์. ์ฒซ ๋ฒ์งธ, @PostMapping์ด ๋ถ์๋ค. ๋ ๋ฒ์งธ @RequestParam์ด ์๊ฒผ๋ค. ์ธ ๋ฒ์งธ model.addAttribute๊ฐ ์๊ฒผ๋ค. ๋ค ๋ฒ์งธ return์ด String ํ์ ์ผ๋ก ๊ฐ๋จํด์ก๋ค.
@RequestMapping์ ์ฌ์ฉํ์ ๋๋ GET, POST ๋ฐฉ์์ ๊ตฌ๋ถํ์ง ์๊ณ ๋ฐ์์๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ์๋๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต๋ค. ์๋ก GET ๋ฐฉ์์ ๋ฐ์ดํฐ ์กฐํํ๋๋ฐ ์ฃผ๋ก ์ฌ์ฉํ๋ค. POST ๋ฐฉ์์ ๋ฐ์ดํฐ ์์ฑ ํน์ ๋ณ๊ฒฝ์ ์ฌ์ฉํ๋ค. PUT/PATCH๋ ๋ฐ์ดํฐ ์์ฑ์ ์ฌ์ฉํ๋ค. ์ด๋ฐ ์์ผ๋ก ์ญํ ์ ๋ง๊ฒ ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํ์ฌ ์ฒ๋ฆฌํด์ผ ์ฝ๋๊ฐ ๋ช ํํด์ ธ์ ๋ฒ๊ทธ๋ ์ค์๋ฅผ ์ค์ผ ์ ์๋ค. ๊ทธ๋์ Spring MVC์์๋ ๊ฐ๋จํ๊ฒ @GetMapping, @PostMapping ๋ฑ ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์๋ค.
SpringMVC์์ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ @RequestParam์ผ๋ก ๋ฐ๋๋ค. ๊ทธ๋์ String username = request.getParameter("uesrname"); ์ผ๋ก ์ ์๋๋ฐ, ๊ทธ๋ด ๊ฒ ์์ด @RequestParam ์ ๋ ธํ ์ด์ ์ ์ด์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ๋ฐ์์จ๋ค.
๊ฐ์ ธ์จ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ save ์ํจ ํ id์ ํจ๊ป ๋ฐํ๋ ์ ๋ณด๋ฅผ addAttribute๋ก model์ ์ ์ ๋ฃ์ด๋๋ค.
๊ฐ ๋ฉ์๋์ ๋ฐํํ์ ์ ๋ณด๋ฉด, String์ผ๋ก ๋ฐ๋์ด์๋ค. ๊ทธ๋ ๋ค๋ฉด ModelAndView ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒ ์์ด ๋ฌธ์์ด์ธ ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๊ธฐ๋ง ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋ ๊ฒ์ด๋ค.