[CS] 디자인 패턴과 프로그래밍 패러다임

이지예·2023년 7월 1일
0

CS

목록 보기
3/4

1. 디자인 패턴

<싱글톤 패턴>

하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴.
하나의 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어드는 장점.
하지만 의존성이 높아진다는 단점이 있다.

의존성

파라미터나 리턴 값 또는 지역변수 등으로 다른 객체를 참조하는 것. 종속성이라고도 한다. 의존성 주입을 통해 싱글톤 패턴의 결합을 느슨하게 만들 수 있다.

A가 B에 의존성이 있다는 것은 B의 변경 사항에 대해 A 또한 변해야 한다는 것을 의미한다.

의존성 주입의 장점

  • 모듈을 쉽게 교체할 수 있는 구조가 되어 테스팅하기 쉽고 마이그레이션 하기 수월하다.
  • 애플리케이션을 쉽게 추론 가능하다.
  • 모듈간의 관계들이 명확해진다.

의존성 주입의 단점

  • 모듈들이 더욱 분리되므로 클래스 수가 늘어나 복잡성이 증가할 수 있다.
  • 런타임 패널티가 생기기도 한다.

모듈간 결합도가 낮으면 좋은 이유?

  • 재사용이 용이하다.
  • 다른 모듈에 영향이 가지 않아 사이드 이펙트 발생 확률이 낮아진다.

<팩토리 패턴>

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

상위 클래스에서는 인스턴스 생성 방식에 대해 알 필요가 없기 때문에 유연성을 가질 수 있고, 객체 생성 로직이 분리 돼 있기 때문에 유지 보수성이 증가한다.

<전략 패턴>

같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고 이들이 필요할 때 교체할 수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있게 하는 디자인 패턴

<상속과 구현>

상속(extends)

자식 클래스가 부모 클래스의 메서드 등을 상속받아 사용하며, 자식 클래스에서 추가 및 확장을 할 수 있는 것. 이로 인해 재사용성, 중복성의 최소화가 이루어진다.

구현(implements)

부모 인터페이스를 자식 클래스에서 재정의하여 구현하는 것. 부모 클래스의 메서드를 재정의하여 구현해야 한다.

차이점

상속은 일반 클래스, 추상 클래스를 기반으로 구현하며, 구현은 인터페이스를 기반으로 구현한다.

< DOM >

Document Object Model의 준말.

문서 객체 모델을 말하며, 웹 브라우저상의 화면을 이루고 있는 요소들을 지칭한다.

<프록시 서버>

클라이언트가 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램

왜 사용하는가?

1. 보안

서버의 IP를 숨기는 것이 가능하다. 서버로 접근하기 어렵게 만들어 외부로부터 위험을 막아주는 역할을 한다.

2. 캐시

캐시를 사용하여 속도가 더 빨라진다. 이전 요청들을 프록시 서버에 저장(캐시) 해두어 재요청을 보낼 때 서버를 거치지 않고 데이터를 주고 받을 수 있기 때문이다.

3. 우회

IP 주소를 숨기는 것이 가능하기 때문에, IP를 통해 접속을 감지하는 사이트를 프록시 서버를 통해 우회할 수 있다.

<DDoS 공격>

짧은 기간 동안 네트워크에 많은 요청을 보내 네트워크를 마비시켜 웹 사이트의 가용성을 방해하는 사이버 공격 유형.

공격 유형

애플리케이션 계층 공격

애플리케이션 계층에서 서버가 클라이언트 요청에 대응하고, 요청과 관련된 정보를 확보하여 패키징한 다음 브라우저로 전달하는 과정이 일어난다. 애플리케이션 공격 시 해커는 동일한 소스에서 과부하가 걸릴 정도로 정보를 반복해서 요청한다.

프로토콜 공격

방화벽, 라우팅 엔진, 로드 밸런서와 같은 서버 리소스에 과부하를 주는 공격이다. ex) SYN 플러드 공격

SYN 플러드 공격 : 컴퓨터 두 대가 TCP 핸드셰이크를 수행하여 보안 통신 채널을 시작하면, 공격자가 스푸핑된 IP 주소를 포함하는 수많은 SYN 패킷을 서버로 보낸다. 서버가 각 패킷에 대응하지만 클라이언트는 대응하지 않기 때문에 서버는 충돌할 때까지 대기할 수밖에 없다.

볼륨 공격

대역폭이 처리할 수 없을 정도로 많은 트래픽을 서버로 보내는 방식. ex) DNS 증폭

DNS 증폭 : 공격자가 스푸핑된 표적의 IP 주소를 사용하여 DNS 서버로 요청을 전송한다. DNS 서버는 요청에 대한 대응을 표적 서버로 전송한다. 엄청난 양의 DNS 서버 대응으로 표적 서버에 과부하가 발생한다.

방어 방법

  • 공격자들이 공격할 수 잇는 대상을 최소화하여 공격자의 공격을 제한하고 제한된 공간에서 DDoS 보안 활동을 해아 한다.
  • 대규모의 공격을 방어하기 위해 인터넷의 대역폭 또는 서버의 용량을 확보한다.
  • 주요 콘텐츠 또는 주요 데이터를 각각 분산해서 보관하는 것이 좋다.
  • 인터넷 트래픽을 실시간 모니터링하면서 비정상적인 트래픽 발생 시 조치한다.
  • DDoS 보안 프로그램을 최신 버전으로 유지한다.

< CORS >

Cross-Origin Resource Sharing의 준말.

웹 어플리케이션에서 다른 도메인으로부터 리소스를 요청할 때 발생하는 보안 정책을 허용하기 위한 HTTP 헤더 기반 메커니즘이다.

기본적으로 웹 브라우저는 동일 출처 정책(Same-Origin Policy)를 따른다. 출처는 프로토콜, 호스트, 포트번호를 기준으로 결정된다.

CORS는 이러한 동일 출처 정책을 우회하고, 다른 도메인에서 리소스에 접근할 수 있는 방법을 제공한다. 웹 서버는 클라이언트에게 특정 도메인에서의 요청을 허용하도록 응답 헤더에 CORS 관련 정보를 포함시킨다. 웹 브라우저가 응답을 확인하면 허용된 도메인에 대해서만 리소스에 접근할 수 있게 된다.

2. 프로그래밍 패러다임

프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론

<선언형 프로그래밍>

‘무엇을’ 풀어내는가에 집중하는 패러다임.

프로그램이 함수형, 논리형, 제한형 프로그래밍 언어로 작성 된 경우.

ex) SQL, HTML 등이 선언형 프로그래밍 언어의 일종

<명령형 프로그래밍>

‘어떻게’ 해결할 것인가에 집중하는 패러다임.

ex) 포트란, ALGOL, C 등이 명령형 프로그래밍 언어의 일종

<객체지향 프로그래밍>

객체들의 집합으로 프로그래밍의 상호 작용을 표현하며 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식

객체지향 프로그래밍의 특징

추상화

복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것

캡슐화

객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉하는 것

상속성

상위 클래스의 특성을 하위 클래스가 이어받아 재사용하거나 추가, 확장 하는 것.

코드 재사용 측면, 계층적인 관계 생성, 유지 보수성 측면에서 중요.

다형성

하나의 메서드나 클래스가 다양한 방법으로 동작하는 것.

대표적으로 오버로딩, 오버라이딩이 있다.

<객체지향과 절차 지향 프로그래밍 차이>

객체지향 프로그래밍

코드의 재사용성이 높고 유지보수가 쉬우며, 코드를 재사용하기 때문에 개발 시간도 단축할 수 있다. 반면, 처리 속도가 절차 지향보다 느리고 설계에 많은 시간이 필요하다는 단점이 있다.

절차지향 프로그래밍

코드를 작성한 순서대로 실행되기 때문에 처리 속도가 빠르고, 코드의 순서가 바뀌어도 동일한 결과를 보장한다는 장점이 있다. 그러나 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵고 유지보수 또한 어렵다는 단점이 있다.

<오버로딩, 오버라이딩>

오버로딩

메소드 이름이 같지만 매개변수의 타입이 다른 메소드를 정의할 수 있는 것입니다. 즉, 같은 이름의 메소드를 여러 개 정의할 수 있습니다. 오버로딩은 정적 다형성의 한 예시입니다.

오버라이딩

부모 클래스로부터 상속받은 메소드의 이름과 매개변수 리스트, 리턴 타입이 모두 같은 메소드를 자식 클래스에서 재정의하는 것을 말합니다. 이는 동적 다형성의 한 예시입니다.

0개의 댓글