2019년 8월 13일
주최자 : 김민상
참가자 : 김종범, 맹세열, 최우석
오늘은 정말로 강의 형식으로 진행할 예정
지금부터 시작하여 끝날 때까지, 모자라면 내일 계속
forEach
, map
, filter
, reduce
, some
, every
var
, let
, const
import
/export
async
await
npm init
npm install
npm uninstall
node-cli
npm run
paths
설정은 필수tsc
, tsc -watch
, ts-node
app.get / post / put / delete
imports
: 가져올 놈exports
: 내보낼 놈providers
: 내 프로바이더controllers
: 내 컨트롤러forRoot
Exception
이 throw
되었을 때 메세지 필터링Exception
을 클라이언트가 보기 편하게 정리하는 역할canActivate
메소드를 override 하여 해당 메소드에 승인 가능/불가능 여부를 판단하여 리턴하는 구조@SetMetadata
데코레이터를 통해 로그인한 유저의 role 을 구분 처리하는 것도 가능@CurrentApp
, @CurrentUser
두 곳에서만 사용중passport-jwt
적용typeorm
적용 (TypeORM 파트에서 설명)multer
적용class-validator
적용winston
사용)dotenv
사용)compression
사용)axios
사용)f9-cli
개발 예정이라 nest-cli
자체를 바로 사용하지 않을 예정이지만, f9-cli
개발을 위해 사용법은 알아둘 필요가 있음@CurrentApp
구현initCurrentApp
middleware 를 통해 처리함@CurrentUser
처리시 Controller 와 Resolver 가 각각 대응하는 방식이 다른데, 이를 통합하여 처리하도록 구현PublicAuthGuard
guard 에서 하고 있음entry
설정으로 scripts/migration/index.ts 에 기술F9Migration
Class 를 구현하여 Adapter Pattern 으로 정의함entry
설정으로 scripts/gentypes/index.ts 에 기술f9
prefix 로 시작하는 상위 클래스를 상속받게 구현F9BaseResolver
F9BaseDto
F9BaseListArgs
F9BaseMutationResult
F9BaseEntity
QueryBuilder
를 제공하여 raw 방식으로 처리 가능@Decorator
를 통해 가능)@PrimaryGeneratedColumn
@CreateDateColumn
, @UpdateDateColumn
length
default
nullable
unique
, index
는 따로 Decorator 를 통해 지정하는 방식으로 통일@OneToOne
@ManyToOne
, @OneToMany
@ManyToMany
@ManyToOne
을 양쪽으로 걸어 씀총 5가지 방식이 있음
Active Record and findOptions
QueryBuilder
를 사용하지 않을 때 (일반적인 쿼리일 때) 사용하는 find
의 options
Query Builder
createList
(f9-base-entity.ts) 가 이 방식이 아니면 안 됨Create / Update / Delete 쿼리 사용
GraphQLModule (@nestjs/graphql)
구현 자체가 Apollo Server 기반, 정확히는 type-graphql
+ apollo-server
)resolver
를 구현하는 방식Entity
에 Decorator 로 때려넣는 방식type-graphql
@ObjectType
(Type)@InputType
(Input)@ArgsType
(스키마 아님)@Field
(Field of Type/Input)F9BaseEntity
안에 있는 createList
함수createList
함수는 resolver 에서 전달받은 @Info
데이터를 파싱하는데 resolveGqlInfo
함수 사용 (별도 구현, resolve-gql-info.ts)다른 대안은?
Angular 만의 장점이라면?
@Input
, @Output
지시자를 구분하여 별도로 관리하는 부분ng serve
, ng build
하는 구조)angular.json
에 담겨 있음Observables 는 Angular 에서 매우 중요한 개념이자, 매우 자주 사용되는 개념
기본적으로는 Promise 의 대체재라고 보면 되는데, 훨씬 더 잘 정리된 개념으로 보임 (다른 테크닉과 비교)
Observable 은 선언적입니다. Subscribe 하기 전까지는 연산이 시작되지 않아요. 반면 Promise 는 생성 즉시 실행 됩니다. 이 차이는 "당신이 결과를 필요로 할 때" 사용 가능한 레시피처럼 활용되기에 유용합니다.
Observable 은 여러 값들을 제공할 수 있습니다. 반면 Promise 는 하나밖에 제공할 수 없죠. 계속해서 복수의 값들을 받아야 할 때 Observable 이 잘 활용될 수 있습니다.
Observable 은 chaining 과 subscription 을 구분합니다. Promise 에는 오직
.then
뿐이죠. 그래서 Observable 은 복잡한 데이터 변환 레시피를 만드는데 유용합니다. 작업을 바로 수행하지 않은 상태에서요.Observable 은 에러 처리를
subscribe()
에게 맡깁니다. Promise 는 에러를 자식 Promise 에게 넘기죠. 따라서 보다 중앙화 되고 예측가능한 에러 처리를 가능하게 합니다.
Async Pipe
셋업된 Observable 을 반드시 코드 단에서 subscribe()
할 필요 없이 거기서 나올 데이터를 바로 뷰에 바인딩하는 것이 가능함. 그걸 가능하게 해주는 것이 Async Pipe, 아래와 같이 사용 가능.
<div class="product" *ngFor="let product of products | async">
{{ product.title }}
</div>
Query
/Mutation
(심지어 문서도 만들어줌)@Output
을 올려주는 방식으로 처리하고, 이보다 뎁스가 높은 경우 Local Cache 를 사용하는 방식을 고려할 수 있음