Spring 게시판 URL 이해하기

2019-10-14

게시판을 만들면서 모든 게시물의 리스트를 보여주는 list.jsp를 만들었다.

여기서 title을 클릭하면 해당 게시물로 이동할 수 있게 아래의 코드가 있다.

<a href='/read${pageMaker.makeSearch(pageMaker.cri.page)}&bno=${boardVO.bno}'>
${boardVO.title}</a>

검색기능을 만들면서 수정하다 보니 본문으로 이동하는 링크가 꽤 복잡해졌다. 이 자체로는 문제가 없지만 필자는 mainlist.jsp라는 걸 만들고 싶었다. 조회수 기준으로 인기가 있는 게시물을 메인 페이지에 출력해주는 jsp 파일이다. 문제는 저 링크를 그대로 가져다 사용하면 게시물로 이동을 못한다. 그러면 다른 jsp에서는 어떻게 게시물 본문으로 이동가능하게 만들까?

결론부터 이야기 하자면 <a class="card-link" href='/read?bno=${boardVO.bno}'></a> 이렇게 하면 된다. 어떻게 저 패턴인지를 알았냐면 Controller에 정의된 항목을 보면 알 수 있다.

@RequestMapping(value = "/read", method = RequestMethod.GET)
	  public void read(@RequestParam("bno") int bno, Model model) throws Exception

read라는 기능을 담당하는 Controller에는 위와 같이 정의되어 있다. 저 말은 즉 /read후에 RequestParam을 통해 bno를 가져온다는 것이다. 그러므로 bno만 있으면 read기능을 사용할 수 있다는 것이다. 그래서 저렇게 만들어 주면 다른 페이지에서도 read기능을 사용해 게시글 본문으로 갈 수 있다.

${pageContext.request.contextPath}

그 다음 문제는 jsp끼리 이동할때 발생하는 문제다.

header.jsp에 원래는 이렇게 정의를 해두었다.

그러면 리스트를 눌렀을때는 /list이렇게 갈것이고 회원가입을 누르면 /user/register이렇게 URL을 찾아갈 것이다. 근데 문제는 회원가입을 누른 후 리스트를 누르면 주소가 /user/list로 이상하게 꼬여서 원래 리스트 페이지를 찾아가지 못한다. 이걸로 몇일을 고민하다가 영어로 그냥 검색하니 바로 해결책이 나왔다.

<a class="nav-link" href="list">리스트</a>
<a class="nav-link" href="/user/register">회원가입</a>

${pageContext.request.contextPath} 이걸 사용하면 문제는 해결된다.

위 코드의 의미는 항상 Application root를 반환한다.

즉 회원가입 페이지에서 리스트 페이지를 눌러도 이제는 /user가 앞에 나오지 않고 루트 /가 나와서 주소가 꼬이지 않고 /list로 이동시켜준다.

<a class="nav-link" href="${pageContext.request.contextPath}/list">리스트</a>
<a class="nav-link" href="/user/register">회원가입</a>