๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒท Spring/Spring MVC_1

[Spring] ๊น€์˜ํ•œ ์Šคํ”„๋ง MVC_ ์„น์…˜6. ์Šคํ”„๋ง MVC - ๊ตฌ์กฐ์ดํ•ด

by ._.sori 2025. 7. 22.

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>



 

์„น์…˜ 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 ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ ์—†์ด ๋ฌธ์ž์—ด์ธ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋  ๊ฒƒ์ด๋‹ค.