본문 바로가기
스프링/스프링 웹

[Spring] 스프링 MVC로 적용하기 - @RequestMapping, @Controller

by drCode 2023. 5. 31.
728x90
반응형

스프링이 제공하는 컨트롤러는 애노테이션 기반으로 동작해서 매우 유연하고 실용적이다.

과거에는 자바 언어에 애노테이션이 없기도 했고, 스프링도 처음부터 이런 유연한 컨트롤러를 제공한 것은 아니다.

 

@RequestMapping

스프링은 애노테이션을 활용한 매우 유연하고, 실용적인 컨트롤러를 만들었는데 이것이 바로 @RequestMapping 애노테이션을 사용하는 컨트롤러이다.

과거에는 스프링 프레임워크가 MVC 부분이 약해서 스프링을 사용하더라도 MVC 웹 기술은 스트럿츠 같은 다른 프레임워크를 사용했었다.

그런데 @RequestMapping 기반의 애노테이션 컨트롤러가 등장하면서, MVC 부분도 스프링의 사용성이 완전히 올라갔다

 

@RequestMapping

   - RequestMappingHandlerMapping

   - RequestMappingHandlerAdapter

 

잎서 봤듯이, 가장 우선순위가 높은 매핑과 핸들러 어댑터는 RequestMappingHandlerMapping, RequestMappingHandlerAdapter이다.

 

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

실무에서는 99.9% 이 방식의 컨트롤러를 사용한다.

 

@RequestMapping 기반의 스프링 MVC 컨트롤러로 변경해본다.

 

SpringMemberFormControllerV1 - 회원 등록 폼

package helloMVC.servlet.web.springmvc.v1;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
////@Component
//@RequestMapping
public class SpringMemberFormControllerV1 {

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

 

@Controller

  : 스프링이 자동으로 스프링 빈으로 등록한다. (내부에 @Component 애노테이션이 있어서 컴포넌트 스캔 대상이 된다)

  : 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다.

 

@RequestMapping 

  : 요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션을 기반으로 동작하기 때문에, 메서드의 이름은 임의로 지으면 된다.

 

ModelAndView

   : 모델과 뷰 정보를 담아서 반환하면 된다.

 

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

 

따라서 다음 코드도 동일하게 동작한다.

@Component //컴포넌트 스캔을 통해 스프링 빈으로 등록
@RequestMapping
public class SpringMemberFormControllerV1 {

    @RequestMapping("/springmvc/v1/members/new-form")
    public ModelAndView process() {
    	return new ModelAndView("new-form");
    }
}

물론 컴포넌트 스캔 없이 다음과 같이 스프링 빈으로 직접 등록해도 동작한다.

 

@RequestMapping
public class SpringMemberFormControllerV1 {

    @RequestMapping("/springmvc/v1/members/new-form")
    public ModelAndView process() {
    	return new ModelAndView("new-form");
    }
}

 

※ 스프링 3.0 이상 주의사항

스프링 부트 3.0(스프링 프레임워크 6.0)부터는 클래스 레벨에 @RequestMapping이 있어도 스프링 컨트롤러로 인식하지 않는다.

오직 @Controller가 있어야 스프링 컨트롤러로 인식한다.

참고로 @RestController는 해당 애노테이션 내부에 @Controller를 포함하고 있으므로 인식이 된다.

따라서 @Controller가 없는 위의 두 코드는 스프링 컨트롤러로 인식되지 않는다.

(RequestMappingHandlerMapping에서 @RequestMapping는 이제 인식하지 않고, Controller만 인식한다)

 

ServletApplication

@Bean
SpringMemberFormControllerV1 springMemberFormControllerV1() {
    return new SpringMemberFormControllerV1();
}

 

http://localhost:8080/springmvc/v1/members/new-form

 

SpringMemberSaveControllerV1 - 회원 저장

package helloMVC.servlet.web.springmvc.v1;

import helloMVC.servlet.domain.member.Member;
import helloMVC.servlet.domain.member.MemberRepository;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class SpringMemberSaveControllerV1 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v1/members/save")
    public ModelAndView process(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.getModel().put("member", member);
        mv.addObject("member", member);

        return mv;
    }

}

mv.addObject("member", member)

 : 스프링이 제공하는 ModelAndView를 통해 Model 데이터를 추가할 때는 addObject()를 사용하면 된다.

   이 데이터는 이후 뷰를 렌더링 할 때 사용된다.

 

http://localhost:8080/springmvc/v1/members/save

 

SpringMemberListControllerV1 - 회원 목록

package helloMVC.servlet.web.springmvc.v1;

import helloMVC.servlet.domain.member.Member;
import helloMVC.servlet.domain.member.MemberRepository;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@Controller
public class SpringMemberListControllerV1 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v1/members")
    public ModelAndView process() {

        List<Member> members = memberRepository.findAll();

        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);

        return mv;
    }

}

 

 

http://localhost:8080/springmvc/v1/members

728x90
반응형

댓글