본문 바로가기
Backend/Spring

Spring : 파라미터를 처리하는 방법 ( @PathVariable, @RequestParam, @RequestMapping )

by 코딩쥐 2024. 10. 27.

파라미터가 여러개 일 때

파라미터가 여러개일 경우에는 @RequestMapping과 @GetMapping을 사용하여 간단하게 로직을 작성할 수 있다. 아래 예시는 /product 경로를 사용하여 여러 개의 파라미터를 처리한다. 

package com.example.project.controller;

import com.example.project.dto.ProductDTO;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
//첫번째 파라미터
@RequestMapping("/product")
public class ExampleController {
    //두번째 파라미터
    @GetMapping("/onion")
    public ResponseEntity<ProductDTO> onion(){
        return new ResponseEntity<>(new ProductDTO("ask1db", "양파"), HttpStatus.OK);
    }

    @GetMapping("/desk")
    public ResponseEntity<ProductDTO> desk(){
        return new ResponseEntity<>(new ProductDTO("1bskd", "책상"), HttpStatus.OK);
    }
}

 

파라미터 전달 하는 방법

@PathVariable

만약에 파라미터를 받아서 값을 추출하여 사용하고 싶을 경우에는 @PathVariable 어노테이션을 사용할 수 있다. 아래 예제는 물품ID값을 파라미터로 받아서 id 값을 설정한다.

package com.example.project.controller;

import com.example.project.dto.ProductDTO;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/product") // 첫번째 파라미터
public class ExampleController {
    
    // PathVariable을 사용하는 예시
    @GetMapping("/{id}")
    public ResponseEntity<ProductDTO> productById(@PathVariable("id") String id) {
        // 여기서 id에 따라 다른 상품 정보를 반환할 수 있음
        return new ResponseEntity<>(new ProductDTO(id, "상품 이름"), HttpStatus.OK);
    }
}

 

@RequestParam

URL의 쿼리 문자열의 경우 @RequestParam 어노테이션을 사용하여 값을 추출하여 사용할 수 있다. 아래 예제는 파라미터로 물품 ID값을 파라미터로 받아 productID을 설정하고, 쿼리문자열로 상품이름 값을 받아 name으로 설정한다. 

package com.example.project.controller;

import com.example.project.dto.ProductDTO;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/product") // 첫번째 파라미터
public class ExampleController {
    @GetMapping("/{id}")
    public ResponseEntity<ProductDTO> productById(@PathVariable("id") String id, @RequestParam("name") String name) {
        // 파라미터에 따라 id를 변경하고, 쿼리문자열에 따라 name을 변경한다.
        return new ResponseEntity<>(new ProductDTO(id, name), HttpStatus.OK);
    }
}

 

파라미터 정보에 따라 처리하기

만약 특정한 파라미터의 값에 따라서 메서드를 매핑하고 싶다면, @RequestMapping 어노테이션에 params라는 항목을 삽입한다.

  • @RequestMapping( value = "값", method = RequestMethod.HTTP메서드,  params={"파라미터"})
package com.example.project1.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/tistory")
public class ExampleController {
    // id 파라미터가 "codingji"일 때 호출되는 메서드
    // @RequestMapping(value="/main", method=RequestMethod.GET, params={"id=codingji"})  작성 가능
    @GetMapping(value="/main", params={"id=codingji"})
    public ResponseEntity<String> codingjiEx (){
        return new ResponseEntity<>("코딩쥐의 티스토리 메인입니다.", HttpStatus.OK);
    }

    // id 파라미터가 "readingji", pw 파라미터가 "okreadingji" 일 때 호출되는 메서드
    // @RequestMapping(value="/main", method=RequestMethod.GET, params={"id=readingji","pw=okreadingji"}) 작성 가능
    @GetMapping(value="/main", params={"id=readingji","pw=okreadingji"})
    public ResponseEntity<String> readingjiEx (){
        return new ResponseEntity<>("리딩쥐의 티스토리 메인입니다.", HttpStatus.OK);
    }

    //잘못된 파라미터가 들어온 경우 예외 처리
    @GetMapping(value="/main")
    public ResponseEntity<String> defaultResponse(){
        return new ResponseEntity<>("유효한 파라미터를 작성해주세요.", HttpStatus.BAD_REQUEST);
    }
}

 

헤더 정보에 따라 처리하기

@RequestMapping의 headers 속성을 통해 HTTP 요청의 헤더를 사용하여 클라이언트의 정보를 기반으로 응답을 다르게 처리할 수 있다.

  • @RequestMapping( value = "값", method = RequestMethod.HTTP메서드, headers = "헤더")
package com.example.project1.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/tistory")
public class ExampleController {

    // 헤더에 CODINGJI-API-VERSION=1 이라는 요청이 있으면 아래 로직 시행
    // @RequestMapping(value = "값", method = RequestMethod.OK, headers = "CODINGJI-API-VERSION=1") 가능
    @GetMapping(value="/codingji", headers = "CODINGJI-API-VERSION=1")
    public ResponseEntity<String> codingjiEx1() {
        return new ResponseEntity<>("코딩쥐 버전 1 입니다.", HttpStatus.OK);
    }
    
    // @RequestMapping(value = "값", method = RequestMethod.OK, headers = "CODINGJI-API-VERSION=2") 가능
    // 헤더에 CODINGJI-API-VERSION=2 이라는 요청이 있으면 아래 로직 시행
    @GetMapping(value="/codingji", headers = "CODINGJI-API-VERSION=2")
    public ResponseEntity<String> codingjiEx2() {
        return new ResponseEntity<>("코딩쥐 버전 2 입니다.", HttpStatus.OK);
    }

    // 잘못된 요청에 대한 기본 응답 처리
    @GetMapping(value="/codingji")
    public ResponseEntity<String> defaultResponse() {
        return new ResponseEntity<>("유효한 헤더를 제공해주세요.", HttpStatus.BAD_REQUEST);
    }
}

 

해당 로직을 확인하기 위해서 포스트맨사용해서 http://localhost:8080/tistory/codingji의 헤더 요청에 CODINGJI-API-VERSION을 추가해서 전송했다.