인프런 커뮤니티 질문&답변

어니님의 프로필 이미지
어니

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

상품 상세

다중맵핑과 템플릿 분기

작성

·

212

1

상품 상세(조회)와 상품 수정(조회)는 로직이 같기 때문에

이전에 배웠던 다중맵핑을 사용하면 될 것 같은데요

@GetMapping("/{itemId}/edit")
public String editForm(@PathVariable Long itemId, Model model) {
Item item = itemRepository.findById(itemId);
model.addAttribute("item", item);
return "basic/editForm";
}

@GetMapping("/{itemId}")
public String item(@PathVariable Long itemId, Model model) {
Item item = itemRepository.findById(itemId);
model.addAttribute("item", item);
return "basic/item";
}

다중맵핑을 한 후 템플릿은 조건에 따라 다르게 지정하고 싶은데

조건문 말고 다른 좋은 방법은 없나요?

맵에 넣어서 하고 싶은데

@PathVariable로 URL이 변하니까 안될 것 같고요

실무에선 이런 경우에 어떻게 처리하는지 궁금합니다.

@GetMapping({"/{itemId}", "/{itemId}/edit"})
    public String item(@PathVariable long itemId, Model model, HttpServletRequest request) {
        Item findItem = itemRepository.findById(itemId);
        model.addAttribute("item", findItem);

        String viewName = "basic/item";

        if(request.getRequestURI().endsWith("edit"))
            viewName = "basic/editForm";

        return viewName;
    }

답변 1

2

안녕하세요. 어니님, 공식 서포터즈 David입니다.

개인적으로는 조회와 수정을 명확히 분리하는 것을 더 선호합니다.

만약 코드 중복이 과하다면 컨트롤러 내 로직을 별도의 메서드로 뽑아낼 것 같습니다.

감사합니다.

어니님의 프로필 이미지
어니
질문자

댓글 감사합니다. 예시의 수정이라는 말이 혼동을 드린 것 같은데 둘은 같은 조회입니다.

물론 상품 상세조회와 수정을 위한 조회를 목적으로 구분지어 나눌 수 있겠으나

위는 이해를 돕기위한 예시이고...

질문의 요지는 @PathVariable을 사용한 다중맵핑에

URL별 템플릿 이름의 리턴 방법이 조건문으로 처리하는 것 외에 스프링만의 편의기능이 있는지요..

@RequestMapping( {"/{itemId}", "/{itemId}/XXX", "/{itemId}/YYY"} )

/{itemId} -> "basic/items"

/{itemId}/XXX ->"basic/item"

/{itemId}/YYY -> "baisic/items"

반드시 다중매핑을 이용하셔야 한다면 분기문을 추가하는 수 밖엔 없는 것 같습니다.

어니님의 프로필 이미지
어니
질문자

감사합니다

어니님의 프로필 이미지
어니

작성한 질문수

질문하기