<-- 목 차 --> 프레임워크와 라이브러리 01 프레임워크 02 라이브러리 03 프레임워크와 라이브러리의 차이 디자인패턴 01 개념 02 싱글톤 패턴 이란 02-1 개념과 장단점 02-2 의존성 주입 02-2-1 의존성 주입의 개념과 원칙 그리고 사용이유 02-2-2 의존성 주입의 장단점과 사용예시 03 팩토리 패턴 04 전략 패턴 05 옵저버 패턴 06 프록시 패턴과 프록시 서버 06-1 프록시 패턴 06-1-1 프록시 패턴의 종류 06-2 프록시 서버 06-2-1 프록시 서버와 cors 07 이터레이터 패턴 08 노출모듈 패턴 09 MVC 패턴 10 MVP 패턴 11 MVVM 패턴 프로그래밍 패러다임 01 개념 02 선언형과 함수형 프로그래밍 02-1 순수함수 02-2 고차함수 03 객체지향 프로그래밍 03-1 객체지향 프로그래밍의 특징 03-2 객체지향 프로그래밍의 설계원칙 04 절차형 프로그래밍 면접 예상 질문
원하는 기능 구현에 집중하여 개발할 수 있도록 일정한 형태와 필요한 기능을 갖추고 있는 골격, 뼈대
문제해결을 위한 클래스와 인터페이스가 모여있는 집단.
프레임워크라는 틀, 흐름(flow) 위에 개발자가 필요한 코드를 작성하여 동작한다.
애플리케이션 코드는 프레임워크가 짜 놓은 틀 안에서 수동적으로 동작한다.
활용 가능한 도구들의 집합.
손쉬운 도구 모음집.
미리 작성된 코드, 함수를 사용해 애플리케이션을 쉽게 만들 수 있다.
라이브러리는 필요할 때마다 호출하여 사용 할 수 이싿.
'누가 코드를 돌리냐' 의 차이.
결국 코드를 실행하는 주체가 누구냐
가 프레임워크와 라이브러이의 차이라고 할 수 있겠다.
라이브러리는 개발자가 필요한 함수나 미리 작성된 코드를 가져와서 빠르게 코드를 만들 수 있도록 도와주는 도구로
코드는 개발자가 작성한대로 움직이기 때문에 코드를 실행하는 주체는 개발자가 된다.
반면 프레임워크는 프레임워크가 제공하는 개발 범위 내에서 개발자가 코드를 작성하면
프레임워크가 개발자의 코드를 가져가 동작하기 때문에 코드 실행의 주체가 프레임워크 자신이 된다.
이처럼 개발자가 아니라 프레임워크가 개발의 주도권을 가져가는 것을 "제어의 역전"
이라 한다.
개발자는 개발할 때 필연적으로 유연성과 확장성에 대해 고민
하게 된다.
이렇게 프로그램을 설계할 때 발생했던 문제점
(예_모듈화, 캡슐화 같은 재사용성 증대) 들을
객체 간의 상호 관계 들을 이용해 해결할 수 있도록 하나의 규약 형태로 만들어 놓은 것
이 디자인 패턴이다.
프로그래밍 시 빈번하게 발생하는 문제점들을 해결할 수 있는 표준적인 해법
이며
수학에서 알고있다면 문제를 좀 더 빨리 풀 수 있는 공식, 단축키, 숏컷과 비슷한 종류라고 보면 된다.
직접적으로 코드를 가져다 쓸 수 있는 건 아니지만 우리가 보다 높은 레벨에서 코드 전체와 구조에 대해 생각 할 수 있도록 도와준다.
일종의 청사진이다.
생성패턴, 구조패텅, 행동패턴으로 구분된다.
생성패턴(Creational patterns)로 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴.
이 인스턴스에 대해서는 전역접근(엑세스)가 가능
하다.
싱글톤 패턴은 엄격하게 전역 변수들을 관리해야 할 때나 프로그램에서 공유되는 단일 데이터베이스에서 자주 사용된다.
class 클래스 = 객체를 만들기 위한 설계도 혹은 틀
odject 객체 = 구현할 대상
instance 인스턴스 = 설계를 바탕으로 구현된 실체
장점
단점
싱글톤 패턴은 객체의 유일성이 유지되지 않고 전역접근이 가능한 점이 과.오용 될 때 문제가 발생하는 편이다.
의존성
문제를 발생시켜 유지 보수 비용이 증가한다. 의존성
은 객체지향 프로그래밍에서 클래스 간의 관계로 인해 하나의 클래스가 변화할 때 다른 클래스가 영향을 받는 것을 의미한다.
의존성은 존속성 이라고도 하며 의존성이 높을 경우 하나의 클래스의 코드를 변경했을 때
변경하지 않은 다른 클래스의 코드가 예상하지 못한 결과값으로 오류를 발생시킬 수 있기 때문에 코드의 품질과 안정성 저하의 우려가 있다.
이를 해결하기 위한 방법으로 의존성 주입 (DI, Depensency Injection)이 있다.
의존성 주입 (DI, Depensency Injection)은
메인 모듈과 하위 모듈 사이에 의존성 주입자(생성자)를 두어 클래스간의 의존성을 줄이는 것을 말한다.
의존성 주입의 장점으로
의존성 주입을 했을 때의 단점은
상속관계에 있는 두 클래스에서 상위 클래스가 뼈대를 결정하고, 하위 클래스가 구체적인 객체생성을 결정하는 패턴.
팩토리 패턴은 객체지향원칙의 개방-폐쇄 원칙으로 수정은 닫혀있고 확장은 열려있어야 한다는 것에 의해 만들어진 패턴이다.
수정이 일어날 부분과 그렇지 않은 부분을 분리하여 결합도(의존성)을 낮추는 것이다.
이는 의존성 주입이라 볼 수도 있다.
같은 문제를 해결하기 위해 "전략"이라 부르는 '캡슐 알고리즘'을 여러 개 정의하고, 이를 필요할 때 교체할 수 있게 만든 패턴.
또한 이 "전략"을 담을 '콘텍스트'에 참조를 저장하기 위한 필드가 있어야 한다. 이 콘텍스트는 작업을 자체적으로 실행하는 대신 전략 객체에 이를 위임한다.
"전략" 이란 어떤 목적을 달성하기 위한 알고리즘 묶음이다. 전략 패턴은 이 "전략"을 교체하므로써 직접적인 코드 수정없이 유연하게 확장할 수 있다.
전략패턴의 문제점으로는 새로운 기능을 수정할 경우 기존 코드의 내용을 수정해야 하는 상황이 발생하기 때문에 객체지향원칙의 "개방-폐쇄 원칙"에 위반되기 때문이다.
주체가 관찰 중인 객체에서 발생한 상태 변화(이벤트)에 대해 옵저버 목록에 있는 관찰자들에게 알리는 구독 매커니즘을 정의할 수 있는 패턴
주로 분산 이벤트 핸들링을 구현할 때 쓰이며 발행/구독 모델로도 불린다.
느슨한 결합으로 객체 간의 유연한 관계로 의존성을 줄일 수 있다.
다만 많이 사용하면 상태관리가 힘들어지고 관찰자들이 무작위의 알림을 받는다는 단점이 있다.
주로 MVC(Model-View-Contraller) 패턴에도 사용된다.
자바스크립트에서 옵저버 패턴은 프록시 객체
를 통해 구현할 수 있다.
프록시 객체
프록시 객체란 어떤 대상의 작업을 가로챌 수 있는 객체.
특정 객체를 감싸 읽기, 쓰기와 같은 작업을 중간에 가로채는 객체로, 가로챈 작업은 프록시 자체에서 처리되거나, 원래 객체가 처리하도록 그대로 전달되기도 한다.
JS에서의 프록시 객체는 두 개의 매개변수를 갖는다.
new Proxy (target, handler) ;
proxy에 작업이 가해지고, handler에 작업과 상응하는 트랩이 있으면 트랩이 실행되어 proxy가 이 작업을 처리할 기회를 얻게 된다. 트랩이 없으면 target에 작업이 직접 수행된다.
handler로 가로챌 수 있는 동작
대상 객체(Subject)에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴.
프록시를 이용해 원래 객체에 대한 접근을 제어하여, 어떤 요청이 원래 객체에 전달되기 전,후에 무언가를 수행할 수 있다.
이를 통해 객체의 속성이나 변환 등을 보완하고, 데이터 보안, 검증, 캐싱, 로깅 등에 사용된다.
프록시 서버는 클라이언트가 프록시 서버를 통해 서버에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램으로 사용자가 서버로 직접 접근하는 것을 간접적인 접근으로 바꾸면서 보안성을 강화할 수 있는 방법. 이를 통해 Ddos 공격을 방어하고 https를 구축할 때 인증서를 기반으로 구축할 수 있다.
cors(cross-origin resource sharing)
클라이언트카 서버로 요청을 보낼 때, 클라이언트와 서버가 포트가 다르면 서버가 보안상의 이유로 요청을 차단할 수 있다. 이를 해결하는 방법은
1) 백엔드에서 포트를 모두 열어주거나
2) 프론트와 백이 포트를 맞추거나
3) 프록시를 이용하는 방법이 있다.
프록시 서버를 이용하면 프론트 서버가 http 통신을 할 때 포트번호가 달라도 프록시 서버를 거치면서 알맞은 포트 번호로 바뀌어 요청을 보낼 수 있다.
반복자 패턴. 컬렉션의 요소들의 기본 표현(리스트, 스택, 트리 등)을 노출하지 않고 지정한 순서대로 모든 항목에 접근할 수 있게 해주느 행동 패턴.
접근기능과 자료구조 기능을 분리하여 객체화 한다.
클라이언트는 모든 컬렉션에 접근할 수 있지만 컬렉션이 어떻게 동작하는 지는 알지 못한다.
for문을 사용해도 동일한 접근이 가능하지만 굳이 반복자 패턴을 사용하는 이유는 말했다시피 접근기능과 자료구조 기능의 분리가 가능하기 때문이다.
기능 분리를 통해 객체지향의 단일 책임 원칙을 만족시킬 수 있고, 새로운 컬렉션이나 반복자를 추가 할 때도 기존 코드를 건드리지 않고 수정할 수 있어 개방-폐쇄 원칙에도 부합한다.
다만 간단한 앱의 경우 해당 패턴 사용이 과할 수 있다.
반복자 패턴은 컬렉션 내부에 복잡한 데이터 구조가 있지만 이 구조의 복잡성을 보안/편의상의 이유로 숨기고 싶을 때 사용할 수 있다.
즉시 실행 함수를 이용해 private, public 같은 접근 제어자를 만드는 패턴.
기본적으로 자바스크립트는 위와 같은 접근 제어자가 존재하지 않고 전역 범위에서 스크립트가 실행된다.
노출모듈패턴을 사용하면
private 데이터를 제공하고 전역변수를 덜 더럽힌다.
스크립트 문법이 일관적이게 되어 가독성이 올라간다.
다만 private 메소드에 접근할 방법이 없고 이 함수를 확장하는데 어려움이 있다고 한다.
애플리케이션을 Model - View - Controller 역할로 구분하여 개발하는 패턴
Model 모델
애플리케이션의 데이터, 상수, 변수를 말한다.
View에서 데이터를 수정하거나 생성하면 컨트롤러를 통해 모델을 생성하거나 갱신한다.
View 뷰
사용자가 사용하는 인터페이스 요소를 말한다. 사용자가 볼 화면을 생성하기 위해 Model로 부터 정보를 얻어온다.
Controller 컨트롤러
하나 이상의 모델과 뷰를 잇는 다리역할을 한다. 모델에 명령을 보냄으로써 뷰의 상태를 변경할 수 있다.
MVC의 장단점
Model + View + Presenter
Presenter는 View에서 요청한 정보로 Model을 가공하여 View에게 전달하는 역할을 한다.
View와 Presenter는 1:1 관계이기 때문에 MVC 패턴보다 강한 결합을 가진 디자인 패턴이다.
Model과 View의 의존성이 없다는 장점이 있다.
대신 View와 Preserter 사이의 의존성이 강해졌다.
Model + View + View Model
View Model은 View를 표현하기 위해 만든 View를 위한 Model.
Model, View, View Model이 각각 독립적으로 모듈화 개발이 가능하다.
뷰와 뷰모델 사이에 양방향 바인딩을 지원하고 UI를 별도의 코드 수정 없이 재사용 가능하고 테스팅하기 쉽다.
프로그램 개발을 위한 전략을 짜기 위한 방법들.
크게 선언형
과 명령형
으로 나뉘며
선언형은 함수형
명령형은 객체지향형
과 절차지향형
으로 구분된다.
무엇을 어떻게 해결할지에 집중하고 해결방법은 컴퓨터에 위임하는 방법.
함수형 프로그래밍은 최소단위가 함수이며, 함수를 통해 새로운 데이터를 만들어가는 방식이다.
모든 데이터는 수학적 함수로 계산되고 함수 단위로 구현되기 때문에 재사용성이 높다.
불변성(Immutabillity)를 지향하여 객체가 생성된 이후 변화하지 않아서 동작이 예측하기 쉽고 이를 통해 self effects(부작용)을 방지해 함수 외부에서 상태를 수정할 수 없게 만들어 동시성 문제를 해결 할 수 있다.
함수형 프로그래밍은 다음의 전제로 동작한다.
모든 데이터는 불변상태(Immutab)여야 한다.
모든 함수는 순수함수로 만든다. (loop 보다는 재귀를 이용한다.)
입력값에 의존하여 출력값은 도출하는 함수.
함수가 함수를 매개변수로 받아 로직을 생성하는 것.
명령형 프로그래밍으로 문제를 어떻게 해결해야 하는지 컴퓨터에게 명령을 내리는 프로그래밍 방법이다.
설계에 많은 시간이 소요되고 처리속도가 다른 프로그래밍에 비해 느리다.
규모가 큰 프로그램을 만들 때 주로 사용된다.
추상화
복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것
캡슐화
객체의 속성과 메서드를 하나로 묶고(재사용성) 일부는 외부에 감추어 은닉(은닉화)하는 것
상속성
상위 클래스의 특성을 하위 클래스가 이어받아 재사용하거나 추가, 확장하는 것
다형성
하나의 메서드나 클래스가 다양한 방법으로 동작하는 것 (오버로딩, 오버라이딩)
오버로딩(overloading)
한 클래스 내에 같은 이름의 매서드를 여러개 정의하는 것.
매개변수의 개수나 타입은 달라도 매서드 이름은 같아야 함.
이는 매서드 작성이나 호출이 편리하고 새로운 매서드 이름을 짓지 않아도 되니 효율적이다.오버라이딩(overriding)
상속관계에 있는 매서드와 동일한 이름을 갖고 파라미터를 갖는 매서드를 정의하여 함수를 덮어 쓰는 것.
단일 책임 원칙
모든 클래스는 각각 하나의 책임만 가져야 한다.
개방-폐쇄 원칙
기존의 코드를 변경하지 않으면서 확장은 쉬워야 한다.
리스코프 치환 원칙
부모 객체에 자식 객체를 넣어도 시스템이 문제 없이 돌아가야 한다.
인터페이스 분리 원칙
하나의 일반적인 인터페이스 보다 구체적인 여러 개의 인터페이스를 만들어야 한다.
의존 역전 원칙
상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립해야 한다.
순차적인 명령 수행 뿐만 아니라, 흐로시저 호출의 개념을 바탕으로 하고 있는 프로그램 패러다임. 대표적으로 C언어가 절차형 프로그래밍 언어이다.
코드의 가독성이 좋고 실행속도가 빠르기 때문에 계산이 많은 작업에 쓰인다. 다만 모듈화가 어렵고 유지 보수성이 떨어진다.
프레임워크와 라이브러리의 차이가 뭔가요
프로그래밍을 할 때 프레임워크는 뼈대이고 라이브러리는 레고라고 생각된다.
프레임워크는 정해진 틀에 내가 짠 코드를 군데군데 적용시켜 프로그램이 동작하게 만들고 라이브러리는 레고처럼 각각의 기능이 있는 라이브러리를 불러와 내가 프로그램을 만들어 동작한다는 것이 차이이다. 결국 코드 실행의 주체가 누구에게 있느냐가 프레임워크와 라이브러리의 차이이다.
디자인 패턴의 3가지 분류를 말씀해주실 수 있나요 > 싱글톤은 어디에 포함될까여
리액트와 뷰의 차이를 말씀해주세요
SOLID원칙에 대해 설명해주세요
프록시와 VPN의 차이를 설명할 수 있나요
객체지향 프로그래밍의 장단점 간단하게 설명해주세요
클래스와 인스턴스(객체)를 설명해주세요
객체지향프로그래밍에서 추상화는 무엇인가요
객체지향프로그래밍에서 캡슐화는 무엇인가요
오버로딩과 오버라이딩의 차이를 설명해주세요
<참고>
면접을 위한 CS 전공지식 노트 -주홍철 저
프레임워크와 라이브러리
https://webclub.tistory.com/458
https://juyeop.tistory.com/23
https://brilliantdevelop.tistory.com/68
디자인패턴
https://kotlinworld.com/361
https://refactoring.guru/ko/design-patterns/singleton
https://gmlwjd9405.github.io/2018/07/06/design-pattern.html
싱글톤
https://refactoring.guru/ko/design-patterns/singleton
https://devmoony.tistory.com/43
https://blog.hexabrain.net/394
https://velog.io/@seongwon97/싱글톤Singleton-패턴이란
https://jeong-pro.tistory.com/86
https://velog.io/@sana/DI-의존성-주입Dependency-Injection-의-개념과-방법
팩토리패턴
https://velog.io/@ellyheetov/Factory-Pattern
https://jusungpark.tistory.com/14
프록시
https://doqtqu.tistory.com/346
https://velog.io/@esthevely/JS-자바스크립트에서-Proxy-객체-이해하기
https://coding-factory.tistory.com/711
https://devlog.kro.kr/postitem/?name=Cors
https://velog.io/@sonwj0915/CORS와-Proxy를-활용하여-해결하기
https://lhwn.tistory.com/entry/3-프록시Proxy-설정으로-CORS-이슈-해결
이터레이터패턴(반복자)
https://keencho.github.io/posts/iterator-pattern/
https://flower0.tistory.com/446
https://lktprogrammer.tistory.com/40
노출모듈패턴
https://velog.io/@narangke3/노출모듈-패턴
https://edykim.com/ko/post/revealing-module-pattern/
MVC패턴
https://cocoon1787.tistory.com/733
https://m.blog.naver.com/jhc9639/220967034588
MVP패턴, MVVM패턴
https://beomy.tistory.com/43
프로그래밍 패러다임
https://velog.io/@codenmh0822/프로그래밍-패러다임
https://hoi5088.medium.com/프로그래밍-패러다임-절차-지향-객체지향-프로그래밍-a5160a1e39e4
https://huilife.tistory.com/31
https://hwayomingdlog.tistory.com/337