게시판의 게시글을 읽거나 유튜브의 영상을 시청할 때 얼마나 많이 시청 했는지 나타내는 값이다. 해당 값을 통해 어떤 카테고리의 글이나 영상이 인기가 많은지 확인할 수 있다. 하지만 단순히 방문을할 때 조회수가 증가되도록 로직을 구성하면 조회수가 계속 증가하게 될 것이다. 이를 방지하기 위해서 쿠키를 사용할 수 있다. 쿠키란 간단하게 말하면 웹 서버에서 웹 클라이언트에게 전달하여 사용하는 것으로 서버의 요청이 있을 때 다시 서버로 돌려주는 문자열 정보를 말한다.
@Modifying
@Query("update Article a set a.views = a.views + 1 where a.id = :id")
fun updateViews(id: Long): Int
@Modifying 어노테이션에 관한 설명
Queries that require a @Modifying
annotation include INSERT, UPDATE, DELETE, and DDL statements.
일반적으로 JPQL을 사용할 때 @query()에 파라미터로 select 문을 넣어주곤한다. 하지만 그왜에 상태를 변경하는 쿼리를 요청할 경우 @Modifying
어노테이션이 필요하다.
fun didYouVisit(request: HttpServletRequest,
response: HttpServletResponse, id: Long): Boolean
{
var isVisited = false
var oldCookie: Cookie? = null
var cookies = request.cookies
cookies?.let{
for(cookie in cookies) {
if(cookie.name.equals("postView")) oldCookie = cookie
}
}
if(oldCookie != null){
if(!oldCookie!!.value.contains("[${id}]")){
isVisited = true
oldCookie!!.value= oldCookie!!.value+ "_[${id}]"
oldCookie!!.path= "/"
oldCookie!!.maxAge= 60 * 60 * 24
}
} else{
var newCookie = Cookie("postView", "[${id}]")
newCookie.path= "/"
newCookie.maxAge= 60 * 60 * 24
response.addCookie(newCookie)
}
return isVisited
}
위와같이 한번 만들어 보았다. 기능에 대해 간략히 설명해보겠다.
우선 HttpServletRequeset 파라미터 값으로부터 여러개의 cookie들을 받는다. 그 쿠기들 중에 postView 라는 이름을 가진 쿠키를 찾아내고 거기에 게시글의 id 값이 포함되어 있다면 조회수를 증가시키지 않고 포함되어 있지 않다면 조회수를 증가시키고 조회글 id 값을 postview 쿠키에 넣어서 클라이언트에게 전달하게 된다.