본문 바로가기

Server Oriented/Spring

스프링 Controller 에 딸린 메서드의 파라미터와 리턴값

1. 파라미터

 

컨트롤러 클래스에서
메소드에 파라미터를 사용할 때에는..

form 문에 담긴 컨트롤 값으로 넘어오는 것이면,
해당 클래스를 그대로 기술하면 되지만..
@...Mapping("/...")
public foo(ClassA classA) { ... }

request url 의 path 에도 파라미터가 넘어온다면,
@PathVariable 사용
@...Mapping("/.../{param}") // url 의 path 부분에 변수가 들어오기 때문에 PathVariable
public bar(@PathVariable ClassB param, ...) { ... }

JSON 데이타가 (url 호출시 body에) 파라미터로 넘어온다면,
@RequestBody 사용
@...Mapping("/.../{param1}")
public baz(@PathVariable ClassC param1, @RequestBody ClassD param2) { ... }

 

그렇다면 request 의 head 부분에 들어가는 값은..

이를테면 쿠키값..?

 

 

 

2. 리턴값

 

form 문을 처리하는 것이라면,

템플릿의 url 이나 redirect 를 String 으로 처리..

public String foo(...) {

  ...

  return "aaa/bbb"; // /aaa/bbb 템플릿 호출. "/aaa/bbb" 라고 해도 되지만, 뭔가 이상해짐

  // return "redirect:/ccc/ddd"; // /ccc/ddd url 을 호출하도록 response 하면, 브라우저가 /ccc/ddd 를 호출

}

 

템플릿에 값을 전달하려면,

Model 처리..

public String foo(..., Model model, RedirectAttributes ra) {

  ...

  model.addAttribute("...", ...);

  ra.addFlashAttribute("...", ...); // return 되는 url 을, 브라우저가 서버에 다시 request 할 때 전달되는 파라미터

  return ...;

}

 

Restfull 이라면(JSON/TEXT/XML 형태),

@ResponseBody 사용..

@ResponseBody

public ObjectA bar(...) {

  ...

  return objectA;

}

 

@Controller 대신 @RestContollrer 를 클래스에 사용했다면,

@ResponseBody 생략.

 

HTTP 상태코드/헤더/본문 등을 보완하려면,

ResponseEntity 사용..

public ResponseEntity<ObjectA> baz(...) {

  ...

  // return ResponseEntity.status(HttpStatus.OK).body(objectA); // bar() 에서 리턴한 값과 (결과적으로) 동일

  return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); // bar() 에서 null 을 리턴하는 것과 동등

  // ....build() 는 ....body(null) 과 동일 결과

 

  // return objectA != null ?

  //   ResponseEntity.status(HttpStatus.OK).body(objectA) :

  //   ResponseEntity.status(HttpStatus.BAD_REQUEST).build();

}

오류인 경우에 관련 메시지나 처리를,

JSON 에 담아서 전달해도 된다.

오류 발생시 관련 내용을 담는 JSON 클래스를 하나 만들어서 활용해 보시길..