๐ ๋ฐฐ๊ฒฝ
sendRedirect()๋ ํ ๋ฒ๋ง ํธ์ถ์ด ๊ฐ๋ฅํ๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
๋ง์ฝ ํ๋์ Response์์ sendRedirect()๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถ์ ์๋ํ๋ ๊ฒฝ์ฐ, java.lang.IllegalStateException : Cannot call sendRedirect() after the response has been committed ๋ฉ์์ง์ ํจ๊ป ์์ธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ํน์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ค ๊ธฐ๋ฅ์ด HttpServletResponse๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์ ๋ด๋ถ์ ์ผ๋ก sendRedirect๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์๋ sendRedirect๋ฅผ ๋ง๊ฑฐ๋ ์ฐํํ ์๋ ์๋ ๊ฑธ๊น?
์์ ) cors ๋ฌธ์ ๋ฐ์, ํน์ ๋๋ฉ์ธ ๊ฒฝ๋ก๋ก ๊ฐ๋ ๊ฒ ๋ง์์ ๋ค์ง ์๋ ๊ฒฝ์ฐ ๋ฑ
โ๏ธ ์์
public class ExternalLib {
private final HttpServletResponse response;
public ExternalLib(HttpServletResponse response) {
this.response = response;
}
public void call() {
System.out.println("๊ธฐ๋ฅ ์ํ ์์!");
System.out.println("call() ์๋ ๋์ถฉ ์์ฒญ๋ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์.");
try {
this.response.sendRedirect("https://shiba-holic.tistory.com/");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
ExternalLib๋ call์ด๋ผ๋ API๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. ํด๋น API๋ ๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๊ณ ์์ฑ์์์ ์ ๋ฌ๋ฐ์ response์ sendRedirect()๋ฅผ ํธ์ถํ๋ค.
@Component
public class ShibaFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
ExternalLib externalLib = new ExternalLib(response);
externalLib.call();
response.sendRedirect("https://www.naver.com");
}
}
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์๋ ํํฐ์์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๊ฒ ๋์ง๋ง, ์๊ธฐ๊ฐ ์ํ๋ ๋๋ฉ์ธ์ ๊ฐ์ผ๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์ด์ Redirect๋ฅผ ๋ณ๊ฒฝํ๋ค.
ํ์ง๋ง sendRedirect()๋ ํ ๋ฒ๋ง ํธ์ถ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ์์ธ๊ฐ ๋ฐ์ํ๋ค.
๐ ํด๊ฒฐ
์ด๋ฐ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น?
ํ์๋ ํด๋น ์ผ์ด์ค์์ ๋๋ฆฌ ํด๋์ค(Delegator)๋ฅผ ์์ฑํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
public class HttpServletResponseDelegator extends HttpServletResponseWrapper {
public HttpServletResponseDelegator(HttpServletResponse response) {
super(response);
}
@Override
public void sendRedirect(String location) throws IOException {
// ignored
}
}
Spring์์๋ Response ๋ฉ์๋ ๊ธฐ๋ฅ์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํตํด ์ง์ ๊ตฌํํ ์ ์๊ฒ ํด์ฃผ๋ HttpServletResponseWrapper๋ผ๋ Wrapper ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค.
ํด๋น ํด๋์ค๋ฅผ ์์๋ฐ์ ๋๋ฆฌ ํด๋์ค(Delegator)๋ฅผ ์์ฑํด์ ๊ธฐ์กด Response๋ฅผ ๋๊ฒจ๋ฐ๊ณ , sendRedirect๋ ์ค๋ฒ๋ผ์ด๋ ํด์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ฌด๋ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๋๋ก ๋ง๋ค๋ฉด ๋๋ค.
@Component
public class ShibaFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
ExternalLib externalLib = new ExternalLib(new HttpServletResponseDelegator(response));
externalLib.call(); // ์ด๋ํ์ง ์์
response.sendRedirect("https://www.naver.com"); // ์ํ๋ ๊ฒฝ๋ก๋ก ์ค์ ๊ฐ๋ฅ!
}
}
ํด๋น ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ง์ ํ ๊ฒฝ๋ก๋ก ๋ฆฌ๋๋ ์ ๋์ง ์๊ฒ ๋๊ณ , ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ๊ณ ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฒฝ๋ก๋ก ๋ฆฌ๋๋ ์ ์ด ๊ฐ๋ฅํด์ง๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ๋์ผํ ํจํค์ง ํด๋์ค ์์ฑ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์ ์์ ํ๊ธฐ (0) | 2023.10.07 |
---|---|
Spring ์ธํ ๋ฆฌ์ ์ด Service, Common, Batch ๋ชจ๋ ๋ถ๋ฆฌํ๊ธฐ (Maven) (0) | 2023.09.17 |
nginx์์ ์๋ฒ๋ก ๋๋ฉ์ธ ์ ๋ฌํ๊ธฐ (0) | 2023.08.26 |
Spring message ChannelInterceptor ๋ฉ์๋ ํน์ง (0) | 2023.07.23 |
Spring RedisSerializer ์ข ๋ฅ์ ํน์ง (0) | 2023.07.15 |
๋๊ธ