ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [기술면접 sw] 아키텍처 패턴 vs 디자인 패턴 개념과 차이
    취업준비/기술면접 2022. 11. 6. 13:00

     

    Spring MVC 패턴을 사용해 프로젝트를 진행했는데, 면접 중 Spring MVC 패턴을 왜 사용했는가 특징이 뭔가?에 대한 질문을 받았었고, 추가적으로 디자인패턴 관련 질문들을 종종 봤어서 이를 정리해볼까 한다.  정처기 공부하면서 디자인 패턴 종류 엄청 외웠었는데,, 다시 한 번 되새겨보자.

     

     

    📑 소프트웨어 아키텍처란?

     

    : 소프트웨어를 구성하는 구성요소(모듈/컴포넌트) 간의 관례를 관리하는 시스템의 구조이다. 소프트웨어 아키텍처의 기본 원리는 다음과 같다.

     

    📌 1. 모듈화 
    : 시스템의 기능들을 모듈 단위로 나눈 것. 이때 모듈 개수는 적당한 것이 좋다. 너무 많을 경우 통합 비용이, 너무 적을 경우 모듈 하나의 개발 비용이 많이 들게 된다.

    📌 2. 추상화
    : 전체적이고 포괄적인 개념 설계 -< 차례로 세분화/구체화

    📌 3. 단계적 분해
    : 문제를 상위의 중요 개념으로부터 하위의 개념으로 구체화시키며 분할

    📌 4. 정보 은닉
    : 한 모듈 내부에 포함된 절차와 자료를 숨기며 독립적 수행을 가능캐 해, 다른 모듈이 접근하거나 변경하지 못하게 한다. 

    모듈 내 응집도는 강하게, 모듈 간 결합도는 약하게 하는 게 중요하다. 

     

     

     

    📑 아키택처 패턴이란?

     

    주어진 상황에서 소프트웨어 아키텍쳐에서 일반적으로 발생하는 문제점들에 대한 일반화되고 재사용 가능한 솔루션이다.  아키텍처 설계 시 이를 위한 기본적 윤곽을 제시, 서브 시스템들과의 역할 정의, 관계간 여러 규칙 등이 포함되어 있다. 아키텍쳐 패턴은 소프트웨어 디자인 패턴과 유사하지만 더 큰 범주에 속한다. 

     

    아키택처 패턴의 예로는 다음과 같다. 

     

    1. 계층화 패턴 (Layered pattern)
    2. 클라이언트-서버 패턴 (Client-server pattern)
    3. 마스터-슬레이브 패턴 (Master-slave pattern)
    4. 파이프-필터 패턴 (Pipe-filter pattern)
    5. 브로커 패턴 (Broker pattern)
    6. 피어 투 피어 패턴 (Peer-to-peer pattern)
    7. 이벤트-버스 패턴 (Event-bus pattern)
    8. MVC 패턴 (Model-view-controller pattern)
    9. 블랙보드 패턴 (Blackboard- pattern)
    10. 인터프리터 패턴 (Interpreter pattern)

     

    📑 디자인 패턴이란?

     

    : 소프트웨어 디자인에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책을 말한다. 상황에 맞게 사용될 수 있는 문제들을 해결하는데 쓰이는 템플릿을 의미한다. 프로그래머가 어플리케이션이나 시스템을 디자인할 때 공통된 문제들을 해결하는데 쓰이는 형식화된 좋은 패턴이다. 

     

    GoF라 불리는 네명의 컴퓨터 과학 연구자들이 소개한 대표적인 디자인 패턴 방식으로 생성, 구조, 행위 3가지 분야로 분류되는 디자인이 있다. 

     

     

     


     

     

    < 생성 패턴 >

    : 객체 인스턴스를 생성하는 패턴으로, 클라이언트와 그 클라이언트가 생성해야 하는 객체 인스턴스 사이의 연결을 끊어주는 패턴이다. 

     

     

    🎃 싱글턴 패턴(Singleton Pattern)

     

    : 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해주는 패턴이다. 싱클턴 패턴을 사용하면 전역 변수를 사용할 때와 마찬가지로 객체 인스턴스를 어디든지 액세스할 수 있게 만들어진다. 클래스 인스턴스를 하나 만들고 그 인스턴스로의 전역 접근을 제공한다. 

     

    아래와 같이 객체를 생성할 때 final을 붙여 생성자 주입으로 MemberRepository의 객체를  생성하는게 싱글턴 패턴이 적용된 것이라 볼 수 있다. 만약 싱글턴 패턴을 적용하지 않으면 MemberRepository memberRepository  = new MemberRepository ();와 같이 생성해야 되는데 이렇게 하면 MemberRepository  객체를 생성할때마다 새로운 객체가 생성되므로 그 주소는 각각 다르다. 

     

    //@RequiredArgsConstructor
    public class LoginService {
    
        private final MemberRepository memberRepository;
        
        public LoginService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
        }
     }

     

     

     

    🎃 추상 팩토리 패턴(Abstract Factory Pattern)

     

    : 구상 클래스에 의존하지 않고도 서로 연관되거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공한다. 클래스는 서브 클래스에서 만든다. 

     

    만약 LG와 SAMSUNG 컴퓨터와 마우스를 함께 구매하려고 한다. 그럼 ComputerFactory라는 인터페이스에 notebook, mouse 메서드를 만들어둔다. 그리고 LG컴퓨터 클래스와 Samsung 컴퓨터 클래스에서 각각 오버라이딩을 통해 notebook과 mouse 메서드를 재정의 해서 return 값으로 new LGNotebook();과 같이 반환하면 해당 객체가 생성되는 것이다. 

     

     

     

    🎃 팩토리 메소드 패턴(Factory method pattern)

     

    : 객체를 생성할 때 필요한 인터페이스를 만든다. 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결정한다. 팩토리 메서드 패턴을 사용하면 클래스 인스턴스를 만드는 일을 서브 클래스에게 맡기게 된다. 

     

    만약 할인 정책 클래스를 만드려고 한다. 할인 정책을 상품에 10%로 할지 아님 2,000원 할인으로 할지 결정되지 않았다고 가정한다면 할인이라는 interface를 하나 만들어두고 이 인터페이스를 구현하는 고정 금액 할인과 정률 금액 할인 클래스를 2개 만들어둔다. 그 다음 할인 객체를 생성할 때 서브 클래스에서 어떤 클래스의 인스턴스를 만들지 선택하면 된다. 

     

    따라서 추상 팩토리 패턴은 서로 연관 있는 객체들의 조합이 필요할 때, 팩토리 메서드는 각각 다른 객체들이 필요할 때 사용한다. 

     

     

     


     

    <구조 패턴>

     

    :클래스와 객체를 더 큰 구조로 만들 수 있게  구상을 사용하는 패턴이다.

     

     

    🎃 데코레이터 패턴(Decorator Pattern)

     

    : 데코레이터 패턴으로 객체에 추가 요소를 동적으로 더할 수 있다. 데코레이터를 사용하면 서브 클래스를 만들 때 보다 훨씬 유연하게 기능을 확장할 수 있다. 

     

     

    🎃 프록시 패턴(Proxy Pattern)

     

    : 특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)를 제공한다. 사이즈가 큰 객체가 로딩되기 전에 프록시를 통해 참조할 수 있다는 특징이 있다. 

     

    예를들어 용량이 큰 이미지와 글이 같이 있는 문서를 화면에 띄울 때, 텍스트는 용량이 작아 빠르게 나타나지만 이미지는 용량이 크기에 느리게 로딩되는 것을 확인할 수 있다. 만약 이렇게 처리하지 않으면 페이지 로딩이 끝난 후 화면이 나오므로 사용자는 로딩될때까지 기다려야한다. 따라서 텍스트가 먼저 나온 후 이미지를 나오게하는 방식이 좋다. 

     

     

    🎃 어댑터 패턴(Adapter pattern)

     

    : 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다.  

     

     

     


     

    <행동 패턴>

     

    : 클래스와 객체들이 상호작용하는 방법과 역할을 분담하는 방법을 다루는 패턴

     

     

    🎃 템플릿 메서드 패턴(Template Method Pattern)

     

    : 알고리즘의 골격을 정의한다. 템플릿 메서드를 사용하면 알고리즘 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의할 수도 있다. 

     

     

    🎃 옵저버 패턴(observer pattern)

     

    : 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다. 

    반응형

    댓글

Designed by Tistory.