- Union-Find
- ์นด์นด์ค ์ฝํ
- ์ด๋ถํ์
- ์ํฐ๋
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ํธ๋ฆฌ
- Python
- BFS
- go
- DP
- ์์ฝ๋
- LCs
- C++
- ์ฌ๊ท
- nestjs
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- ๋ฐฑ์ค
- golang
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ๋นํธ๋ง์คํน
- ํ๋ฆฌ์จ๋ณด๋ฉ
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- ์นด์นด์ค2021
- ์น๋ฆฐ์ด
- ๋ค์ต์คํธ๋ผ
- DFS
- js
- ๋นํธ๋งต
- ์๊ณ ๋ฆฌ์ฆ
- Today
- Total
Hello Ocean! ๐ผ
[TIL] ํ๋ฆฌ์จ๋ณด๋ฉ ๋ ๋ฒ์งธ ๊ณผ์ _MAPIA ๋ณธ๋ฌธ
๋ ๋ฒ์งธ ๊ณผ์ ๐ฅ
11์ 4์ผ ~ 11์ 6์ผ๊น์ง ๋ ๋ฒ์งธ ๊ณผ์ ๋ฅผ ์งํํ๋ค.
๋ ํ์ฌ์ ๊ณผ์ ์ค์ ์ํ๋ ๊ฒ์ ๊ณจ๋ผ์ ์ํํ๋ ๊ฒ์ด์๋๋ฐ,
ํ ๊ณผ์ ๋ ๋ณดํธ์ ์ผ๋ก ๋ง์ด ์ฐ์ผ ๊ฒ ๊ฐ์ ๋ด์ฉ์ด์๊ณ ,
ํ ๊ณผ์ ๋ graphDB์ graphQL์ ์ด์ฉํ ์๋ค๋ฅธ ๋ด์ฉ์ด์๋ค.
์ฐ๋ฆฌํ์ ๋ง์ฅ์ผ์น๋ก ์๋ค๋ฅธ ๋ด์ฉ์ ๋งํผ์์ปดํผ๋ ๊ณผ์ ๋ฅผ ์ํํ๊ธฐ๋ก ํ๋ค.
์ฌ์ค ๊ณผ์ ๋ฅผ ์ ํ ๋ ์ข ๋๋๋ค. ๋ณดํธ์ ์ผ๋ก ๋ง์ด ์ฐ์ด๋ ๋ด์ฉ์ ์ ํํ๋ ํ์์ด ์์ ์ค ์์๋๋ฐ,
๋ค๋ค ์ฌ๋ฏธ์์ด ๋ณด์ด๊ณ , ๋์ ์ ์ธ ๊ณผ์ ๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ชจ๋ ๊ฐ์ ์๊ฐ์ด๋ผ๋ ๊ฒ์ด ์ข์๋ค.
์์
์คํธ๋ฆฌ๋ฐ ์๋น์ค์์, ๋ฎค์ง์
, ๊ณก
, ์จ๋ฒ
์ ์ธ ๊ฐ์ง ์์๊ฐ ์กด์ฌํ ๋, CRUD API๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ค.
ํ๋ฉด๋ณ Read API ์๊ตฌ์ฌํญ (GraphQL)
๊ณก ํ์ด์ง
โ ํด๋น ๊ณก์ด ์ํ ์จ๋ฒ์ ๊ฐ์ ธ์ค๋ API
โ ํด๋น ๊ณก์ ์ด ๋ฎค์ง์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ API
์จ๋ฒ ํ์ด์ง
โ ํด๋น ์จ๋ฒ์ ์ด ๋ฎค์ง์ ๋ชฉ๋ก ๊ฐ์ ธ์ค๋ API
โ ํด๋น ์จ๋ฒ์ ๊ณก ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ API
๋ฎค์ง์ ํ์ด์ง
โ ํด๋น ๋ฎค์ง์ ์ ๋ชจ๋ ์จ๋ฒ API
โ ํด๋น ๋ฎค์ง์ ์ ๊ณก ๋ชฉ๋ก ๊ฐ์ ธ์ค๋ API
Create, Update, Delete API ์๊ตฌ์ฌํญ (RESTful API)
โ ์จ๋ฒ ์์ฑ API
โ ๋ฎค์ง์ - ๊ณก ์ฐ๊ฒฐ
โ ๊ณก - ์จ๋ฒ ์ฐ๊ฒฐ
โ ๊ณก - ์จ๋ฒ์ฐ๊ฒฐํด์ API
โ ๋ฎค์ง์ - ๊ณก ์ฐ๊ฒฐํด์ API
โ ๋ฎค์ง์ ์์ฑ API
โ ๊ณก ์์ฑ API
github Repository ์ฃผ์ : https://github.com/preOnboarding-Team13/Assignment_2_MAPIA
Neo4j (GraphDB) ๐๏ธ
์ด๋ฒ ๊ณผ์ ๋ฅผ ํตํด graphDB๋ฅผ ์ฒ์ ์จ๋ดค๋ค. ์ด์ ์ NoSQL์ ๊ณต๋ถํ์ ๋, ์ด๋ฐ ์ข ๋ฅ๊ฐ ์๋ค~ ๋ผ๊ณ ๋ง ๋ค์์๋๋ฐ ์ค์ ๋ก ์จ๋ณด๊ฒ ๋์ด ๋๊ทผ๊ฑฐ๋ ธ๋ค.
๊ณผ์ ๊ธฐํ๋ ์งง์๋ฐ, ์๋ก ๋ฐฐ์์ ์จ์ผํ๋ค๊ณ ์๊ฐํ๋ ๋ถ๋ด๊ฐ์ด ๋ค๊ธฐ๋ ํ๋ค. ๊ทธ๋์ ํ์๋ค๊ณผ ํ์ ์ ์ ๊ณต์๋ฌธ์์ ๊ฐ์ข ๋ธ๋ก๊ทธ๋ค์ ์ด์ฌํ ์ฐพ์๋ดค๋ค.
๋คํํ๋ ์ปจ์ ์ด ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ์ ๊ฑฐ์ ๊ฐ์์ ์ดํดํ๋๋ฐ ํฌ๊ฒ ์ด๋ ต์ง ์์๋ค.
์ฟผ๋ฆฌ ์ญ์ ๊น๊ฒ ๊ณต๋ถํ์ง๋ ๋ชปํ์ง๋ง, ๊ณผ์ ๋ฅผ ์ํํ๋๋ฐ ํ์ํ ์ ๋์ ์ฟผ๋ฆฌ๋ ์ด๋ ต์ง ์๊ฒ ์์ฑํ ์ ์์๋ค.
๊ณต๋ถํ๋ฉด์ ๊ต์ฅํ ์ง๊ด์ ์ธ DB๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ์ธ๋ฑ์ค๋, ๊ด๊ณ ์ค์ ์ด๋, ๋ณต์กํ ๊ตฌ์กฐ๊ฐ ์์ด Node์ Relationship๋ง์ผ๋ก ์ฌ์ฉํ ์ ์์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ด๊ณ๋ฅผ ํ๋์ ๊ฐ์ฒด์ฒ๋ผ ๋ณด๋ ๊ด์ ๋ ์๋ก์ ๋ค.
Neo4j Browser๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด๋ณด๊ณ , ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ฐ๋ก๋ฐ๋ก ํ์ธํ ์ ์์ด์ ํธ๋ฆฌํ๋ค.
DB Modeling๐ก
๊ณต์๋ฌธ์์ ๋ชจ๋ธ๋ง ๊ฐ์ด๋๊ฐ ๋ช ํํ๊ฒ ์์ฑ๋์ด ์์ด ํฐ ๊ณ ๋ฏผ์์ด ๋ชจ๋ธ๋ง์ ํ ์ ์์๋ค.
https://neo4j.com/developer/guide-data-modeling/
Graph Modeling Guidelines - Developer Guides
This guide is designed to walk you through the graph data modeling lifecycle of Neo4j. You will be introduced to the basic process of designing a graph data model that can answer a wide range of business questions across a variety of domains.
neo4j.com
Node๋ฅผ ๋ง๋ค๊ณ , Node์์ ํ์ํ property๋ฅผ ๋ฃ๊ณ , Node๋ฅผ ์ ์ ํ Relationship์ผ๋ก ์ฐ๊ฒฐํ๋ฉด ๋์ด์๋ค.
ํฅ๋ฏธ๋ก์ด๊ฑด ์ฐ๋ฆฌ๋ ์ฌ์ฉํ ํ์๊ฐ ์์์ง๋ง RelationShip์๋ property๋ฅผ ์์ฑํ ์ ์๋ค๋ ์ ์ด์๋ค.
๋ชจ๋ธ๋ง์ ํ๋ฉด์, RDBMS์์ N:M ๊ด๊ณ๋ฅผ ํด์ํ๋ ๊ฒฝํ์ด ๋ ์ค๋ฅด๋ฉด์, GraphDB์ ์ฅ์ ์ ํฌ๊ฒ ๋๋ ์ ์์๋ค.
์ฐ๋ฆฌํ์ ๋ชจ๋ธ๋ง ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค!

์์ฒ๋ผ ๋จ๋ฐฉํฅ์ผ๋ก ๊ด๊ณ๋ฅผ ์ค์ ํ์ ๋, song์์๋ album์ด๋ musician๊ฐ์ด ์์ ์ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ ธ๋์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ด ์๋๋๋ ๋ ผ์๊ฐ ์์๋ค. ๊ณต์๋ฌธ์๋ฅผ ์ดํด๋ณธ ๊ฒฐ๊ณผ ๋ฐฉํฅ์ ์๊ด์์ด ์ฐ๊ฒฐ๋ ๋ ธ๋์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
Query ์์ฑ โณ
์ฐ๋ฆฌํ์ ์ด๋ฒ ๊ณผ์ ์์ ๋ฌธ์์ด๋ก ์ฟผ๋ฆฌ๋ฅผ ์งฐ๋ค.
๋ฑํ ๋ง๋ ํ ORM? ODM?์ด ์๊ฐ๋์ง ์์๊ณ , ์ฒ์ ์ ํ๋ DB์ปจ์ ์ด๋ฏ๋ก ์ง์ ๋ฌธ์์ด๋ก ์ฟผ๋ฆฌ๋ฅผ ์ง๋ณด๋ ๊ฒ์ด ์๋ฏธ ์์ ๊ฒ ๊ฐ์๊ธฐ ๋๋ฌธ์ด๋ค.
TIL์ ์์ฑํ๋ฉด์ ์ฐพ์๋ณด๋ OGM(Object Graph Mapper)๊ฐ ์กด์ฌํ๋ค.
๋ค์์ GraphDB๋ฅผ ์ธ ๋๋ OGM์ ์ด์ฉํ๋ ๊ฒ์ผ๋ก! JS OGM package
๋์ ๋๊ท ๋์ด ํ์ํ ์ฟผ๋ฆฌ๋ฅผ ๋ ธ์ ์ ํ๋์ฉ ์ ์ด๋๊ฐ๋ค.
์ ์ผ๋ฉด์ ์ด ์ฟผ๋ฆฌ์์ return๊ฐ์ด ํ์ํ ๊น์? ๋ณ์ ์ด๋ฆ์ ์ด๋ป๊ฒ ํต์ผํ ๊น์?๋ฑ์ ๋ ผ์๋ฅผ ํ๋ค.
์์ฑํ๋ ๋ช ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ ธ์๋ดค๋ค.
// MUSICIAN ์์ฑ
CREATE(m:MUSICIAN {name: '๋ ๋๋ฒจ๋ฒณ', company: 'JYP'}) return m
// MUSICIAN ์
๋ฐ์ดํธ
MATCH (m:MUSICIAN {name:'๋ ๋๋ฒจ๋ฒณ'}) SET m.company = 'JYP' RETURN m
// MUSICIAN ์ญ์
MATCH (m:MUSICIAN {id:'์ด์ฉ๊ตฌ์ ์ฉ๊ตฌ'}) DELETE m
// ALBUM๊ณผ ์ฐ๊ฒฐ๋์ด์๋ MUSICIAN ์ฐพ๊ธฐ
MATCH (m:MUSICIAN)-[r1:HAVE]->(s:SONG)<-[r2:CONTAIN]-(a:ALBUM)
WHERE a.name = 'Perfect Velvet'
RETURN m
// MUSICIAN, SONG, ALBUM ์ฐ๊ฒฐ ์ฌ๋ถ
MATCH (m:MUSICIAN {name: '๋ ๋๋ฒจ๋ฒณ'}),(s:SONG {name: 'Perfect Velvet'}), (a:ALBUM {name: 'ํผ์นด๋ถ'})
RETURN EXISTS((m)-[:HAVE]-(s)-[:CONTAIN]-(a))
์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ํ ์คํธํ๋ฉด์ ๋ชจ๋ธ๋ง์ ์์ ํ๋ค.
๊ทธ ์ ์๋ id property๊ฐ ์์ด name์ด PK๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ ์ ์์๊ฑฐ๋ผ๊ณ ์๊ฐํ๋๋ฐ,
name์ผ๋ก ํ๋ฉด ํด๋น name์ ๊ฐ์ง ๋ชจ๋ ๊ฐ์ฒด๊ฐ ์ํฅ์ ๋ฐ๋๋ค.
ํ์ง๋ง ์ด๋ฆ์ด ๊ฐ์ ๋ฎค์ง์ , ๋ ธ๋, ์จ๋ฒ์ด ์ถฉ๋ถํ ์กด์ฌํ ๊ฒ ๊ฐ์ id property๋ฅผ ๊ฐ ๋ ธ๋์ ์ถ๊ฐํ๊ณ , uuid๋ฅผ ์์ฑํด ๋ฃ์ด์ฃผ์๋ค.
id๊ฐ ์ถ๊ฐ๋ ํ์ ์ค์ ๋ก ์ฌ์ฉํ ์ฟผ๋ฆฌ๋ค์ ์ฌ๊ธฐ์ ์ ์์ฑ๋์ด ์๋ค.
GraphQL ๐
GraphQL์ ์ ๋ง ์ฉ์ด์กฐ์ฐจ๋ ์์ํ๋ค. ์ฒ์์๋ GraphDB์ ์ฌ์ฉํ๋ SQL๋ฌธ ๊ฐ์๊ฑด๊ฐ ์๊ฐํ๋ค.
ํ์ฐธ์ ๊ณ ๋ํ๋ค๊ฐ ์ด ์์์ ํตํด ์ดํดํ๊ฒ ๋์๋ค.
์ปจ์ ์ ์ดํดํ๋๋ฐ ์ ๋ง ๋ง์ ๋์์ด ๋์๋ค. ์์ผ๋ก ๋๊ตฐ๊ฐ ๋์๊ฒ GraphQL์ด ๋ญ๋๊ณ ๋ฌผ์ด๋ณด๋ฉด ์ด ์์์ ๋ณด์ฌ์ค ๊ฒ ๊ฐ๋ค.
GraphQL์ Rest API๋ฐ์ ์กด์ฌํ์ง ์๋ ๋ด ๋จธ๋ฆฟ์์ ํฐ ์ถฉ๊ฒฉ์ ์ฃผ์๋ค. ์ผ ์ด๊ฒ๋๋คใ
ใ
Client๊ฐ Body์ ๋ญ ๋ด์๋ณด๋ด๋๋์ ๋ฐ๋ผ Res์ ์กด์ฌํ๋ ํ๋๊ฐ๋ค์ด ๋ฌ๋ผ์ง๋ค๋!! ๊ทธ๋ฆฌ๊ณ ์ด ๊ฒ์ด ๋น๊ต์ ๊ฐ๋จํ ๋ก์ง์ผ๋ก ํด๊ฒฐ๋๋ค๋!!
GraphQL ๊ธฐ๋ณธ์ ์ธ ์ค์ ๋ฐ ์ ์ฉ์ ๋๊ท ๋์ด ํด์ฃผ์ จ๊ณ , ๋๋ ํฌ์ง๋, ๋์๋๊ณผ ํจ๊ป where์ ์ ์กฐ๊ฑด๊ฐ์, client๊ฐ ํน์ id๋ฅผ ๋ฃ์ด๋ณด๋์ ๋๋ฅผ ์ํ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
Resolver์ฝ๋๋ฅผ ์์ ํด์ Arg๋ก id๋ฅผ ๋ฐ๋๋ก ํ๋๋ฐ, ์ ๋๋ก ์๋ํ์ง ์์๋ค.
// AlbumRead Resolver ์ฝ๋
...
// ๊ธฐ์กด ์ฝ๋ (๋ชจ๋ ์จ๋ฒ)
@Query(() => [Album])
async readAllAlbum() {
return this.readService.readAllAlbum();
}
// ์ถ๊ฐํ ์ฝ๋ (ํน์ id)
@Query(() => [Album])
async readAlbum(@Args("id") id: string) {
return this.readService.readAlbum(id);
}
...
์์ธ์ graphqlํ์ผ์ ์์๋ค.
์ด ํ์ผ์ ์ ์๋ ํํ์ ์์ฒญ๋ง ์ฒ๋ฆฌํ ์ ์์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ id๋ฅผ ์ธ์๋ก ๋ฐ์ ์ ์๋ Query๋ฅผ ์ถ๊ฐํ๋ค.
type Query {
readAlbum(id: String!): [Album!]! // ์ถ๊ฐ!
readAllAlbum: [Album!]!
}
์ด๋ ๊ฒ ๋จ 2๊ฐ์ง๋ง ์ถ๊ฐํด์ ํน์ id์ ๋ํ ๊ฒฐ๊ณผ๋ง ๋ณด์ฌ์ฃผ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์๋ค. ๋ฌผ๋ก ๋๊ท ๋์ด GraphQL์ ์ค์ ํ์๋๋ฐ ๋ง์ ๋ ธ๋ ฅ์ด ๋ค์ด๊ฐ์ง๋ง, API๋ฅผ ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์์ด์ ์ ๋ง ์ ๊ธฐํ๋ค.
๋ค์๋ฒ์ GraphQL์ ์ฐ๊ฒ๋๋ค๋ฉด, ๋ด๊ฐ ์ค์ ์ ๋งก์๋ณด๊ณ ์ถ๋ค.
NestJS ๐
์ด๋ฒ ํ๋ก์ ํธ์์ NestJS๋ ์ฒ์ ์จ๋ดค๋ค. ์ฒซ ๋ฒ์งธ ๊ณผ์ ์์๋ express๋ฅผ ์ด์ฉํ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ฒ ๊ณผ์ ์์ NestJS๋ฅผ ์ด์ฉํ ์ฐ๋ฆฌํ ๊ณผ์ ๋ ํฌ๋ฅผ ์ดํด๋ณด๋ฉด์ ๊ตฌ์กฐ๋ฅผ ํ์ ํ๋ค.
์จ๋ณธ์ ์ด ์๊ธด ํ์ง๋ง, ๋๊ฐ ํ์ด๋ณด๋ 'JS์ Spring๊ฐ์ ์น๊ตฌ๊ตฌ๋'๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
์์ ๋๊ฐ ๊ต์ฅํ ๋์๋ express์ ๋ค๋ฅด๊ฒ ๋๋ถ๋ถ์ด ์ ํํ, ๊ตฌ์กฐํ ๋์ด์์๋ค.
์ฒ์์๋ ์ด ๋ถ๋ถ์ด ์ด์ง ๋ถํธํ๊ธฐ๋ ํ๋๋ฐ, ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ณด๋ ์คํ๋ ค ํ์ ํ๊ธฐ์๋ express๋ณด๋ค ํจ์ฌ ํธ๋ฆฌํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
MVCํจํด์ด๊ณ , router ๋์ ์ Controller์ ์ด๋ ธํ ์ด์ ์ผ๋ก url์ ์ค์ ํ๋ ๊ฒ๋ ๋ฌ๋๋ค. (Spring์ด๋ ์ ๋ง ๋น์ทํ๋ค๊ณ ๋๋ ๋๋ชฉ์ด์๋ค.)
* NestJS์์๋ ์ด๋ ธํ ์ด์ ์ด์๋๋ผ ๋ฐ์ฝ๋ ์ดํฐ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
TS๋ ์ฒ์์จ๋ดค๋๋ฐ, ๋ฑํ ๋ฏ์ค์ง ์์๋ค. JS์ ๋ค๋ฅด๊ฒ type์ ์ ํด์ค ์ ์๋ ์ ์ด ์คํ๋ ค ์ข์๋ค.
Controller, Service, Repository๋ฅผ ๋ง๋ค์ด์ ์คํ์ ์์ผฐ๋๋ฐ ์๋ฌ๊ฐ ๋ฌ๋ค. ์์กด์ฑ ์ฃผ์ ์ ํด์ฃผ์ง ์์์์๋ค.
๊ธํ๋๋ก ์ ๋ฒ๋ ํฌ๋ฅผ ๋ณด๊ณ ๋ง์ด ์ฐธ๊ณ ํ๋ค. ์ด ๋๋ ์์กด์ฑ๋ถ๋ถ์ ์ ์ดํด๊ฐ ๋์ง ์์์ง๋ง, ํ์ฌ 6๋ฒ์งธ ํ๋ก์ ํธ๋ฅผ ์งํ์ค์ธ ์ํฉ์์ ์ค์ค๋ก ์์กด์ฑ์ฃผ์ ์ ํ ์ ์๋ ์์ค์ด ๋์๋ค.
@Global() ๐
Neo4jService๋ฅผ ๋ง๋ค์ด์, ๊ฐ ์ํฐํฐ(๋ ธ๋)์ Repositoryํ์ผ์์ Neo4jService๋ฅผ importํด์ ์ฌ์ฉํ๋ค.
๊ทธ๋์ ์ผ์ผ์ด ๊ฐ ๋ ธ๋์ Module๋ง๋ค Neo4jModule์ ์ฃผ์ ํด์ฃผ์๋๋ฐ, ์ด๊ฒ ๋ง๋ ์ถ์๋ค.
์ญ์๋, ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ด ์์๋ค. ๋ฐ๋ก @Global() ๋ฐ์ฝ๋ ์ดํฐ! ๊ณต์๋ฌธ์
์ด ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ด์ฉํ๋ฉด Module์ ์ ์ญ๋ฒ์๋ก ๋ง๋ค์ด์ ํ์ํ ๊ณณ๋ง๋ค ์ผ์ผ์ด ๋ฃ์ด์ค ํ์๊ฐ ์์๋ค.
๊ณตํต ์๋ต ํด๋์ค ๐
์ด์ ์ express๋ฅผ ์ผ์ ๋์๋(์ฒซ ๋ฒ์งธ ๊ณผ์ ), ๊ณตํต Error Handler๋ ์ ์ฉํ์ง๋ง ์ฑ๊ณต์์ res๋ฅผ ๋ณด๋ด๋ ์ฝ๋๊ฐ ๊ฐ ์ปจํธ๋กค๋ฌ๋ง๋ค ๋ฐ๋ก ๋ถ์ด์์๋ค.
์ด๋ฒ ๊ณผ์ ์์๋ global ํด๋์ ๊ณตํต ์๋ต ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์ด์ฉํ๋ค. github
์ ์ฉํ๊ธฐ ์ด์ ๋ณด๋ค ์ฝ๋๊ฐ ๊น๋ํด์ง๊ณ , ๋ชจ๋ํ๊ฐ ์ ์ด๋ฃจ์ด์ก๋ค๋ ๋๋์ด ๋ค์๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AWS EC2] key-pair๋ฅผ ์ด์ฉํ ssh ์ฐ๊ฒฐ (0) | 2024.06.24 |
---|---|
[TIL] ํ๋ฆฌ์จ๋ณด๋ฉ ์ธ ๋ฒ์งธ ๊ณผ์ _RedBrick (1) | 2021.12.12 |
[TIL] ํ๋ฆฌ์จ๋ณด๋ฉ ๋ง์ง๋ง, ์ผ๊ณฑ ๋ฒ์งธ ๊ณผ์ _Cardoc (0) | 2021.12.02 |
[TIL] ํ๋ฆฌ์จ๋ณด๋ฉ ์ฒซ ๋ฒ์งธ ๊ณผ์ ํ๊ณ ๋ก (0) | 2021.11.12 |
[CS/DB] Transaction (0) | 2021.10.09 |