스프링 MVC 시작하기
스프링 MVC - 시작하기
스프링이 제공하는 컨트롤러는 애노테이션 기반으로 동작해서, 매우 유연하고 실용적이다. 과거에는 자바 언어에 애노테이션이 없기도 했고, 스프링도 처음부터 이런 유연한 컨트롤러를 제공한 것은 아니다.
@RequestMapping
스프링은 애노테이션을 활용한 매우 유연하고, 실용적인 컨트롤러를 만들었는데
이것이 바로 @RequestMapping 애노테이션을 사용하는 컨트롤러이다. 다들 한번쯤 사용해보았을 것이다.
여담이지만 과거에는 스프링 프레임워크가 MVC 부분이 약해서 스프링을 사용하더라도 MVC 웹 기술은 스트럿츠 같은 다른 프레임워크를 사용했었다. 그런데 @RequestMapping 기반의 애노테이션 컨트롤러가 등장하면서, MVC 부분도 스프링의 완승으로 끝이 났다.
@RequestMapping 의 앞글자를 따서 만든 이름인데, 이것이 바로 지금 스프링에서 주로 사용하는
애노테이션 기반의 컨트롤러를 지원하는 핸들러 매핑과 어댑터이다. 실무에서는 99.9% 이 방식의
컨트롤러를 사용한다.
그럼 이제 본격적으로 애노테이션 기반의 컨트롤러를 사용해보자.
지금까지 만들었던 프레임워크에서 사용했던 컨트롤러를 @RequestMapping 기반의 스프링 MVC
컨트롤러로 변경해보자.
SpringMemberFormControllerV1 - 회원 등록 폼
@Controller // Spring 컨테이너에 컨트롤러 빈으로 등록됨
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form") // 해당 URL 패턴에 매핑
public ModelAndView process() {
// ModelAndView 객체를 생성하여 뷰 이름을 설정하고 반환
return new ModelAndView("new-form"); // 뷰 리졸버에서 jsp를 처리하기 위한 view를 찾아서 랜더가 된다.
}
}
부연
- @Controller 어노테이션은 이 클래스를 Spring의 컨트롤러 빈으로 등록. 이렇게 등록된 클래스는 Spring MVC에서 웹 요청을 처리하는 컨트롤러 역할을 할 수 있다.
- @RequestMapping("/springmvc/v1/members/new-form") 어노테이션은 해당 메서드를 지정된 URL 패턴에 매핑한다. 즉, "/springmvc/v1/members/new-form" 경로로 들어온 HTTP 요청을 이 메서드가 처리하게 된다.
- process 메서드는 ModelAndView 객체를 반환한다. 이 객체는 Spring MVC에서 컨트롤러가 처리한 결과를 담는 데 사용,
- ModelAndView 객체를 생성하고, 생성자에 뷰 이름 "new-form"을 전달하여 뷰를 설정. 이 뷰 이름은 뷰 리졸버(ViewResolver)에 의해 실제 JSP 또는 뷰 템플릿 파일과 연결된다.
=> 이렇게 생성된 ModelAndView 객체는 Spring MVC에 의해 처리되고, 설정한 뷰 이름에 따라 해당 뷰를 찾아서 렌더링하게 된다.
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");
}
}
(
ServletApplication
//스프링 빈 직접 등록
@Bean
SpringMemberFormControllerV1 springMemberFormControllerV1() {
return new SpringMemberFormControllerV1();
}
)
실행
http://localhost:8080/springmvc/v1/members/new-form
화면
정상적으로 출력
SpringMemberSaveControllerV1 - 회원 저장
@Controller // Spring 컨테이너에 컨트롤러 빈으로 등록됨
public class SpringMemberSaveControllerV1 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/springmvc/v1/members/save") // 해당 URL 패턴에 매핑
public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
// HTTP 요청에서 사용자명(username)과 나이(age) 파라미터를 추출
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
// 회원 객체를 생성하고 회원 저장소에 저장
Member member = new Member(username, age);
memberRepository.save(member);
// ModelAndView 객체를 생성하고 뷰 이름을 설정
ModelAndView mv = new ModelAndView("save-result");
// ModelAndView에 회원 객체를 추가하여 뷰로 전달
mv.addObject("member", member);
return mv;
}
}
부연
- @Controller 어노테이션은 이 클래스를 Spring의 컨트롤러 빈으로 등록.
이렇게 등록된 클래스는 Spring MVC에서 웹 요청을 처리하는 컨트롤러 역할을 수행.
- @RequestMapping("/springmvc/v1/members/save") 어노테이션은 해당 메서드를 지정된 URL 패턴에 매핑.
즉, "/springmvc/v1/members/save" 경로로 들어온 HTTP POST 요청을 이 메서드가 처리합니다.
- process 메서드는 HTTP 요청에서 사용자명(username)과 나이(age) 파라미터를 추출.
이 정보를 기반으로 Member 객체를 생성하고, memberRepository를 사용하여 회원 정보를 저장.
- ModelAndView 객체를 생성하고, 생성자에 뷰 이름 "save-result"를 전달하여 뷰를 설정.
이 뷰 이름은 뷰 리졸버(ViewResolver)에 의해 실제 JSP 또는 뷰 템플릿 파일과 연결됨.
- addObject 메서드를 사용하여 ModelAndView에 "member"라는 이름으로 회원 객체를 추가함.
이렇게 추가한 객체는 뷰로 전달되어 뷰에서 사용할 수 있다..
- 마지막으로 ModelAndView 객체를 반환.
Spring MVC는 이 객체를 처리하고, 설정한 뷰 이름에 따라 해당 뷰를 찾아 렌더링하고, 모델 데이터를 뷰에 전달함.
SpringMemberListControllerV1 - 회원 목록
@Controller // Spring 컨테이너에 컨트롤러 빈으로 등록됨
public class SpringMemberListControllerV1 {
private final MemberRepository memberRepository = MemberRepository.getInstance();
@RequestMapping("/springmvc/v1/members") // 해당 URL 패턴에 매핑
public ModelAndView process() {
// 회원 저장소에서 모든 회원 정보를 조회
List<Member> members = memberRepository.findAll();
// ModelAndView 객체를 생성하고 뷰 이름을 설정
ModelAndView mv = new ModelAndView("members");
// ModelAndView에 회원 목록을 추가하여 뷰로 전달
mv.addObject("members", members);
return mv;
}
}
실행
등록: http://localhost:8080/springmvc/v1/members/new-form
목록: http://localhost:8080/springmvc/v1/members