> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/mvc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/mvc/5.-mvc/mvc-1.md).

# 스프링 MVC - 시작하기

애노테이션 기반 MVC로 코드를 작성해보자.\
클래스 위에 @Controller를 붙이면 컴포넌트로 스캔한다.\
클래스 위에 @RequestMapping("url정보") 를 붙이면 해당 url이 들어오면 그 함수가 실행된다!

RequestMappingHandlerMapping으로 핸들러 매핑하고\
RequestMappingHandlerAdapter로 핸들러 어댑터.

1. 회원 등록
2. 회원저장 정보 조회
3. 회원 조회

회원 등록

1. @Controller와 @Controller를 붙이는 이유!!!!!!⭐️⭐️⭐️⭐️⭐️\
   **스프링이 자동으로 스프링 빈으로 등록한다. (내부에 @Component 애노테이션이 있어서 컴포넌트 스캔 대상이 된다.**\
   스프링 MVC에서 **애노테이션 기반** **컨트롤러로 인식**한다!⭐️\
   RequestMappingHandlerMapping은 @RequestMapping 또는 **@Controller가 클래스 레벨에 붙어 있는 경우 매핑 정보로 인식**한다!!!

```java
package hello.servlet.web.springmvc.v1;

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

@Controller
public class SpringMemberFormControllerV1 {

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

```

해당하는 url이 들어오면 process() 메서드 실행된다.(논리 이름 new-form을 반환)\
뷰리졸버는 우선순위에 따라 이 new-form을 처리한다!(이전 페이지 뷰리졸버 참고)

```java
package hello.servlet.web.springmvc.v1;

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

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

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

```

회원 저장 정보 조회\
ModelView=>ModelAndView\
mv.getModel().put("member",member) => ModelAndView\.addObject("member",member)

```java
package hello.servlet.web.springmvc.v1;

import hello.servlet.domain.member.Member;
import hello.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;
import java.util.Map;

@Controller
public class SpringMemberSaveControllerV1 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v1/members/save")
    public ModelAndView process(HttpServletRequest req, HttpServletResponse res) {
        String username = req.getParameter("username");
        int age = Integer.parseInt(req.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;
    }
}

```

회원 조회\
회원 정보 저장과 마찬가지로 ModelAndView를 리턴하도록 수정해준다!

```java
package hello.servlet.web.springmvc.v1;

import hello.servlet.domain.member.Member;
import hello.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;
import java.util.Map;

@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;
    }
}

```
