개발/OOP, Design Pattern
-
Eventual Consistency 란개발/OOP, Design Pattern 2021. 7. 11. 13:22
Eventual Consistency 분산 시스템을 구성하려면 CAP 이론에 의해서 일관성과 가용성 중 하나를 포기해야하는 상황이 올 수 있습니다. 클라이언트의 요청을 받았을 때, A서버의 데이터가 변경되면 즉시 다른 서버에 반영되지 않습니다. 아래 두가지 경우가 있습니다. 모든 서버가 동일한 데이터를 갖도록 동기화 하는동안 클라이언트의 접근을 막는 경우 (가용성의 문제) 다른 클라이언트들이 변경된 데이터를 요청했을 때 어떤 클라이언트는 최신의 데이터를, 어떤 클라이언트는 오래된 데이터를 받게되는 경우.(일관성의 문제) 그러나 2번의 경우 언젠가는 동기화가 되면, 모든 클라이언트가 동일한 데이터를 받아볼 수 있게 됩니다. 이것이 Eventual Consistency 입니다. Eventual consist..
-
헥사고날(포트와 어댑터) 아키텍처개발/OOP, Design Pattern 2021. 7. 11. 12:45
저는 저희 팀 프로젝트를 확장 가능한 구조로 만들고자 포트어댑터 아키텍처를 알아보았습니다. 포트와 어댑터를 간단하게 설명하자면 애플리케이션이 외부 요소(인프라)등에 관련없이 지속가능하게 만드는 것이 목표이며, 포트는 인터페이스고 어댑터는 구현하는 클래스를 말합니다. 외부에 의해 동작하는 포트를 주포트 (구현은 주어댑터) ex) MVC의 Controller와 같은 외부에서 애플리케이션과 통신하고자 할때 필요한 포트 내부적으로 외부의 프로토콜과 통신하는 것을 부포트 (구현은 부어댑터)ex) MVC의 DAO와 같은 애플리케이션이 외부와 통신할 때 필요한 필요한 포트 현재는 MVC구조로 HTTP API → 서비스 → Repository(MySQL) 로 구성되어있는데 이중 HTTP API가 grpc로 변경되거나,..
-
객체지향에서 메세지와 메소드는 다르다.개발/OOP, Design Pattern 2021. 2. 24. 10:51
객체지향에서 메세지와 메소드는 다르다. 객체지향에 입문해서 자료를 보다보면 메세지 라는 말을 많이 보게 된다. 예를 들어 객체의 상태를 직접 변경하지 않고, 어떤 작업을 요청하는 메세지를 보내야 한다 라는 식이다. 이렇게 보면 '아. 객체의 메소드를 사용해서 간접적으로 상태를 변경하라는 뜻이구나' 라는 생각이 든다. 그럼 왜 메소드를 쓰라고 하면 되지, 굳이 메세지를 보내라고 하는 걸까? 메소드는 메세지를 수신하는 방법이다. 다음과 같은 사람의 클래스가 있다고 가정하자. public abstract class Person { public abstract void sleep(); } 추상 클래스에 sleep() 이라는 추상 메소드가 정의되어 있고, 이것은 Person의 자식 클래스를 사용하는 사용자에게 s..
-
의존성을 '조절'하기 위해 인터페이스와 구현을 분리하자개발/OOP, Design Pattern 2021. 2. 21. 00:56
조영호님의 오브젝트 챕터1 을 읽고 배운점 객체지향은 객체의 자율성을 높여 응집성을 높이고, 객체간의 의존성을 조절 하여 이해하기 쉽고 변경하기 쉬운 코드를 작성하는 것이 중요하다. 그런데 왜 객체간의 의존성을 '낮추는 것'이 아닌 '조절' 일까? 자율성을 높여보자 다음과 같이 매표원 역할을 하는 TicketSeller 클래스가 있다. 이 클래스는 표를 판매하기 위해 TicketOffice 를 가지고 Audience 파라미터를 참조한다. 의존성 측면에서 보면 문제가 없어보이지만, TicketSeller가 임의로 TicketOffice의 상태를 변경하고 있다. public class TicketSeller { private TicketOffice ticketOffice; public void sellTo(..
-
[객체지향의 원리와 이해] 템플릿 콜백 패턴 (Template Callback Pattern)개발/OOP, Design Pattern 2021. 1. 3. 01:52
템플릿 콜백 패턴 전략을 믹명 내부 클래스로 구현한 전략 패턴 템플릿 콜백 패턴은 전략 패턴의 변형으로 모든 것이 전략 패턴과 동일한데, 전략을 익명 내부 클래스로 정의해서 사용한다는 특징이 있다. 템플릿 콜백 패턴을 리팩토링하면 중복되는 부분을 컨텍스트로 이관하여 코드가 간결해진다. 익명 내부 클래스를 사용하기 때문에 전략 패턴에서 사용한 각각의 전략 클래스(StrategyGun.. 등등)이 필요없다. 스프링의 3대 프로그래밍 모델 중 하나인 DI(의존성 주입)에서 사용하는 특별한 형태의 전략 패턴이다. 스프링을 이해하기 위해 전략 패턴, 템플릿 콜백 패턴, 리팩터링된 템플릿 콜백 패턴을 알아야 한다. 전략 패턴의 일종이므로 개방 폐쇄 원칙(OCP)와 의존성 역전 원칙(DIP)이 적용된다. 예제 아래 ..
-
[객체지향의 원리와 이해] 전략 패턴 (Strategy Pattern)개발/OOP, Design Pattern 2021. 1. 2. 21:40
전략 패턴 (Strategy Pattern) 클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴 다양한 전략을 생성해내고 필요에 따라 컨텍스트에 주입시키면 전략을 실행할 수 있다. 전략을 주입시킨다는 것은 모델링된 객체(어플리케이션 바운더리)에 전략을 매개값으로 주어서 사용되도록 하는 것이라고 할 수 있다. Startegy startegy = new Strategy(); // 전략 생성 Client client = new Client(); client.runContext(strategy); // 전략을 주입했다. 중요 포인트 전략 메서드를 가진 전략 객체 전략 객체를 사용하는 컨텍스트(전략 객체의 사용자/소비자) 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트(제3자, 전략 객체의 공급자..
-
[객체지향의 원리와 이해] 데코레이터 패턴 (Decorator Pattern)개발/OOP, Design Pattern 2021. 1. 2. 16:07
데코레이터 패턴 메서드 호출의 반환값에 변화를 주기 위해 중간에 장식자를 두는 패턴 참고 : https://johngrib.github.io/wiki/decorator-pattern/ 원본에 장식을 더하는 패턴이다. 프록시와 구현 방법이 같다. 데코레이터 패턴은 클라이언트가 받는 값에 장식을 더하는 것이 목적이다. 프록시의 패턴의 목적은 제어의 흐름을 변경하거나 별도의 로직 처리이다. 그리고 반환값을 변경하지 않는다. 중요 포인트 장식자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다. 장식자는 실제 서비스에 대한 참조 변수를 갖는다.(합성) 장식자는 실제 서비스의 같은이름을 가진 메서드를 호출하고, 그 반환값에 장식을 더해 클라이언트에게 돌려준다. 장식자는 실제 서비스의 메서..
-
[객체지향의 원리와 이해] 싱글턴 패턴 (Singleton Pattern)개발/OOP, Design Pattern 2021. 1. 2. 16:03
싱글턴 패턴 클래스의 인스턴스, 즉 객체를 하나만 만들어 사용하는 패턴 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 인스턴스를 여러개 만들면 불필요한 자원을 사용하게 되고, 프로그램에 예상치 못한 결과를 초래하기도 한다. 그래서 이런 경우 하나의 인스턴스만을 만들고 계속 재사용하는 싱글턴 패턴을 사용한다. 중요 포인트 new를 실행할 수 없도록 생성자에 private 접근제한자를 지정한다. 유일한 단일 객체를 반환할 수 있는 정적 메소드가 필요하다. 유일한 단일 객체를 참조할 수 있는 정적 참조 변수가 필요하다. 예제 public class Singleton { static Singleton singletonObject; // 정적 참조 변수 private Singleton() {} // pr..