250x250
반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

스윞한 개발자

1. 디자인 패턴 본문

CS 이론

1. 디자인 패턴

스윞남 2024. 8. 6. 16:17
728x90
반응형
SMALL

이번에 네이버 부스트캠프를 도전하면서 CS에 대한 지식의 필요성을 느껴 CS 공부를 시작하게 되었습니다!

 

이 포스팅은 CS 공부하며 정리한 글입니다. 잘못된 부분이 있을 수 있으니 그런 부분에 대해서는 지적바랍니다!

 

 

 

728x90

1. 디자인 패턴

디자인 패턴에 대해서 알아보기 전에! 먼저 용어 정의를 하고 가겠습니다. 

 

* 라이브러리 :

 - 공통으로 사용될 수 있는 특정한 기능을 모듈화한 것

 - 폴더명, 파일명 등에 대한 규칙이 없으며, 프레임워크에 비해 자유로움

 

 

* 프레임워크 : 

 - 공통으로 사용될 수 있는 특정한 기능을 모듈화한 것

 - 폴더명, 파일명 등에 대한 규칙이 존재. 라이브러리보다 더 엄격.

 

디자인 패턴이란?

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

 

# 싱글톤 패턴

하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴입니다. 

ex) 데이터베이스의 연결 모듈에 많이 사용

 

하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어드는 장점이 있습니다.

 

 - 싱글톤 패턴의 단점

 

싱글톤 패턴은 TDD(Test Driven Development : 테스트 기반 개발)를 할 때 걸림돌이 됩니다. TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 합니다.

But, 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 '독립적인' 인스턴스를 만들기 어렵습니다.

 

# 의존성(종속성) 주입

싱글톤 패턴은 사용하기가 쉽고 굉장히 실용적이지만 모듈 간의 결합을 강하게 만들 수 있다는 단점이 있습니다. 의존성 주입(DI : Dependency Injection)을 통해 모듈 간 결합을 느슨하게 만들어 해결할 수 있습니다.

 

ex) A가 B에 의존성이 있다 -> B의 변경사항에 대해 A 또한 변해야 된다

 

메인 모듈이 직접 하위 모듈에 의존성을 주입하지 않고, 중간에 의존성 주입자를 두어 간접적으로 의존성을 주입할 수 있습니다. 

-> '디커플링이 되다'

위와 같은 방법을 사용하면, 모듈을 쉽게 교체할 수 있는 구조가 되어 테스팅하기 쉽습니다.

 

- 단점

모듈들이 더 분리되므로 클래스의 수가 늘어나 복잡성이 증가될 수 있음 -> 런타임 패널티가 발생 가능

 

- 원칙(의존성 주입 원칙)

상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 하며, 추상화에 의존해야 합니다. 

 

팩토리 패턴이란?

객체를 사용하는 코드에서 객체 생성 부분을 떼어 내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴입니다.

 

상/하위 클래스로 분리되기 때문에 느슨한 결합을 가지며, 상위에서는 객체 생성에 관한 것들을 알 필요가 없기에 유연성을 갖게 됩니다.

 

객체 생성 로직이 떼어져 있기에, 리팩터링하더라도 한 곳만 고칠 수 있게 되니 유지 보수성이 증가하게 됩니다.

 

전략 패턴이란?

전략 패턴은 정책 패턴이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주며 상호 교체가 가능하게 만드는 패턴입니다.

ex) 전략 : 결제 방식 LUNACard, KAKAOCard

 

* 컨텍스트

프로그래밍에서의 컨텍스트는 상황, 맥락, 문맥을 의미하며 개발자가 어떠한 작업을 완료하는데 필요한 모든 관련 정보를 말함

 

 - 전략 패턴 라이브러리 Passport(Node.js) : 서비스 내의 아이디와 비밀번호를 기반으로 인증하는 LocalStrategy, OAuth 전략 등

 

옵저버 패턴이란?

 

주체가 어떤 객체의 상태 변화를 관찰하다 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 패턴입니다.

 

주체와 객체를 따로 두지 않고 변경되는 개체를 기반으로 구축되기도 합니다.

ex) 트위터(현 : X), MVC 패턴에 적용 가능

 

* 상속 : 부모 클래스의 메서드 등을 상속받아 사용하며 자식 클래스에서 추가 및 확장을 할 수 있는 것. abstract 클래스 기반으로 구현됨

* 구현 : 부모 클래스의 메서드를 재정의하여 구현해야 함. 인터페이스 기반으로 구현됨

 

* 프록시 객체

대상의 기본적인 동작(속성, 접근, 할당, 순회, 열거, 함수 호출 등)의 작업을 가로챌 수 있는 객체를 뜻하며, 

 - target : 프록시할 대상

 - handler : target 동작을 가로채고 어떠한 동작을 할 것인가 설정되어 있는 함수

 

프록시 패턴이란?

대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 해당 접근을 필터링하거나 수정하는 등의 역할을 하는 계층이 있는 디자인 패턴입니다.

 

객체의 속성, 변환 등을 보완하며 보안, 데이터 검증, 캐싱, 로깅에 사용합니다. (프록시 서버 : nginx 로도 활용)

 

프록시 서버는 클라이언트 사이에서 클라이언트가 자신을 통해 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템, 응용 프로그램을 가리킵니다.

 

ex) CloudFlare, CORS

 

 

 

이번 포스팅은 디자인 패턴에 대한 예시 몇 가지를 알아보았습니다. 다음 시간에 더 다양한 패턴에 대해 공부하고 정리해 보겠습니다!

 

728x90
반응형
LIST

'CS 이론' 카테고리의 다른 글

6. 운영체제  (0) 2024.08.17
5. 네트워크(HTTP)  (0) 2024.08.12
4. 네트워크 기기  (0) 2024.08.11
3. 네트워크  (0) 2024.08.10
2. 디자인 패턴, 프로그래밍 패러다임  (0) 2024.08.08