모르지 않다는 것은 아는것과 다르다.

객체지향 16

프록시 적용하기

인터페이스 기반 프록시 적용 인터페이스를 기반으로 프록시를 적용한다면 아래와 같은 구조가 된다. 위의 그림처럼 Controller와 Service를 인터페이스로 구현하고, 실제 구현체와 같은 인터페이스를 구현하도록 프록시를 만든다. 이렇게 되면 런타임 시점에는 아래와 같이 의존 관계가 설정된다/ 구현 Repository, RepositoryProxy public class OrderRepositoryV1Impl implements OrderRepositoryV1 { @Override public void save(String itemId) { //... 생략 } } @RequiredArgsConstructor public class OrderRepositoryInterfaceProxy implements..

객체지향 2022.08.06

프록시 패턴과 데코레이터 패턴

개요 프록시를 이용하면 기존로직에 변화를 주지 않고도 새로운 기능을 추가할 수 있다. 스프링은 이러한 방법을 이용해서 유연하게 기능을 확장했다. 그래서 기존코드를 건드리지 않고 새로운 기능을 추가할 수 있는 프록시 패턴과 데코레이터 패턴을 학습하려고 한다. 클라이언트, 서버, 프록시 보통 Client와 Server를 생각하면 컴퓨터 네트워크의 Client, Server 를 많이 떠올리지만, 이 개념을 객체에 도입하면 요청하는 객체는 클라이언트가 되고, 요청을 처리하는 객체는 서버가 된다. 하지만 여기서 Client가 요청한 결과를 서버에 직접 요청하는 것이 아니라 어떤 대리자를 통해서 간접적으로 서버에 요청할 수 있다. 여기서 그 대리자가 바로 프록시다. 프록시는 객체안에서의 개념도 있고, 웹 서버에서의..

객체지향 2022.08.06

생성 패턴 (디자인 패턴)

생성패턴 객체를 생성하는 것과 관련된 패턴으로, 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화 하고, 코드의 유연성을 높여 준다. 종류 Factory Method Singleton Prototype Builder Abstract Factory Chaining Factory Method Pattern 인스턴스 생성과 관련된 패턴이다. 상위 클래스는 객체를 생성하기 위한 인터페이스를 정의한다. 하위 클래스에서는 어떤 클래스의 인스턴스를 생성할지 결정한다. 생성과 관련된 동일한 메서드는 상위 클래스에서 처리한다. 결론적으로 상황에 따라 다양한 인스턴스를 생성할 수 있게 도와주는 패턴이다. class diagram Product: 팩토리 메소드가 생성하는 객체의 인터페이스를 정의한다. Concrete..

객체지향 2022.05.15

행위 패턴 (디자인 패턴)

행위 패턴 반복적으로 사용되는 객체들의 상호작용을 패턴화한 것으로, 쿨래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 제공한다. 행위 패턴은 행위 관련 패턴을 사용하여 독립적으로 일을 처리하고자 할때 사용 종료 Strategy Template Method Observer Chain of responsibility Interpreter Iterator Visitor Command Mediator State Memento Strategy Pattern 정책이나 알고리즘을 교체하여 사용한다. 보통 실무에서 많이 사용되는 패턴이다. 같은 메서드를 경우에 따라 다르게 구현해서 사용하는 방식이다. 다양한 알고리즘이 존재하면 이들 각각을 하나의 클래스로 캡슐화하여 알고리즘의 대체가 가능하도록 한다. cla..

객체지향 2022.05.15

구조패턴 (디자인 패턴)

구조 패턴 프로그램 내의 자료구조나 인터페이스 구조 등 프로그램 구조를 설계하는데 활용 될 수 있는 패턴 클래스, 객체들의 구성을 통해서 더 큰 구조를 만들 수 있게 해준디. 큰 규모의 시스템에서는 많은 클래스들이 서로 의존성을 가지게 되는데, 이런 복잡한 구조를 개발하기 쉽게 만들어주고, 유지 보수하기 쉽게 만들어 준다. 종료 Decorator Adapter Bridge Composite Facade Flyweight Proxy Decorator Pattern 작식과 실제 내용을 동일시 하는 패턴이다. 어떤 객체에 여러 기능을 추가해야될 경우, 보통 상속을 생각하는 경우가 많다. 만약 자잘한 기능들이 많아 진다하면, hierarchy가 복잡해지고 지저분해지는 경우가 있다. 예를들어, 상위클래스에 어떤기..

객체지향 2022.05.15

클래스 다이어그램

클래스 다이어그램 대표적인 UML 구조 다이어그램이다. 객체 지향 프로그래밍에서 여러 클래스 상호관의 혐력 관계를 나타내는 다이어그램이다. 클래스 간의 관계를 설계 할때 유용하다. 가장 윗부분이 클래스 이름이다. 메소드와 비슷하게 괄호가 붙은 것이 연산이다. 변수명 처럼 나타난 것이 속성이다. 이텔릭체로 되어있는 것은 추상클래스나 인터페이스를 의미한다. (메소드도 마찬가지다) 스테레오 타입으로 표현하기도 한다. (, ) 다이어몬드 포살표가 되었다는 의미는 의존관계를 나타내는데, 위와 같은 경우는 Decorator 클래스가 Component 형 변수를 component 라는 이름으로 가지고 있다는 것을 의미한다. 접근 제어자 표시 public : + protected: * default: ~ private..

객체지향 2022.04.23

데코레이터 패턴 활용해서 관심사 분리하기

프락시와 데코레이터 패턴 마치 자신이 클라이언트가 사용하려는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아 주는 갳게를 프락시라고 부른다. 프락시를 통해서 최종적으로 요청을 위임받아 처리하는 실제 객체를 타깃 오브젝트 즉, 대상 객체라고 부른다. 프락시의 특징은 대상 객체와 같은 인터페이스를 구현했다는 것과 프락시가 대상 객체를 제어할 수 있는 위치에 있다는 것이다. 프락시는 사용 목적에 따라서 두 가지로 구분할 수 있다. 첫 번째는 대상 객체에 부가 기능을 부여해 주는 목적이다. -> 이는 디자인 패턴에서, 데코레이터 패턴이라고 부른다. 두 번재는 클라이언트가 대상 객체에 접근하는 방법을 제어하는 목저이다. -> 이는 디자인 패턴에서, 프락시 패턴이라고 부른다. 이번 글에서는 캐싱이라는 부가 기..

객체지향 2022.03.10

상속 보다는 합성을 사용하라!

상속 위의 사진처럼 MovieFinder 라는 부모 클래스가 몇몇 기능의 구현을 자식클래스에게 위임한다. 상속을 사용하면 부모 클래스의 멤버를 재사용할 수 있는 장점이 있다. 또한 확장에 용이하다. 만약 요구사항으로 인해 구현체가 늘어났다고 해서 MovieFinder 가 변하지 않기 때문이다. 하지만, 상속은 캡슐화를 위배하고, 설계를 유연하지 못하게 만든다는 단점이 있다. 합성 합성은 다른 객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 재사용하는 방법을 의미한다. SOLID 원칙중 계방 폐쇄의 원칙(OCP) 을 만족할 수 있다. -> 소프트웨어는 객체는 확장에는 열려있고, 변경에는 닫혀 있어야 한다. MovieReader 를 통해서 자유롭게 확장할 수 있다. 또한 변경시 MovieFinder 는 변..

객체지향 2022.03.10

역할과 책임분리

책임 분리 public class MovieFinder { private MovieReader movieReader = new CsvMovieReader(); /** * 저장된 영화 목록에서 감독으로 영화를 검색한다. * * @param directedBy 감독 * @return 검색된 영화 목록 */ public List directedBy(String directedBy) { return movieReader.loadMovies() .stream() .filter(it -> it.getDirector().toLowerCase().contains(directedBy.toLowerCase())) .collect(Collectors.toList()); } /** * 저장된 영화 목록에서 개봉년도로 영화를 ..

객체지향 2022.03.10