본문 바로가기
Java & Kotlin/Java

Servlet Filter의 response의 PrintWriter를 close 해야할까?

by devson 2021. 2. 24.

Spring으로 웹개발을 하다보면 Security 등의 이유로 Servlet Filter를 사용할 때가 있다.

 

코드를 예로 들면 아래와 같다.

import javax.servlet.Filter
import javax.servlet.FilterChain
import javax.servlet.ServletRequest
import javax.servlet.ServletResponse
import javax.servlet.http.HttpServletRequest

class MyFilter : Filter {
    override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
        request as HttpServletRequest

        if (request.requestURI == "/") {
            response.contentType = "application/json"
            response.writer.println("""{"message": "Hello World!"}""")
            return
        }

        chain.doFilter(request, response)
    }
}

위 코드에서 response.writer(java.io.PrintWriter)를 사용하는데, IO를 사용하는 코드기 때문에 close 메서드를 호출해야하지 않을까?


이에 대한 대답은 No 이다.

 

 

ServletResponseServlet Container에서 관리를 하고 ServletResponse의 life cycle이 끝날 때 close를 한다고 한다.

이를 어떻게 보면 부수 효과를 일으키지 않는 doFilter 메서드를 만드는 것이다.

The general rule of them is this: if you opened the stream, then you should close it. If you didn't, you shouldn't. Make sure the code is symmetric.

 

그렇기 때문에 close를 호출하지않는 것이 좋다.

 

Reference

댓글