안녕하세요! 오늘은 가상자산 과세 시행이 2027년으로 연기된 소식을 전해드리려고 해요. 💰

주요 변경사항 ❗

더불어민주당이 가상자산 소득에 대한 과세를 2년 더 유예하기로 했어요. 당초 2025년부터 시행될 예정이었던 과세가 2027년으로 미뤄지게 된 거죠. 📅

과세 방식은 이렇게 됩니다 📊

  • 연간 소득 250만원 초과 시 과세
  • 세율은 지방세 포함 22%
  • 양도소득과 대여소득이 과세 대상

왜 또 미뤄졌을까요? 🤔

제도 정비가 더 필요하다는 게 주요 이유인데요. 그동안:

  • 공제한도 상향(250만원 → 5,000만원)
  • 유예 기간 조정(2~3년) 등 다양한 방안이 논의됐어요.

해외는 어떨까요? 🌏

선진국들은 대부분 이미 과세를 시행 중이에요!

  • 프랑스: 2019년부터 시행 305유로 이상 소득에 12.8% 과세
  • 독일: 사업성에 따라 과세 사업소득 또는 기타소득으로 분류
  • 그 외: 미국, 영국, 일본 등도 각자의 방식으로 과세 중

마치며 ✨

우리나라도 국제적인 흐름에 맞춰 가상자산 과세를 준비하고 있어요. 2년이라는 시간이 더 생긴 만큼, 보다 체계적인 제도가 마련되길 기대해봅니다.

이상으로 가상자산 과세 연기에 대한 소식이었습니다. 도움이 되셨길 바라요! 😊

반응형

안녕하세요! 2024년부터 청년도약계좌의 혜택이 대폭 강화된다는 반가운 소식이 있어서 정리해봤어요. 특히 저축한도 초과금액에도 혜택을 준다니 너무 좋죠? 🎉

현재 청년도약계좌는 이렇습니다 📊

현재는 본인 납입금에 은행 이자(연 4.5%+α)와 정부 지원금을 매칭해주고 있어요. 다만 소득별로 저축 한도와 지원 비율이 제한되어 있었죠.

예시로 볼까요? 🤔

  • 소득 2,400만원 이하: 40만원까지 6% 지원
  • 소득 3,600만원 이하: 50만원까지 4.6% 지원

2024년부터 이렇게 바뀌어요! ✨

가장 큰 변화는 저축 한도 초과금액에도 3% 지원금을 준다는 거예요.

실제 예시를 들어볼게요 💡

  • 소득 2,400만원인 경우, 50만원 저축시
    • 40만원: 기존처럼 6% 지원
    • 추가 10만원: 새롭게 3% 지원

만기 조건도 더 유연해져요 🎯

지금까지는 5년을 꽉 채워야 했던 만기 조건이 많이 완화됐어요:

  • 3년만 유지해도 비과세 + 기여금 60% 지원 👍
  • 하반기부터는 납입원금 40% 부분인출 가능
  • 2년 이상 + 800만원 이상 납입 시 신용점수 5~10점 상승 ⭐

기존 가입자라면? 🤝

걱정 마세요! 대부분의 혜택이 기존 가입자에게도 적용됩니다:

  • 추가 기여금 지원: 2024년 1월 1일 이후 납입분부터
  • 3년 유지 혜택, 신용점수 상승: 즉시 적용

가입 신청 꿀팁 🍯

2024년 1월 신청은 2일부터 10일까지예요! 가입 조건만 확인해볼까요?

  • 나이: 만 19~34세
  • 개인소득: 7,500만원 이하
  • 가구소득: 중위소득 250% 이하

이렇게 개선된 청년도약계좌, 청년들의 자산형성에 더욱 큰 도움이 될 것 같네요. 관심 있으신 분들은 놓치지 마세요! 📌


 

청년도약계좌 : 네이버 검색

'청년도약계좌'의 네이버 검색 결과입니다.

search.naver.com

 

반응형

1. 파킹통장이란? 🏦

파킹통장은 Parking(주차)과 통장의 합성어로, 차를 잠시 주차하듯 언제든지 돈을 넣고 뺄 수 있는 입출금 통장이에요.

일반적인 수시입출금 통장과 다르게 하루만 맡겨도 이자가 발생한다는 특징이 있어요.

주로 인터넷전문은행과 저축은행에서 출시하며, 2024년 현재 파킹통장의 금리는 인터넷은행 약 2%대, 저축은행 약 3%대 수준이에요.

 

2. 파킹통장이 인기 있는 이유 🔥

최근 금리가 변동성이 크고, 경제 상황이 불안정해지면서 투자자들은 돈을 장기적으로 묶어두는 것보다 언제든 유동적으로 활용할 수 있는 안전한 금융상품을 선호하고 있어요.

파킹통장은 수시입출금이 가능하면서도 하루만 맡겨도 이자를 받을 수 있는 장점 덕분에 많은 사람들이 찾고 있어요.

 

3. 파킹통장을 이용할 때 주의할 점 ⚠️

예치금 한도: 최고금리가 적용되는 금액 한도가 정해져 있어요. 그 이상 예치하면 금리가 낮아질 수 있어요.

예금자 보호 한도: 저축은행이나 인터넷은행은 최대 5,000만 원까지 예금자 보호가 돼요. 그 이상 보관하려면 여러 금융사에 분산 예치하는 것도 방법이에요.

금리 변동 가능성: 경제 상황에 따라 금리가 변동될 수 있으니, 가입 전 최신 금리를 확인하는 것이 중요해요.

4. 증권사 상품도 고려해볼 수 있어요 📈

파킹통장 외에도 증권사에서 제공하는 CMA(Cash Management Account)와 MMF(Money Market Fund) 도 비슷한 기능을 해요.

4.1. CMA란? 🏦

CMA는 ‘자산관리계좌’로, 증권사가 국공채나 안정적인 채권에 투자한 후 발생한 수익을 계좌 보유자에게 돌려주는 방식이에요.

특징:

  • 하루만 맡겨도 이자 발생
  • 예금자 보호 제외(일부 특약 상품 제외)
  • 비교적 안정적인 수익률

4.2. MMF란? 💹

MMF는 증권사가 단기금융상품에 투자하여 수익을 투자자에게 돌려주는 방식이에요.

특징:

  • CMA보다 상대적으로 높은 금리 가능
  • 원금 손실 위험이 존재
  • 단기 금융상품에 투자하여 빠르게 이자를 지급

5. 파킹통장 vs. CMA vs. MMF 비교표 📊

예금자 보호 O (최대 5,000만 원) X (일부 상품 제외) X
금리 수준 낮음 ~ 중간 중간 높음
원금 보장 O 비교적 안전 원금 손실 가능
유동성 높음 높음 중간

 

 

cma 예금자보호 : 네이버 검색

'cma 예금자보호'의 네이버 검색 결과입니다.

search.naver.com

 

6. 결론 ✨

파킹통장은 하루만 맡겨도 이자가 붙고 수시 입출금이 가능해 유동성을 중요하게 여기는 사람들에게 유용해요. 하지만 예치금 한도나 금리 변동성, 예금자 보호 여부 등을 고려하여 자신의 자금 운용 스타일에 맞게 선택하는 것이 중요해요.

증권사의 CMA나 MMF도 좋은 대안이 될 수 있으니, 각 상품의 장단점을 비교해보고 활용해 보세요! 🚀

반응형

1. ECS 패턴이란?

ECS(Entity-Component-System)는 소프트웨어 설계 패턴 중 하나로, 유연하고 재사용 가능한 구조를 제공합니다. 이 패턴은 데이터와 로직을 분리하여 유지보수성과 확장성을 높이는 데 초점을 맞춥니다. 🚀

ECS는 다음과 같은 구조로 구성됩니다:

  • Entity: 고유 식별자를 가진 객체.
  • Component: 데이터를 포함하는 독립적인 객체.
  • System: 데이터를 처리하는 로직.

이 설계 패턴은 대규모 프로젝트에서 객체 간의 강한 결합을 줄이고, 기능을 모듈화하여 효율적인 관리와 확장이 가능하게 합니다.

 

출처: 위키


2. ECS 패턴의 구성 요소

1) Entity (엔티티)

  • 고유 ID를 가진 단순한 객체.
  • 데이터나 로직을 포함하지 않고, 컴포넌트의 컨테이너 역할을 합니다.

2) Component (컴포넌트)

  • 순수 데이터만 포함하며, 엔티티의 속성을 정의합니다.
  • 예: 위치, 속도, 상태 등 다양한 정보.

3) System (시스템)

  • 특정 컴포넌트를 처리하는 로직을 담당합니다.
  • 데이터를 처리하는 데 필요한 알고리즘을 포함하며, 엔티티와 컴포넌트를 직접 참조하지 않습니다.

3. ECS 패턴 예제

다음은 C#으로 간단한 ECS 패턴을 구현한 예제입니다.

using System;
using System.Collections.Generic;

// 1. Component: 데이터를 정의합니다.
public class PositionComponent
{
    public float X { get; set; }
    public float Y { get; set; }
}

public class VelocityComponent
{
    public float X { get; set; }
    public float Y { get; set; }
}

// 2. Entity: 컴포넌트를 포함하는 객체입니다.
public class Entity
{
    public int Id { get; private set; }
    public Dictionary<Type, object> Components = new();

    public Entity(int id)
    {
        Id = id;
    }

    public void AddComponent<T>(T component)
    {
        Components[typeof(T)] = component;
    }

    public T GetComponent<T>()
    {
        return (T)Components[typeof(T)];
    }
}

// 3. System: 로직을 구현합니다.
public class MovementSystem
{
    public void Update(Entity entity, float deltaTime)
    {
        var position = entity.GetComponent<PositionComponent>();
        var velocity = entity.GetComponent<VelocityComponent>();

        position.X += velocity.X * deltaTime;
        position.Y += velocity.Y * deltaTime;
    }
}

// 실행 예제
public class Program
{
    public static void Main()
    {
        var entity = new Entity(1);
        entity.AddComponent(new PositionComponent { X = 0, Y = 0 });
        entity.AddComponent(new VelocityComponent { X = 1, Y = 1 });

        var movementSystem = new MovementSystem();

        for (int i = 0; i < 5; i++)
        {
            movementSystem.Update(entity, 1.0f);
            var position = entity.GetComponent<PositionComponent>();
            Console.WriteLine($"Time: {i + 1}, Position: ({position.X}, {position.Y})");
        }
    }
}

이 예제에서는 PositionComponentVelocityComponent를 가진 엔티티가 MovementSystem을 통해 이동합니다. 데이터와 로직이 명확히 분리되어 유지보수가 용이합니다.


4. ECS 패턴 사용 시 고려할 점

장점 🌟

  1. 유연성: 엔티티에 컴포넌트를 동적으로 추가하거나 제거하여 다양한 동작을 구현할 수 있습니다.
  2. 모듈화: 데이터와 로직의 분리로 재사용성이 높아집니다.
  3. 확장성: 새로운 컴포넌트와 시스템을 추가하는 것이 간단합니다.

주의점 ⚠️

  1. 복잡성 증가: 단순한 프로젝트에서는 과도하게 복잡한 구조가 될 수 있습니다.
  2. 초기 설계 비용: 시스템과 컴포넌트를 세분화하는 초기 비용이 필요합니다.

5. 결론

ECS 패턴은 데이터 중심 설계를 통해 유지보수성과 확장성을 극대화하는 강력한 설계 패턴입니다. 특히 대규모 애플리케이션에서 객체 간의 강한 결합을 줄이고 모듈화된 구조를 제공하는 데 적합합니다. 다만, 모든 프로젝트에 적합하지는 않으므로 복잡성과 요구 사항을 고려해 선택해야 합니다. 😊


6. 관련 링크

반응형

1. 퍼사드 패턴이란?

퍼사드(Facade) 패턴은 복잡한 서브시스템을 단순화하여 클라이언트가 더 쉽게 사용할 수 있도록 인터페이스를 제공하는 디자인 패턴입니다. 말 그대로 "건물의 정면(Facade)"처럼 내부 구조를 숨기고 단순한 접근점을 제공합니다. 이를 통해 코드의 가독성을 높이고 유지보수를 쉽게 만들어줍니다.

2. 퍼사드 패턴의 구성 요소

퍼사드 패턴은 세 가지 주요 구성 요소로 이루어져 있습니다:

  • 서브시스템(Subsystem): 복잡한 내부 기능을 제공하는 클래스나 모듈.
  • 퍼사드(Facade): 서브시스템에 대한 단순화된 인터페이스를 제공하는 클래스.
  • 클라이언트(Client): 퍼사드 클래스를 통해 서브시스템과 상호작용하는 주체.

 

출처: 위키

동작 원리

퍼사드 클래스는 여러 서브시스템을 하나로 묶어주는 역할을 합니다. 클라이언트는 서브시스템의 복잡한 동작을 몰라도 퍼사드를 통해 쉽게 접근할 수 있습니다.

3. 퍼사드 패턴 예제 (C#)

문제 상황

복잡한 홈 엔터테인먼트 시스템(예: TV, 스피커, 스트리밍 장치)을 설정하는 과정을 단순화하기 위해 퍼사드 패턴을 적용해보겠습니다.

// Subsystems
public class Television
{
    public void TurnOn()
    {
        Console.WriteLine("Turning on the TV.");
    }
    public void SetChannel(int channel)
    {
        Console.WriteLine($"Setting TV channel to {channel}.");
    }
}

public class SoundSystem
{
    public void TurnOn()
    {
        Console.WriteLine("Turning on the sound system.");
    }
    public void SetVolume(int volume)
    {
        Console.WriteLine($"Setting sound system volume to {volume}.");
    }
}

public class StreamingDevice
{
    public void Connect()
    {
        Console.WriteLine("Connecting to the streaming device.");
    }
    public void Play(string movie)
    {
        Console.WriteLine($"Playing movie: {movie}.");
    }
}

// Facade
public class HomeTheaterFacade
{
    private Television tv;
    private SoundSystem sound;
    private StreamingDevice streaming;

    public HomeTheaterFacade()
    {
        tv = new Television();
        sound = new SoundSystem();
        streaming = new StreamingDevice();
    }

    public void WatchMovie(string movie)
    {
        Console.WriteLine("Setting up the home theater...");
        tv.TurnOn();
        tv.SetChannel(3);
        sound.TurnOn();
        sound.SetVolume(20);
        streaming.Connect();
        streaming.Play(movie);
        Console.WriteLine("Enjoy your movie!");
    }
}

// Client
public class Program
{
    public static void Main(string[] args)
    {
        HomeTheaterFacade homeTheater = new HomeTheaterFacade();
        homeTheater.WatchMovie("Inception");
    }
}

실행 결과

Setting up the home theater...
Turning on the TV.
Setting TV channel to 3.
Turning on the sound system.
Setting sound system volume to 20.
Connecting to the streaming device.
Playing movie: Inception.
Enjoy your movie!

이 예제에서 클라이언트는 복잡한 홈 엔터테인먼트 시스템의 설정 과정을 몰라도 HomeTheaterFacade 클래스를 통해 간단히 영화 감상을 시작할 수 있습니다.

4. 퍼사드 패턴 사용 시 고려할 점

장점

  • 간결한 인터페이스 제공: 클라이언트는 복잡한 서브시스템에 대해 알 필요가 없습니다.
  • 유지보수 용이성: 서브시스템을 수정해도 퍼사드 인터페이스만 유지되면 클라이언트 코드를 변경할 필요가 없습니다.
  • 결합도 감소: 클라이언트와 서브시스템 간의 의존성을 줄여줍니다.

주의점

  • 유연성 감소: 퍼사드에 의존하게 되면 서브시스템의 세부 기능에 직접 접근하기 어려워질 수 있습니다.
  • 필요 이상으로 단순화하지 않기: 퍼사드를 설계할 때 너무 많은 기능을 포함하면 오히려 유지보수가 어려워질 수 있습니다.

5. 결론

퍼사드 패턴은 복잡한 서브시스템을 숨기고 단순한 인터페이스를 제공함으로써 코드의 가독성과 유지보수성을 높여줍니다. 특히 서브시스템이 복잡하고 여러 모듈이 상호작용해야 하는 상황에서 매우 유용합니다. 하지만 지나치게 단순화하거나 필요 이상으로 사용하지 않도록 주의해야 합니다.

6. 관련 링크

반응형

1. 메멘토 패턴이란?

메멘토 패턴은 객체의 상태를 캡슐화하여 저장하고, 나중에 이를 복원할 수 있도록 하는 디자인 패턴입니다. 주로 실행 취소(Undo) 기능을 구현하거나 특정 시점의 상태를 저장해야 할 때 사용됩니다. 이 패턴은 객체의 내부 구조를 노출하지 않으면서도 상태를 저장할 수 있다는 점에서 유용합니다. 😊

2. 메멘토 패턴의 구성 요소

메멘토 패턴은 다음 세 가지 주요 구성 요소로 이루어집니다:

  1. Originator (원본 객체): 저장하고자 하는 상태를 가진 객체입니다.
  2. Memento (메멘토): 원본 객체의 상태를 저장하는 객체입니다.
  3. Caretaker (관리자): 메멘토 객체를 저장하고 관리하며, 원본 객체의 상태를 복원할 때 이를 사용합니다.

    출처: 위키

3. 메멘토 패턴 예제 (C# 코드)

아래는 메멘토 패턴을 사용해 텍스트 편집기의 실행 취소 기능을 구현한 간단한 예제입니다:

using System;
using System.Collections.Generic;

// Originator: 원본 객체
class TextEditor {
    public string Content { get; private set; } = string.Empty;

    public void Type(string words) {
        Content += words;
    }

    public Memento Save() {
        return new Memento(Content);
    }

    public void Restore(Memento memento) {
        Content = memento.State;
    }

    public override string ToString() {
        return Content;
    }
}

// Memento: 메멘토 객체
class Memento {
    public string State { get; }

    public Memento(string state) {
        State = state;
    }
}

// Caretaker: 관리자 객체
class Caretaker {
    private readonly Stack<Memento> _history = new Stack<Memento>();

    public void Save(TextEditor editor) {
        _history.Push(editor.Save());
    }

    public void Undo(TextEditor editor) {
        if (_history.Count > 0) {
            editor.Restore(_history.Pop());
        } else {
            Console.WriteLine("No states to undo.");
        }
    }
}

// Example Usage
class Program {
    static void Main() {
        var editor = new TextEditor();
        var caretaker = new Caretaker();

        editor.Type("Hello, ");
        caretaker.Save(editor);

        editor.Type("world! ");
        caretaker.Save(editor);

        editor.Type("This is a test.");
        Console.WriteLine("Current Content: " + editor);

        caretaker.Undo(editor);
        Console.WriteLine("After Undo: " + editor);

        caretaker.Undo(editor);
        Console.WriteLine("After Undo: " + editor);
    }
}

출력 결과:

Current Content: Hello, world! This is a test.
After Undo: Hello, world!
After Undo: Hello,

4. 메멘토 패턴 사용 시 고려할 점

  • 상태 캡슐화: 메멘토 객체는 원본 객체의 내부 구조를 노출하지 않아야 합니다. 이를 위해 메멘토를 불변(Immutable)으로 설계하는 것이 좋습니다.

5. 결론

메멘토 패턴은 객체의 상태를 안전하게 저장하고 복구할 수 있는 강력한 도구입니다. 특히, 실행 취소와 같은 기능을 구현할 때 매우 유용합니다. 다만 메모리 사용량과 저장된 상태의 관리 측면에서 주의가 필요합니다. ✨

6. 관련 링크

반응형

1. 방문자 패턴이란? ✨

방문자 패턴은 객체 구조를 변경하지 않고도 새 기능을 추가할 수 있는 디자인 패턴입니다. 특히, 다양한 타입의 객체에 대한 연산을 분리할 때 유용합니다.

예를 들어, 복잡한 객체 구조(트리, 그래프 등)에 서로 다른 연산을 수행해야 한다면, 방문자 패턴을 통해 구조와 연산의 분리를 실현할 수 있습니다.

2. 방문자 패턴의 구성 요소 📦

방문자 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:

  1. Visitor (방문자): 객체 구조의 각 요소를 방문하여 연산을 수행하는 인터페이스입니다.
  2. ConcreteVisitor (구체 방문자): Visitor를 구현하며, 실제 연산을 정의합니다.
  3. Element (요소): Visitor를 수용(accept)하는 인터페이스를 정의합니다.
  4. ConcreteElement (구체 요소): Element를 구현하며, Visitor를 받아들이는 로직을 포함합니다.
  5. ObjectStructure (객체 구조): Element들의 집합으로, Visitor가 이 구조를 순회하며 연산을 수행합니다.

    출처: 위키

3. 방문자 패턴 예제 🌟

아래는 C#으로 작성한 방문자 패턴 예제입니다. 다양한 캐릭터 객체가 있고, 방문자가 이들을 방문하여 연산을 수행하는 상황을 가정합니다.

using System;
using System.Collections.Generic;

// Visitor 인터페이스
public interface IVisitor
{
    void Visit(Warrior warrior);
    void Visit(Mage mage);
}

// Element 인터페이스
public interface ICharacter
{
    void Accept(IVisitor visitor);
}

// 구체 요소들
public class Warrior : ICharacter
{
    public string Name { get; set; } = "Warrior";
    public void Accept(IVisitor visitor) => visitor.Visit(this);
}

public class Mage : ICharacter
{
    public string Name { get; set; } = "Mage";
    public void Accept(IVisitor visitor) => visitor.Visit(this);
}

// 구체 방문자
public class DamageCalculator : IVisitor
{
    public void Visit(Warrior warrior)
    {
        Console.WriteLine($"{warrior.Name} takes 50 damage!");
    }

    public void Visit(Mage mage)
    {
        Console.WriteLine($"{mage.Name} takes 70 damage!");
    }
}

// 객체 구조
public class CharacterGroup
{
    private readonly List<ICharacter> _characters = new();

    public void AddCharacter(ICharacter character) => _characters.Add(character);

    public void Accept(IVisitor visitor)
    {
        foreach (var character in _characters)
        {
            character.Accept(visitor);
        }
    }
}

// 사용 예시
public class Program
{
    public static void Main()
    {
        var group = new CharacterGroup();
        group.AddCharacter(new Warrior());
        group.AddCharacter(new Mage());

        var damageCalculator = new DamageCalculator();
        group.Accept(damageCalculator);
    }
}

출력 결과

Warrior takes 50 damage!
Mage takes 70 damage!

4. 방문자 패턴 사용 시 주의할 점 ⚠️

  1. 요소 클래스의 변경에 취약: 새로운 Element를 추가하면 모든 Visitor를 수정해야 합니다.
  2. 객체 구조의 복잡성 증가: 객체 구조가 클수록 관리가 어려워질 수 있습니다.
  3. 사용 적합성 고려: 연산이 자주 변경되거나 추가되는 경우에 적합하지만, 요소의 변화가 잦다면 부적합할 수 있습니다.

5. 결론 ✨

방문자 패턴은 객체 구조와 연산의 분리를 통해 확장성과 유연성을 제공합니다. 특히, 여러 객체에 대해 다양한 연산을 수행할 때 강력한 도구가 됩니다. 다만, 요소의 변경이 많을 경우 관리 비용이 증가할 수 있으므로 상황에 따라 신중히 선택해야 합니다.

6. 관련 링크 🔗

반응형

1. 책임 연쇄 패턴이란?

책임 연쇄 패턴은 요청을 처리할 수 있는 객체들의 체인을 구성하고, 각 객체가 요청을 처리할 기회를 갖도록 하는 디자인 패턴입니다. 이 패턴을 사용하면 요청을 보낸 코드와 처리하는 코드 간의 결합도를 낮추고, 새로운 처리 로직을 쉽게 추가할 수 있습니다. ✨

2. 책임 연쇄 패턴의 구성 요소

책임 연쇄 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:

  • Handler (처리자): 요청을 처리하거나 다음 처리자에게 전달합니다.
  • ConcreteHandler (구체 처리자): 요청을 실제로 처리하거나 처리할 수 없는 경우 체인의 다음 처리자에게 넘깁니다.
  • Client (클라이언트): 요청을 체인의 첫 번째 처리자에게 전달합니다.

출처: 위키

3. 책임 연쇄 패턴 예제

문제 상황

사용자 요청을 다양한 수준에서 검증해야 합니다. 예를 들어, 사용자 입력에 대해 입력 값 검증, 권한 확인, 로그 기록 등의 처리를 해야 할 때 책임 연쇄 패턴을 사용할 수 있습니다.

C# 코드 예제

using System;

// Handler 인터페이스
abstract class Handler
{
    protected Handler next;

    public void SetNext(Handler nextHandler)
    {
        next = nextHandler;
    }

    public abstract void Handle(string request);
}

// ConcreteHandler: 입력 검증
class ValidationHandler : Handler
{
    public override void Handle(string request)
    {
        if (string.IsNullOrWhiteSpace(request))
        {
            Console.WriteLine("Validation failed: Input is empty.");
            return;
        }

        Console.WriteLine("Validation passed.");
        next?.Handle(request);
    }
}

// ConcreteHandler: 권한 확인
class AuthorizationHandler : Handler
{
    public override void Handle(string request)
    {
        if (request != "AuthorizedUser")
        {
            Console.WriteLine("Authorization failed: User is not authorized.");
            return;
        }

        Console.WriteLine("Authorization passed.");
        next?.Handle(request);
    }
}

// ConcreteHandler: 로그 기록
class LoggingHandler : Handler
{
    public override void Handle(string request)
    {
        Console.WriteLine($"Logging request: {request}");
        next?.Handle(request);
    }
}

// 클라이언트 코드
class Program
{
    static void Main()
    {
        // 체인 구성
        Handler validation = new ValidationHandler();
        Handler authorization = new AuthorizationHandler();
        Handler logging = new LoggingHandler();

        validation.SetNext(authorization);
        authorization.SetNext(logging);

        // 요청 처리
        string userInput = "AuthorizedUser";
        validation.Handle(userInput);
    }
}

출력 결과

Validation passed.
Authorization passed.
Logging request: AuthorizedUser

4. 책임 연쇄 패턴의 특이점 및 고려할 점

  • 유연성: 각 처리자는 독립적으로 동작하며, 체인의 구조를 동적으로 변경할 수 있습니다.
  • 결합도 감소: 요청 처리 로직이 처리자 객체들에 분리되어 코드의 재사용성을 높입니다.
  • 주의점: 요청이 체인의 끝까지 전달되었는데도 처리되지 않을 수 있으므로, 기본 처리자를 추가하거나 요청이 처리되지 않았을 경우에 대한 대책을 마련해야 합니다.

5. 결론

책임 연쇄 패턴은 요청 처리의 유연성과 확장성을 높이는 데 유용한 패턴입니다. 체인의 각 구성 요소를 독립적으로 관리할 수 있어, 유지보수가 용이하며 동적으로 처리 로직을 변경할 수 있습니다. 단, 체인의 끝에서 요청이 처리되지 않는 경우를 염두에 두고 설계해야 합니다. 🔗

6. 관련 링크

반응형

+ Recent posts