์์ํ๊ธฐ ์ ์ ๋ ๋์ผ ํด์
์ด ๊ธฐ์ฌ์์๋ ํ์ผ ์ ์ฅ์ ๋ด๋นํ๋ ๋ ์ด์ด์ ์ด๋ฅผ ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ณ ์ถ์ต๋๋ค.
์ด์ ๊ธฐ์ฌ์์๋ "ํต์ ์กฐ๊ธ ๊ตด๋ ธ๋ค"๊ณ ํ์ต๋๋ค. ipfs, ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ ๊ฐ ํด๊ฒฐํ๊ณ ์๋ ๋ฌธ์ ์ ๋งฅ๋ฝ์์ ์ ํํ๊ฒ ์ผ์ด๋ฌ์ต๋๋ค. ์ ๋ฐ์ ์ผ๋ก ๋๋ ์ด ํ๋ก์ ํธ๊ฐ ๋ฉ์ง๋ค๊ณ ์๊ฐํ๋ค. ์ ๋ ๋จ์ง ๋ค์ํ ์์ ์ ์ํด ๋ค์ํ ๋คํธ์ํฌ๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ํธํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ตฌ์กฐ๋ฅผ ๋ ์ ๊ตฌ์ฑํ๊ณ ๊ฐ๋ณ ๋ ธ๋์ ๋คํธ์ํฌ ์ ์ฒด์ ๋ถํ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ํ๋์ ํ๋ก์ ํธ ํ๋ ์์ํฌ ๋ด์์๋ ํ์ํ ๊ฒฝ์ฐ ์ผ๋ถ ๊ธฐ์ค์ ๋ฐ๋ผ ๋คํธ์ํฌ๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋ถํ ํ์ฌ ์ ์ฒด ๋ถํ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ ์ฅ์๋ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค
- ๋ชจ๋ ๋ ธ๋๋ฅผ ํตํด ์ ์ฅ์์ ํ์ผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ํ์ผ์ ๋ธ๋ก์ด ์๋ ์ ์ฒด๋ก ์ ์ฅ๋ฉ๋๋ค.
- ๊ฐ ํ์ผ์๋ ์ถ๊ฐ ์์ ์ ์ํ ๊ณ ์ ํ ์ฝํ ์ธ ํด์๊ฐ ์์ต๋๋ค.
- ์ ๋ขฐ์ฑ์ ๋์ด๊ธฐ ์ํด ํ์ผ์ ๋ณต์ ํ ์ ์์ต๋๋ค.
- ํ ๋ ธ๋์ ํ์ผ ์๋ ํ์ผ ์์คํ ์ ์ํด์๋ง ์ ํ๋ฉ๋๋ค(์์ธ๊ฐ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์๋ ์ฐธ์กฐ)
- ๋คํธ์ํฌ์ ํ์ผ ์๋ ๋คํธ์ํฌ์ ์ ํจํ ๋ ธ๋ ์์ ๋ฐ๋ผ ํ์ฐ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ผ๋ก ์ ํ๋ฉ๋๋ค. ๋ ๋ฒ์งธ ๋ฒ์ ์์๋ ๋ฌดํํ ์์ ๋ ธ๋์ ํจ๊ป ์๋ํ ์ ์์ต๋๋ค(์์ธํ ๋ด์ฉ์ ๋ค๋ฅธ ๋ฌธ์์์ ์ค๋ช )
์ด๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์์ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ๊ฐ๋จํ ์:
์ฌ๊ธฐ๋ ์ฌ๋:
const Node = require('storacle').Node;
(async () => {
try {
const node = new Node({
port: 4000,
hostname: 'localhost'
});
await node.init();
}
catch(err) {
console.error(err.stack);
process.exit(1);
}
})();
๊ณ ๊ฐ:
const Client = require('storacle').Client;
(async () => {
try {
const client = new Client({
address: 'localhost:4000'
});
await client.init();
const hash = await client.storeFile('./my-file');
const link = await client.getFileLink(hash);
await client.removeFile(hash);
}
catch(err) {
console.error(err.stack);
process.exit(1);
}
})();
๋ด๋ถ๋ณด๊ธฐ
ํ๋ ์๋์๋ ๋ฉ์ง ๊ฒ์ด ์์ต๋๋ค. ํ์ผ ์, ์ ์ฒด ํฌ๊ธฐ, ๊ธฐํ ํฌ์ธํธ์ ๋ํ ์ ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ฉฐ ํ์ผ์ด ์ญ์ ๋๊ฑฐ๋ ์ถ๊ฐ๋ ๋ ์ ๋ฐ์ดํธ๋๋ฏ๋ก ํ์ผ ์์คํ ์ ์์ฃผ ์ก์ธ์คํ ํ์๊ฐ ์์ต๋๋ค. ํน์ ์ ์ฅ ํฌ๊ธฐ์ ๋๋ฌํ์ ๋ ํ์ผ์ ์ํํด์ผ ํ๊ณ ์ ํ์ผ ์ถ๊ฐ๋ฅผ ๊ธ์งํ์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ ๊ฐ๋น์ง ์์ง๊ธฐ๋ฅผ ํ์ฑํํ๋ ๊ฒ์ ์์ธ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ์คํ ๋ฆฌ์ง๋ฅผ ์ฐํํด์ผ ํ๋ฉฐ ๋ง์ ์์ ํ์ผ(์: ๋ฐฑ๋ง ๊ฐ)์ ์ฌ์ฉํ์ฌ ์์ ํ๋ฉด ์๋นํ ๋ก๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ ์ ์์ ํ์ผ์ ์ ์ฅํ๊ณ ๋ ๋ง์ ๋ ธ๋๋ฅผ ์คํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. "ํด๋ฆฌ๋"๊ฐ ๋นํ์ฑํ๋์ด ์์ผ๋ฉด ๊ทธ๋ฌํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํ์ผ ์ ์ฅ์๋ 256๊ฐ์ ํด๋์ 2๋จ๊ณ ์ค์ฒฉ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํ์ผ์ ๋ ๋ฒ์งธ ์์ค ํด๋์ ์ ์ฅ๋ฉ๋๋ค. ์ฆ, 1๋ง ๊ฐ๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋๋ค. ๊ฐ ํด๋์๋ ์ฝ 62500๊ฐ์ ํ์ผ์ด ์์ต๋๋ค(1000000 / sqrt(256)).
ํด๋ ์ด๋ฆ์ ํ์ผ ํด์๋ก ๊ตฌ์ฑ๋๋ฏ๋ก ํด์๋ฅผ ์๋ฉด ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ด ๊ตฌ์กฐ๋ ๋ค์ํ ์ ์ฅ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์ ํ๋์์ต๋๋ค. ์ฆ, ํ ํด๋์ ๋ง์ ํ์ผ์ ์ ์ฅํ๋ ๊ฒ์ด ๋ฐ๋์งํ์ง ์์ ์ทจ์ฝํ ํ์ผ ์์คํ ์ ๋ํ ์ง์, ํ์ํ ๊ฒฝ์ฐ ๋ชจ๋ ํด๋์ ๋น ๋ฅธ ํ์ ๋ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋์์ต๋๋ค. ์ผ์ข ์ ํฉ๊ธ๋ฅ .
์บ์ฑ
ํ์ผ์ ์ถ๊ฐํ ๋์ ํ์ผ์ ๋ฐ์ ๋ ํ์ผ ๋งํฌ๊ฐ ์บ์์ ๊ธฐ๋ก๋ฉ๋๋ค.
๋๋ถ์ ํ์ผ์ ์ฐพ๊ธฐ ์ํด ์ ์ฒด ๋คํธ์ํฌ๋ฅผ ํ์ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋งํฌ ์์ ์๋๊ฐ ๋นจ๋ผ์ง๊ณ ๋คํธ์ํฌ ๋ถํ๊ฐ ์ค์ด๋ญ๋๋ค. ์บ์ฑ์ http ํค๋๋ฅผ ํตํด์๋ ๋ฐ์ํฉ๋๋ค.
๋ํ
ํด๋ผ์ด์ธํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑ๋์์ผ๋ฉฐ ๋ํ์ด๋ฏ๋ก ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ผ์ ์
๋ก๋ํ์๋ฉด ๋ฉ๋๋ค
์ง์ฐ๋ ๋งํฌ
ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ "์ง์ฐ๋ ์ฐธ์กฐ"์ ๋๋ค. ์ด๊ฒ์ ์ง๊ธ ์ฌ๊ธฐ์์ ๋๊ธฐ์์ผ๋ก ์ป์ ์ ์๋ ํ์ผ์ ๋ํ ๋งํฌ์ด๋ฉฐ, ํ์ผ์ด ์ด๋ฏธ ์ ์ฅ์์ ์์ผ๋ฉด ํด๋น ํ์ผ์ ๊ฐ์ ธ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ดํธ์ ์ผ๋ถ ์ฌ์ง์ ํ์ํด์ผ ํ ๋ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ์ฐ๋ฆฌ๋ src์ ์ง์ฐ๋ ๋งํฌ๋ฅผ ๋ฃ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ง์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณผ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ API
- ๋น๋๊ธฐ ํด๋ผ์ด์ธํธ.ํ๋กํ ํ์ .์คํ ์ดํ์ผ() - ํ์ผ ์ ์ฅ
- ๋น๋๊ธฐ ํด๋ผ์ด์ธํธ.ํ๋กํ ํ์ .getFileLink() โ ํ์ผ์ ๋ํ ์ง์ ๋งํฌ ์ป๊ธฐ
- ๋น๋๊ธฐ ํด๋ผ์ด์ธํธ.ํ๋กํ ํ์ .getFileLinks() โ ํ์ผ์ด ์กด์ฌํ๋ ๋ชจ๋ ๋ ธ๋์์ ํ์ผ์ ๋ํ ์ง์ ๋งํฌ ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค.
- ๋น๋๊ธฐ Client.prototype.getFileToBuffer() โ ํ์ผ์ ๋ฒํผ์ ๋ฃ์ต๋๋ค.
- ๋น๋๊ธฐ ํด๋ผ์ด์ธํธ.ํ๋กํ ํ์ .getFileToPath() โ ํ์ผ ์์คํ ์ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ
- ๋น๋๊ธฐ Client.prototype.getFileToBlob() โ Blob์์ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ(๋ธ๋ผ์ฐ์ ๋ฒ์ ์ ๊ฒฝ์ฐ)
- ๋น๋๊ธฐ ํด๋ผ์ด์ธํธ.ํ๋กํ ํ์ .์ ๊ฑฐํ์ผ() - ํ์ผ ์ญ์
- Client.prototype.createRequestedFileLink() โ ์ง์ฐ๋ ๋งํฌ ์์ฑ
๋ค๋ฅธ ์๋ฒ๋ก ํ์ผ ๋ด๋ณด๋ด๊ธฐ
ํ์ผ์ ๋ค๋ฅธ ๋ ธ๋๋ก ์ ์กํ๋ ค๋ฉด ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
- ์ค์ ๊ณผ ํจ๊ป ์ ์ฒด ์ ์ฅ ํด๋๋ฅผ ๋ณต์ฌํ๋ฉด ๋ฉ๋๋ค. (ํฅํ์๋ ์๋ํ์ง ์์ ์๋ ์์ต๋๋ค)
- ํ์ผ์ด ์๋ ํด๋๋ง ๋ณต์ฌํ์ธ์. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ํด๋น ๊ธฐ๋ฅ์ ํ ๋ฒ ์คํํด์ผ ํฉ๋๋ค. node.normalizeFilesInfo()๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ณ์ฐํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ ฅํฉ๋๋ค.
- ๊ธฐ๋ฅ ์ฌ์ฉ node.exportFiles()๊ทธ๋ฌ๋ฉด ํ์ผ ๋ณต์ฌ๊ฐ ์์๋ฉ๋๋ค.
๊ธฐ๋ณธ ๋
ธ๋ ์ค์
์คํ ๋ฆฌ์ง ๋
ธ๋๋ฅผ ์์ํ ๋ ํ์ํ ๋ชจ๋ ์ค์ ์ ์ง์ ํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ง ์ค๋ช
ํ๊ณ ๋๋จธ์ง๋ Github์์ ํ์ธํ ์ ์์ต๋๋ค.
- ์คํ ๋ฆฌ์ง.๋ฐ์ดํฐํฌ๊ธฐ โ ํ์ผ์ด ์๋ ํด๋์ ํฌ๊ธฐ
- Storage.tempSize โ ์์ ํด๋ ํฌ๊ธฐ
- Storage.autoCleanSize โ ๋ณด์ ํด์ผ ํ๋ ์ต์ ์ ์ฅ ํฌ๊ธฐ์ ๋๋ค. ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ๋ฉด ๊ณต๊ฐ์ด ๋ถ์กฑํด์ง๊ธฐ ์์ํ์๋ง์ ๊ฐ์ฅ ์ ๊ฒ ์ฌ์ฉ๋ ํ์ผ์ด ์ญ์ ๋ฉ๋๋ค.
- ํ์ผ.์ต๋ ํฌ๊ธฐ โ ์ต๋ ํ์ผ ํฌ๊ธฐ
- ํ์ผ.์ต์ ํฌ๊ธฐ โ ์ต์ ํ์ผ ํฌ๊ธฐ
- file.preferred์ค๋ณต โ ๋คํธ์ํฌ์์ ์ ํธํ๋ ํ์ผ ์ค๋ณต ์
- file.mimeํ์ดํธ๋ฆฌ์คํธ - ์ ํจํ ํ์ผ ํ์
- file.mime๋ธ๋๋ฆฌ์คํธ - ์๋ชป๋ ํ์ผ ํ์
- file.extํ์ดํธ๋ฆฌ์คํธ - ์ ํจํ ํ์ผ ํ์ฅ์
- file.ext๋ธ๋๋ฆฌ์คํธ - ์๋ชป๋ ํ์ผ ํ์ฅ์
- file.link์บ์ - ๋ค์ํ ๋งํฌ ์บ์ฑ ์ค์
์น์์ ๊ด๋ จ๋ ๊ฑฐ์ ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ ์ ๋๊ฐ๊ณผ ์๋๊ฐ์ผ๋ก ์ ๋ ฅํ ์ ์์ต๋๋ค.
๋ช
๋ น์ค์ ํตํด ์์
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ช
๋ น์ค์ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ ์ญ์ ์ผ๋ก ์ค์นํด์ผ ํฉ๋๋ค. npm i -g ์ ์ฅ์. ๊ทธ๋ฐ ๋ค์ ๋
ธ๋๊ฐ ์๋ ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์์ ํ์ํ ์์
์ ์์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ฅ์ -a storeFile -f ./file.txt -c ./config.jsํ์ผ์ ์ถ๊ฐํ๋ ค๋ฉด ๋ชจ๋ ์์
์ ๋ค์์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ ์ด๊ฒ์ด ํ์ํ ์ ์์ต๋๊น?
- ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ ์ฅํ๊ณ ์์ ํ ์ผ์ข ์ ๋ถ์ฐํ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๊ฒฝ์ฐ. ์๋ฅผ ๋ค์ด ๊ธฐ์ฌ ์์ ๋ถ๋ถ์ ๋งํฌ์ ์ค๋ช ๋ ์์ ํ๋ก์ ํธ๋ ๋ค์์ ์ฌ์ฉํฉ๋๋ค. ์ ์ฅ๊ณ .
- ๋ถ์ฐ ๋ฐฉ์์ผ๋ก ํ์ผ์ ์ ์ฅํด์ผ ํ๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์์ ํ๋ ๊ฒฝ์ฐ. ํ์ํ ๋คํธ์ํฌ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ถํ๊ณ , ๋ ธ๋๋ฅผ ์ ์ฐํ๊ฒ ๊ตฌ์ฑํ๊ณ , ํ์ํ ๋ ์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์น ์ฌ์ดํธ ํ์ผ์ ์ด๋๊ฐ์ ์ ์ฅํด์ผ ํ๋๋ฐ ๋ชจ๋ ๊ฒ์ ์ง์ ์์ฑํ๊ธฐ์๋ ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ์ ๋๋ค. ์๋ง๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ทํ์ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค ๋ ์ ํฉํ ๊ฒ์ ๋๋ค.
- ํ์ผ ์์ ์ ํ๋ ํ๋ก์ ํธ๊ฐ ์์ง๋ง ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ ์กฐ์์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ. ์๋ฒ ์ฝ๋ ์์ฑ์ ํผํ ์ ์์ต๋๋ค.
๋ด ์ฐ๋ฝ์ฒ :
์ถ์ฒ : habr.com