[그린컴퓨터] Server/Spring

컨트롤러 4. 파라미터수집 { 개요, 예제(@RequestParam, @PathVariable, @RequestBody), 연습문제 }

Ben의 프로그램 2023. 8. 4. 12:50
728x90
파라미터?
파라미터는 사용자가 데이터를 요청할 때 함께 전달하는 값입니다. 컨트롤러는 사용자가 보낸 데이터를 활용하여 요청 작업을 수행하게 됩니다. 컨트롤러는 다양한 방법으로 파라미터를 수집합니다. Request Param 방식은 URL에 쿼리 문자열 형태로 파라미터를 전달하는 것이고, Path Variable 은 URL 경로에 파라미터를 포함시켜 전달하는 것이고, Request Body 는 본문에 파라미터를 담아서 전달하는 것입니다. 

예를 들어서 no=1 이라는 것을 클라이언트가 파라미터로 전달하면 서버는 글 번호가 1인 게시물을 보여주는 것이죠.

1번은 서버 입장에서 파라미터를 처리하는 것을 보여주고 있고 2번은 클라이언트 입장에서 파라미터를 전달하는 방법을 보여주고 있습니다. 

 

@RequestParam 예제 1 & 2
우선 SampleController3 이라는 컨트롤러를 만들고, 여기에 메서드를 적어보겠습니다. 

ex1 과 ex2 예제를 적었는데요. 여기서 눈여겨 볼 만한 점은 단순타입은 @RequestParam 어노테이션 생략이 가능하다는 점, 클라이언트가 여러 파라미터를 전달할 때는 &를 사용하여 구분한다는 점이겠다. 또한 이런 메서드를 클라이언트가 정상적으로 사용하기 위해서는 3가지를 주의해야 하는데, 1 메서드 2 주소 3 파라미터 이다. 이렇게 3가지를 다 올바르게 입력하여야 올바른 응답을 받을 수 있게 된다. 

postman 에서 ex1 을 위와 같이 작성하였습니다. 

위와 같이 값이 잘 출력된 것을 확인할 수 있습니다. 

ex2 를 postman 에서 위와 같이 작성한다. postman 에서는 key 와 value 를 활용하여 파라미터를 손쉽게 넣어줄 수 있다. 

잘 값이 출력된 것을 확인할 수 있다. 

 

@RequestParam 예제 3 & 4
이번에는 int[] arr 이라는 int 형 배열과 ArrayList<Integer> list 라는 int 형 리스트를 파라미터로 수집하는 ex3 와 ex4 메서드를 작성하였습니다. 

postman 으로 arr 1~3 을 파라미터로 설정한 다음 get 방식으로 호출하였습니다. 호출할 때 URL을 보면 같은 arr=1&arr=2&arr=3 같은 방식으로 파라미터를 전달한다는 것입니다. 

위에서 보이는 것과 같이 int 형 배열을 잘 수집한 것을 볼 수 있습니다. 

list 도 마찬가지로 작성할 수 있습니다. 

출력 결과를 보면 위와 같이 잘 출력이 되고 있는 것을 확인할 수 있습니다. 

 

@RequestParam 예제 5 & 예제 6
예제 5번은 날짜 데이터를 수집하는 것인데요. 여기서 주의할 점은 날짜 데이터 형식은 - - 가 기본 형식입니다. 그래서 URL 주소에서도 - - 를 활용하여 수집하고 있는 것을 볼 수 있는데요. 또한 위에서 @DateTimeFormat(pattern = "yyyy-MM-dd") 은 기본 형식이기 때문에 생략이 가능하다는 점이 있습니다. 

재밌는 점은 / / 날짜 형식을 사용할 수도 있습니다. 이때 특징은 - - 가 기본 형식이기 때문에 pattern 을 / / 로 지정하였더라도 클라이언트가 - - 로 호출하여도 정상적으로 동작하게 됩니다. 

호출을 해보면 잘 동작을 하는 것을 확인할 수 있습니다. 

 

@PathVariable 이란?
@PathVariable 은 URL 경로에 내가 지정한 위치를 통해 파라미터를 수집하는 방식입니다. 사용자는 i=100 과 같은 방식이 아니라 지정된 주소 위치에 100 을 바로 입력하여 사용하게 됩니다. 

 

@PathVariable 예제 7
@PathVariable 을 사용할 때는 @GetMapping 경로에 /{i} 로 경로에 지정된 위치를 통해서 파라미터를 수집합니다. 

Postman 에 위와 같이 PathVariable 형태로 경로 자체에 값을 넣어준 것을 볼 수 있습니다. 이 경우에는 자연스럽게 Query Params 을 사용하지 않는 것을 확인할 수 있습니다. 

실행을 해보면 위와 같이 100 이 잘 수행된 것을 알 수 있습니다. 

 

@RequestBody 란?
@RequestBody 란 만약 파라미터로 받아야 하는 값이 엄청 길다면, 주소가 엄청 길어지기 때문에 사용하는 방식이다. @RequestBody 를 사용하면 클라이언트가 JSON 과 같은 형태로 정보를 제공하면 서버는 이 JSON을 해석하여 클래스로 사용할 수 있게 됩니다. Jackson 라이브러리가 이때 사용이 됩니다. 결국 우리 서버 개발자는 클래스 형태로 파라미터를 받을 수 있는 효과를 누리게 됩니다. 

 

@RequestBody 예제 8 & 9
@ResquestBody 애노테이션을 활용하여 객체와 객체타입 리스트를 수집하는 코드를 작성하였습니다. 

json 을 전달하는 방법을 유의하여 보아야 하는데요. Postman 에서 우선 GET 방식으로 localhost:8080/param/ex8 을 경로로 지정합니다. 그 다음 Body - raw - Json 을 선택하여 Json 을 입력할 준비를 한 다음 value 에 BookDTO 객체를 JSON 형태로 작성합니다.

실행을 시켜 보면 객체가 정상적으로 잘 수집된 것을 확인할 수 있습니다. 

다음은 객체 리스트를 전달하는 ex9 입니다. 

실행을 시켜 보면 리스트가 정상적으로 파라미터가 수집되어 잘 출력되고 있는 것을 확인할 수 있습니다. 

 

@RequestParam 예제 10
다음은 @RequestParam 예제입니다. int bookNo 를 클라이언트로부터 입력받아서 1~10 사이의 숫자를 입력받으면 새로운 BookDTO 를 생성하여서 ResponseEntity<Object> 에 담아서 리턴을 시키는 코드입니다. 이 예제는 ResponseEntity 를 사용하는 이유에 대해서 알아보기 위해서인데요. 어차피 서버가 응답 코드를 만들어주는데, 우리가 응답 코드를 만들어야 하는 이유는 무엇일까? 그 해답이 위 예제에 있습니다. 예를 들어서 클라이언트로부터 int 를 입력받을 거긴 한데, 1~10에 해당하는 int 만 올바른 값으로 인식하고 싶은 경우가 있다는 것이죠. 이 경우 100 을 클라이언트가 입력을 했다면 ResponseEntity 를 사용하여 조건 처리를 하지 않으면 서버는 올바른 값이 들어왔다고 인식하고 응답코드 200 을 내보내게 됩니다. 이런 경우에 ResponseEntity 를 활용하여 400 응답코드를 보내주면 사용자는 '아 내가 형식의 문제는 없지만 값에 문제가 있었기 때문에 에러가 발생이 되었구나'를 인식할 수 있게 됩니다. 

Postman 을 작성하고 실행을 시켜봅니다. 

실행을 하면 서버가 클라이언트에게 위와 같이 객체를 반환해준 것을 볼 수 있습니다. 

 

연습문제 1 ~ 6

======================================== q1========================================


========================================q2===================================

 

======================================q3===================================

=================================q4~6 문제====================================

======================================q4===================================

======================================q5===================================


===============================<<< 문제 5번 vol2 >>>==============================
Q. 학생의 번호를 파라미터로 수집한다. 학생의 번호가 1~3 사이가 아니라면 400 응답코드와 에러메세지를 반환한다. 학생의 번호가 1~3 사이라면 해당 학생정보를 반환한다. 

올바른 값을 입력하면 위처럼 해당하는 학생 객체가 잘 나오는 것을 확인할 수 있습니다. 위에서 조심해야 하는 부분은 학생 번호 no - 1 이 index 번호가 된다는 것을 알고 코드를 작성해야 합니다. 또한 여기서 중요하게 알아야 하는 부분이 하나 더 있는데요. 지금은 IF 조건문에서 둘다 String 을 반환하고 있지만 만약 true 일 경우에는 객체만 던져주고 false 인 경우에는 에러 메시지를 함께 던져주는 String 이라면 이때는 ResponseEntity< >의 제네릭을 생략하고 ResponseEntity 를 사용하면 됩니다


잘못된 값을 입력하면 위와 같은 에러 메세지가 출력되는 것을 확인할 수 있습니다. 


======================================q6===================================
만약 위 코드에서 for 구문을 클라이언트에게 전달하고 싶으면 어떻게 해야할까? 우선, 응답은 한 번밖에 보낼 수 없기 때문에 for 구문을 여러번 반복해서 응답을 보내주는 것은 불가능하다. 따라서 for 구문의 결과를 String 에 append해서 String 을 보내주는 방식으로 처리를 하게 됩니다

위 코드는 q3 에 해당하는 내용인데요. for 구문을 쓰지 않고 어떻게 값을 보내지..? 하는 첫 고민의 결과로 저런 노가다를 작성했었습니다. 

위와 같이 String 에 담아서 전달하는 것이 훨씬 간편한 방법입니다.