
요청을 보내는 쪽(Sender)과 요청을 처리하는 쪽(Receiver)을 분리하는 패턴


public class Request {
private String body;
public Request(String body) {
this.body = body;
}
public String getBody() {
return body;
}
}
public class RequestHandler {
public void handler(Request request) {
System.out.println(request.getBody());
}
}
기본 처리자, 그저 요청 내용 출력
public class LoggingRequestHandler extends RequestHandler {
@Override
public void handler(Request request) {
System.out.println("로깅");
super.handler(request);
}
}
(1) 로깅을 출력하고, (2) 부모의 handler() 호출 (요청 본문 출력)
public class AuthRequestHandler extends RequestHandler {
public void handler(Request request) {
System.out.println("인증이 되었나?");
System.out.println("이 핸들러를 사용할 수 있는 유저인가?");
super.handler(request);
}
}
(1) 인증 검사, (2) 부모의 handler() 호출 (요청 본문 출력)
public static void main(String[] args) {
RequestHandler chain = new AuthRequestHandler(
new LoggingRequestHandler(
new PrintRequestHandler(null)
)
);
Client client = new Client(chain);
client.doWork();
}
연결구조 : Auth-> Logging -> Print
Request request = new Request("이번 놀이는 뽑기입니다.");
requestHandler.handle(request);
System.out.println("인증이 되었는가?");
super.handle(request);
각 객체는 자기 책임만 처리한다.

ex1) 서블릿 필터체인
@WebFilter(urlPatterns = "/hello")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("게임에 참하신 여러분 모두 진심으로 환영합니다.");
chain.doFilter(request, response);
System.out.println("꽝!");
}
}
chain.doFilter(request, response); => 다음 필터나 다음 처리 단계로 넘기기
ex2) 스프링 필터
1. 인증 필터
2. 로깅 필터
3. CORS 필터
4. 인코딩 필터