1. μ± μ μ°μ ν¨ν΄(Chain of Responsibility pattern)
μ± μ μ°μ ν¨ν΄μ νΈλ€λ¬λ€μ 체μΈ(μ¬μ¬)μ λ°λΌ μμ²μ μ λ¬ν μ μκ² ν΄μ£Όλ νλ λμμΈ ν¨ν΄μ΄λ€. κ° νΈλ€λ¬λ μμ²μ λ°μΌλ©΄ μμ²μ μ²λ¦¬ν μ§ λλ 체μΈμ λ€μ νΈλ€λ¬λ‘ μ λ¬ν μ§ κ²°μ νλ€.
μ± μ μ°μ ν¨ν΄μ μ¬μ©νλ©΄ SRP λ₯Ό μ§ν¬ μ μλ€. SRP λ κ°μ²΄λ λ¨ νλμ μ± μμ κ°μ ΈμΌ νλ€λ μμΉμ΄λ€. μ¦, λ³κ²½λμ΄μΌ ν μ΄μ λν νκ°μ§μ¬μΌ νλ€λ μλ―Έμ΄λ€. μ± μ μ°μ ν¨ν΄μ μ¬μ©νλ©΄ κ° νΈλ€λ¬μκ² μ± μμ λ§‘κΈ°κ³ νΈλ€λ¬ μ± μ μΈμλ λ€λ₯Έ νΈλ€λ¬μκ² μμνκΈ° λλ¬Έμ SRP λ₯Ό μ§ν¬ μ μλ€.
μ± μ μ°μ ν¨ν΄μ μμ²μ 보λ΄λ 주체μ μμ²μ μ²λ¦¬νλ 주체λ₯Ό λΆλ¦¬νλ ν¨ν΄μΌλ‘ μμ²μ 보λ΄λ μ£Όμ²΄κ° μμ²μ μ²λ¦¬νλ νΈλ€λ¬κ° ꡬ체μ μΈ νμ μ μκ΄μμ΄ λ컀νλ§ λ μνμμ μ²λ¦¬ κ°λ₯νλλ‘ ν΄μ£Όλ ν¨ν΄μ΄λ€.
sample code : Client
class Main {
public static void main(String[] args) {
RequestHandler chainingRequestHandler =
new RequestHandler(
new RequestUuidHandler(
new RequestLoggingHandler(null)));
final Client client = new Client(chainingRequestHandler);
client.doWork("hello request");
}
}
class Client {
private final RequestHandler requestHandler;
public Client(final RequestHandler requestHandler) {
this.requestHandler = requestHandler;
}
void doWork(final String request) {
requestHandler.handle(request);
}
}
sample code : RequestHandler Chaining
// RequestHandler
public class RequestHandler {
private RequestHandler nextHandler;
public RequestHandler(RequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
public void handle(String request) {
nextHandler.handle(request);
}
}
// RequestLoggingHandler
public class RequestLoggingHandler extends RequestHandler {
private RequestHandler nextHandler;
public RequestLoggingHandler(RequestHandler nextHandler) {
super(nextHandler);
}
@Override
public void handle(final String request) {
System.out.println("2. request logging start ======================");
System.out.println("logging request : " + request);
System.out.println("2. request logging end ======================");
if (nextHandler == null) {
return;
}
super.handle(request);
}
}
// RequestUuidHandler
public class RequestUuidHandler extends RequestHandler {
private RequestHandler nextHandler;
public RequestUuidHandler(RequestHandler nextHandler) {
super(nextHandler);
}
@Override
public void handle(final String request) {
System.out.println("1. request uuid start ======================");
UUID uuid = UUID.randomUUID();
System.out.println("request uuid : " + uuid.toString());
super.handle(request);
System.out.println("1. request uuid end ======================");
}
}
Result

2. μ± μ μ°μ ν¨ν΄μ μ₯λ¨μ
μ± μ μ°μ ν¨ν΄μ μ₯μ μ SRP λ₯Ό μ§ν€λ©΄μ κΈ°λ₯μ μΆκ°ν μ μλ€. μλ‘μ΄ κΈ°λ₯μ μΆκ°νκ³ μΆμ κ²½μ° μλ‘μ΄ νΈλ€λ¬λ₯Ό λ±λ‘νκ³ μμλ₯Ό κ²°μ νλ©΄ ν΄λΌμ΄μΈνΈ μ½λ λ³κ²½μμ΄ κΈ°λ₯μ μΆκ°ν μ μλ€.
κ·Έλ¦¬κ³ μμ²μ μ²λ¦¬ μμλ₯Ό μ μ΄νκ³ νΉμ μμ²μ νν΄μλ§ μ€ν κ°λ₯νλλ‘ μ€μ μ΄ κ°λ₯νλ€. νμ§λ§ νΉμ μμ²μ΄ μ²λ¦¬λμ§ μμ μ μκΈ° λλ¬Έμ μ£Όμν΄μΌ νλ€.
λ¨μ μ λλ²κΉ μ΄ λ²κ±°λ‘λ€. filter chaining μ ν΅ν νΈλ€λ¬κ° μ¦κ°νλ©΄ μνλ νΈλ€λ¬λ₯Ό μ°ΎκΈ° μν΄ μ²΄μ΄λ λμ΄ μλ νΈλ€λ¬λ₯Ό νμν΄μΌ νκΈ° λλ¬Έμ λ²κ±°λ‘λ€.
3. μ± μ μ°μ ν¨ν΄ μμ
μ€νλ§ μν리ν°μμ filter chain λ₯Ό κΈ°λ°ν΄μ μΈμ¦, μΈκ° κΈ°λ₯μ μ 곡νλ€.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// do something before the rest of the application
chain.doFilter(request, response); // invoke the rest of the application
// do something after the rest of the application
}
Reference
- spring security architecture reference : https://docs.spring.io/spring-security/reference/servlet/architecture.html
- [refactoring.guru] μ± μ μ°μ ν¨ν΄ : https://refactoring.guru/ko/design-patterns/chain-of-responsibility
- [inflearn] μ½λ©μΌλ‘ νμ΅νλ GoFμ λμμΈ ν¨ν΄
'π programming-language > java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| νΌμ¬λ ν¨ν΄(Facade Pattern) (0) | 2024.07.08 |
|---|---|
| 컀맨λ ν¨ν΄(command pattern) (0) | 2024.07.08 |
| μ±κΈν€ ν¨ν΄(singleton pattern) (0) | 2024.07.03 |
| μ λ° μ°μ°μλ BigDecimal μ μ¬μ©νμ (0) | 2024.04.24 |
| Garbage Collector simple summary (0) | 2024.03.04 |