6_oHji
6_oHji
ν™˜μ˜ν•©λ‹ˆλ‹€☺
GitHub   Gmail
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (62)
    • πŸ’‘ DEEP DIVE (17)
      • PATTERN (17)
    • πŸ“ 끄적끄적 (4)
    • 🌈 EXPERIENCE (3)
    • πŸ’» PROJECT (3)
    • πŸ“’ STUDY (34)
      • ALGORITHM (1)
      • JAVA (5)
      • FRONT-END (7)
      • BACK-END (10)
      • SPRING (7)
      • NETWORK (3)
      • CLOUD (1)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ

곡지사항

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

κ°œμΈμ •λ³΄

  • ν‹°μŠ€ν† λ¦¬ ν™ˆ
  • μŠ€ν† λ¦¬
  • 포럼
  • 둜그인
hELLO Β· Designed By μ •μƒμš°.
6_oHji
6_oHji
Deep Dive Into Design Patterns - μ±…μž„ 연쇄 νŒ¨ν„΄
πŸ’‘ DEEP DIVE/PATTERN

Deep Dive Into Design Patterns - μ±…μž„ 연쇄 νŒ¨ν„΄

2024. 5. 10. 16:49

πŸ’‘ μ±…μž„ 연쇄(Chain of Responsibility) νŒ¨ν„΄μ΄λž€?

ν•Έλ“€λŸ¬λ“€μ˜ 체인(μ‚¬μŠ¬)을 따라 μš”μ²­μ„ 전달할 수 있게 ν•΄μ£ΌλŠ” 행동 λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€. ν΄λΌμ΄μ–΄νŠΈμ˜ μš”μ²­μ— λŒ€ν•œ μ„Έμ„Έν•œ 처리λ₯Ό ν•˜λ‚˜μ˜ 객체가 λͺ½λ•… ν•˜λŠ” 것이 μ•„λ‹Œ, μ—¬λŸ¬ 개의 처리 κ°μ²΄λ“€λ‘œ λ‚˜λˆ„κ³ , 이듀을 μ‚¬μŠ¬(chain)처럼 μ—°κ²°ν•΄ μ§‘ν•© μ•ˆμ—μ„œ μ—°μ‡„μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 행동 νŒ¨ν„΄μž…λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ 처리 객체듀을 ν•Έλ“€λŸ¬(handler)라고 λΆ€λ₯΄λŠ”λ°, μš”μ²­μ„ λ°›μœΌλ©΄ 각 ν•Έλ“€λŸ¬λŠ” μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆλŠ”μ§€ νŒλ‹¨ν•˜κ³ , μ—†μœΌλ©΄ 체인의 λ‹€μŒ ν•Έλ“€λŸ¬λ‘œ μ²˜λ¦¬μ— λŒ€ν•œ μ±…μž„μ„ μ „κ°€ν•©λ‹ˆλ‹€.

 

μ²˜λ¦¬μ— λŒ€ν•œ μ±…μž„μ„ μš”μ²­μ„ λ³΄λ‚΄λŠ” μͺ½(sender)κ³Ό μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ”(receiver) μͺ½μ„ λΆ„λ¦¬ν•˜μ—¬ 각 객체λ₯Ό λΆ€ν’ˆμœΌλ‘œ λ…λ¦½μ‹œν‚€κ³  결합도λ₯Ό λŠμŠ¨ν•˜κ²Œ λ§Œλ“€λ©°, 상황에 λ”°λΌμ„œ μš”μ²­μ„ μ²˜λ¦¬ν•  객체가 λ³€ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ—λ„ μœ μ—°ν•˜κ²Œ λŒ€μ‘ν•  수 μžˆλ‹€λŠ” μž₯점을 κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 

 

πŸ’‘ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ λ³Έ μ±…μž„ 연쇄 νŒ¨ν„΄

 

  1. Handler : μš”μ²­μ„ μˆ˜μ‹ ν•˜κ³  처리 κ°μ²΄λ“€μ˜ 집합을 μ •μ˜ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€.
  2. BaseHandler : λͺ¨λ“  ν•Έλ“€λŸ¬ ν΄λž˜μŠ€λ“€μ„ λ¬ΆλŠ” 좔상 클래슀둜, 선택적이닀.
  3. ConcreteHandler : μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” μ‹€μ œ 처리 객체둜, ν•Έλ“€λŸ¬μ— λŒ€ν•œ ν•„λ“œλ₯Ό 내뢀에 κ°€μ§€κ³  있으며 λ©”μ„œλ“œλ₯Ό 톡해 λ‹€μŒ ν•Έλ“€λŸ¬λ₯Ό μ²΄μΈμ‹œν‚€κ³  λ‹€μŒ  바라본닀. μžμ‹ μ΄ μ²˜λ¦¬ν•  수 μ—†λŠ” μš”κ΅¬κ°€ λ‚˜μ˜€λ©΄ 바라보고 μžˆλŠ” λ‹€μŒ 체인의 ν•Έλ“€λŸ¬μ—κ²Œ μš”μ²­μ„ λ– λ„˜κΈ΄λ‹€. ConcreteHandler1 - ConcreteHandler2 - ConcreteHandler3 - ... μ΄λŸ°μ‹μœΌλ‘œ 체인 ν˜•μ‹μ΄ κ΅¬μ„±λ˜κ²Œ λœλ‹€.
  4. Client : μš”μ²­μ„ Handlerμ—κ²Œ μ „λ‹¬ν•œλ‹€. μš”μ²­μ€ λͺ¨λ“  ν•Έλ“€λŸ¬μ— 보낼 수 있고, κΌ­ 첫 번째 ν•Έλ“€λŸ¬μΌ ν•„μš”λŠ” μ—†λ‹€.

 

πŸ’‘ μ±…μž„ 연쇄 νŒ¨ν„΄ κ΅¬ν˜„

- Base Handler

// ꡬ체적인 ν•Έλ“€λŸ¬λ₯Ό λ¬ΆλŠ” μΈν„°νŽ˜μ΄μŠ€ (좔상 클래슀)
abstract class Handler {
    // λ‹€μŒ 체인으둜 연결될 ν•Έλ“€λŸ¬
    protected Handler nextHandler = null;

    // μƒμ„±μžλ₯Ό 톡해 μ—°κ²°μ‹œν‚¬ ν•Έλ“€λŸ¬λ₯Ό 등둝
    public Handler setNext(Handler handler) {
        this.nextHandler = handler;
        return handler; // λ©”μ„œλ“œ 체이닝 ꡬ성을 μœ„ν•΄ 인자λ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•¨
    }

    // μžμ‹ ν•Έλ“€λŸ¬μ—μ„œ ꡬ체화 ν•˜λŠ” 좔상 λ©”μ„œλ“œ
    protected abstract void process(String url);

    // ν•Έλ“€λŸ¬κ°€ μš”μ²­μ— λŒ€ν•΄ μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œ 
    public void run(String url) {
        process(url);

        // 만일 ν•Έλ“€λŸ¬κ°€ μ—°κ²°λœκ²Œ μžˆλ‹€λ©΄ λ‹€μŒ ν•Έλ“€λŸ¬λ‘œ μ±…μž„μ„ λ– λ„˜κΈ΄λ‹€
        if (nextHandler != null)
            nextHandler.run(url);
    }
}

 

-  Concrete Handler

class ProtocolHandler extends Handler {
    @Override
    protected void process(String url) {
        int index = url.indexOf("://");
        if (index != -1) {
            System.out.println("PROTOCOL : " + url.substring(0, index));
        } else {
            System.out.println("NO PROTOCOL");
        }
    }
}

class DomianHandler extends Handler {
    @Override
    protected void process(String url) {
        int startIndex = url.indexOf("://");
        int lastIndex = url.lastIndexOf(":");

        System.out.print("DOMAIN : ");
        if (startIndex == -1) {
            if (lastIndex == -1) {
                System.out.println(url);
            } else {
                System.out.println(url.substring(0, lastIndex));
            }
        } else if (startIndex != lastIndex) {
            System.out.println(url.substring(startIndex + 3, lastIndex));
        } else {
            System.out.println(url.substring(startIndex + 3));
        }
    }
}

class PortHandler extends Handler {
    @Override
    protected void process(String url) {
        int index = url.lastIndexOf(":");
        if (index != -1) {
            String strPort = url.substring(index + 1);
            try {
                int port = Integer.parseInt((strPort));
                System.out.println("PORT : " + port);
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }
    }
}

 

-  Client

class Client {
    public static void main(String[] args) {
        // 1. ν•Έλ“€λŸ¬ 생성
        Handler handler1 = new ProtocolHandler();
        Handler handler2 = new DomianHandler();
        Handler handler3 = new PortHandler();

        // 2. ν•Έλ“€λŸ¬ μ—°κ²° μ„€μ • (handler1 → handler2 → handler3)
        handler1.setNext(handler2).setNext(handler3);

        // 3. μš”μ²­μ— λŒ€ν•œ 처리 연쇄 μ‹€ν–‰
        String url1 = "<http://www.youtube.com:80>";
        System.out.println("INPUT: " + url1);
        handler1.run(url1);

        System.out.println();

        String url2 = "<https://www.inpa.tistory.com:443>";
        System.out.println("INPUT: " + url2);
        handler1.run(url2);

        System.out.println();

        String url3 = "";
        System.out.println("INPUT: " + url3);
        handler1.run(url3);
    }
}

 

πŸ’‘ 마무리

μ±…μž„ 연쇄 νŒ¨ν„΄μ€

  1. νŠΉμ • μš”μ²­μ„ 2개 μ΄μƒμ˜ μ—¬λŸ¬ κ°μ²΄μ—μ„œ νŒλ³„ν•˜κ³  μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ
  2. νŠΉμ • μˆœμ„œλ‘œ μ—¬λŸ¬ ν•Έλ“€λŸ¬λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•  λ•Œ
  3. ν”„λ‘œκ·Έλž¨μ΄ λ‹€μ–‘ν•œ 방식과 μ’…λ₯˜μ˜ μš”μ²­μ„ μ²˜λ¦¬ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜μ§€λ§Œ μ •ν™•ν•œ μš”μ²­ μœ ν˜•κ³Ό μˆœμ„œλ₯Ό 미리 μ•Œ 수 없을 λ•Œ
  4. μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆλŠ” 객체 집합이 λ™μ μœΌλ‘œ μ •μ˜λ˜μ–΄μ•Ό ν•  λ•Œ (체인 연결을 λŸ°νƒ€μž„μ—μ„œ λ™μ μœΌλ‘œ μ„€μ •)

에 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ±…μž„ 연쇄 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” 처리 객체의 체인 μ§‘ν•© λ‚΄λΆ€μ˜ ꡬ쑰λ₯Ό μ•Œ ν•„μš”κ°€ μ—†κ³ , 각각의 체인은 μžμ‹ μ΄ ν•΄μ•Όν•˜λŠ” 일만 ν•˜κΈ° λ•Œλ¬Έμ— μƒˆλ‘œμš΄ μš”μ²­μ— λŒ€ν•œ 처리 객체 생성이 νŽΈλ¦¬ν•΄μ§‘λ‹ˆλ‹€(SRP μ€€μˆ˜). λ˜ν•œ, κΈ°μ‘΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  ν•Έλ“€λŸ¬λ₯Ό 체인에 λ™μ μœΌλ‘œ μΆ”κ°€ν•˜κ±°λ‚˜ 처리 μˆœμ„œλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€(OCP μ€€μˆ˜).

 

κ·ΈλŸ¬λ‚˜, μš”μ²­μ΄ λ°˜λ“œμ‹œ μˆ˜ν–‰λœλ‹€λŠ” 보μž₯이 μ—†μŠ΅λ‹ˆλ‹€. (체인 λκΉŒμ§€ κ°”λŠ”λ°λ„ μ²˜λ¦¬λ˜μ§€ μ•Šμ„ 수 있음.)

 

 

μ±…μž„ 연쇄 νŒ¨ν„΄

/ λ””μžμΈ νŒ¨ν„΄λ“€ / 행동 νŒ¨ν„΄ μ±…μž„ 연쇄 νŒ¨ν„΄ λ‹€μŒ μ΄λ¦„μœΌλ‘œλ„ λΆˆλ¦½λ‹ˆλ‹€: CoR, μ»€λ§¨λ“œ μ‚¬μŠ¬, Chain of Responsibility μ˜λ„ μ±…μž„ 연쇄 νŒ¨ν„΄μ€ ν•Έλ“€λŸ¬λ“€μ˜ 체인​(μ‚¬μŠ¬)​을 따라 μš”μ²­μ„ 전달할 수 있게

refactoring.guru

 

πŸ’  Chain Of Responsibility νŒ¨ν„΄ - μ™„λ²½ λ§ˆμŠ€ν„°ν•˜κΈ°

Chain Of Responsibility Pattern μ±…μž„ 연쇄 νŒ¨ν„΄(Chain Of Responsibility Pattern, COR)은 ν΄λΌμ΄μ–΄νŠΈμ˜ μš”μ²­μ— λŒ€ν•œ μ„Έμ„Έν•œ 처리λ₯Ό ν•˜λ‚˜μ˜ 객체가 λͺ½λ•… ν•˜λŠ” 것이 μ•„λ‹Œ, μ—¬λŸ¬κ°œμ˜ 처리 κ°μ²΄λ“€λ‘œ λ‚˜λˆ„κ³ , 이듀을 사

inpa.tistory.com

 

λ°˜μ‘ν˜•
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)
    'πŸ’‘ DEEP DIVE/PATTERN' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • Deep Dive Into Design Patterns - λΉŒλ” νŒ¨ν„΄
    • Deep Dive Into Design Patterns - ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄
    • Deep Dive Into Design Patterns - ν”„λ‘μ‹œ νŒ¨ν„΄
    • Deep Dive Into Design Patterns - μ€‘μž¬μž νŒ¨ν„΄
    6_oHji
    6_oHji
    끄적끄적

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”