본문 바로가기

WEB

@PathVariable와 model.addAtribute

@PathVariable

URI에 변수를 넣고 싶을 때 사용한다. 사용방법은 매우 다양 


model.addAtribute

view에 담을 데이터를 담는 공간, 이것도 방식이 많다. 그중 가장 내 기준에 직관적인 것을 사용하였다.

Model addAttribute(String attributeName, @Nullable Object attributeValue);

첫 번째 파라미터인 attributeName는 view 페이지, 다시 말해 html에 해당 string이 있어야 한다.

두 번째 파라미터 attributeValue는 메소드내에 있어야 한다.


 

 //MemberController
 
@PostMapping("form")
    public String addMember(Member member, Model model) {
        Member savedMember = memberRepository.save(member);
        model.addAttribute("member", savedMember);
        return "selectClass";
    }

@GetMapping("form/warrior/id={memberId}")
    public String selectWarrior(@PathVariable(name ="memberId") Long memberId, Model model) {
        Member member = memberRepository.findById(memberId);
        memberService.pickClass(member, ClassType.Warrior);

        //뷰에 보낼 데이터
        model.addAttribute("member", member);

        return "member";
    }
    
//selectClass.html

<div class="col">
    <button class="w-100 btn btn-primary btn-lg"
            th:onclick="|location.href='@{/form/warrior/id={memberId}(memberId=${member.id})}'|"
            type="button">Warrior</button>
</div>

 


SelectClass.html

위 페이지는 유저이름을 설정한 뒤다. 유저 이름을 설정하면 아래 포스트매핑 매서드로 인해 뷰에 데이터가 전달된다.

@PostMapping("form")
public String addMember(Member member, Model model) {
    Member savedMember = memberRepository.save(member);
    model.addAttribute("member", savedMember);
    return "selectClass";
}

 

그 결과 SelectClass 타임리프 문법 내 변수였던 memberId가 결정된다. 그래서 warrior라는 버튼을 클릭하면

 

http://localhost:8080/form/warrior/id=4 URI로 이동하게 되고 아래 메소드가 수행된다.

 

@GetMapping("form/warrior/id={memberId}")
    public String selectWarrior(@PathVariable(name ="memberId") Long memberId, Model model) {
        Member member = memberRepository.findById(memberId);
        memberService.pickClass(member, ClassType.Warrior);

        model.addAttribute("member", member);

        return "member";
    }

 

이 메소드가 수행됨에 따라 아래 페이지가 보이게 된다.