๐ŸŒฑBEB 09 Final Project ํšŒ๊ณ 

๋…์ˆ˜๋ฆฌ๋ฐ•๋ฐ•ยท2023๋…„ 8์›” 17์ผ
0

project

๋ชฉ๋ก ๋ณด๊ธฐ
3/3
post-thumbnail

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๊ฐœ์š”


์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ์ €๋ฒˆ ํ”„๋กœ์ ํŠธ2์˜ ์ฃผ์ œ์™€ ๋™์ผํ•˜๊ฒŒ ํ”Œ๋กœ๊น… ๋ฐ ๊ธฐํƒ€ ํ™˜๊ฒฝ ์šด๋™ ๊ด€๋ จ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋ธ”๋ก์ฒด์ธ ๊ธฐ๋ฐ˜ ์ธ์„ผํ‹ฐ๋ธŒ ํ˜•์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ๊ฐ€ ๋น„์Šทํ•œ ๋Œ€์‹  ๊ธฐ๋Šฅ์„ ๋Š˜๋ ธ๊ณ  ERC-1155๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ NFT๋ฅผ ๋ฐฐ์ง€ ํ˜•์‹์œผ๋กœ ์ฐธ๊ฐ€์ž์—๊ฒŒ ํ–‰์‚ฌ ์ฐธ์—ฌ ๋ณด์ƒ์œผ๋กœ ์ง€๊ธ‰ํ•˜๊ณ  ERC-721๋กœ DNFT๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ2์™€ ๋™์ผํ•œ ํŒ€์› ๋ถ„๋“ค์— ํ•œ๋ถ„ ๋” ๋ชจ์…”์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋‹ค๋“ค ๋„ˆ๋ฌด ์ž˜ํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด๋ผ ๊ฐˆ๋“ฑ ํ•œ๋ฒˆ ์—†์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ž˜ ๋งˆ๋ฌด๋ฆฌ ํ–ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋™์•ˆ์˜ ํ”„๋กœ์ ํŠธ์™€ ๋™์ผํ•˜๊ฒŒ smart contract ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ–ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ปจํŠธ๋ž™ํŠธ ๋ฐ ์„œ๋ฒ„์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ์ž‘์„ฑํ•ด๋ณด๊ณ  mongoDB๋„ ์ƒˆ๋กœ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋‹ค. ์ฒ˜์Œ์—๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์› ์ง€๋งŒ ๊ธˆ๋ฐฉ ์ž˜ ์ ์‘ํ•ด์„œ ๋งก์€ ๋ถ€๋ถ„์„ ์ž˜ ๊ตฌํ˜„ํ•ด ๋‚˜์•„๊ฐ”๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ฅผ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•ด ์—ฌ๋Ÿฌ ํ–‰์‚ฌ ๋ฐ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ๋ฅผ ๋”์šฑ ์šฉ์ดํ•˜๊ฒŒ ๊ตฌ์„ฑํ–ˆ๋‹ค.

github

clean-mile github

๋ฐฐํฌ๋งํฌ

client : https://www.clean-mile.co/
admin : https://admin.clean-mile.co/auth/login

์„œ๋น„์Šค ์•„ํ‚คํ…์ณ

์—ญํ•  ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ

์—ญํ• 

  • Smart Contract : DNFT, Badge, Token Contract, Test Code, Contract Deploy,Verify
  • Server: contract controller, Unit Test

๊ธฐ์ˆ  ์Šคํƒ

ERC-1155

ERC1155๋Š” ์ด๋”๋ฆฌ์›€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์ผํ•œ ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋Œ€์ฒด ๊ฐ€๋Šฅ, ๋ถ€๋ถ„ ๋Œ€์ฒด ๊ฐ€๋Šฅ, ๋Œ€์ฒด ๋ถˆ๊ฐ€๋Šฅ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋„๋ก ํ•ด ์ฃผ๋Š” ํ‘œ์ค€์ด๋‹ค
์šฐ๋ฆฌ ํ”Œ๋žซํผ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ธ ํ™œ๋™ ํ›„ ์ธ์ฆ์„ ํ•˜๋ฉด ํ–‰์‚ฌ์™€ ๊ด€๋ จํ•œ ๋ฐฐ์ง€๋ฅผ ์ง€๊ธ‰ํ•˜๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ–ˆ๋‹ค. ๋ฐฐ์ง€๋Š” ERC-721๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ–‰์‚ฌ์— ์ฐธ์—ฌํ•œ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋™์ผํ•œ ๋ฐฐ์ง€๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด์„  ์„ธ์ƒ์— ์˜ค์ง ๋”ฑ ํ•˜๋‚˜ ์กด์žฌํ•˜๋Š” ํ† ํฐ์ด ์•„๋‹Œ ์ฐธ๊ฐ€์ž ์ˆ˜ ๋งŒํผ ๋™์ผํ•œ ํ† ํฐ์ด ์กด์žฌํ•ด์•ผ ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ERC-1155๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

interface ICleanMileBadge {
    // ๊ฐ ๋ฑƒ์ง€์˜ ID๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. 0์€ ๋ธŒ๋ก ์ฆˆ, 1์€ ์‹ค๋ฒ„, 2๋Š” ๊ณจ๋“œ ๋ฑƒ์ง€์ž…๋‹ˆ๋‹ค.
    enum BadgeType {
        Bronze,
        Silver,
        Gold
    }

    // ํ† ํฐ ID์— ๋Œ€ํ•œ ๋ฑƒ์ง€ ์œ ํ˜•์„ ์กฐํšŒํ•˜๋Š” ํ•จ์ˆ˜
    function badgeType(uint256 tokenId) external view returns (BadgeType);

    // ์œ ์ €์˜ ๋ฑƒ์ง€ ์ ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” ํ•จ์ˆ˜
    function userBadgeScore(
        address userAddress
    ) external view returns (uint256);

    // ํŠน์ • ํ† ํฐ์˜ ๋ฑƒ์ง€ ์ˆ˜๋Ÿ‰์„ ์กฐํšŒํ•˜๋Š” ํ•จ์ˆ˜
    function badgeBalance(
        address account,
        uint256 tokenId
    ) external view returns (uint256);

    // ๋ฑƒ์ง€๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋Š” ํ•จ์ˆ˜
    function mintBadge(
        address account,
        BadgeType badgeType,
        uint256 amount,
        string memory uri
    ) external returns (uint256);

    // ๋ฑƒ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ํ•จ์ˆ˜ (ํ•œ๋ช…์—๊ฒŒ ํ•œ๊ฐœ์”ฉ)
    function transferBadge(
        address from,
        address to,
        uint256 tokenId,
        uint256 amount
    ) external;

    // ๋ฑƒ์ง€๋ฅผ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†กํ•˜๋Š” ํ•จ์ˆ˜ (ํ•œ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ํ† ํฐ์„ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์—๊ฒŒ)
    function transferBadges(
        address from,
        address[] calldata recipients,
        uint256 tokenId,
        uint256 amount
    ) external;

    event MintBadge(
        address indexed sender,
        address account,
        BadgeType badgeType,
        uint256 amount,
        string _uri
    );

    event TransferMultiple(
        address indexed sender,
        address[] recipients,
        uint256 tokenId,
        uint256 amount
    );

    // ํŠน์ • ํ† ํฐ์— ๋Œ€ํ•œ ๊ถŒํ•œ ๋ถ€์—ฌ ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค.
    event ApprovalForToken(
        address indexed account,
        uint256 indexed tokenId,
        bool approve
    );

1.๊ด€๋ฆฌ์ž๋Š” mintBadge ํ•จ์ˆ˜๋กœ ํ–‰์‚ฌ์™€ ๊ด€๋ จํ•œ ๋ฑƒ์ง€๋ฅผ ์›ํ•œ๋Š” ์ˆ˜๋Ÿ‰๋งŒํผ ๋ฏผํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2.์ดํ›„ transferBadge ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ qr์ธ์ฆ์„ ํ•˜๋ฉด ํ•ด๋‹น ํ–‰์‚ฌ์— ๋Œ€ํ•œ ๋ฑƒ์ง€๋ฅผ ์ „์†กํ•œ๋‹ค.
3.๋งŒ์•ฝ ์ฐธ์—ฌ์ž๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์„ ๊ฒฝ์šฐ ์ผ์ผ์ด ๋ฐฐ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์Šค๋น„๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ์†Œ์š”๋œ๋‹ค. ๋”ฐ๋ผ์„œ transferBadges๋กœ ์ธ์ฆ ์™„๋ฃŒํ•œ ์ฐธ์—ฌ์ž๋“ค์—๊ฒŒ ์ผ๊ด€ ์ „์†กํ•œ๋‹ค.
4. ๋ฐฐ์ง€๋Š” gold, silver, bronze ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋ฐฐ์ง€๋ฅผ ๋ฐ›๋Š” ์ˆœ๊ฐ„ ๊ฐ™์ด ๋ฐฐ์ง€ ์ ์ˆ˜๋„ ๋ฐ›๊ฒŒ ๋˜๋ฉฐ ์ถ”ํ›„์— DNFT ์—…๊ทธ๋ ˆ์ด๋“œ์— ์‚ฌ์šฉ๋œ๋‹ค. (๊ณจ๋“œ : 10์ , ์‹ค๋ฒ„ : 5์ , ๋ธŒ๋ก ์ฆˆ : 1์ )
5.userBadgeScore ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž์˜ ๋ฐฐ์ง€ ์ ์ˆ˜๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งŒ์•ฝ ์ฐธ๊ฐ€์ž๊ฐ€ qr์ธ์ฆ์„ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐฐ์ง€๋ฅผ ์ง€๊ธ‰ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

์ดํ›„ ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ˆ˜๋ นํ•œ ๋ฐฐ์ง€ ๋ฐ ์ฐธ๊ฐ€ํ•œ ํ™œ๋™์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฐฐ์ง€ ์ ์ˆ˜ ๋˜ํ•œ ๊ฐ™์ด ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋ฐฐ์ง€ ๋ฏผํŒ…์ด๋‚˜ ์ „์†ก ๊ฐ™์ด ์ค‘์š”ํ•œ ํ•จ์ˆ˜๋“ค์€ ๋”ฐ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ •์˜ํ•ด ๋กœ๊ทธ ์ƒ์„ฑ ๋ฐ ๋ฐ๋ชฌ์ด ์ถ”์  ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.


DNFT(ERC-721)

NFT์˜ ์†์„ฑ์ด ๋™์ ์œผ๋กœ ๋ณ€๋™๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด DNFT์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด DNFT๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํšŒ์›๊ฐ€์ž… ์‹œ ์ง€๊ธ‰ํ•˜๊ณ  ํ™œ๋™์— ๋”ฐ๋ฅธ ๋ฐฐ์ง€ ์ ์ˆ˜์— ๋”ฐ๋ผ์„œ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž๋“ค์€ ํ™œ๋™์— ๋”ฐ๋ผ DNFT๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ์•„์ด์ฝ˜์ด ๋ณ€๊ฒฝ๋˜๋ฉฐ ์ž์‹ ์˜ ํ™œ๋™ ๊ธฐ๋ก์ด DNFT description์— ๊ณ„์†ํ•ด์„œ ๊ธฐ๋ก๋˜๋ฉฐ ์–ด๋Š ์ •๋„ ํ™œ๋™์— ๋Œ€ํ•œ ์ธ์ฆ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

interface ICleanMileDNFT {
    //level 1~5๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž level_6์€ ๊ด€๋ฆฌ์ž
    enum DNFTLevel {
        level_1,
        level_2,
        level_3,
        level_4,
        level_5,
        level_6
    }

    enum UserType {
        User,
        Admin
    }

    struct DNFTData {
        uint256 token_id;
        string name;
        string description;
        DNFTLevel level;
    }

    event UpgradeDNFT(address indexed sender, uint256 tokenId);

    event MintDNFT(
        address _to,
        string _name,
        string _description,
        UserType userType
    );

    function dnftName(uint256 _tokenId) external view returns (string memory);

    function dnftDescription(
        uint256 _tokenId
    ) external view returns (string memory);

    function dnftLevel(uint256 _tokenId) external view returns (DNFTLevel);

    function dnftData(uint256 _tokenId) external view returns (DNFTData memory);

    function mintDNFT(
        address _to,
        string calldata _name,
        string calldata _description,
        UserType userType
    ) external returns (uint256);

    function updateName(uint256 _tokenId, string calldata _name) external;

    function updateDescription(
        uint256 _tokenId,
        string calldata _description
    ) external;

    function setBadge(address badgeAddress) external returns (bool);

    function upgradeDNFT(uint256 _tokenId) external returns (bool);

    function upgradeCheck(uint256 _tokenId) external returns (DNFTLevel);
}

DNFT ์ปจํŠธ๋ž™ํŠธ์˜ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
1.DNFT๋Š” 1~6๋ ˆ๋ฒจ๊นŒ์ง€ ์กด์žฌํ•œ๋‹ค. 6๋ ˆ๋ฒจ์€ ๊ด€๋ฆฌ์ž์ด๋‹ค.
2.์‚ฌ์šฉ์ž๋Š” ํšŒ์›๊ฐ€์ž…์‹œ mintDNFT ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ž์‹ ์˜ ์ง€๊ฐ‘์— DNFT๋ฅผ ์ˆ˜๋ นํ•œ๋‹ค.
3.์ดํ›„ ํ™œ๋™์„ ํ•˜๋ฉฐ ๋ฐฐ์ง€ ์ ์ˆ˜๋ฅผ ํš๋“ํ•˜๊ณ  ์ •ํ•ด์ง„ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
[๊ธฐ์ค€]
1๋‹จ๊ณ„(์”จ์•—) : 0์ (ํšŒ์›๊ฐ€์ž… ์ƒํƒœ)~ 14์  (๊ฐ„๊ฒฉ: 15์ )
2๋‹จ๊ณ„(์ƒˆ์‹น) : 15์  ~ 39์  (๊ฐ„๊ฒฉ25์ )
3๋‹จ๊ณ„(์žŽ์ƒˆ) : 41์  ~ 74์  (๊ฐ„๊ฒฉ35์ )
4๋‹จ๊ณ„(๊ฐ€์ง€) : 75์  ~ 119์  (๊ฐ„๊ฒฉ45์ )
5๋‹จ๊ณ„(์—ด๋งค) : 120์  ~
์ด ๊ธฐ์ค€์€ ํ˜„์‹ค์ ์ธ ํ–‰์‚ฌ๋“ค์˜ ์ฃผ์ตœ ์ฃผ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
4.์ด ๊ธฐ์ค€์„ ์ถฉ์กฑํ•œ๋‹ค๋ฉด ๋‹ค์Œ ๋ ˆ๋ฒจ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๊ทธ๋ ˆ์ด๋“œ ์ „

์—…๊ทธ๋ ˆ์ด๋“œ ํ›„

์ปจํŠธ๋ž™ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ€์Šค๋น„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ํ•œ ์˜จ์ฒด์ธ ์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ค„์ด๊ณ  ํŠธ๋žœ์žญ์…˜ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋งŽ์ด ๊ณ ๋ฏผํ•ด ๋ณด์•˜๋‹ค.


์ปจํŠธ๋ž™ํŠธ ํ›„๊ธฐ

ํ”„๋กœ์ ํŠธ 1์€ foundry, ํ”„๋กœ์ ํŠธ 2๋Š” truffle, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ 3๋Š” hardhat์„ ์‚ฌ์šฉํ–ˆ๋‹ค. 3๋ฒˆ ๋ชจ๋‘ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์„ ์ด์šฉํ•ด ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ๊ฒ€์ฆ๊นŒ์ง€ ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๋˜ ํ•˜๋‚˜ ์ƒˆ๋กœ ์‹œ๋„ํ•œ ๊ฒƒ์€ mocha๋ฅผ ์ด์šฉํ•œ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด๋‹ค. ๊ฐ ์ปจํŠธ๋ž™ํŠธ ๋งˆ๋‹ค positive, negative case๋ฅผ ๋‘์–ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ƒํ™ฉ์„ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋ ค ํ–ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๋ถ€๋ถ„์ด ๊ตณ์ด ํ•„์š”ํ•œ๊ฐ€ ์‹ถ์—ˆ์ง€๋งŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ ์ปจํŠธ๋ž™ํŠธ์— ๋นˆ ๊ณณ์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ์ž‘์—…์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ์—๋Ÿฌ ์ •์˜ ๋ฐ ์ด๋ฒคํŠธ ์ •์˜์™€ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ๋งŽ์ด ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


์„œ๋ฒ„

์„œ๋ฒ„ ๋ถ€๋ถ„์—์„œ๋Š” ์ปจํŠธ๋ž™์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ controller๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„ ๋‹ด๋‹นํ•˜์‹  ํŒ€์› ๋ถ„์ด ์ž‘์„ฑํ•ด ๋†“์€ api์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ๊ฐ–๋‹ค ๋ถ™์˜€๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„ ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ์‚ฌ์‹ค ์„œ๋ฒ„ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ํ•จ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์กฐ๊ธˆ ํž˜๋“ค์—ˆ๋‹ค. ๋ฐฉ์‹์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ธฐ์กด DB๋ฅผ ๊ฑด๋“œ๋ฆฌ๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— mongo-memory-server๋ฅผ ๋„์šด๋‹ค์Œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ ๋˜๋ฉด ๊ฐ™์ด ์ข…๋ฃŒํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค. ์ปจํŠธ๋ž™ํŠธ์™€ ๋งˆ์นœ๊ฐ€์ง€๋กœ mocha, chai๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค!

์‚ฌ์‹ค ์„œ๋ฒ„์™€ ๊ด€๋ จํ•ด์„œ ๋‚ด๊ฐ€ ๊ธฐ์—ฌํ•œ ๋ถ€๋ถ„์€ ์ด ์ •๋„์ด๋‹ค. ํ•˜์ง€๋งŒ ํŒ€์›๋ถ„๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋งค์ผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ ์ข€ ๋” ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๊ฐ€ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์—ˆ๋‹ค. ์•„๋งˆ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งŽ์ด ์ฐธ๊ณ ํ•  ๊ฑฐ ๊ฐ™๋‹ค. ์„œ๋ฒ„ ๋‹ด๋‹นํ•˜์‹  ํŒ€์› ๋ถ„๊ป˜์„œ postman์œผ๋กœ api๋ฅผ ์ •๋ฆฌํ•˜์…จ๋‹ค. ํ•œ ๋ˆˆ์— ๋ณด๊ธฐ ์ƒ๋‹นํžˆ ํŽธํ•˜๊ณ  ๊น”๋”ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฃผ๋กœ ๋งก์€ ํŒŒํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค ๋ณด๋‹ˆ ๋‚จ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋‚ด ๊ฒƒ์„ ์ค‘๊ฐ„์— ์‚ฝ์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋ถ€๋ถ„ ๋ณด๋‹ค๋Š” ๋‚จ์˜ ๊ฒƒ์„ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“œ๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ์Ÿ์•˜๋˜๊ฑฐ ๊ฐ™๋‹ค.ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์ œ์ผ ๋งŽ์ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ๋‚จ์ด ํ•˜๋Š” ๊ฒƒ์„ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„์—์„œ ์˜ค๋Š” ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ํ›„๊ธฐ

๋งˆ์ง€๋ง‰ ํ”„๋กœ์ ํŠธ๊นŒ์ง€ ๋งˆ๋ฌด๋ฆฌ ๋˜์—ˆ๋‹ค.

์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๊ณ  ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์ข‹์€ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ๋งŽ์€ ์ •๋ณด์™€ ๋„์›€์„ ๋ฐ›์•„ ์ด๋ ‡๊ฒŒ ๋๋‚  ๋•Œ ์ฏค์—๋Š” ์–ด๋Š ์ •๋„ ๋‚ด๊ฐ€ ๋งก์€ ์—ญํ• ์„ ๋‹ค ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ๋œ๊ฑฐ ๊ฐ™์•„ ๋ฟŒ๋“ฏํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ž์œผ๋กœ ๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ๊ณต๋ถ€๋ฅผ ํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๋ฐฉํ–ฅ์„ ์žก์„ ์ˆ˜ ์žˆ์–ด ์ข‹์•˜๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์–ธ์–ด์˜ ํญ์„ ๋Š˜๋ฆฌ๊ณ  ์ปจํŠธ๋ž™ํŠธ ๊ด€๋ จ ๋ถ€๋ถ„ ํ•ด์„œ๋Š” ์ด๋ก ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ๋งŽ์ด ๊นŒ๋จน์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ž์œผ๋กœ ๋‹ค์‹œ ๋ณต์Šตํ•˜๋ฉด์„œ ๋ณด๊ฐ•ํ•ด ๋‚˜๊ฐ€์•ผ ํ•  ๊ฑฐ ๊ฐ™๋‹ค.

์š•์‹ฌ๋ถ€๋ฆฌ์ง€ ์•Š๊ณ  ์ฒœ์ฒœํžˆ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€์•ผ๊ฒ ๋‹ค.

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 8์›” 17์ผ

์ด๋ ‡๊ฒŒ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ