분류 전체보기 258

프록시 패턴 (Proxy Pattern)

프록시 패턴 (Proxy Pattern) 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴 특정 객체에 접근하기 전에 프록시 객체를 먼저 지난 후 접근하게 된다. 초기화 지연, 접근 제어, 로깅, 캐싱 등 다양하게 응용하여 사용할 수 있다. 프록시 패턴 적용 전 Client 가 startGame 이 실행되고 종료되기까지 얼마나 시간이 걸리는지 알기 위해서는 Client 코드의 main 시작 부분과 startGame 마지막 부분에 시간을 재면 된다. public class Client { public static void main(String[] args) { GameService gameService = new GameService(); gameService.startGame(); } } ..

디자인 패턴 2022.07.22

플라이웨이트 패턴 (Flyweight Pattern)

플라이웨이트 패턴 (Flyweight Pattern) 객체를 가볍게 만들어 메모리 사용을 줄이는 패턴 자주 변화는 속성과 변하지 않는 속성을 분리하고 변하지 않는 속성을 캐시하여 재사용해 메모리 사용을 줄일 수 있다. 플라이웨이트 패턴 적용 전 편집기를 만든다 가정하고 글자들을 관리하기 위해 Character 클래스를 만들었다. public class Character { char value; String color; int fontSize; String fontFamily; public Character(char value, String color,String fontFamily, int fontSize) { this.value = value; this.color = color; this.fontSiz..

디자인 패턴 2022.07.22

퍼사드 패턴 (Facade Pattern)

퍼사드 패턴 (Facade Pattern) 퍼사드 패턴은 복잡한 서브 시스템 의존성을 최소화 하는 방법이다. 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화 할 수 있다. 클라이언트가 서브 시스템 클래스나 메서드를 직접 사용하는 것이 아니라 중간에서 복잡한 서브 시스템을 감추고 우리가 사용하는 기능에 대해서만 인터페이스 또는 클래스로 압축시켜 사용하게 해준다. [참고] 퍼사드란 원래 건물의 입구 쪽을 바라보는 건물의 전경 이라는 뜻이며, 건물의 외벽을 본다고 건물의 안이 어떤지는 알 수 없다. 퍼사드 패턴 적용 전 자바는 이메일 관련 라이브러리가 제공되는데, 클라이언트가 라이브러리에 대해 지나치게 많이 알아야 한다 라는 문제가 발생한다. 아래와 같이 클라이언트가 많은것..

디자인 패턴 2022.07.19

데코레이터 패턴(Decorator Pattern)

데코레이터 패턴(Decorator Pattern) 기존 코드를 변경하지 않고 부가기능을 추가하는 패턴 상속이 아닌 위임을 사용해서 보다 유연하게 (런타임에) 부가 기능을 추가하는 것도 가능하다. 데코레이터 패턴 적용 전 웹 사이트에서 사용자들이 작성한 Comment 를 관리하는 어플리케이션이 있다 가정해보자. Comment 를 관리하는 CommentService 는 아래와 같으며 addComment 는 Comment 를 출력하는 메서드이다. public class CommentService { public void addComment(String comment) { System.out.println(comment); } } 만약, "..." 과 특수기호는 관리하고 싶지 않다면 그에 맞는 기능을 추가해야..

디자인 패턴 2022.07.19

애자일(Agile) 이란

애자일(Agile) 이란 흔히 개발 ‘방법론' 혹은 ‘프로세스' 라고 얘기하지만 와닿지 않는다. ‘일하는 방식' 정도로 생각하자. 기존 소프트웨어 개발을 할 때 사용하던 전통적인 방식 (구닥다리 방식) 이 아닌 여러 거장들이 ‘유연하게 일하는 방식’ 을 정의한 것이다. 실제 애자일이라는 용어 자체가 ‘기만한', ‘재빠른', ‘민첩한' 이라는 뜻을 가지고 있다. 기존 전통적인 방식 (구닥다리 방식) 전통적인 방식 이라면, 정확히 어떤 방식인지 ‘책을 집필하고 출판하는 과정’ 을 예시로 설명해보겠다. 저자가 기술 서적을 쓰기로 마음 먹음 출판사에 저자의 기획안을 제출 출판사 는 책 출판을 결정 저자와 출판사는 계약을 하고 저자는 집필 시작 탈고일이 6개월 이라 가정, 출판사는 프로그레스를 중간 중간 점검함 ..

개발(ETC) 2022.07.15

컴포짓 패턴 (Composite Pattern)

컴포짓 패턴 (Composite Pattern) 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴. 클라이언트 입장에서는 ‘전체’나 ‘부분’이나 모두 동일한 컴포넌트로 인식할 수는 계층 구조 를 만든다. (Part-Whole Hierarchy) 객체들의 관계를 트리 구조로 표현하며 사용자가 단일 객체와 복합 객체를 모두 동일하게 다룰 수 있도록 구조화한 패턴이다. 즉, 클라이언트 입장에선 전체 부분인지, 전체의 맨 마지막 부분인지, 특정 부분인지 모르고 인터페이스를 통해 사용하게끔 한다. 왜 필요한가? 데이터를 다루다보면 계층형 트리 자료구조로 저장되고 이를 다루게되는 경우가 종종 생긴다. 이 때 composite 패턴을 사용하면 클라이언트 측에서 모든 데이터를 모르더라도 복잡한 트리구조를 쉽게 다..

디자인 패턴 2022.07.12

브릿지 패턴 (Bridge Pattern)

브릿지 패턴 (Bridge Pattern) 추상적인 것과 구체적인 것을 구분하는 패턴 하나의 계층 구조일 때 보다 각기 나누었을 때 독립적인 계층 구조로 발전시킬 수 있다. 하나의 거대한 클래스나 기능부/구현부 로만 분리되어 있던 어플리케이션을 기능부/구현부 각각 독립적인 계층화 구조로 나누는 설계방식을 말한다. 브릿지 패턴 (Bridge Pattern) 적용 전 Champion 인터페이스는 모든 캐릭터(챔피언)가 사용할 수 있는 기능을 인터페이스로 정의해놨다. public interface Champion { void move(); void skillQ(); void skillW(); void skillE(); void skillR(); } 아리 라는 캐릭터는 특정 Skin 을 선택할 수 있는데, 이 ..

디자인 패턴 2022.07.12

어댑터 패턴 (Adapter Pattern)

일상에서 220V 코드를 110V 콘센트에 꽂을 때 어댑터를 사용해 본 경험이 있을것이다. 어댑터 패턴도 위 경험과 매우 유사한 사례라고 할 수 있다. 어댑터 패턴 (Adapter Pattern) 구조 패턴인 어댑터 패턴을 설명하면, Client 가 사용하는 Interface 는 정해져있는데 내가 작성한 코드(Adaptee)는 해당 Interface 를 따르지 않을 때 Client 와 Adaptee 사이의 간극을 Adapter 로 매꿔서 Adaptee 를 재사용할 수 있도록 하는 패턴이다. 즉, 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴이다. 어댑터 패턴 (Adapter Pattern) 적용 전 LoginHandler, UserDetails, UserDetailsService ..

디자인 패턴 2022.07.05

대용량 웹 서비스를 위한 마이크로 서비스 아키텍쳐(MSA)의 이해

마이크로 서비스 아키텍쳐 (이하 MSA) 는 최근 웹 기반의 분산 시스템의 디자인에 많이 반영되고 있는 아키텍쳐 스타일이다. 특정 사람이 정의한 아키텍쳐가 아니라 분산 웹 시스템의 구조가 유사한 구조로 설계 되면서 개념적으로만 존재하던 개념이다. 얼마 전 마틴파울러(Martin folwer) 가 MSA 에 대한 개념을 글로 정리하여 개념을 정립 시키는데 일조하였다. 이 글에서는 대규모 분산 웹 시스템의 아케텍쳐 스타일로 주목 받고 있는 MSA 에 대한 개념에 대해서 알아보도록 하자. 모노리틱 아키텍쳐 (Monolithic Architecture) MSA 를 이해하려면 먼저 모노리틱 아키텍쳐 스타일에 대해서 이해해야 한다. (Monolithic: 단단히 짜여 하나로 되어있는, 하나로 된 거대한 덩어리) 모..

개발(ETC) 2022.07.01

프로토타입 (Prototype) 패턴

기존의 객체를 응용해서 새로운 인스턴스를 만들때 사용된다. 네트워크를 거치거나 db 를 거쳐서 만들어야 하는 등의 복잡한 과정을 거쳐 인스턴스를 만드는 경우 리소스가 많이 드는데, 이미 만들어진 객체를 가지고 복제를 해서 새로운 인스턴스를 만들면 비용을 줄일 수 있다. 아래 그림과 같이 복제 기능을 갖추고 있는 기존 인스턴스를 프로토타입으로 사용해 새 인스턴스를 만들 수 있다. 프로토타입 패턴 실습 GithubRepository public class GithubRepository { private String user; private String name; public String getUser() { return user; } public void setUser(String user) { this.u..

디자인 패턴 2022.06.29