디자인 패턴

·2022년 6월 17일
0

컴퓨터개론

목록 보기
3/14
post-thumbnail

분명 전공수업에서 컴퓨터 그 자체에 대한 수업을 듣긴 했는데 시간이 너무 오래지나기도 했고
업계가 비슷한데 영역이 달랐다보니 기억들이 훼손(...)되었다.
그래서 겸사겸사 면접준비도 하고 CS 공부를 하기 위하여 포스트를 작성할 예정이고, 이것은 첫번째 포스트다.

이것은 어떻게 보면 기술면접을 대비한 공부에 가깝다는 것이 중요하다.
한번 전반적인 부분을 훑어보는 느낌이랄까?

더 세밀한 부분은 추가적으로 공부를 할 예정이다.


디자인 패턴

디자인 패턴이란 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여
해결할 수 있도록 하나의 규약형태로 만들어 놓은 것을 의미한다.

조금 더 이해하기 쉬운 말로 바꿔보면 아래와 같다.

수많은 사람들이 작업을 하다보니 코드에 대한 수정을 하거나 작업물끼리 연결을 할 때 수많은 문제가 발생하였다.
이 문제를 해결하기 위하여 나온 것이 디자인 패턴이다.

큰 카테고리에서는 3가지로 나눠지는데 생성, 구조, 행동 패턴으로 나눠진다.

1. 싱글톤 패턴

싱글톤 패턴은 한개의 클래스에 오직 한개의 인스턴스만 가지는 패턴이다.

1. MVC 패턴

MVC 패턴이란 Model, View, Controller의 약자로 한개의 애플리케이션(프로젝트)를 구성할 때 구성 요소를 3가지 역할로 나눈 패턴이다.

실질적으로 데이터를 처리하는 로직이 들어가있는 Model
사용자가 보는 페이지를 구현해주는 View
Model과 View 사이에서 입력과 출력을 처리 해주는 Controller

이렇게 구성이 되어있어서 각 서비스마다 분리해서 개발을 한다면 유지보수를 하기 좋고 확장성이 좋아진다.
하지만 순환구조로 되어있기 때문에 강한 결합으로 높은 의존성을 가지게 된다.

2. MVP 패턴

MVP 패턴이란 MVC 패턴에서 View와 Model이 서로 의존하는 것을 해결하기 위해 나온 패턴이다.

기존에 MVC 패턴에 있던 Controller가 사라지고 Presenter가 추가된 모습을 볼 수 있다.
View에서 받은 정보를 통하여 Model에게 요청을 하는 Presenter

이렇게 순환 구조는 풀어냈지만 Model과 Presenter 그리고 View가 Presenter가 1:1 관계로 높은 의존성이 생겨났다.

강한 결합과 느슨한 결합의 특징

반복되서 나오는 의존성 이 무엇이길래 부정적인 의미로 사용되는것일까?

의존성이란 A라는 클래스가 B클래스를 사용하여 코드가 돌아가는 로직이 있다면 두개의 클래스는 의존성이 있다고 표현한다.
여기서 의존성과 함께 나오는 강한 결합(Tight Coupling)과 느슨한 결합(Loose Coupling)의 특징을 알아보자

강한 결합의 특징

  1. 한개의 객체가 변경하게 되면 다른 객체들의 변경이 요구된다.
  2. 강하게 결합이 되어있어서 서로를 사용하지 않는다면 사용할 수 없다.
    이러한 이유로 강한 결합이 되어있는 상태에서는 테스트 코드를 짜는 것이 불가능에 가깝다.
  3. new를 선언할 때 마다 컴퓨터 메모리를 사용하는데 비교적 강한 결합에서 new 선언의 빈도수가 많아서 메모리를 많이 소모한다.

느슨한 결합의 특징

  1. 클래스와 클래스간의 결합이 느슨해져서 기능을 추가하거나 수정하고 확장하는 것이 쉬워진다.
  2. 코드의 유지보수가 쉬워진다.
  3. 테스트 대역으로 치환하는 것이 쉬워서 테스트 코드를 짜는 것이 편해진다.

설명만 보더라도 강한 결합은 절대적으로 나쁜 것을 볼 수 있는데
그렇기 때문에 강한 결합을 느슨한 결합으로 바꾸는 것이 가능하다.

IoC 패턴 (Inversion of Control / 제어의 역전)

IoC 또한 디자인 패턴 중 하나인데 내용이 짧게 요약을 하면
개발자가 프로그램의 흐름을 관리하는 주체였는데, 프레임워크(라이브러리)등이 이것을 관리하게 되면서
제어하는 주체가 변하게 되었다. IoC 라고 부른다.

DI(Dependency Injection / 의존성 주입)

DI는 강한 결합을 느슨한 결합으로 전환시켜주는 방법이고, IoC의 기술 중 하나다.

제어의 역전 : 프레임워크가 대신 제어를 한다.
의존성 주입 : 개발자가 정의해놨던 코드들을

DI(의존성주입)에는 3가지의 방법이 존재하는데 대표적으로 클래스의 생성자(constructor)를 사용한다.

BoardResolver에서 boardService를 주입하여 사용하는 예시

3. 싱글톤 패턴

싱글톤 패턴이란 한개의 클래스에는 오직 한개의 인스턴스만 가지는 패턴이다.

한개의 인스턴스를 만들어서 다른 모듈들이 공유하면서 사용하기 때문에 반복해서 인스턴스를 생성하지 않고
가져다가 붙여 쓸 수 있다는 장점이 존재한다.

자바스크립트에서는 { } 혹은 new Object로 객체를 생성하게 될 경우
다른 객체와 같을 수 없기 때문에 손쉽게 싱글톤 패턴을 만들어볼 수 있다.

값은 서로 a:27이지만 false가 뜨는 모습을 볼 수 있다

싱글톤 패턴 또한 강한 결합이 이루어지지만, DI를 통하여 느슨한 결합으로 바꿔줄 수 있어서
NestJS의 경우 최상단 App.modele.ts에 올려놓으면 하위 폴더에서는 의존성 주입을 하여 자유롭게 사용할 수 있다.

싱글톤 패턴이 적용되어있는 App.modele.ts의 코드

4. 퍼사드 패턴

객체지향 프로그래밍 언어에서 자주 쓰이는 개념인 퍼사드 패턴이다.

이것은 아주 간단하게 실행되는 명령들을 분리하여 함수(메소드)의 형태로 만들어주는 것을 이야기한다.

이렇게 만들어줄 경우 필요한 것만 실행을 할 수 있고
여러 곳에서 코드를 사용할 경우 가져와서 바로 쓸 수 있기 때문에 코드가 간결해진다는 장점이 있다.

단점으로는 마구잡이로 사용을 할 경우 로직이 다 분리되어있어서 코드의 흐름을 읽는데 힘들어질 수 있다.

5. 전략 패턴

전략 패턴이란 객체의 행위를 바꾸고 싶을 때, 직접적으로 수정을 하지 않고 전략이라고 부르는 캡슐화를 한 알고리즘을 바꿔주면서 상호 교체가 가능한 패턴을 이야기한다.

전략 패턴은 인증을 할 때 많이 사용하는데, node의 경우 passport라는 미들웨어 라이브러리로 전략 기반으로 인증을 할 수 있게 한다.

전략(Strategy)가 구현되어있는 구글 소셜 로그인의 JwtGoogleStrategy

구글전략을 가져와서 사용하는 것으로 소셜 로그인이 이루어진다.

작성 중

6. 팩토리 패턴

7. 프록시 패턴

8. 빌더 패턴

9. 프로토타입 패턴

profile
물류 서비스 Backend Software Developer

0개의 댓글