Spring MVC의 동작방식
1. 클라이언트(웹브라우저)에서 요청을 전송하면 DispatcherServlet이라는 클래스에요청이 전달된다.
2. - 은 클라이언트의 요청을 처리할 Controller에 대한 검색을 HandlerMapping 인터페이스에게 요청한다.
3. HandlerMapping은 클라이언트 요청과 매핑되는 핸들러 객체를 다시 DispatcherServlet에게 리턴해준다.
4. 요청을 처리할 컨트롤러는 찾았고 실제 요청을 처리할 Handler 메서드를 찾아서 호출한다. HandlerAdapter에게 이 작업을 위임한다.
5. HandlerAdapter는 DispatcherServlet으로부터 전달받은 Controller 정보를 기반으로 해당 Controller의 Handler메서드를 호출한다.
6 ~ 12. 반대로 진행된다.
API계층
API 계층(계층형 아키텍처)
API 계층은 클라이언트의 요청을 직접적으로 전달받고, 이를 통해 비즈니스계층, 데이터엑세스 계층을 거쳐서 데이터저장소(DataBase)와 상호작용한다.
Controller
컨트롤러의 엔트리 포인트
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Demo {
public static void main(String[] args) {
SpringApplication.run(Demo.class, args);
}
}
@SpringBootApplication 에너테이션은
1. 자동구성을 활성화
2. @Component 가 붙은 클래스를 Scan하여 Spring Bean으로 등록하는 기능을 활성화
3. @Configuration 이 붙은 클래스를 자동으로 찾아주고, Spring Bean을 등록하는 기능을 활성화
SpringApplication.run(Demo.class, args); 는 Spring 애플리케이션을 부트스트랩하고, 실행한다.
컨트롤러 구조 작성
package demo.member;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/v1/members")
public class MemberController {
}
@RestController
특정클래스에 @RestController를 추가하면 해당 클래스가 REST API의 리소스를 처리하기 위한 API 엔드포인트로 동작하게 한다.
@RequestMapping
클라이언트의 요청과 클라이언트의 요청을 처리하는 핸들러 메서드(Handler Method)를 매핑해 주는 역할을한다.
또한 해당 컨트롤러 클래스에 레벨을 추가하여 클래스 전체에 사용되는 공통 URL을 설정한다.
@RequestMapping(value = "/v1/members", produces = {MediaType.APPLICATION_JSON_VALUE})
여기서 사용된 produces 애트리뷰트는 응답데이터를 어떤 미디어 타입으로 클라이언트에게 전송할지를 설정한다.
@GetMapping: HTTP Get Method에 해당하는 단축 표현으로 서버의 리소스를 조회할 때 사용 @PostMapping: HTTP Post Method에 해당하는 단축 표현으로 서버에 리소스를 등록(저장)할 때 사용 @PutMapping: HTTP Put Method에 해당하는 단축 표현으로 서버의 리소스를 수정할 때 사용. 리소스의 모든 정보를 수정할 때 사용한다. @PatchMapping: HTTP Put Method에 해당하는 단축 표현으로 서버의 리소스를 수정할 때 사용. 리소스의 일부 정보만 수정할 때 사용한다. @DeleteMapping: HTTP Delete Method에 해당하는 단축 표현으로 서버의 리소스를 삭제할 때 사용. |
[ref. RequestMapping에 사용되는 애트리뷰트]
@PostMapping
public String postMember(@RequestParam("email") String email,
@RequestParam("name") String name,
@RequestParam("phone") String phone){
...
}
@GetMapping("/{member-id}")
public String getMember(@PathVariable("member-id")long memberId) {
...
}
@RequestParam
핸들러메서드의 파라미터 종류중 하나이다. 쿼리 파라미터는 URL에서 ?를 기준으로 뒤에붙는 key/value쌍의 데이터를 말한다.
@PathVariable
핸들러메서드의 파라미터 종류, 위의 @GetMapping(" ")안의 문자열값과 PathVariable의 문자열이 동일해야된다. 문자열이 다르면 MissingPathVariableException이 발생한다.