3주차 백엔드 개념 스터디는 Nest.js를 배우기 위한 준비 단계이다!
1. Dependency Injection
[ Object Dependencies (객체 의존성) ]
현재 객체가 다른 객체와 상호작용(참조)하고 있다면 현재 객체는 다른 객체에 의존성을 갖는다.
위의 사진에서는 Programmer 클래스가 Coffee 클래스에 의존한다.
단점
PetOwner 객체가 AnimalType객체의 생성을 제어하기 때문에 두 객체 간에 결합도가 커진다
즉, 하나의 모듈이 바뀌면 의존한 다른 모듈까지 변경되어야 한다
또한 결합도가 높아지기 때문에 Unit Test 작성이 어려워진다
[ Dependency Injection (의존성 주입) ]
DI라고도 부르며, 객체 자체가 아니라 Framework에 의해 객체의 의존성이 주입되는 설계 패턴이다.
이는 표준을 정의할 수 있고, 정의된 표준을 바탕으로 같은 설계를 하게 한다.
의존성 주입은 필요한(의존하는) 클래스를 직접 생성하는 것이 아니라, 주입해줌으로써 객체간의 결합도를 줄이고 보다 유연한 코드를 작성할 수 있도록 한다.
=> 한 클래스를 수정했을 때, 다른 클래스도 수정해야하는 상황을 방지한다.
위처럼 필요한 객체를 직접 생성하는 것이 아니라 외부로부터 필요한 객체를 받아서 사용하는 것이다
장점
Unit Test가 쉬워진다
코드의 재활용성을 높여준다 -> 확장성 증가
객체간의 의존성(종속성)을 줄이거나 없앨 수 있다
객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다
[ Node.js의 DI 라이브러리 ]
사실 Node.js에서 의존성 관리는 언급이 적은 편이다. 확실하진 않지만 아마 이를 OOP를 위한 컨셉으로 생각하는 경향이 있는 것 같다(?)
Node.js는 동적 타입 언어기 때문에 인터페이스와 상관없이 임의의 객체를 집어넣어 테스트가 가능하기 때문에 굳이 Interface가 필요하지 않다.
또한 기능을 실행하는 객체의 타입이 중요하지 않기 때문에 인터페이스가 없는 만큼 유연해진 것이다.(그만큼 규칙이 없어졌지만..)
하지만 동적 타입을 활용해 테스트가 가능해도, 구현체에 직접 의존하면 강한 결합이 발생한다. 따라서 이를 막기 위해 node,js의 라이브러리를 사용한다.
- Inversify : Javascipt와 Typescript 모두 구현 가능하고, 쉽고 빠르게 DI를 구성할 수 있도록 함
- Lerna : 여러 저장소의 의존성을 묶어주는 역할과 test, build, release 같은 작업을 최적화시켜준다.
2. Javascript Decorator
[ Decorator ]
- 클래스 프로퍼티나 메소드 혹은 클래스 자체를 수정하는데 자바스크립트 함수이다. (순수 함수로 작성되는 것이 좋다)
- 새 함수를 반환하여 전달된 함수 또는 메소드 동작을 수정하는 함수이다.
[ 사용법 ]
- "@ + 데코레이팅 할 코드" 로 사용한다
[ 특징 ]
- 원하는 만큼 사용이 가능하다.
- 선언한 순서대로 적용된다.
- class 선언, method, accessor, property, parameter에 모두 선언이 가능하다.
- 코드가 간결해지고 명확해진다.
[ 예시 ]
데코레이터 함수(cachingDecorator)로부터 반환된 함수를 wrapper(래퍼)라고 한다.
이 함수는 기존의 slow 함수 로직에 cache 로직을 추가한다.
slow 함수의 로직을 건드리지 않고 분리되어 있기 때문에 복잡하지 않다!
3. Nest.js
[ Nest.js ]
Nest.js는 효육적이고 확장 가능한 Node.js 서버 측 어플리케이션을 구축하기 위한 프레임워크이다.
Javascript와 TypeScript로 빌드되고 객체 지향 프로그래밍, 함수형 프로그래밍 등의 요소를 결합한다.
[ Express.js vs Nest.js ]
Express.js는 개발 구조에 대한 자유도가 높기 때문에 개발자들이 Express를 사용하면서 여러 툴, 기술, 미들웨어 등을 선택할 수 있다.
하지만 규모가 커짐에 따라서 많은 개발자들의 관여가 발생하고, 결국 통일성을 해치게 될 수 있다.
Nest.js는 이 문제를 개선하여 각각의 역할을 갖는 controller, service, module이라는 구조를 제공하여 통일성이 생성되고 생산성이 향상되었다.
하지만 이 또한 그만큼 제한이 생긴다.
- Express : 가볍고 간편하기 때문에 비교적 빠르게 간단한 웹을 위한 서버를 만들기 좋다
- Nest.js : 통일성 있고 거대한 프로젝트를 만들기 좋다.
4. 데이터베이스 ORM
ORM 기술은 코드에서 데이터베이스를 쉽게 다룰 수 있게 해주는 도구입니다.
ORM이 무엇인지 알아보고, 기존의 쿼리 중심의 DB Client와의 차이를 알아봅시다.
[ Persistence (영속성) ]
먼저 이것부터 알고가자!
- 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 말한다
- 영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 사라지게 된다
- Object Presistence (영구적인 객체)는 메모리 상의 데이터를 파일 시스템, 관계형 데이터베이스나 객체 데이터베이스 등을 활용하여 영구적으로 저장하여 영속성을 부여한다
[ ORM 이란? ]
- Object Relational Mapping의 약자로, 객체-관계 매핑이다.
- 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말한다.
- 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용하는데, 이 때 객체 모델과 관계형 모델 간에 불일치가 존재한다.
- 이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자도응로 생성하여 불일치를 해결한다.
- 데이터베이스 데이터 <- 매핑 -> Object 필드 : 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다
- Persistant API라고도 할 수 있다
[ ORM 장점 ]
- 객체 지향적인 코드로 더 직관적이고 비즈니스 로직에 집중할 수 있게 도와준다
- 재사용 및 유지보수의 편리성이 증가한다
- DBMS에 대한 종속성이 줄어든다
[ ORM 단점 ]
- 완벽한 ORM으로만 서비스를 구현하기는 어렵다
- 프로시저가 많은 시스테에선 ORM의 객체 지향적인 장점을 활용하기 어렵다
자세한건 아래 사이트 참조..
https://gmlwjd9405.github.io/2019/02/01/orm.html
[ DB Client vs ORM ]
DB Client
ORM에 비해 쉽고, SQL의 세부적인 내용을 변경할 수 있어 간편하다
동적 쿼리 사용 시 ORM보다 간편하게 구현이 가능하다
ORM
RDM의 종류에 관계없이 사용이 가능하기 때문에 DB 변경이나 코드 재활용이 용이하다
테이블이나 객체 생성, 변경 등 관리가 용이하다
쿼리에 많은 시간 투자를 안해도 되기 때문에 빠른 개발이 가능하다
'사이드 프로젝트 > 개발몰입과정[2021_SUMMER]' 카테고리의 다른 글
4주차 개념 스터디 - BE (0) | 2021.08.28 |
---|---|
Typescript 개념 정리 (작성중) (0) | 2021.08.25 |
3주차 개념 스터디 - 테스트 프레임워크 (0) | 2021.08.20 |
3주차 개념 스터디 - JWT (0) | 2021.08.19 |
3주차 개념 스터디 - CORS (0) | 2021.08.19 |
댓글