코드 그라데이션

스프링 MVC 시작하기 본문

Spring/MVC 1

스프링 MVC 시작하기

완벽한 장면 2023. 10. 4. 13:49

스프링 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

 

등록
저장
목록

 

 

728x90

'Spring > MVC 1' 카테고리의 다른 글

스프링 MVC - 실용적인 방식  (0) 2023.10.05
스프링 MVC - 컨트롤러 통합  (0) 2023.10.05
검증 헤더와 조건부 요청 1  (0) 2023.10.04
뷰 리졸버  (0) 2023.10.03
핸들러 매핑과 핸들러 어댑터  (0) 2023.10.02
Comments