본문 바로가기

spring

SPRING MVC 시작하기

스프링이 제공하는 컨트롤러는 애노테이션 기반으로 동작해서, 매우 유연하고 실용적이다. 과거에는 자바 언어에 애노테이션이 없기도 했고, 스프링도 처음부터 이런 유연한 컨트롤러를 제공한 것은 아니다.

 

@RequestMapping

스프링은 애노테이션을 활용한 매우 유연하고, 실용적인 컨트롤러를 만들었는데 이것이 바로 @RequestMapping 애노테이션을 사용하는 컨트롤러이다. 다들 한번쯤 사용해보았을 것이다. 여담이지만 과거에는 스프링 프레임워크가 MVC 부분이 약해서 스프링을 사용하더라도 MVC 웹 기술은 스트럿츠 같은 다른 프레임워크를 사용했었다. 그런데 @RequestMapping 기반의 애노테이션 컨트롤러가 등장하면서, MVC 부분도 스프링의 완승으로 끝이 났다.

 

SPRING MVC의 @RequestMapping을 사용할 때 역시 이전에 구조와 마찬가지로 HandlerMapping과 HandlerAdapter가 필요한데 @RequestMapping방식은 아래에 나와있는 핸들러와 어댑터가 사용이 된다.

  • RequestMappingHandlerMapping
  • RequestMappingHandlerAdapter

@RequestMapping 의 앞글자를 따서 만든 이름인데, 이것이 바로 지금 스프링에서 주로 사용하는 애노테이션 기반의 컨트롤러를 지원하는 핸들러 매핑과 어댑터이다. 실무에서는 99.9% 이 방식의 컨트롤러를 사용한다.

 

애노테이션 기반의 컨트롤러를 만들어보자.

@Controller
public class SpringMemberFormControllerV1 {
    @RequestMapping("spirngmvc/v1/members/new-form")
    public ModelAndView process(){
        System.out.println("SpringMemberFormControllerV1.process");
        return new ModelAndView("new-form");
    }
}

구조가 매우 간단하다. 클래스 상단에 @Controller를 지정해주고 @RequestMapping이라는 애노테이션을 사용해서 ModelAndView 타입으로 만든 뒤 뷰 리졸버에서 인식할 수 있게 new ModelAndView("new-form")을 리턴한 모습이다.

해당 url로 접속을 하게 되면 우리가 원했던 new-form이라는 뷰가 확인이 된다.

구조를 하나씩 설명해보자면

  1. @Controller : 스프링이 자동으로 스프링 빈으로 등록한다. 이전까진 @Component를 사용해서 스프링 빈으로 등록을 해왔지만 @Controller 애노테이션이 @Component를 포함하고 있어서 자동으로 스프링 빈으로 인식을 해준다. 그리고 해당 애노테이션을 사용하면 SPRING MVC에서 자동으로 애노테이션 기반으로 인식을 한다.
  2. @RequestMapping :  요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션을 기반으로 동작하기 때문에, 메서드의 이름은 임의로 지으면 된다.
  3. ModelAndView : 모델과 뷰 정보를 담아서 반환하면 된다.

RequestMappingHandlerMapping은 스프링 빈 중에서 @RequestMapping 또는 @Controller 가 Class 레벨에 붙어 있는 경우에 매핑 정보로 인식한다.

@Component
@RequestMapping
public class SpringMemberFormControllerV1 {
    @RequestMapping("spirngmvc/v1/members/new-form")
    public ModelAndView process(){
        System.out.println("SpringMemberFormControllerV1.process");
        return new ModelAndView("new-form");
    }
}

이렇게도 사용이 가능하다. 또는 @Component를 사용하지 않고 ServletApplication.java 안에 직접 스프링 빈으로 등록해서 사용해도 잘 작동한다.
하지만 @Controller를 넣어주는 것 만으로 이 모든걸 대신 해주니까 가장 간편한 방식이다.

 

이제 이 방식으로 이전에 했던 예시를 만들어보자.

- Form 이동

@Controller
public class SpringMemberFormControllerV1 {
    @RequestMapping("springmvc/v1/members/new-form")
    public ModelAndView process(){
        System.out.println("SpringMemberFormControllerV1.process");
        return new ModelAndView("new-form");
    }
}

단순히 new-form화면으로 이동하기 위한 컨트롤러

 

- Save-Result

@Controller
public class SpringMemberSaveControllerV1 {
    MemberRepository memberRepository = MemberRepository.getInstance();
    @RequestMapping("/springmvc/v1/members/save")
    public ModelAndView memberSave(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;
    }
}

이전에 방식과 차이점이 있다면 동작 기반이 바뀌고 Map<Stirng,String>paramMap이 아닌 request와 response를 받아서 form에서 전달 받은 값들을 request로 받아와 변수에 저장하고 사용했다는 점이다. 다시 객체를 담아갈 때 역시 ModelAndView에 addObject를 이용해 값을 담아간다.

 

- MemberList

@Controller
public class SpringMemberListControllerV1 {
    MemberRepository memberRepository = MemberRepository.getInstance();
    @RequestMapping("/springmvc/v1/members")
    public ModelAndView ListMember(){
        List<Member> members = memberRepository.findAll();
        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members",members);
        return mv;
    }
}

'spring' 카테고리의 다른 글

SPRING MVC 실용적인 방식  (0) 2023.03.22
SPRING MVC 통합 컨트롤러  (0) 2023.03.21
뷰 리졸버  (0) 2023.03.21
HandlerMapping, HandlerAdapter  (0) 2023.03.20
SPRING MVC 구조  (0) 2023.03.20