[Spring]요청받기 어노테이션

윤재열·2022년 2월 18일
2

Spring

목록 보기
26/72

@RequestMapping

  • @RequestMapping에서 value 표기하지 않기!
  • @ReponseBody로 응답이 뷰를 거치지 않고 바로 웹브라우저로 이동하게 합니다.
  • @RequestMapiing에서 파라미터가 1개(URL지정)만 있다면 value를 생략할 수 있습니다.
 @RequestMapping("/sample/not-value")
 @ResponseBody
    public String sample1(){
        return "RequestMapping without value property";
    }

http://localhost:8080/sample/not-value

@PathVariable로 URL경로 매개변수 읽기

  • @RequestMapping에서 선언한 URL에 {키} 형식으로 URL 경로 매개변수를 설정합니다.
  • 자바 메서드 매개변수에 @PathVariable("키") 어노테이션으로 URL 경로 매개변수가 매칭됨을 알립니다.
  • 자바 매개변수 이름은 키와 달라도 상관 없습니다.
    👉예제에서의 키는 param이지만 매개변수 이름은 parameter입니다.
  • {}안에 어노테이션뒤에 오는 파라미터의 타입으로 값을 입력해줍니다.
 @ResponseBody
 @RequestMapping("/sample/path/{param}")
 public String samplePath(@PathVariable("param")String parameter){
 
        return "Request Path Parameter : "+parameter;
        }

http://localhost:8080/sample/path/CODE:J

@RequestParam으로 쿼리 스트링 매개변수 읽기

  • URL에서 부가적인 정보를 입력받을 때 사용하는 쿼리스트링의 사용법입니다.
  • 쿼리스트링은 URL에서 ?로 시작하고 각 항목은 키=값형식으로 서버에 값을 전달하는 방법입니다.
  • 예제에서는 param이라는 키로 CODE:J라는 값을 전달 하였습니다.
  • 자바 메서드 매개변수에 @RequestParam("키")어노테이션으로 쿼리스트링이 매칭됨을 알립니다.
  • URL 끝에 ?+param(키)=CODE:J(값) 라고 입력합니다.
 @ResponseBody
 @RequestMapping("/sample/query-string")
 public String sampleQueryString(@RequestParam("param")String parameter){
 
        return "Sample Query String : "+parameter;
    }

http://localhost:8080/sample/query-string?param=CODE:J

@RequestParam 여러개 사용하기

  • 전의 예제와 똑같지만 @RequestParam을 2번 사용한 것입니다.
  • 쿼리스트링은 키=값형식이기 때문에 URL에서 순서가 바뀌어도 관계가 없습니다.
  • 쿼리스트링의 각 항목은 &표시로 구분합니다.
 @ResponseBody
 @RequestMapping("/sample/query-string-many")
 public String sampleQueryString2(@RequestParam("param1")String parameter1,
                                  @RequestParam("param2")String parameter2){
        return "Many Query String : param 1 = " +parameter1 + "param2 =  "+parameter2;

    }

http://localhost:8080/sample/query-string-many?param1=CODE& param2=:J

@RequestParam 선택적 매개변수 사용하기

  • 매개변수가 필수가 아닐 경우 처리하는 방법입니다.
  • 필수 매개변수가 없다면 오류가 납니다.
  • @RequestParam에 required = false옵션이 없다면 선택적 매개변수입니다.
  • 쿼리스트링이 전달되지 않으면 기본값은 null 입니다.
  • @RequestParam에 defaultvalue 속성이 있다면 선택적 매개변수 입니다.
  • 쿼리스트링이 전달되지 않으면 기본값은 defaultValue에서 지정한 값에 따릅니다.
@ResponseBody
@RequestMapping("/sample/query-string-option")
public String sampleQueryStringOption(@RequestParam(value = "required")String required,
                                      @RequestParam(value = "not_required", required = false)String notRequired,
                                      @RequestParam(value = "default_value",defaultValue = "default value")String defaultValue) {

     return String.format(
                "Query String Options. required=%s,notRequired=%s, defaultValue=%s",
                required, notRequired, defaultValue);
    }

http://localhost:8080/sample/query-string-option?required=really

http://localhost:8080/sample/query-string-option?required=really& not_required=oh-my-god

http://localhost:8080/sample/query-string-option?required=really& not_required=oh-my-god& default_value=i-am-standard

@RequetsParam 없이 HTTP 매개변수 읽기

  • 컨트롤러 메서드에서 아무런 어노테이션 없이 String등 Request와 관련 없는 타임의 파라미터가 선언되었을 경우 스프링은 @RequestParam(required=false, value={변수명}) 이라고 가정합니다
@ResponseBody
@RequestMapping("/sample/withdout-request-param")
public String sampleWithdoutRequestParam(String value){
        return value;
    }
@RequestParam(value = "value", required = false) String value 
String value  
  • 위의 두 줄의 파라미터는 동일한 의미를 가집니다.

DTO 객체를 이용해 매개변수 읽기

  • 파라미터 값을 담을 DTO객체를 선언합니다.
  • DTO 객체를 이용해서 파라미터를 입력받는 것을 커맨드 패턴이라고 부릅니다.
  • DTO 객체에는 setter메서드가 모두 있어야 정상 동작합니다.
  • DTO의 값 출력을 위해 @ToString 어노테이션을 해줍니다.
  • DTO를 사용할 때는 파라미터에 @RequestParam 어노테이션을 붙이지 않습니다.
  • HTTP 매개변수는 자동으로 DTO 객체의 값으로 설정됩니다.
GET http://localhost:8080/sample/param-dto?name=spring-boot&age=27hobby=coding
name : spring-boot, age : 27, hobby : coding 
  • GET 파라미터 뿐만 아니라 POST 파라미터도 처리할 수 있습니다.

SampleRequestDTO 클래스를 만들어줍니다.

import lombok.Setter;
import lombok.ToString;

@Setter
@ToString
public class SampleRequestDTO {
    private  String name;
    private int age;
    private String hobby;
}

Controller

@ResponseBody
@RequestMapping("/sample/param-dto")
public String sampleParamDTO(SampleRequestDTO sampleRequestDTO){
        return sampleRequestDTO.toString();
    }

http://localhost:8080/sample/param-dto?name=spring-boot&age=27&hobby=coding

@GetMapping

  • HTTP GET 요청이 올때만 자바 메서드가 실행됩니다.
  • 클라이언트에서 서보로 정보를 요청할떄 사용합니다.
  • 게시물 조회에 주로 쓰입니다.
  • 데이터를 넘길때 주소창을 이용해 넘기는 방법입니다.
  • SQL의 SLECT라고 생각하면 쉽습니다.
  • GetMapping 어노테이션은 @RequestMapping(method=RequestMethod.GET, value=..) 의 축약형 표현입니다.
 @GetMapping("/sample/get-mapping")
 @ResponseBody
 public String sampleGetMapping(){
        return "this is get mapping example";
    }

http://localhost:8080/sample/get-mapping

@PostMapping

  • HTTP POST 요청이 올 때만 자바 메서드가 실행됩니다.
  • 클라이언트에서 서버로 새로생성하거나 업데이트 할 때 사용합니다.
  • 게시판 작성,수정에 주로 씁니다.
  • SQL의 CREATE를 생각하면 쉽습니다.
  • PostMapping 어노테이션은 @RequestMapping(method=RequestMethod.POST, value=..) 의 축약형 표현입니다.
@PostMapping("/sample/post-mapping")
@ResponseBody
public String samplePostMapping(){
        return "this is post mapping example";
    }
  • 브라우저에 직접 주소를 입력해서 이동하는 것은 HTTP GET메서드라고 간주합니다. 따라서 /sample/post-mapping경로는 GET 요청을 받아들이지 않기 때문에 오류가 발생합니다.

@RestController

  • @Controller어노테이션과 @ResponseBody어노테이션을 합쳐놓은 것이 @RestController 입니다.
  • 이전과 다르게 @Mapping어노테이션에 @ResponseBody 어노테이션이 없습니다.
@RestController  
public class SampleRestController {  
    
@GetMapping("/rest")  
public String index() {  
        return "this is rest";  
    }  

@GetMapping("/rest/now")  
public LocalDateTime now() {  
        return LocalDateTime.now();  
    }  
}  

http://localhost:8080/rest

http://localhost:8080/rest/now

@RequestMapping을 클래스에 사용하기

  • @RequestMapping은 메서드 뿐만 아니라 클래스에도 사용할 수 있습니다.
  • 클래스에 사용하면 각 메서드에 공통된 URL을 쓸 수 있습니다.
@RestController  
@RequestMapping(value="/class/request")  
public class SampleClassRequestMapping {  
    @GetMapping("/")  
    public String index() {  
        return "this is sample class Request Mapping";  
    }  

    @GetMapping("/now")  
    public LocalDateTime now() {  
        return LocalDateTime.now();  
    }  
} 
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글