Controller 관련 - @RequestMapping , @GetMapping , @ResponseBody , @RequestBody , @RequestParam , @PathVariable , @ResponseStatus

이정수·2025년 10월 23일

Spring Boot

목록 보기
16/25

Controller를 선언하는 어노테이션

@RequestMapping, @GetMapping, @DeleteMapping, @PatchMapping, @PostMapping , @PutMapping

클라이언트요청URL 패턴HTTP Method가 일치하는 경우 선언된 메서드mapping하는 어노테이션
Spring MVCHandlerAdapter, HandlerMapping 역할을 수행

Web Controller Class의 내부를 구성하는 Controller Method를 정의 시 사용 Controller Class
▶ 해당 method는 Controller로서 요청을 처리하고 Service, Repository를 통해 필요한 logic을 수행 후 결과를 Dispatcher Servlet으로 응답

。기본적으로 반환값View Resolver에 의해 참조되며 REST API를 통한 JSON 등의 데이터를 반환 시 @ResponseBody 선언 시 View Resolver는 작동하지 않는다.

。각 REST API ControllerURL Pattern 설정 시 각 Endpoint에 적합하게 지정
REST API - Endpoint

@RequestMapping(value="url", method = RequestMethod.HTTP메서드명)
HTTP method를 설정하는 경우 매핑URL Pattern요청HTTP Method에 해당하는 요청에 대해서만 해당 Controller Method를 사용
▶ 일일이 RequestMethod를 통해 HTTP 메서드를 지정해야하며 직관적이지 않으므로 잘 활용되지않음

HTTP Method 종류 :
GET, POST, DELETE, PUT , PATCH

 @RequestMapping("/say-hello-jsp" , method = RequestMethod.GET)
    public String sayHelloJsp() {
        return "sayHello";
    }
  • 클래스 레벨에 선언하는 경우 APIURL Patternprefix를 지정
    클래스@RequestMapping("/api/users") 선언 시 Controller@GetMapping("/1")을 선언하는 경우 해당 Controller/api/users/1HTTP 요청라우팅
@RestController
@RequestMapping("/members")
public class MemberController {
	private final MemberService memberservice;
	// localhost:8080/members/로 요청 시 해당 컨트롤러로 매핑
	@PostMapping("/")
	@ResponseStatus(HttpStatus.CREATED)
	public void create(@Valid @RequestBody MemberCreateRequest request) {
  				//
	}

@GetMapping(path="url")
@RequestMapping(path="url", method = RequestMethod.GET)와 동일 기능을 수행하는 어노테이션

REST API에 의한 Path Variable를 정의할 경우 path="URL"{Path Variable이름}을 추가해야한다.
@GetMapping(path="/users/{id}")

Http 메서드에 따라서 다음 어노테이션구체화 :
@DeleteMapping, @PatchMapping, @PostMapping , @PutMapping

@GetMapping(path="/users/{id}")
    public User GetUserById(@PathVariable int id){
        User user = userDaoService.findById(id);
        return user;
    }
  • Http Method : GET이 아닌 경우 Http MessageXML 또는 JSON을 포함하여 전송
    클라이언트에서 요청HTTP Message BodyJSON Format 데이터를 포함 시 @RequestBody을 통해 Jackson이 동작하여 JSONPOJODTO바인딩하여 처리

HTTP Message를 통해 전달되는 JSON과 DTO 객체 간 변환을 수행하는 어노테이션

@RequestBody, @ResponseBody
Jackson Message Converter를 이용
DTO

DTOPOJO를 사용
Spring BeanSingleton 특징으로 데이터 전달용도로는 사용하지 않는다.

@RequestBody
클라이언트에서 JSON Format의 데이터를 HTTP Request Body에 포함하여 ControllerURL로 요청 시 Controller매개변수에서 해당 JSON 데이터와 사전에 MappingDTO 객체에 선언하여 수신받도록하는 어노테이션
Jackson역직렬화를 통해 선언된 Controller Method의 매개변수에 존재하는 DTO 객체HTTP Request BodyJSON과 Mapping

JSONkey와 매핑할 DTOfield명을 동일하게 설정

GET Method는 @ResponseBody를 사용 불가능!
GET은 기본적으로 HTTP Request Body를 포함하지않으므로 Query String을 통해 클라이언트로부터 데이터를 수신

Content Negotiation을 통해 HTTP Request Body데이터클라이언트가 원하는 Representation ( data type or language )로 Response 받을 수 있음.

// DTO 정의
public class UserCreateRequest {
	private String name;
	private int age;
	public UserCreateRequest(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public int getAge() {
		return this.age;
	}
}
@RestController
@RequiredArgsConstructor
public class AnnotationController {
	AnnotationRepository annotationRepository;
  // REST API 역할의 Controller
	@PostMapping("/annotation/user")
	public void create(@RequestBody UserCreateRequest request) {
		System.out.println(request.getAge());
	}
}

@ResponseBody
REST API를 구현하기위해 Controller에서 자원을 포함하여 반환되는 DTO 객체JSON, XML format으로 직렬화하여 Dispatcher Servlet을 통해 HTTP Response Body로 포함하여 클라이언트에게 반환하도록 하는 어노테이션

@ResponseBody를 선언하는 경우 View Resolver의 작동을 차단
반환값을 기준으로 View의 기반이 될 템플릿 파일을 검색을 수행하지않고 그대로 반환.

@ResponseBody 대신 ResponseEntity로 대체가능 ResponseEntity

@RestController 내부에 @ResponseBody를 포함하므로 따로 정의할 필요는 없다.

Controller Method에서 Response 용도의 DTO의 일반 POJO를 반환값으로 설정 및 @ResponseBody를 선언 시 Jackson에 의해 JSON으로 직렬화되어 HTTP Response Body에 포함
Response 용도의 DTOgetter를 포함해야한다.

// @ResponseBody : 이미 @RestController에 포함
@RestController
public class CourseController {
    @GetMapping( path="/courses")
    public List<Course> retrieveAllCourses() {
        return Arrays.asList(
                new Course(1,"Learn AWS","wjdtn1"),
                new Course(1,"Learn DevOps","wjdtn2")
        );
    }
}


▶ 반환된 DTO 객체@ReponseBody에 의해 JSON으로 직렬화되어 브라우저로 전달됨

Message Converter
POJOJSON 등의 다양한 Format으로 직렬화하는 역할을 수행.

Controller에서 전달된 JSONMessage Converter를 통해 DTO역직렬화 하거나 반환하는 DTOHTTP Message에 맞는 데이터( JSON 등 )으로 직렬화

  • JacksonHttpMessageConverters
    Spring Boot의 기본 Http Message Converter
    @RequestBody, @ResponseBody에 포함되어 있음.
    ▶ 해당 Message ConverterPOJO를 전달 시 JSON Conversion하거나 JSON 전달 시 POJO매핑하는 역할을 수행.

URL 패턴에 포함된 매개변수를 수신하는 어노테이션

Query Parameter : @RequestParam
Path Variable : @PathVariable

@RequestParam :
URL 패턴Query ParameterController Method의 매개변수로 Binding

@RequestParamGETQuery Parameter 뿐만 아니라, POST method를 통해 전달되는 Form Data도 전달 받을 수 있다.

@Controller
public class gotoLoginPage {
    @RequestMapping("/login")
    public String gotoLoginPage(@RequestParam String name, ModelMap model) {
        model.put("name",name);
        return "login"; 
    }
}

URL 패턴 : /login?name=wjdtn747일 경우,
▶ 매개변수에 @RequestParam String name 설정 시 URL의 Query Parameternamemapping

  • @RequestParam(required = true)
    요청URL에 해당 Query Parameter를 포함하지 않는 경우 IllegalArgumentException를 발생
    Client에게 400 에러를 반환

    Query String이 꼭 필요하지 않는경우 @RequestParam(required = false) 설정
    Spring은 기본적으로 required=false

  • @RequestParam(defaultValue = "기본값")
    요청URL에 해당 Query Parameter를 포함하지 않는 경우 설정된 기본값을 전달
    초기 개발을 안넣는 경우도 존재하여 테스트임시값 설정 용도로 사용

    Query Parameter /자원명?키=값 Query String
    URI에 포함되어 전달되는 Query String
    @RequestParam으로 수신

@PathVariable :
@RestControllerController에 요청되는 REST API URL에 포함된 Path VariableController Method의 매개변수로 Mapping.

@GetMapping( path = "/courses/path-variable/{name}")
    public Course getCourse(@PathVariable String name) {
        // /{name} : Path Variable => 변수는 {}로 구분.
        return new Course(1,name,"wjdtn1");
    }

Controller에 등록하는 URL 패턴Path Parameter 부분은 {PathVariable명}으로 지정.
매개변수명칭URL 패턴{PathVariable명}을 통일

  • @PathVariable()

    Path Variable : /user/{name}
    REST APIURI에 포함되어 전달되는 Path
    @PathVariable으로 수신

HTTP Response와 함께 알맞은 HTTP Status Code를 설정하여 반환하는 어노테이션

@ResponseStatus(code=HttpStatus.상태코드)
Spring MVC에서 Controller특정 Exception이 발생한 경우 정의된 HTTP Status Code와 함께 Response반환하도록 설정.
HTTP ResponseStatus Code를 설정

인자HttpStatus객체( org.springframework.http.HttpStatus )의 Status Code 프로퍼티를 설정 시 404가 반환된다.
@ResponseStatus(code= HttpStatus.NOT_FOUND)

@PostMapping("/users")
	@ResponseStatus(HttpStatus.CREATED)
	public void createUser(@RequestBody User user) {
		// 코드 
	}
profile
공부기록 블로그

0개의 댓글