Skip to content

ANI-WEAR/BackEnd

Repository files navigation

๐ŸŽˆ AniWear

๋น„๊ฑด ์‡ผํ•‘๋ชฐ

๐ŸŽ Figma

๐ŸŽ‡ ERD


๐Ÿ‰ ๊ทœ์น™

  • branch๋ช… ๊ทœ์น™
feature/signup : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•  ๋•Œ(๊ธฐ๋Šฅ๋ณ„ 1๊ฐœ์”ฉ๋งŒ signup1, signup2 => x)  
fix/๋ธŒ๋žœ์น˜๋ช… : ๋ฒ„๊ทธ ์ˆ˜์ •ํ•  ๋•Œ  
refactor/๋ธŒ๋žœ์น˜๋ช… : ๊ฒฐ๊ณผ๋ฌผ์€ ๊ทธ๋Œ€๋กœ์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ๋•Œ
  • commit ๋ฉ”์„ธ์ง€ ๊ทœ์น™
feat : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€, ๊ธฐ์กด์˜ ๊ธฐ๋Šฅ์„ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž์ถ”์–ด ์ˆ˜์ •  
fix : ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฒ„๊ทธ ์ˆ˜์ •  
chore : ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ •, ๊ทธ ์™ธ ๊ธฐํƒ€ ์ˆ˜์ • ex) .gitignore  
test : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€/์ˆ˜์ •  

Node.js Template

๋ณธ ํ…œํ”Œ๋ฆฟ์€ ์†Œํ”„ํŠธ์Šคํ€˜์–ด๋“œ ์„œ๋ฒ„ ๊ต์œก์šฉ Node.js ํ…œํ”Œ๋ฆฟ ์ž…๋‹ˆ๋‹ค. (2022 ver.)

โœจCommon

REST API

REST API์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์›๋ฆฌ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌ๊ธ€๋งํ•˜์—ฌ ์ตํžŒ ๋’ค์— Route๋ฅผ ๊ตฌ์„ฑํ•˜์ž.

Folder Structure

  • src: ๋ฉ”์ธ ๋กœ์ง src์—๋Š” ๋„๋ฉ”์ธ ๋ณ„๋กœ ํŒจํ‚ค์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋„๋ก ํ–ˆ๋‹ค. ๋„๋ฉ”์ธ์ด๋ž€ ํšŒ์›(User), ๊ฒŒ์‹œ๊ธ€(Post), ๋Œ“๊ธ€(Comment), ์ฃผ๋ฌธ(Order) ๋“ฑ ์†Œํ”„ํŠธ์›จ์–ด์— ๋Œ€ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ํ˜น์€ ๋ฌธ์ œ ์˜์—ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๊ฐ์ž ์„ค๊ณ„ํ•  APP์„ ๋ถ„์„ํ•˜๊ณ  ํ•„์š”ํ•œ ๋„๋ฉ”์ธ์„ ๋„์ถœํ•˜์—ฌ src ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜์ž.
  • config ๋ฐ util ํด๋”: ๋ฉ”์ธ ๋กœ์ง์€ ์•„๋‹ˆ์ง€๋งŒ src ์—์„œ ํ•„์š”ํ•œ ๋ถ€์ฐจ์ ์ธ ํŒŒ์ผ๋“ค์„ ๋ชจ์•„๋†“์€ ํด๋”
  • ๋„๋ฉ”์ธ ํด๋” ๊ตฌ์กฐ

Route - Controller - Provider/Service - DAO

  • Route: Request์—์„œ ๋ณด๋‚ธ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ

  • Controller: Request๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  Response ํ•ด์ฃผ๋Š” ๊ณณ. (Provider/Service์— ๋„˜๊ฒจ์ฃผ๊ณ  ๋‹ค์‹œ ๋ฐ›์•„์˜จ ๊ฒฐ๊ณผ๊ฐ’์„ ํ˜•์‹ํ™”), ํ˜•์‹์  Validation

  • Provider/Service: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ, ์˜๋ฏธ์  Validation

  • DAO: Data Access Object์˜ ์ค„์ž„๋ง. Query๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ๊ณณ.

  • ๋ฉ”์†Œ๋“œ ๋„ค์ด๋ฐ๋ฃฐ ์ด ํ…œํ”Œ๋ฆฟ์—์„œ๋Š” ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ ๋ช…๋ช… ๊ทœ์น™์€ User ๋„๋ฉ”์ธ์„ ์ฐธ๊ณ ํ•˜์ž. ํ•ญ์ƒ ์ด ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋„ค์ด๋ฐ์€ ํ†ต์ผ์„ฑ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒŒ ์ข‹๋‹ค.

Comparison

3๊ฐœ ํ…œํ”Œ๋ฆฟ ๋ชจ๋‘ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Request์— ๋Œ€ํ•ด DB ๋‹จ๊นŒ์ง€ ๊ฑฐ์นœ ๋’ค, ๋‹ค์‹œ Controller๋กœ ๋Œ์•„์™€ Response ํ•ด์ฃผ๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ์ดํ•ดํ•˜๊ณ  ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์ž.

Request -> Route -> Controller -> Service/Provider -> DAO -> DB

DB -> DAO -> Service/Provider -> Controller -> Route -> Response

๋‹ค์Œ์€ ๊ฐ ํ…œํ”Œ๋ฆฟ ๋ณ„ ์ฐจ์ด์ ์„ ๋น„๊ต ๊ธฐ์ˆ ํ•ด ๋†“์€ ๊ฒƒ์ด๋‹ค.

PHP (ํŒจํ‚ค์ง€๋งค๋‹ˆ์ € = composer)

Request(์‹œ์ž‘) / Response(๋) โ‡„ Router (index.php) โ‡„ Controller โ‡„ Service (CUD) / Provider (R) โ‡„ PDO (DB)

Node.js (ํŒจํ‚ค์ง€๋งค๋‹ˆ์ € = npm)

Request(์‹œ์ž‘) / Response(๋) โ‡„ Router (*Route.js) โ‡„ Controller (*Controller.js) โ‡„ Service (CUD) / Provider (R) โ‡„ DAO (DB)

Springboot java (ํŒจํ‚ค์ง€๋งค๋‹ˆ์ € = Maven (= Spring ์„ ํ˜ธ), Gradle (Springboot ์„ ํ˜ธ))

Request(์‹œ์ž‘) / Response(๋) โ‡„ Controller(= Router + Controller) โ‡„ Service (CUD) / Provider (R) โ‡„ DAO (DB)

Validation

์„œ๋ฒ„ API ๊ตฌ์„ฑ์˜ ๊ธฐ๋ณธ์€ Validation์„ ์ž˜ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์™ธ๋ถ€์—์„œ ์–ด๋–ค ๊ฐ’์„ ๋‚ ๋ฆฌ๋“  Validation์„ ์ž˜ ์ฒ˜๋ฆฌํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ํ„ฐ์ง€๋Š” ์ผ์ด ์—†๋„๋ก ์œ ์˜ํ•˜์ž. ๊ฐ’, ํ˜•์‹, ๊ธธ์ด ๋“ฑ์˜ ํ˜•์‹์  Validation์€ Controller์—์„œ, DB์—์„œ ๊ฒ€์ฆํ•ด์•ผ ํ•˜๋Š” ์˜๋ฏธ์  Validation์€ Provider ํ˜น์€ Service์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

โœจStructure

์•ž์— (*)์ด ๋ถ™์–ด์žˆ๋Š” ํŒŒ์ผ(or ํด๋”)์€ ์ถ”๊ฐ€์ ์ธ ๊ณผ์ • ์ดํ›„์— ์ƒ์„ฑ๋œ๋‹ค.

โ”œโ”€โ”€ config                              #
โ”‚   โ”œโ”€โ”€ baseResponseStatus.js           # Response ์‹œ์˜ Status๋“ค์„ ๋ชจ์•„ ๋†“์€ ๊ณณ. 
โ”‚   โ”œโ”€โ”€ database.js                     # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์„ค์ •
โ”‚   โ”œโ”€โ”€ express.js                      # express Framework ์„ค์ • ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ jwtMiddleware.js                # jwt ๊ด€๋ จ ๋ฏธ๋“ค์›จ์–ด ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ secret.js                       # ์„œ๋ฒ„ key ๊ฐ’๋“ค 
โ”‚   โ”œโ”€โ”€ winston.js                      # logger ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •
โ”œโ”€โ”€ * log                               # ์ƒ์„ฑ๋œ ๋กœ๊ทธ ํด๋”
โ”œโ”€โ”€ * node_modules                    	# ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋” (package.json ์˜ dependencies)
โ”œโ”€โ”€ src                     			# 
โ”‚   โ”œโ”€โ”€ app              				# ์•ฑ์— ๋Œ€ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ
โ”‚ 	โ”‚   โ”œโ”€โ”€ User            			# User ๋„๋ฉ”์ธ ํด๋”
โ”‚   โ”‚ 	โ”‚   โ”œโ”€โ”€ userDao.js          	# User ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
โ”‚ 	โ”‚ 	โ”‚   โ”œโ”€โ”€ userController.js 		# req, res ์ฒ˜๋ฆฌ
โ”‚ 	โ”‚ 	โ”‚   โ”œโ”€โ”€ userProvider.js   		# R์— ํ•ด๋‹นํ•˜๋Š” ์„œ๋ฒ„ ๋กœ์ง ์ฒ˜๋ฆฌ
โ”‚ 	โ”‚ 	โ”‚   โ”œโ”€โ”€ userService.js   		# CUD์— ํ•ด๋‹นํ•˜๋Š” ์„œ๋ฒ„ ๋กœ์ง ์ฒ˜๋ฆฌ   
โ”œโ”€โ”€ .gitignore                     		# git ์— ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ํด๋”, ํŒŒ์ผ๋“ค์„ ์ž‘์„ฑ ํ•ด๋†“๋Š” ๊ณณ
โ”œโ”€โ”€ index.js                            # ํฌํŠธ ์„ค์ • ๋ฐ ์‹œ์ž‘ ํŒŒ์ผ                     		
โ”œโ”€โ”€ * package-lock.json              	 
โ”œโ”€โ”€ package.json                        # ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„, ๋ฒ„์ „, ํ•„์š”ํ•œ ๋ชจ๋“ˆ ๋“ฑ ๋…ธ๋“œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ 
โ””โ”€โ”€ README.md

โœจDescription

๋ณธ ํ…œํ”Œ๋ฆฟ์€ Node.js์™€ Express (Node.js์˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋‹ค. Node.js์™€ Express์˜ ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์›๋ฆฌ๋Š” ๊ฐ์ž ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.

  • node index.js ๋ฅผ ํ†ตํ•ด์„œ js ํŒŒ์ผ์„ ์‹คํ–‰ํ•œ๋‹ค.
  • node๋Š” js ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ๋•Œ package.json ์ด๋ผ๋Š” ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์–ด๋–ค ํ™˜๊ฒฝ์œผ๋กœ ๊ตฌ๋™ํ•˜๋Š”์ง€, ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์ผ๋Š”์ง€(dependencies) ๋“ฑ์˜ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •๊ฐ’ ๋“ค์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • npm install npm(node package manager)์„ ํ†ตํ•ด package.json์— ์žˆ๋Š” dependencies ๋“ฑ์„ ์ฐธ๊ณ ํ•˜์—ฌ node_modules ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ํŒŒ์ผ์—์„œ require ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

config > express.js ์—์„œ express ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ app ๋ชจ๋“ˆ์„ export ํ•˜๋„๋ก ํ•˜์—ฌ ์–ด๋Š ํด๋”์—์„œ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋„๋ฉ”์ธ์„ ๋งŒ๋“ค ๊ฒฝ์šฐ, ํ•ด๋‹น ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด Route ํด๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ express.js์—์„œ ๋งŒ๋“  app ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

require('../src/app/User/userRoute')(app);

index.js์—์„œ express์—์„œ ๋งŒ๋“  app์ด 3000๋ฒˆ ํฌํŠธ๋ฅผ Listen ํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค. ๋ณธ์ธ์ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ํฌํŠธ ๋ฒˆํ˜ธ๋Š” ์ด๊ณณ์—์„œ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Database๋Š” config > database.js์— mysql2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌ์„ฑํ–ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ๋“ค์€ mysql2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณต์‹ README๋ฅผ ์ฐธ๊ณ ํ•˜์ž. cf. connection์„ ๋‹ค ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด release๋ฅผ ํ†ตํ•ด ๊ผญ ํ• ๋‹น ํ•ด์ œ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

Log๋Š” winston, winston-daily-rotate-file ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌ์„ฑํ–ˆ๋‹ค. ์„œ๋ฒ„ ์ ‘๊ทผ ์‹œ์— ์ƒˆ๋กœ ์ƒ๊ธฐ๊ฒŒ ๋  log ํด๋”์—์„œ ๋กœ๊ทธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚จ๊ธฐ๋Š”์ง€ ์‚ดํŽด๋ณด์ž. (์ปค์Šคํ…€ํ•ด๋„ ์ข‹๋‹ค.)

โœจUsage

API ๋งŒ๋“ค๊ธฐ ์˜ˆ์ œ

๋กœ์ปฌ์—์„œ npm install์„ ํ†ตํ•ด node_modules ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋”๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

[DB ์—ฐ๊ฒฐ ์—†์ด TEST]

  1. userRoute.js์˜ 0. ํ…Œ์ŠคํŠธ API ๋ถ€๋ถ„์„ ์ฃผ์„ ํ•ด์ œํ•œ๋‹ค.
  2. userController.js์˜ ํ…Œ์ŠคํŠธ API ๋ถ€๋ถ„์„ ์ฃผ์„ ํ•ด์ œํ•œ๋‹ค.
  3. node index.js๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™์‹œํ‚ค๊ณ  ํฌ์ŠคํŠธ๋งจ์„ ํ†ตํ•ด GET localhost:3000/app/test๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

[DB ์—ฐ๊ฒฐ ์ดํ›„ TEST]

  1. config > database.js์—์„œ ๋ณธ์ธ์˜ DB ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
  2. DB์— TEST๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.
  3. userRoute.js, userController.js, userProvider.js, userDao.js๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ๊ฐ’๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋กœ์ง์„ ๋งŒ๋“ ๋‹ค.
  4. node index.js๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™์‹œํ‚ค๊ณ  ํฌ์ŠคํŠธ๋งจ์„ ํ†ตํ•ด ๋ณธ์ธ์ด ๋งŒ๋“  API ํ…Œ์ŠคํŠธ๊ฐ€ ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

๋ฌด์ค‘๋‹จ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด PM2๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (JavaScript ๋Ÿฐํƒ€์ž„ Node.js์˜ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์ž) ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฒ•์€ ๊ณต์‹ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

JavaScript

๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•๋“ค์€ ์Šค์Šค๋กœ ํ•™์Šตํ•˜์ž. ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•˜๋‹ค.

Error

์„œ๋ฒ„ Error๋ฅผ ๋งˆ์ฃผํ–ˆ๋‹ค๋ฉด, ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ํ†ตํ•ด ๋ฌธ์ œ ์›์ธ์„ ์ฐพ์ž.

  • Nginx ๋กœ๊ทธ ํ™•์ธ (๋กœ๊ทธ ๊ฒฝ๋กœ๋Š” ๊ตฌ๊ธ€๋ง)
  • pm2 log ํ™•์ธ (๋กœ๊ทธ ๊ฒฝ๋กœ๋Š” ๊ตฌ๊ธ€๋ง)
  • console.log ๋กœ ๋””๋ฒ„๊น…
  • ๊ทธ ์™ธ ๋ฐฉ๋ฒ•๋“ค

โœจLicense

  • ๋ณธ ํ…œํ”Œ๋ฆฟ์˜ ์†Œ์œ ๊ถŒ์€ ์†Œํ”„ํŠธ์Šคํ€˜์–ด๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ์ž๋ฃŒ์— ๋Œ€ํ•œ ์ƒ์—…์  ์ด์šฉ ๋ฐ ๋ฌด๋‹จ ๋ณต์ œ, ๋ฐฐํฌ ๋ฐ ๋ณ€๊ฒฝ์„ ์›์น™์ ์œผ๋กœ ๊ธˆ์ง€ํ•˜๋ฉฐ ์ด๋ฅผ ์œ„๋ฐ˜ํ•  ๋•Œ์—๋Š” ํ˜•์‚ฌ์ฒ˜๋ฒŒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published