본문 바로가기

CS

(10)
핵사고날 아키텍처의 사용이유 일단 핵사고날을 왜 사용하는가 부터 생각해보자면,결국은 변경에 의한 영향을 최대한 막기위한 발버둥이라고 나는 생각한다나는 핵사고날이 클린아키텍처의 하나의 구현방법이라고 생각하고,이걸 이글에서는 구분해서 쓰지않을거임 이건 어플리케이션을 구분하는것부터 시작하는데보통 테스트 관련 서적을 보면,코드를 4분면으로 나눔1사분면: 의존성과 로직이 모두 많아 테스트가 어려운 코드.2사분면: 의존성이 없고 로직만 있는 코드로, 유닛 테스트로 충분.3사분면: 단순히 성공 여부만 확인하면 되는 코드.4사분면: 의존성은 많지만 로직이 없는 코드로, 통합 테스트로 대응 가능.코드는 이 4가지 분류로 분류할수있고,여기서 문제가 되는건 1사분면인데,의존성은 많아서 유닛테스트는 매우 힘든데,로직도 많아서 테스트없이 두기엔 너무 위험..
템플릿 메서드(Template Method) 패턴 템플릿 메서드 패턴은,추상클래스를 만들고 변경되는부분을 제외한 모든걸 다 구현한다음,변경되는 부분들만 추상메서드로 빼두고,추상클래스의 메인메서드(실행메서드)에서 모든 구현과 추상메서드를 부르는 메서드를 만들고,서브클래스에서 해당 추상메서드만 구현하게 해서,다른 모든 템플릿부분은 재사용하며 변경되는부분만 바꿔가며 쓸수있게 만드는 패턴임 즉 변하는부분을 제외한 나머지전체를 템플릿으로 잡고,변하는부분만 상속받아서 구현하는것템플릿 메서드 패턴은알고리즘의 골격을 정의,템플릿메서드패턴을 사용하면 알고리즘의 일부단계를 서브클래스에서 구현할수있으며,알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의할수도 있음 응용으로,추상클래스에서 생성한 텅 빈 구현메서드인 hook를 사용해서,서브클래스에..
퍼사드(Facade) 패턴 퍼사드패턴은 많은양의 메서드를 한번에 실행시켜야하거나,여러 클래스의 메서드들을 한번에 실행해야할때 묶어서 실행하는 패턴임즉 클래스가 많으면 클라이언트가 클래스를 전부 생성하고,메서드를 실행시키는게 귀찮으니까,그냥 실행만을 대행하는 클래스를 만든다음,해당클래스를 의존하는식으로 바꾸는거이건 서브시스템클래스를 캡슐화하는게 아닌,단순히 기능들을 묶어서 사용할수있는 인터페이스만 제공하는거고,만약 필요하다면 서브시스템클래스에 직접 접근할수있음(해당클래스들이 퍼블릭하게 열려있음) 장점은 이걸 사용하면 클라이언트구현과 서브시스템을 분리할수있음(퍼사드만 고치면되니)어댑터패턴과의 차이점은,어댑터는 인터페이스를 변경해서 클라이언트에서 필요로하는 인터페이스에 맞추는거고퍼사드는 어떤 서브시스템에 대한 쓰기편한 인터페이스를 제공..
어댑터(Adapter) 패턴 어댑터 패턴은 서로 상호호환되지않는 클래스들을,중간 인터페이스를 거쳐가게해서 서로 호환이 되게만드는 패턴임래퍼와 같은말임예를들면 스피커의 슈퍼클래스를 구현한 서브클래스를 만들고,그안에서 스마트폰을 만들거나 합성한다음 스피커의 오버라이드 메서드에 스마트폰의 메서드를 넣는식 이건 기본적으로 인터페이스의 하나의 메서드와 각 클래스들의 각각 하나의메서드를 1대1매칭시키는방식이고,매칭이 되지않으면 예외를 던지면됨 즉,어댑터 패턴은 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환하는 패턴,이를통해 인터페이스가 호환되지않아 같이쓸수없던 클래스를 쓸수있게 도와줌 추가적으로 어댑터에는 객체어댑터와 클래스어댑터가 있는데,클래스어댑터는 다중상속을 해야하기때문에 요즘언어에선 사용하기어려움(별차이도없음)
커맨드(command) 패턴 이 패턴은 클래스들(리시버)의 각 메서드들을 추상화 시켜서 하나의 이름으로 통일시켜서 사용할수 있게 하는 패턴임 이건 사용되어질 클래스의 모든 메서드를 추상화한(커맨드들의) 인터페이스를 만들고,단일 메서드(execute())만 만들어둔다음,모든 커맨드클래스들은 해당 인터페이스를 구현해서,자기가 실행됐을때(원래 클래스의 메서드가 실행되었을때) 할일을 execute안에다가 다 넣어두는거임 즉 커맨드는 리시버의 모든 사용할 메서드마다 하나씩 생기고,해당메서드들을 하나의 인터페이스로 사용할수 있게 해주는 패턴 또한 커맨드들은 리시버(내가 execute를 할 대상)를 di받으면,클래스단위가 아닌 객체단위로써 동작시킬수있음 그러면 인보커(리모컨이라고 생각하면됨)에 해당 커맨드객체를 di받든 세터로세팅하든 어쩌든 해..
싱글톤(singleton) 패턴 이건 전역적으로 단 하나만 생성되는걸 보장하는 객체를 만드는 패턴임즉싱글톤은 클래스 인스턴스를 하나만 만들고,그 인스턴스로의 전역 접근을 제공하는 패턴 이건 두개이상 생겼을때 정합성문제가 생기거나,생성비용이 비싼곳에서 사용됨 만드는 방식은,일단 private생성자로 생성을 잠가둔다음프로그램의 시작시에 생성하거나,해당 클래스에 자기를 필드로 가진다음,스태틱클래스로 자기가 null이면 자기를 생성해서 리턴하고,자기가 있으면 해당필드를 그대로 리턴하는식으로 만들면됨(고전방식) 이때 멀티스레드에서 여러 스레드가 동시에 접근하면 동기화문제가 생길수있음(2개이상생성될수있음),그러니 자바의경우 synchronized를 생성메서드에 넣어줘야함(어짜피 값 리턴해주는거라서 부하도 별로없음)만약 해당메서드가 병목이라면 그냥..
팩토리(Factory) 패턴 팩토리패턴은 객체의 생성을 대행해주는 패턴들을 통틀어서 말함 직접적으로 코드내에서 객체를 생성할경우엔 해당 객체에 강의존될수밖에 없지만,이 생성부분을 외부로 빼내고 해당클래스를 사용해서 생성해달라고 요청한다음,인터페이스를 사용해서 받으면 약의존으로 바뀌게됨 즉 이걸 사용하면 ocp를 지킬수있는 도구가 됨,객체의 생성선택권한을 팩토리쪽으로 넘겨주면서 캡슐화해서 변경에 닫혀있게 만드는것이게 심플 팩토리 패턴임 여기서 팩토리를 static으로(코틀린에서는 companion object)로 하면 정적 팩토리 패턴이 되고,이건 팩토리인스턴스를 만들지않아도 객체들을 생성할수있게되지만서브클래스로 객체생성메서드를 변경할수없다는 단점이 생겨서 간단한거에 이렇게사용함 심플팩토리 패턴은,사용클래스를 추상클래스(인터페이스로 ..
데코레이터(Decorator) 패턴 목표는 ocp,즉 변경하지않고 확장하는게 목표 이 패턴은 인터페이스를 하나 만들고,모든 구현체들이 이 인터페이스를 구현하게해서 서로서로 겹칠수있게 하는게 목적인 패턴임즉,데코레이터 패턴은객체에 추가요소를 동적으로 더할수있게 만드는 패턴,이걸 사용하면 서브클래스보다 훨씬 유연하게 기능을 확장할수있음 여기서 인터페이스는 메서드를 주는게 목적이 아닌,모든 객체들이 동일한 메서드를 가지고 사용할수있게하는게 목적임 이건 종이컵을 겹쳐놓는다는 이미지랑 비슷하다고 생각함(래퍼객체라고 생각해도됨)모든 구현체들은 자기 인터페이스에 해당하는 변수를 di받고,그걸통해 재귀처럼 타고내려가면서 기능을 수행할수 있게 하는 패턴임,즉 만들때의 핵심은모든 구현체에 동일한 인터페이스를 구현시킴자기 인터페이스와 동일한 지역변수를 모든 ..