3 분 소요

Model, View, Controller 구성요소를 사용해 클라이언트의 요청을 처리해주는 프레임워크.

Model

클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터

View

Model 데이터를 이용해서 웹브라우저 같은 클라이언트 애플리케이션의 화면에 보여지는 리소스를 제공하는 역할

Spring MVC에는 다양한 View 기술이 포함되어 있다.

  • HTML 페이지 출력
  • PDF, Excel 등의 문서 형태로 출력
  • XML, Json 등 특정 형식의 포맷으로 변환

Controller

클라이언트 측의 요청을 직접적으로 전달 받는 엔드포인트로써

Model과 View의 중간에서 상호 작용을 해주는 역할

클라이언트 측의 요청을 전달받아 비즈니스 로직을 거친 후,

Model 데이터가 만들어지면, 이 Model 데이터를 View로 전달하는 역할을 한다.

Spring MVC의 동작 방식과 구성 요소

스크린샷_20230213_101733

Controller 심화

EntryPoint

Spring Boot 기반의 애플리케이션이 정상적으로 실행되기 위해서 먼저 해야될 일은 main() 메서드가 포함된 애플리케이션의 엔트리포인트(시작점)을 작성하는 것이다.

(엔트리포인트 클래스가 이미 작성되어 있음)

package test.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args); 
	}

}


@SpringBootApplication

  • 자동 구성을 활성화한다.
  • 애플리케이션 패키지 내에서 @Component가 붙은 클래스를 검색한 후(scan), Spring Bean으로 등록하는 기능을 활성화한다.
  • @Configuration이 붙은 클래스를 자동으로 찾아주고, 추가적으로 Spring Bean을 등록하는 기능을 활성화한다.


SpringApplication.run(DemoApplication.class, args);

  • Spring 애플리케이션을 부트스트랩하고, 실행하는 역할을 한다.

(부트스트랩(Bootstrap)은 애플리케이션이 실행되기 전에 여러가지 설정 작업을 수행하여 실행 가능한 애플리케이션으로 만드는 단계를 의미한다.)


@RestController

  • MVC에서는 특정 클래스에 @RestController를 추가하면 해당 클래스가 REST API의 리소스를 처리하기 위한 API 엔드포인트로 동작함을 정의한다.
  • @RestController가 추가된 클래스는 애플리케이션 로딩 시, Spring Bean으로 등록해준다.


@RequestMapping

  • 클라이언트의 요청과 클라이언트 요청을 처리하는 핸들러 메서드(Handler Method)를 매빙해주는 역할을 한다.


REST API란?

REST 방식을 통해서 리소스에 접근하기 위한 서비스 API를 지칭한다.

(REST는 HTTP 네트워크 상의 리소스를 정의하고 해당 리소스를 URL라는 고유한 주소로 접근하는 방식을 의미한다.)

REST API URL 작성 규칙

  • URI의 마지막이 ‘/’로 끝나지 않아야 한다.
  • 동사 보다는 명사를 사용한다.
    • http://www.itivllage.tistory.com/coffees (ㅇ)
    • http://www.itivllage.tistory.com/coffees/update (x)
  • 단수형 보다는 복수형 명사를 사용한다.
    • http://www.itivllage.tistory.com/coffees (ㅇ)
    • http://www.itivllage.tistory.com/coffee (x)
  • URI는 기본 소문자로 사용한다.
  • 언더스코어( _ ) 대신에 하이픈(-)을 사용한다.
  • 파일 확장자는 URI에 포함하지 않는.




Handler Method 핸들러 메서드

Controller 클래스에서 클라이언트의 요청을 처리함


Method Argument 설명
@RequestParam 쿼리 파라미터, form-data 등의 Servlet request Parameter를 바인딩 해야 할 경우 사용합니다.
@RequestHeader request header를 바인딩해서 header의 key/value에 접근할 수 있습니다.
@RequestBody request body를 읽어서 지정한 Java 객체로 deserialization 해줍니다.
@RequestPart ‘multipart/form-data’ 형식의 request 데이터를 part 별로 바인딩할 수 있도록 해줍니다.
@PathVariable @RequestMapping 에 패턴 형식으로 정의된 URL의 변수에 바인딩할 수 있도록 해줍니다.
@MatrixVariable URL 경로 세그먼트 부분에 key/value 쌍으로 된 데이터에 바인딩할 수 있도록 해줍니다.
HttpEntity request header와 body에 접근할 수 있는 컨테이너 객체를 사용할 수 있습니다.
javax.servlet.ServletRequest, javax.servlet.ServletResponse 로우 레벨의 ServeletRequest와 ServletResponse의 정보가 필요할 때 사용할 수 있습니다.


@RestController
@RequestMapping(value = "/v1/members", produces = {MediaType.APPLICATION_JSON_VALUE})
public class MemberController {
    @PostMapping
    public String postMember(@RequestParam("email") String email,
                             @RequestParam("name") String name,
                             @RequestParam("phone") String phone) {
        System.out.println("# email: " + email);
        System.out.println("# name: " + name);
        System.out.println("# phone: " + phone);
        
        String response =
                "{\"" + 
                   "email\":\""+email+"\"," + 
                   "\"name\":\""+name+"\",\"" + 
                   "phone\":\"" + phone+ 
                "\"}";
        return response;
    }

    @GetMapping("/{member-id}")
    public String getMember(@PathVariable("member-id")long memberId) {
        System.out.println("# memberId: " + memberId);

        // not implementation
        return null;
    }

    @GetMapping
    public String getMembers() {
        System.out.println("# get Members");

        // not implementation
        return null;
    }
}

추가설명 / 클래스 레벨의 @RequestMapping에 추가된 항목

  • produces

produces애트리뷰트는 응답 데이터를 어떤 미디어 타입으로 클라이언트에게 전송할 지를 설정함.

여기서는 JSON 형식의 데이터를 전송하겠다는 의미로 MediaType.APPLICATION_JSON_VALUE 값을

설정함.

  • postMember() 메서드 (회원 정보를 등록해주는 핸들러 메서드)
    • @PostMapping은 클라이언트의 요청 데이터를 서버에 생성할 때 사용하는 애너테이션 (HTTP Method 타입과 동일하게 맞춰야한다.)
  • getMember() 메서드 (특정 회원의 정보를 클라이언트 쪽에 제공하는 핸들러 메서드)
    • @GetMapping 은 클라이언트가 서버에 리소스를 조회할 때 사용하는 애너테이션

핵심


  • 클라이언트의 요청을 전달 받아서 처리하기 위해서는 요청 핸들러 메서드(Request Handler Method)가 필요하다.
  • Spring MVC에서는 HTTP Method 유형과 매치되는 @GetMapping, @PostMapping 등의 애너테이션을 지원한다.
  • @PathVariable 애너테이션을 사용하면 클라이언트 요청 URI에 패턴 형식으로 지정된 변수의 값을 파라미터로 전달받을 수 있다.
  • @RequestParam 애너테이션을 사용하면 쿼리 파라미터(Query Parmeter 또는 Query string), 폼 데이터(form-data), x-www-form-urlencoded 형식의 데이터를 파라미터로 전달 받을 수 있다.
  • @GetMapping, @PostMapping 등에서 URI를 생략하면 클래스 레벨의 URI 경로만으로 요청 URI를 구성한다.

카테고리: ,

업데이트:

댓글남기기