queryParam이 없는 경우, 여러개 있는경우 (multivaluedMap 사용) 관련질문
1097
작성한 질문수 44
수업에서 같은 키를 가진 쿼리 파라미터가 여러개인 경우
MultiValueMap을 쓰면 된다고 하셔서 적용해 봤는데요
같은 리소스에 대해
1. 파라미터가 없는 경우
2. 같은 파라미터가 여러개(1개이상)인 경우
Q1) 이 2가지를 적용하고자 하면 아래와 같이 하면될까요?
Q2) @RequestParam(required=false) 설정 했음에도 쿼리 파라미터를 넣지 않으면 nullpoint에러가 떠,
@Nullable을 추가하였는데 이 방법이 맞는건가요?
---
Status 에 맞는 조건에 따라 결과 값을 출력해주고 싶은건데
a. 스테이터스가 없으면 전체 list 출력
b. 스테이터스가 있으면 해당하는 (ex> new, reserved) status에 해당하는 list 출력
-----
같은 리소스에 대해 요청을 받는거라면 한 method내에 있는게 맞는 것 같아 이렇게 코딩하였는데
MultiValueMap을 사용하고 requestParam에 false를 주어
파라미터 가 없는 경우를 처리하려 했으나
정의한 status enum값에 없는 쿼리 파라미터를 넣었을 때 예외 처리 작업, jpa에서 in절 사용 에 넣어줄 파라미터 값으로 변환 작업 등 (이전에 jpa수업에서 질문하였을때, 순수 jpa로 연습하라하셔서 순수 jpa로 연습중) 으로
controller내에서 로직이 너무 길게 있는것 같아, 좋은 방법이 아닌것 같습니다.
Q2) MultiValueMap외에 같은 파라미터를 여러개 받을수 있는 방법이 있을까요?
Q3) url 경로는 contoller와 밀접한 거라 controller로직내에 작성하였는데 이런 경우면 service로직에 넣어주는게 맞을까요?
답변주시면 감사드리겠습니다.
private final String[] STATUS_PARAMS = {"new", "complete", "reserve"};
private final String GET_ALL_POST_PARAM_KEY = "status";
@ApiImplicitParams({
@ApiImplicitParam(name = "status", required = false ,dataTypeClass = String.class, paramType = "query"),
@ApiImplicitParam(name = "status", required = false ,dataTypeClass = String.class, paramType = "query"),
@ApiImplicitParam(name = "status", required = false ,dataTypeClass = String.class, paramType = "query")
})
@GetMapping()
public GetAllPostResponseDto getAllPost(
@ApiIgnore @RequestParam(required = false) @Nullable MultiValueMap<String, String> statuses,
@ApiIgnore HttpSession session){
getSessionCheckedAccount(session);
if (statuses.size() == 0){
List<Post> posts = postService.findAll();
return new GetAllPostResponseDto(posts);
}
boolean keyMatch = !statuses.keySet().stream().allMatch(GET_ALL_POST_PARAM_KEY::equals);
boolean statusMatch = !Arrays.asList(STATUS_PARAMS).containsAll(statuses.get(GET_ALL_POST_PARAM_KEY));
if(keyMatch || statusMatch){
throw new IllegalArgumentException("잘못된 경로 입니다.");
}
List<PostStatus> postStatuses = statuses.get(GET_ALL_POST_PARAM_KEY)
.stream().map(String::toUpperCase)
.map(PostStatus::valueOf)
.collect(toList());
List<Post> posts = postService.findAllByStatuses(postStatuses);
return new GetAllPostResponseDto(posts);
}
public List<Post> findAllByStatuses(List<PostStatus> postStatuses){
return em.createQuery("select p from Post p" +
" join fetch p.seller s" +
" join fetch p.postCategory pc" +
" join fetch pc.category c" +
" where p.postStatus in (:statuses)", Post.class)
.setParameter("statuses", postStatuses)
.getResultList();
}
답변 1
0
안녕하세요. 유승현님
다음 코드를 참고해주세요.
http://localhost:8080/params?value=a&value=b
package com.example.springmvcaccpet;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Slf4j
@RestController
public class ParamsController {
@GetMapping("/params")
public String params(@RequestParam(value = "value", required = false) List<String> values) {
for (String value : values) {
System.out.println("value = " + value);
}
return "test";
}
}
url 경로에 대한 부분은 컨트롤러나 인터셉터에서 처리하는 것이 맞습니다.
감사합니다.
mvc 패턴 - 적용 강의에서 회원가입할 때 redirect가 아닌 forward인 이유가 궁금합니다.
0
29
1
servlet과 container에 대한 질문입니다
0
54
1
api를 어느 컨트롤러에 작성해야하는지는 어떤 기준으로 해야하나요?
0
84
1
jsp 의존성 수정 요청
0
122
2
요즘 웹 서버가 주로 사용되는 이유는 SPA 구조 때문일까요 ?
0
158
1
save() 메서드 문의
0
77
1
절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상
0
112
1
request-body-json
0
94
2
MVC 패턴의 적용 단위
0
103
1
RequestMapping을 이용한 핸들러, 어댑터
0
124
2
save 후 결과화면
0
100
2
jsp를 이용한 view
0
102
1
application.properties에 debug 추가해도 결과가 똑같습니다.
0
189
1
수업 코드 제공 관련 문의
0
106
2
RequestMappingHandlerAdapter의 Controller 호출 과정
0
109
3
파일 오픈 시
0
75
1
스프링 배치 관련
0
81
1
@RequestParam의 defaultValue가 blank 값도 처리하는 지 여부
0
115
1
postman으로 /request-body-json-v1 호출시 500 error
0
105
1
프론트엔드와 백엔드의 mvc, rest api에 대한 질문
0
90
1
모델의 역할과 계층 분리에 대한 이해 차이 + 추가질문
0
119
1
console log 출력 관련 질문입니다.
0
79
1
애플리케이션이 실행 되지 않습니다 ㅠㅠㅠ
0
146
1
html 변경하는 부분 적용 문제
0
108
1





