connect-foundation / 2019-20 Goto Github PK
View Code? Open in Web Editor NEWπ¦[Project 48] κ°μΈκ° μ€κ³ κ±°λ μ€κ³ νλ«νΌ π¦
Home Page: https://github.com/connect-foundation/2019-20/wiki
π¦[Project 48] κ°μΈκ° μ€κ³ κ±°λ μ€κ³ νλ«νΌ π¦
Home Page: https://github.com/connect-foundation/2019-20/wiki
Express JSλ₯Ό μ¬μ©νλ νλ‘μ νΈμμ ν΄λꡬ쑰λ₯Ό ν΅μΌνμ¬ νμ μ μ©μ΄νκ² νλ€.
Expressμ± μ κ²½μ°μλ λΉμ·ν ꡬμ±μ μλ²κ° μ¬λ¬λ² λ°λ³΅λμ΄ μ¬μ©λ©λλ€(API μλ²). μ΄ κ³Όμ μμ νμλ€κ³Ό νλμ μμ€μ½λλ₯Ό 곡μ νκ² λλ©°, μλ‘ λ€λ₯Έ Expressμ±μ μμ±νλ©΄μ μΌκ΄μ μΈ κ°λ°μ μνμ¬ νλμ ν΄λꡬ쑰μ λν μ½μμ΄ νμν©λλ€.
μ°λ¦¬μ νλ‘μ νΈλ νλμ λ ν¬μ§ν λ¦¬λ§ μ¬μ©μ΄ κ°λ₯νκ³ , λ€μκ³Ό κ°μ΄ νλμ λ ν¬μμ μλ‘λ€λ₯Έ ν΄λλ‘ μλ²μ μ½λλ₯Ό λΆλ¦¬ν΄μΌ ν©λλ€.
.
βββ ApiServer1 //Express Server 1
βΒ Β βββ package.json
βββ ApiServer2 //Express Server 2
βΒ Β βββ package.json
βββ package.json
μ¬λ¬μλ²λ₯Ό μ€κ°λ κ³Όμ μμ ν΄λ κ΅¬μ‘°κ° μλ‘ λ€λ₯΄λ©΄ μ½λλ₯Ό μ΄ν΄νλλ° ν° λ Έλ ₯μ΄ λ€κ² λ©λλ€.
μΈλͺ μ΄ νλμ μμ€μ½λλ₯Ό 곡μ νκ³ , κ°λ°μ μ½μλ μ μ ν μμΉμμ μμ ν μ μμ΅λλ€.
Express Generator μμ μ 곡νλ κΈ°λ³Έ ν΄λ ꡬ쑰λ₯Ό νμ©νλ λ°©λ²μ΄ κ°μ₯ μμ°μ μΌ κ² κ°μ΅λλ€.
κ΄μ¬ μΉ΄ν κ³ λ¦¬λ₯Ό μ±μ ν ν λ€μ νμ λμμ€κ³ λ€μ μ€μ νλ¬ λ€μ΄κ°λ©΄ κΈ°μ΅νκ³ μμ§ μμ
ν΄λΌμ΄μΈνΈκ° κ΄μ¬ μΉ΄ν κ³ λ¦¬λ₯Ό κΈ°μ΅νκ³ λ―Έλ¦¬ 체ν¬νκ³ μμ κ² κ°μμ
ꡬ맀μμ ν맀μκ° μΈμ λ λ€μ μ°Ύμμ λνλ₯Ό μ΄μ΄κ° μ μλ μ€μκ° μ±ν μλΉμ€λ₯Ό μ 곡ν©λλ€ .
Issue #77
μ격μμ ꡬ맀μμ ν맀μκ° λνλ₯Ό νκΈ° μν΄ ν΅μ μ΄ νμ ν©λλ€.
λν, λν λ΄μ©μ κΈ°λ‘νκ³ μΆνμ λ€μ μ 곡νκΈ° μν΄ μ μ₯νλ λ°©λ²μ΄ νμν©λλ€.
λ§μ§λ§μΌλ‘ μ΄λ¬ν ν΅μ κ³Όμ μμμ λ©μΈμ§λ₯Ό νλ©΄μ λ
ΈμΆμν¬ λ°©λ²μ΄ νμν©λλ€.
λ€μ΄λ² OAuthλ₯Ό ν΅ν νμ κ°μ
μ¬μ©μλ‘μ¨ ν΄λΉ μ¬μ΄νΈ μ΄μ©μ μν΄μ νμκ°μ ν μ μλ€.
λ³Έ μλΉμ€λ₯Ό μ΄μ©νλλ° μμ΄ μν λ±λ‘ μμ μμ λ° μ±ν
μ μν΄μλ μΈμ¦κ³Όμ μ΄ νμν©λλ€.
μ΄μ μ°λ¦¬λ μ¬μ©μμκ² μ§μ μ μΌλ‘ ID ν¨μ€μλ λ±μ μꡬνμ§ μκ³ λ€μ΄λ²μ resource serverλ‘ λΆν° νμν νμ μ λ³΄λ§ λ°μ μ€λ OAuthλ₯Ό λμ
νκΈ°λ‘ κ²°μ νμμ΅λλ€.
μ¬λ¬ κ°λ°μλ€κ°μ νμ μ μννκ² νκΈ° μν΄μ 곡ν΅μ Issue, PR ν νλ¦Ώμ μ μν©λλ€.
ν νλ‘μ νΈλ Issueλ₯Ό ν΅ν Feature List κ΄λ¦¬νλ©° Projectλ₯Ό λ°±λ‘κ·Έλ‘μ μ¬μ©νκ³ μμ΅λλ€.
github flowλ₯Ό μΌλμ λκ³ , λͺ¨λ μμ
μλ Issueλ₯Ό μ°μ λ±λ‘ν λ€ PRμ ν΅ν΄ 리뷰λ₯Ό λ°κ³ mergeλκ² λ©λλ€.
μ΄λ¬ν κ³Όμ μμ 곡ν΅μ μ½μμμ΄ Issue νΉμ PRμ μ§ννκ² λλ©΄, λ€μν λ¬Έμ κ° λ°μν μ μμ΅λλ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μ 곡ν΅μ ν νλ¦Ώμ μ μν©λλ€.
ν
νλ¦Ώμ GIthubμμ κΈ°λ³Έμ μΌλ‘ μ 곡νλ κΈ°λ₯μΌλ‘μ Markdown ννλ‘ μμ±νλ©΄, μμ½κ² μ¬μ©μ΄ κ°λ₯ν©λλ€.
νλ‘μ νΈμ root dirμ .githubμ ν΄λλ₯Ό μμ± λ€ μ ν΄μ§ κ·μΉμ λ°λΌ md νμΌμ μμ±ν©λλ€.
곡μ λ¬Έμ
μΆμ² ν νλ¦Ώ
λ€μ΄λ² OAuthλ₯Ό ν΅ν λ‘κ·ΈμΈ
μ¬μ©μλ‘μ¨ ν΄λΉ μ¬μ΄νΈ μ΄μ©μ μν΄μ νμκ°μ
ν μ μλ€.
OAuthλ₯Ό ν΅ν΄ λ‘κ·ΈμΈ νλλ° κΈ°μ‘΄μ νμκ°μ
μ΄ λ μ¬μ©μλΌλ©΄ νμκ°μ
νλ‘μΈμ€λ₯Ό 무μνκ³ κ³§λ°λ‘ λ‘κ·ΈμΈμ΄ λμ΄μΌ ν©λλ€.
μ¬μ©μλ‘μ κ²μμμ§μ λμμ λ°μμ κ²μμ΄ μ λ ₯μ λμμ λ°μ μ μλ€.
μ€κ³ λλΌ, λΉκ·Όλ§μΌμμ μ€κ³ μνμ κ²μν λ μ¬μ©μμ μ€μλ‘ μΈ ν μ€ν, μ μ¬μ΄λ‘ μΈν λμΌ μνμ΄μ§λ§ λ§μ λͺ©λ‘μ 보기 νλ κ²½μ°κ° μμ΅λλ€. λ°λΌμ μ΄λ¬ν λΆνΈν¨μ ν΄μνκ³ μ μλΌμ€ν± μμ§μ μ¬μ©νμ¬ μ¬μ©μ μ λ ₯μ λν μ€νλ₯Ό 보μ νκ±°λ κ΄λ ¨λ μνμ μ μλ°μ μ μκ² ν©λλ€.
gitμ λͺ λ Ήμ΄ μ¬μ© μ΄μ μ μ°λ¦¬μ κ·μΉμ λν μΆ©μ‘± μ¬λΆλ₯Ό νμΈνλ€.
Gitμ μν©μ λ°λΌ λ€μν Hooksλ₯Ό μ 곡ν©λλ€. Hooksλ₯Ό νμ©νλ©΄, gitμ μ¬μ©νλ©° μ€κ° κ³Όμ λ§λ€ μ°λ¦¬μ μꡬμ¬νμ μ λ¬ν μ μμ΅λλ€. μ΄λ¬ν κ·μΉμ νμ μ ν λ μ€μλ₯Ό μ¬μ μ λ°©μ§νκ³ , λΆνμν μ»΄ν¨ν μμμ λλΉλ₯Ό λ°©μ§ν©λλ€.
μλ₯Ό λ€μ΄, Linterλ Formatterμ κ²½μ°λ codeμ buildμλ λ³κ°μ λ¬Έμ μ λλ€. build μ΄μ μ νμΈμ΄ κ°λ₯νμ§λ§, μ΄λ₯Ό νμΈνμ§ μκ³ μλ²μ λ°°ν¬ (νΉμ PR)μμ λ€μκ³Ό κ°μ μμ λ€μ κ±°μΉκ² λ©λλ€. (보ν΅μ CIμμ...)
μμ κ°μ μν©μμ μ΅μ μ κ²½μ°μλ λΆνμν λΉλλ₯Ό νλ μκ°μ κΈ°λ€λ¦° λ€ (μλΆ μμλ μ μλ€) 맨 μ²μμ ν μ μμλ linterμ formatterλ₯Ό νμΈνκ² λ©λλ€. κ·Έλ μ§ μλλΌλ, μ΅μνμ linterμ formatterλ₯Ό νμΈνκΈ° μν΄μλ 3λ²κΉμ§μ μμ μ μνν΄μΌ νλ―λ‘ μ΄ λν μκ°κ³Ό μ»΄ν¨ν μμμ λλΉνλ μΌμ λλ€.
μ μ΄μ λ³κ²½μ¬νμ commit νκ³ pushνκΈ° μ΄μ μ νμΈν μ μλ€λ©΄, λ―Έμ°μ μμκ°μ λλΉλ₯Ό λ°©μ§ν μ μμ΅λλ€.
λ€μκ³Ό κ°μ μν©μμ μ°λ¦¬μ μ½λλ₯Ό κ²μ¦ν©λλ€.
[μ½λλ₯Ό 컀λ°νκΈ° μ΄μ μ]
[μ»€λ° λ©μΈμ§λ₯Ό μμ± ν λ]
μ λ°μ μΌλ‘ git hooksμ λν μ‘μ
μ μ·¨νκΈ° μν΄μ μ°λ¦¬λ huskyλ₯Ό μ¬μ©νμ¬ κ΄λ¦¬ν©λλ€. λ³λμ script
ν΄λλ₯Ό μμ±νμ¬ κ° stageλ§λ€ λ°μν΄μΌ νλ μ‘μ
μ κ΄λ¦¬ν μ μμ΅λλ€.
μ μνλ κ²°κ³Ό
μμ, 2λ² pushνλ©΄ μλλ λΈλμΉμ λν΄μλ issue #3 μμ μΈκΈνκ³ μλ λ΄μ©μ μ°Έκ³ νμκΈΈ λ°λλλ€.
4λ²μ μ»€λ° λ©μΈμ§ μμ±μμλ μ°λ¦¬μ κ²½μ° λ€μ μλ£λ₯Ό κΈ°λ°μΌλ‘ μμ±ν©λλ€. μ΄λ₯Ό μνμ¬ commitlintμ lint-stagedλ₯Ό μ¬μ©νμ¬ κ²μ¦ν μ μμ΅λλ€.
μ°λ¦¬λ λ€μκ³Ό κ°μ μ»€λ° λ‘κ·Έ μμ± κ·μΉμ νμ©νμ¬ κ²μ¦ν©λλ€.
type(scope?): subject #scope is optional
chore: run tests on travis ci # example
λ§μ§λ§μΌλ‘, μ 1 ~ 4λ²μ λ΄μ©μ€ νλλΌλ μΆ©μ‘±νμ§ λͺ»νκ²½μ°, commitμ μ΄λ£¨μ΄μ§μ§ μμ΅λλ€.
commit λ¨κ³κ° μλλΌ push λ¨κ³μμ νλ²μ linterμ formatterλ₯Ό νμΈν μ μμ κ² κ°μ΅λλ€. κ·Έλ¬λ μ΄ κ²½μ°μ μκ°μ commitμ΄ μμ΄λ©΄, μ΄μλν λΆμ±κ° μμ¬κ°μ νλ²μ μμ νκΈ° λ²κ±°μ΄ μν©μ΄ λ°μνκ² λ©λλ€. μ‘°κΈ λ 짧μ μ£ΌκΈ°λ‘ νΌλλ°±μ μ§ννκΈ° μν΄ commit μ΄μ μ hooksλ₯Ό μ°κ²°νμμ΅λλ€.
μ§μ κΈ°λ° κ²μμ μ΄μ©νμ¬ μ¬μ©μκ° μνλ μ§μμμμ κ±°λκΈμ νμν μ μμ΅λλ€.
μ¬μ©μλ νμ λ μ§μ λ²μλ΄μμμ μνμ λν μ 보λ₯Ό μ 곡λ°μ μ μμ΅λλ€.
μ€κ³ κ±°λμ νΉμ±μ, μ λ’°μ λ¬Έμ λ‘ μΈν΄ μ§κ±°λλ₯Ό μ νΈνλ κ²½ν₯μ΄ μμ΅λλ€. μ΄λ° μν©μμ ν맀μλ μμ μ μ§κ±°λ ν맀 λ²μλ₯Ό νμ νκ³ , ꡬ맀μλ μμ μ΄ μ§κ±°λλ₯Ό μνμ¬ μ°Ύμκ° μ μλ λ²μλ₯Ό μ§μ ν¨μΌλ‘μ λ³΄λ€ λ λ§μΆ€νλ κ²μκ²°κ³Όλ₯Ό μ 곡ν μ μμ΅λλ€.
μΌλΌμ€ν± μμΉμ Geo queriesλ₯Ό μ¬μ©ν΄ λ³Ό μ μμ΅λλ€.
λ, mongooseμμ μ 곡λλ μ’ν κΈ°λ° κ²μμ νμ©ν μ μμ΅λλ€. mongoose geojson
νμ¬ μν λ±λ‘ κΈ°λ₯μ΄ μμ νμ§ μμ μν λͺ©λ‘μ λ°μ λμ§ μμ κ² κ°μ΅λλ€. λ±λ‘μ νλ©΄ 리μ€νΈμ 보μ΄λ©΄ μ’μ κ² κ°μ΅λλ€.
μνμ μ΄λ¦ κ°κ²© μ¬μ§ μ€λͺ μ μ λ ₯ν νμ λ±λ‘μ λλ₯΄λ©΄ μ΄λ€ μΈν°λ μ λ μμ΄μ λ±λ‘μ νλμ§ μ μ μμκ³ μ€μ 리μ€νΈμ λ°μλ κ² κ°μ§ μμ΅λλ€. κΈ°λ₯ λ±λ‘μ΄ λλ©΄ μ’μ κ² κ°μ΅λλ€.
λ±λ‘μ λλ₯΄λ©΄ νμ νΉμ λͺ¨λ¬λ‘ λ±λ‘μ΄ μλ£ λμλ€λ μ°½μ΄λμ€κ³ μΌμ μκ°μ΄ μ§λλ©΄ (μΆ©λΆν 짧μ) μν 리μ€νΈλ‘ κ°λ©΄ μ’μ κ² κ°μ΅λλ€.
const [on, setOn] = useState(false)
function uploadHandler (event){
// νμΌμ μ
λ‘λνλ νμΉ μμ²
setOn(true)
setTimeout(()=>{
window.location.href("μν 리μ€νΈ")
}, 1000)
}
μ±ν
λ°©μ μ¬λ¬λͺ
μ΄ μ‘΄μ¬ν κ²½μ°, μ±ν
μ΄ μ€λ³΅λμ λμ€λ μ€λ₯κ° μμ΅λλ€.
μμ μ λΈλΌμ°μ μμλ§ μ±ν
μ΄ μ€λ³΅λμ λνλλ μ€λ₯λ μ‘΄μ¬ν©λλ€.
νλ²μ μ±ν μ μΉλ©΄ νλμ λ©μμ§λ§ λμ€κΈ°λ₯Ό κΈ°λν©λλ€.
λκ΅°κ°λ μ€λ³΅λμ μ±ν μ΄ λ³΄μ΄κ³ , λκ΅°κ°λ μ±ν μ΄ μ€λ³΅λμ 보μ΄μ§ μμ΅λλ€
μνμ΄ λ±λ‘λ μ€ μμμ΄μ.
μ¬μ©μλ‘μ¨ ν΄λΉ μ¬μ΄νΈ μ΄μ©μ μν΄μ νμκ°μ ν μ μλ€.
μ¬μ΄νΈ μ΄μ©μ μν νμκ°μ
λ° λ‘κ·ΈμΈ μΈμ¦ νλ‘μΈμ€ μ
λλ€.
ν νμλ₯Ό ν΅ν΄ μΈμ¦μ Naver OAuthλ§μ μ΄μ©νκΈ°λ‘ κ²°μ νμ΅λλ€.
λ€μ΄λ²μ Resource Serverλ‘ λΆν° νμν μ 보λ§μ μ λ¬λ°μ UserDBμ μ μ₯ν©λλ€.
μ¬μ΄νΈλ₯Ό μ΄μ©νκΈ° μν μ΅μ°μ 쑰건μ΄λ―λ‘ μ νμ΄μλ μμ΅λλ€.
Object Storageλ₯Ό κ°κ°μ μλ²μμ λμν μ μλ λ©μλ ꡬν
μ€κ³ κ±°λμ μμ΄μ μ νμ μνλ₯Ό νμΈν μ μλ μ΄λ―Έμ§, λμμ μ λ³΄κ° νμν©λλ€. μ΄λ¬ν λ°μ΄ν°λ€μ λΉμ ν λ°μ΄ν°λ‘μ¨ μ νλ°μ΄ν°λ₯Ό μ μ₯νλ λ°©μλ³΄λ€ ν΄λΌμ°λ μλΉμ€μμ μ 곡νλ Object Stroageλ₯Ό μ΄μ©νμ¬ λΉμ ν λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ κ²μ΄ μ’λ€κ³ μκ°λμ΄ μ μν©λλ€.
Object Storageλ₯Ό μ¬μ©ν¨μΌλ‘μ¨ λ°μ΄ν°κ° 'μ΄λμ-μ΄λ»κ²-μ μ₯λλμ§' κ΄λ¦¬λ ν΅μ ν νμ μμ΄ μ μ₯μ΄ κ°λ₯νλ€λ μ₯μ μ΄ μκ³ , μ μ₯λ λ°μ΄ν°λ₯Ό μ¬μ©ν λμλ κ³ μ μλ³λ²νΈλ₯Ό ν΅ν΄ λ°λ‘ μ κ·Όμ΄ κ°λ₯νλ€λ μ΄μ μ΄ μμ΅λλ€.
Gitμμ μ¬μ©λ branchμ μ΄λ¦μ λν κ·μΉμ μ ν©λλ€
μ°λ¦¬μ νλ‘μ νΈλ Gitλ₯Ό μ€μ¬μΌλ‘ Source codeμ versionμ κ΄λ¦¬ν©λλ€. λν, Gitμ νΉμ branchλ₯Ό μ€μ¬μΌλ‘ CIλ₯Ό ꡬν νλ μν©μ κΈ°ννμμ΅λλ€.
CIλ₯Ό νΈλ¦¬κ±° νλ νΉμ λΈλμΉλ€κ³Ό(νΈλ¦¬κ±° λΈλμΉ), κ°κ°μ νΈλ¦¬κ±° λΈλμΉμ λν μΆκ° λΈλμΉ(κΈ°λ₯ κ°λ° λΈλμΉ)λ€μ΄ κ³μνμ¬ μμ±λκ² λ©λλ€. μ΄ κ³Όμ μμ λμΉλ λΈλμΉλ€μ νΌλμ μ 리ν μλ¨μ΄ νμνμ¬ μ μνμμ΅λλ€.
push νμ§ λ§μμΌ ν branchλ‘λ λ€μκ³Ό κ°μ λΈλμΉλ€μ΄ μμ΅λλ€.
μ΄ λΈλμΉλ€μ PRμ΄λ μλνλ λ°©λ²μ ν΅ν΄μλ§ μ½λμ λ³κ²½μ¬νμ΄ λ°μλμ΄μΌ ν©λλ€.
κΈ°λ₯ ꡬνμ μν λΈλμΉλ μ pushνμ§ λ§μμΌ ν λΈλμΉμμ νμλ λΈλμΉ μ
λλ€.
μ΄ λΈλμΉμμ μμ
λλ μ½λλ€μ μμ
μ€μ μμμ μ μ μμΌλ©°, mergeμμ μμ λ©λλ€.
κ°λ°μ€μ 곡ν΅μ μ½λ μ€νμΌμ μ μ©νκ³ μ Linter μ Formatterμ λν μ€μ μ μΆκ° & μ μ© ν©λλ€.
νμ μμ μ½λ리뷰, νΉμ μ½λ μ μ§λ³΄μλ₯Ό μνμ¬ λ€λ₯Έ μ΄λ€μ΄ μμ±ν μ½λλ₯Ό λ³΄κ² λλ κ²½μ°κ° λ§μ΅λλ€. μ΄λ μλλ°©μ μ½λμ λν μλλ₯Ό λΉ λ₯΄κ² νμ νκΈ° μν΄μ 곡ν΅μ μ½λ μ€νμΌμ λν μ½μμ΄ νμν©λλ€.
μ½λλ₯Ό μμ±νλλ° μμ΄ κ³΅ν΅μ μ€νμΌ κ·μΉ(Linter), μ½λ© κ·μΉ(Linter), κ·Έλ¦¬κ³ ν¬λ§·ν (Formatterμ) λ± μ μ§μν΄μΌ ν©λλ€. μ΄λ¬ν κ²μ¦ κ³Όμ μ μλμΌλ‘ μ΄λ£¨μ΄ μ§λ©°, λ§μ‘±λμ§ μμμμ μλμΌλ‘ μμ μ΄ λ©λλ€.
Linterλ₯Ό μνμ¬ ESLintλ₯Ό μ¬μ©νκ³ , Formatterλ₯Ό μνμ¬ Prettierλ₯Ό μ¬μ©ν©λλ€.
κ°κ°μ νμμ΄ μ¬μ©μ€μΈ IDEμμ Formattingμ μλμ μΌλ‘ μ μ©νλλ‘ νκ³ , Linterμ λν μλ΄λ¬Έκ΅¬λ₯Ό IDE λ΄λΆμμ 보μ¬μ£Όκ² ν©λλ€.
λ§μ§λ§μΌλ‘, commitνκΈ° μ κ³Ό λ°°ν¬ν λ€ Linterμ Formatterμ λν κ²μ¦μ μ§ννκ² λ©λλ€.
ESLintμ μ€νμΌμ μ λͺ ν Airbnb λ₯Ό μ μ©ν©λλ€.
λ§μ§λ§μΌλ‘, Express μ React μ±μμ μλ‘ λ€λ₯Έ linter κ·μΉμ μ μ©ν μ μλλ‘ νκ²½ μ€μ μ΄ νμν©λλ€.
http://10.180.170.175:3000/write λ‘ λ€μ΄κ°μ λ μ무κ²λ νμλμ§ μμ΅λλ€.
κΈμ°λ νλ©΄μ΄ λμ¬μ€ μμμ΄μ γ
κ°κ²© μλμ λμνμ§ μλ κ°λ‘μ€ν¬λ‘€μ΄ μμ΅λλ€!
μμ μ μ λ°κΈ° κΈμλ κΉ¨μ§κ³ μμ΄μ
κ°λ‘ μ€ν¬λ‘€μ΄ μκ±°λ κ°λ‘μ€ν¬λ‘€μ΄ λμν΄ μ μ λ°κΈ°κ° μ§€λ¦¬μ§ μλλ€.
λμΌν νκ²½μμ ꡬλνκΈ° μν dockerfileμ μ€μ νκ³ base imageλ₯Ό μ€μ λ° μμ±ν©λλ€.
μλ‘μ΄ μλ²λ₯Ό μΆκ°νκ±°λ λ€μ μλ‘κ² λ§λ€κ² λ λ νμ¬ μ°λ¦¬κ° κ°λ°νκ³ μλ νκ²½μ λ§λ μ€μ νλ κ³Όμ μ΄ λ°λ³΅λ©λλ€. μ΄ κ³Όμ μ μ΅μν νκΈ° μν΄ dockerλ₯Ό μ¬μ©νκ³ , 컨ν μ΄λλ₯Ό μ¬μ©νκΈ° μν κΈ°λ³Έ ν νλ¦Ώμ΄ νμνλ€ μκ°λμ΄ μ μν©λλ€.
OS | μ₯μ | λ¨μ |
---|---|---|
CoreOS | λ컀 μ¬μ μ€μΉ, κ²½λνλ OS, μ’μ λ¬Έμν | Package Managerκ° μμ |
Fedora | μ°μ νμ€, κ°λ°μΉνμ , λ°©λν package | μ λ°μ΄νΈμ λ¬Έμ λ°μν μ μμ |
CentOS | docker μ€μ μ©μ΄, μμ μ± | μΈκΈX |
Ubuntu LTS | μ μ μΉνμ , κΈ΄ μ§μκΈ°κ° | λμ μμ€ν μꡬμ¬ν |
SamrtOS | λ°μ΄λ 컨ν μ΄λ 격리(?) | μλΌλ¦¬μ€μμ νμ |
busybox | Docker κ΄λ ¨ μμ | μ²μ μ¬μ© |
ꡬ맀μλ‘μ ν맀μμ μ€κ³ μνμ ꡬ맀νκΈ° μν΄ λνλ₯Ό μμν μ μλ€
ꡬ맀μμ μ μ₯μμ ν맀μκ° μ¬λ¦° μνμ λν΄ λ¬Έμ/ν₯μ λ±μ μ§ννκΈ° μν΄ κ°μΈμ μΈ μν΅μ΄ νμνκΈ°λ ν©λλ€. λκΈκ³Ό κ°μ΄ λ€λ₯Έ μ΄μκ²λ λ ΈμΆλ μ μλ μν΅ μ±λ 보λ€λ 1:1λ‘ privateνκΈ° μν μν΅ κ³΅κ°μ΄ νμν©λλ€.
ν΅μ
μ±ν UI/UX
μΈμ¦/κΆν
ν΄λΌμ°λ μλΉμ€λ₯Ό μ΄μ©νμ¬ μλΉμ€λ₯Ό λ°°ν¬ν μ μλλ‘ κΈ°λ³Έμ μΈ μ€μ μ ν©λλ€
μ°λ¦¬λ μ΄λ² νλ‘μ νΈμμ NCloudλ₯Ό μ¬μ©νμ¬ ν΄λΌμ°λ νκ²½μ ꡬμΆνκ² λ©λλ€.
NCloudλ₯Ό κ°κ°μ Local νκ²½μμ μ½λλ‘μ(CLI) ꡬμΆ, μμ± ν μ μλλ‘ νκΈ° μν΄μ κΆνκ³Ό κ΄λ ¨λ μ€μ μ΄ νμν©λλ€. λν, μ΄λ¬ν κΆνμ CI νΉμ CDμ μν©μμ κΆνμ μ λ¬ν μ μμ΄μΌ ν©λλ€. (λΉλλ±μ μ§ννκΈ° μν΄μ) μ΄ λ°μλ κΆνμ μ€μ νμ¬ λ€μν μν©μμ νμ© κ°λ₯νλλ‘ ν©λλ€.
ν΄λΌμ°λ νκ²½μ μ¬μ©νμ¬ λλ©μΈμ ꡬμ & μ°κ²°μ νλ μμ μ΄ νμν©λλ€. κΈ°λ³Έμ μΌλ‘ μ 곡νλ urlμμ λ²μ΄λ μ°λ¦¬μ λλ©μΈμ μ¬μ©νκ² λλ€λ©΄, μΌμΌ λ°°ν¬μ νλμ κ³ μ λ μ£Όμλ₯Ό νλ‘μ νΈ λμ μ μ§ν μ μμ΅λλ€. μ΄ κ³Όμ μμ HTTPS μ λν μΈμ¦μ μΆκ°νλ λ°©λ²λ κ³ λ €ν μ μμ΅λλ€.
λ§μ§λ§μΌλ‘, μ°λ¦¬κ° μ¬μ©νκ² λ μ€μ¬ μ»΄ν¨ν μλΉμ€ (Ncloud: Server, AWS: EC2)μ λν μ€μ μ΄ νμν©λλ€. μ΅μ΄ μμ±ν μλ²λ λΉ κΉ‘ν΅κ³Ό κ°μ μν©μΌλ‘μ μΈλΆλ‘μ μ°κ²°λ±μ μμ μ΄ μ νλμ΄μΌ μλ²λ₯Ό μ¬μ©ν μ μμ΅λλ€.
κΈ°λ₯ κ°λ°μμ, λΆκ°μ μΈ ν΄λΌμ°λ μ€μ μμ΄ λ°λ‘ μλ²λ₯Ό μ¬μ©ν μ μμ΅λλ€.
κΈ°λ₯ κ°λ° μ΄νμ, μΌμΌ λ°°ν¬λ₯Ό μννλ©° ν΅μΌλ μ£Όμλ₯Ό μ¬μ©ν μ μμ΅λλ€.
Ncloudμ 곡μ λ¬Έμμ μμΈν νμ© λ°©λ²μ΄ μλ΄λμ΄ μμ΅λλ€.
μμ
ν΄μΌ ν μ€μν 체ν¬λ¦¬μ€νΈλ λ€μκ³Ό κ°μ΅λλ€.
(μΆκ°μ μΌλ‘ νμν λ΄μ©μ λκΈλ‘ λΆνλ립λλ€.)
λͺ¨λ°μΌ κ°λ‘νλ©΄μΌ λ λ±λ‘λ²νΌ μλμ TextAreaκ° μ΄λ―Έμ§μ²λΌ κΉλ €μμ΄μ.
λ±λ‘μ΄ νλ©΄μ λ§κ² 맨 μλμ μκ³ , κ·Έ μμ TextAreaκ° μλ€.
μ‘΄μ¬νμ§μλ νμ΄μ§κ° μμ (chat, info, write)
νμ΄μ§κ° λνλ κ² κ°μλ° μμλ€.
ꡬ맀μμκ² κ΅¬λ§€ μμ¬κ° μλ λ²μλ₯Ό νμ νμ¬ κ²μ κ²°κ³Όλ₯Ό λ°μλ³Ό μ μλ κΈ°λ₯μ μ 곡ν©λλ€.
μ€κ³ κ±°λμ νΉμ±μ 물건μ ν맀κ°λ λ€μν λ²μλ₯Ό κ°μ΅λλ€. μ΄λ¬ν μν©μμ ꡬ맀μλ μ μ ν ν맀κ°λ₯Ό μ°ΎκΈ°μν΄ μ¬λ¬ μνμ λλ¬λ³΄λ©° ꡬ맀 κ°λ₯μ±μ΄ ν¬λ°ν μνλ€μ΄ κ²°κ³Όμ ν¬ν¨λκ³€ ν©λλ€. μ΄λ¬ν λΆνμν κ²μκ²°κ³Όλ₯Ό μ κ±°νκ³ , μ¬μ©μμκ² λ§μΆ€λ μ 보λ₯Ό μ 곡νκΈ° μνμ¬ νμν©λλ€.
μ°Έκ³ μ΄μ : #47
μλλ‘ λΉκΈ°λ©΄ μλ‘μ΄ λ°μ΄ν°κ° λ‘λλ μ€ μμμ΄μ
κ°μ μ μ κ° μ μμνμλ μ±ν
μ΄ μ¬λ¬λ² ννλ©λλ€.
λ¬Όλ‘ ν
μ€νΈμ© κ³μ μ΄λΌ κ·Έλ¬κ² μ§λ§
μκΉ νμΈνμ κ²μ²λΌ DB, socket λ±λ±μ μ΄μκ° κ²Ήμ³ μλ κ² κ°μ΅λλ€.
μΆκ°μ μΌλ‘, μ μ»΄ν¨ν°μμλ 4λ²μ© λμ€κ³ λ€λ₯Έ μ¬λ μ»΄ν¨ν°μμλ 2λ²μ© λμ€λλ± λλ€νκ² λ°μνλ μ΄μλ μλ κ² κ°μ΅λλ€.
맀λλ¬μ΄ μ±ν μ΄ νκ³ μΆμμ΄μ γ
React JSλ₯Ό μ¬μ©νλ νλ‘μ νΈμμ ν΄λꡬ쑰λ₯Ό ν΅μΌνμ¬ νμ μ μ©μ΄νκ² νλ€.
리μ‘νΈμ κ²½μ°μ νμ μ μ²΄κ° νλμ μμ€μ½λλ₯Ό 곡μ ν©λλ€. κ°κ° λ€λ₯Έ λ°©λ²μΌλ‘ 리μ‘νΈ νλ‘μ νΈ μμ±μμ ν΄λ ꡬ쑰μ μ°¨μ΄λ‘ μΈνμ¬ λ³΅μ‘ν¨μ΄ μ¦κ°ν μ μμ΅λλ€.
μλ₯Όλ€μ΄ μ»΄ν¬λνΈλ₯Ό κ΄λ¦¬νκΈ° μν΄ λκ΅°κ°λ container
, components
λΌλ λκ°μ ν΄λλ‘ λΆλ¦¬νλ λ°λ©΄, λκ΅°κ°λ components
λΌλ νλμ ν΄λλ§μ μ¬μ©ν μ μμ΅λλ€.
Reactμμ ν΄λ ꡬ쑰μ λν΄μ κ°μ νλ νλμ λ°©λ²μ΄ μκ³ , μ΄λ₯Ό ν΅μΌν νμκ° μμ΅λλ€.
μΈλͺ μ΄ νλμ μμ€μ½λλ₯Ό 곡μ νκ³ , κ°λ°μ μ½μλ μ μ ν μμΉμμ μμ ν μ μμ΅λλ€.
React JSλ₯Ό μ¬μ©ν λ€μν νλ‘μ νΈλ₯Ό μ°Έκ³ νμ¬ ν΄λ ꡬ쑰λ₯Ό μ μν©λλ€.
μΆκ° μ 보μ μ°Έκ³ ν λ§ν μλ£λ€μ μΆκ° νμμΌλ©°, λκΈμ ν΅νμ¬ λΆκ°μ μΈ μλ£λ₯Ό μ¬λ €μ£Όμ
λ λ©λλ€.
벨λ‘νΌνΈλμ velog νλ‘μ νΈμ github λ ν¬μ λλ€
ꡬ맀μμ ν맀μκ°μ μ±ν μ μννκ² μ 곡νκΈ° μν UI/UX μ λν λ΄μ©μ ν¬ν¨ν©λλ€.
Issue #77
μ μ ν UI/UXλ₯Ό ν΅νμ¬ κ΅¬λ§€μμ ν맀μκ° μ§κ΄μ μΌλ‘ λνλ₯Ό λλκ³ , κ·Έ κ³Όμ μμ κ±°λλ₯Ό νλ°νκ² μ§νν μ μλλ‘ μ₯λ €ν©λλ€.
μ μ λ‘μ λ¬Όνμ ꡬ맀λ₯Ό μνμ¬ μνμ‘°νκ° κ°λ₯νκ³ , ν맀λ₯Ό μνμ¬ μ νμ λ±λ‘ μμ μμ ν μ μλ€.
μ€κ³ κ±°λμ μμ΄μ κ°μ₯ ν΅μ¬μ μΈ κΈ°λ₯μΌλ‘μ¨, μνλͺ©λ‘μ νμΈν μ μλ μλ¨μ΄ νμν©λλ€. μ΄μ μΌλ°μ μΈ κ²μν κΈ°λ₯μ ꡬννλ, ꡬ맀μμκ² μνμ μΆκ°μ μΈ μ 보λ₯Ό μ 곡ν©λλ€. λ°λΌμ, μν μνκ° νμΈ κ°λ₯ν μ΄λ―Έμ§ μ μ₯μλ₯Ό κ΄λ¦¬ν μ μλ κΈ°λ₯μ ꡬννκ³ , λΆκ°μ μΌλ‘ μν κ±°λ μν, μ νμ μν, κ°κ²©μ λ³΄λ± λ¬Όκ±΄ κ±°λμ νμν μ 보λ₯Ό νμΈν μ μμ΄μΌ ν©λλ€.
λ°μ΄ν°λ² μ΄μ€λ λ§μ΄ν¬λ‘ μλΉμ€ μν€ν μ²λ₯Ό λ°λ₯΄κΈ° μν΄ ν μ΄λΈμ λ³λλ‘ λΆλ₯νμ¬ κ΅¬νν©λλ€. (ex: μνν μ΄λΈμ μνκ΄λ¦¬ μλΉμ€μλ§ μ‘΄μ¬, μ μ μ 보λ μ μ κ΄λ¦¬ μλΉμ€μλ§ μ‘΄μ¬, μΆν κ°κ°μ μ 보λ apiλ₯Ό ν΅ν΄ μ°λ)
Express JSμμ μ격μμ λ°μνλ μλ¬λ₯Ό μΆμ νκΈ° μν λꡬ μ½μ
μ°λ¦¬λ Express JSλ₯Ό API μλ²λ‘μ μ¬μ©νκ³ μμ΅λλ€. Express JSλ localμμ κ°λ°λμ΄ μΈλΆ ν΄λΌμ°λ μλ²λ‘ λ°°ν¬ λλ©°, λ°°ν¬ μ΄νμλ λ‘컬μμ μ 곡λ°λ μλ¬ μμ§κ³Ό κ°μ ννμ μ§μμ μ 곡λ°κΈ° μ΄λ ΅μ΅λλ€. (λλ²κΉ λꡬ) λ§μ½ μλ¬ μμ§μ κΈ°λ³Έμ μΌλ‘ μ 곡νλλΌλ μ΄λ₯Ό μ‘°ννκΈ° μνμ¬ μ격μ μλ μλ²μ μ£ΌκΈ°μ μΌλ‘ μ κ·Ό νμ¬ (SSH λ±) νμΈνμ¬μΌ ν©λλ€.
ν΄λΌμ°λ μΈμμμ μλ²λ νμμ λ°λΌ Scale outμ νκΈ°λ νκ³ , μ΄ κ³Όμ μμμ μλ²κ° μμ±λκ³ μμ λκΈ°λ₯Ό λ°λ³΅ν©λλ€. μ£Όλ‘ Imageλ₯Ό ν΅νμ¬ containerμ ννλ‘ μλ²λ₯Ό ꡬμ±νκ³ , μ΄λ κ² λ¨λͺ νλ(ephemeral) μλ²μ νΉμ±μ λ΄λΆμ μ‘΄μ¬νλ λ‘κ·Έλ€λ κ°μ΄ μμ λκ³€ ν©λλ€. μ¦, μ΄μλκ³ μλ μλ²μμ μμ§ν λ‘κ·Έλ₯Ό μ€μμΌλ‘ λͺ¨μΌλ μμ μ νμ§ μλλ€λ©΄, μλ²μ ν¨κ» μλ©Έλ μ μμ΅λλ€.
μ΄λ¬ν λ²κ±°λ‘μμ λ°©μ§νκΈ° μνμ¬ μ€μμμ λͺ¨λ Express JSμμ λ°μνλ μλ¬λ₯Ό μμ§νκ³ μΆμ ν μ μλ λꡬλ₯Ό μ λͺ©νκ³ μ ν©λλ€.
μ¬λ¬λμ Express Serverμμ λ°μνλ μλ¬μ κΈ°ν λ‘κ·Έλ€μ νκ³³μΌλ‘ μμ§νμ¬ κ΄λ¦¬νκ³ μΆμ΅λλ€.
Issue #7 μ λμΌν λΌμ΄λΈλ¬λ¦¬μΈ Sentryλ₯Ό μ¬μ©νκ³ μ ν©λλ€.
μλ¬ μΆμ μ μ¬μ©λλ λꡬλ₯Ό ν΅μΌν¨μΌλ‘μ κ°λ°μ μμ°μ±μ μ¬λ¦¬λ, κ΄λ¦¬λ₯Ό μ©μ΄νκ² ν©λλ€
μ΄ κ³Όμ μμ, React JSμμλ Error Boundaries
λ₯Ό ν΅νμ¬ μλ¬λ₯Ό μμ§νμλ€λ©΄, Express JSμμλ λ€μκ³Ό κ°μ νλ¦μΌλ‘ μλ¬λ₯Ό μμ§ & μ²λ¦¬ νκ³ μ ν©λλ€.
Some module throws an error
-> API router catches the error
-> it propagates the error to the middleware
μΆκ°μ μΌλ‘ κ³ λ €ν λ§ν λμμ΄λ, Sentry μ΄μΈμ λΌμ΄λΈλ¬λ¦¬ μ¬μ©μ μνλ€λ©΄ comment λΆνλ립λλ€.
λνμ μ°Έμ¬νλ ꡬ맀μμ ν맀μλ§μ΄ μ μ₯ν μ μλλ‘ λ‘μ§μ μμ±ν©λλ€.
Issue #77
ꡬ맀μμ ν맀μκ°μ 1:1 μ±ν μ΄λ―λ‘, μ΄λ₯Ό μν΄ νκ°λ μ¬μ©μλ§ μ κ·Όν μ μμ΄μΌ ν©λλ€. μ΄λ₯Ό μν΄μ μλ²/ν΄λΌμ΄μΈνΈ λͺ¨λ λ°©μ΄μ μΈ λ‘μ§μ΄ νμν©λλ€.
React JSμμ μ¬μ©μμ λΈλΌμ°μ μμ λ°μνλ μλ¬λ₯Ό μΆμ νκΈ° μν λꡬ μ½μ
μ°λ¦¬λ νλ‘μ νΈμμ React JS λ₯Ό λ°νμΌλ‘ μμ±λ μ ν리μΌμ΄μ μ μ¬μ©μμκ² FEλ‘μ μ 곡ν©λλ€. React JSλ Single Page Application(SPA)λ‘μ, μ¬μ©μμκ² μ ν리μΌμ΄μ ꡬλμ μνμ¬ νμν λͺ¨λ νμΌμ μ λ¬νλ€λ νΉμ§μ΄ μμ΅λλ€. μ΄λ κ² μ λ¬λ νμΌμλ HTML, JS, CSSλ± μΉ λΈλΌμ°μ μμ νλ©΄μ λλλ§νκΈ° μνμ¬ νμν λꡬλ€μ ν¬ν¨νκ³ μμΌλ©°, μΆκ°μ μΈ μ 보λ μΈλΆ APIλ₯Ό ν΅νμ¬ μμ² & νν νκ² λ©λλ€.
SPAμ νΉμ±μ μ€νλλ μ½λ(JS, React)μ μ΄μ λν κ²°κ³Ό λͺ¨λ μ¬μ©μμ λΈλΌμ°μ μμ μ‘΄μ¬νκ² λ©λλ€. κ·Έλ¬λ―λ‘ SPAκ° νλ² λ°°ν¬λμ΄ μ¬μ©μμκ² μ λ¬λλ©΄, μ΄ μ ν리μΌμ΄μ μ λν μ μ΄κΆμ μ ν¬(κ°λ°μ)μ μμ λ²μ΄λκ² λ©λλ€.
μ΄λ μλΉμ€ μ΄μ©μ μ ν λ¬Έμ κ° μλ ννμ΄λ©°, μ΄μν μ λ μμ§λ§ μλ¬ λ°μμμ κ·Έ μΆμ μ΄ μ΄λ ΅κ² λ©λλ€.
κ°λ°μ λͺ¨λμμ React JSλ₯Ό κ°λ°νκ² λλ©΄, λ€μν debugging λꡬλ₯Ό ν΅νμ¬ μ€λ₯λ₯Ό κ²μΆνκ³ κ°μ νκ² λ©λλ€. λν, ν μ€νΈλ₯Ό ν΅νμ¬ μ΄λμ λ νμ§μ λν μμ κ°μ λΆμ¬ν μ μμ΅λλ€. λ€λ§, μ무리 μ μμ±λ ν μ€νΈλΌ νμ¬λ μ¬μ©μμ λͺ¨λ μ¬μ© ν¨ν΄μ ν¬ν¨ν μ μκ³ , μμμΉ λͺ»ν μλ¬λ νμ μ‘΄μ¬νλ λ¬Έμ μ λλ€.
μμμ μΈκΈν λ°°ν¬λ Reactμ±μ κ²½μ°, μ¬μ©μμκ² μ λ¬λ μμ μμ μμ νμλ―μ΄ λ€μν μλ¬κ° λ°μ ν μ μμ§λ§, μ΄λ₯Ό κ°λ°μμ μ μ₯μμλ μ μ μμ΅λλ€. μ΅μ μ κ²½μ°μλ μ¬μ©μ λΈλΌμ°μ μμ μ±μ΄ μμ ν μ μ§(crashλμ΄) λμ΄λ κ°λ°μλ μ ν μ μ μμΌλ©°, μ΄ μν©μ λν μλ°μ μΈ μ¬μ©μμ "μ€λ₯ μ κ³ "κ° μ 곡λ λ κΉμ§ μ€λ μκ°μ΄ μμλ μ μμ΅λλ€.
μ¬μ©μμμ λ°μνλ μ£Όμνκ³ κΈ΄κΈν μλ¬μ μ¬λ¬ ν¬κ³ μμ μλ¬λ€μ μμ§νκ³ , μ΄λ₯Ό κ΄λ¦¬ & λΆμ νμ¬ μλΉμ€λ₯Ό κ°μ μν¬ μ μλ λ°©λ²μ΄ νμν©λλ€.
μ¬μ©μμκ² μ λ¬λ React JS μμ λ°μνλ μλ¬λ€μ μ€μκ°μ κ°κΉκ² ν΅λ³΄λ°μ μ μκ³ , λ€μν λΆμ λꡬλ₯Ό ν¬ν¨νμ¬ λΉ λ₯Έ μλΉμ€ κ°μ μ κ°λ₯ν λ‘ ν©λλ€.
μμ©νλ λꡬμ΄μ, μ€νμμ€ λκ΅¬μΈ Sentryλ₯Ό μ¬μ©νλ λ°©λ²μ μ μν©λλ€.
Sentry provides open-source and hosted error monitoring that helps all software
teams discover, triage, and prioritize errors in real-time.
μ΄ λꡬλ ReactJSμ μμ½κ² μ½μ
ν μ μλ ꡬ체μ μΈ κ³΅μ λ¬Έμλ₯Ό μ 곡νμ¬ λΉ λ₯Έ μ¬μ©μ΄ κ°λ₯νκ² ν΄μ€λλ€.
λν, λλ²κΉ
μ μν λ€μν λꡬλ€κ³Ό μκ°ν λꡬλ₯Ό μ 곡ν©λλ€.
React JSμ v16 λΆν°λ Error BoundariesλΌλ κΈ°λ₯μ μ 곡ν©λλ€. μ΄ κΈ°λ₯μ ν΅νμ¬ μ°λ¦¬λ μ€μμμ ReactJSμμ λ°μλ λ€μν μλ¬λ€μ μ€μμμ μμ§ν μ μμ΅λλ€. μμ§λ μλ¬λ₯Ό μ°λ¦¬μ μλ¬ μμ§ κ³΅κ°μΌλ‘ 보λ΄μ΄ κ΄λ¦¬ν μ μμ΅λλ€.
λ€λ§, μ΄ λ°©μμ μ¬μ©νλ©΄ λ³λμ λΆμ & μκ°ν λκ΅¬κ° νμν©λλ€.
React JSμ 곡μλ¬Έμμ μΈκΈλμ΄ μλ―μ΄, try/catchλ imperative μ€νμΌμ μ½λμμ μ¬μ© λ©λλ€. λ°λ©΄, React JSλ declarative ν μ€νμΌμ μ 곡νμ¬ try/catchμ μλ¬ μ²λ¦¬ λ°©μμ΄ μ ν©νμ§ μμ΅λλ€.
λ€λ§, μ»΄ν¬λνΈ λ΄λΆμμ μΈλΆ ν΅μ λ±κ³Ό κ°μ μν©μ try/catch λ‘ μλ¬λ₯Ό μμ§νμ¬ μΈλΆλ‘ μ μ‘νλ λ°©λ²μ μ¬μ©ν μ μμ΅λλ€.
μ μ μ€ν 리μ ν¬ν¨λλ μΈλΆ 체ν¬λ¦¬μ€νΈ(ν μ€ν¬)λ₯Ό λ³λμ μ΄μλ‘ κ΄λ¦¬ν©λλ€.
μ°λ¦¬κ° μ μ μ€ν λ¦¬λ‘ μ΄μλ₯Ό λ§λλ,
νλ‘μ νΈ(λ°±λ‘κ·Έ)μ νλμ ν° μ μ μ€ν λ¦¬κ° λ©μ΄λ¦¬λ‘ λ€μ΄κ°μ μκ°κ³Ό μ°μ μμ μΈ‘μ μ΄ μ΄λ €μ΄κ² κ°μ΅λλ€.
νλμ ν° μ μ μ€ν 리λ₯Ό, μΈλΆ ν μ€ν¬μ ν΄λΉνλ μ΄μλ‘ μͺΌκ°μ΄ κ΄λ¦¬ν©λλ€.
νλ‘μ νΈμ λ ΈνΈ λ₯Ό μΆκ°νλ κΈ°λ₯μΌλ‘ ν μ€ν¬λ₯Ό λΆλ₯νλ λ°©λ².
λ€μ λκΈμμ λ¬Έμ κ° μ κΈ° λμ΄ μΆκ°λμμ΅λλ€.
RESTful APIλ₯Ό μ¬μ©ν¨μ μμ΄, api λͺ μΈμλ₯Ό μμ± ν λ μλνλ λꡬλ₯Ό μ΄μ©ν΄ μμ±λ μΈν°λ ν°λΈν λ¬Έμλ₯Ό μμ±ν μ μλλ‘ swaggerμ μ¬μ©ν κ²μ μ μν©λλ€.
swagger 곡μλ¬Έμ
swagger-ui NPM module
A declarative, efficient, and flexible JavaScript library for building user interfaces.
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. πππ
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google β€οΈ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.