Skip to content

linking-service/client-web

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

71 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Linking

1. ์„œ๋น„์Šค ๊ฐœ์š”

1.1 ์ดˆ๋ก

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

์ด๋Ÿฐ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ๋ชจ๋‘ ๋งํฌ๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค. ์ผ์ƒ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํฅ๋ฏธ๋กœ์šด ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ณต์œ ํ•˜๋“ฏ ์ด์ œ๋Š” ๋งํฌ๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์ •๋ณด์™€ ํ”„๋กœ๊ทธ๋žจ ๊ทธ ์ž์ฒด๊ฐ€ ๊ณต์œ ๋œ๋‹ค. ํŽธํ•˜๊ฒŒ ํฐ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„ ์—†์ด ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋Ÿฐ ์ค‘์š”ํ•œ ๋งํฌ๋Š” ๋งŽ์ด ๊ณต์œ ๋˜์ง€๋งŒ, ๋งˆ๋•…ํžˆ ๋ชจ์•„์„œ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•  ๊ณณ์ด ์—†์–ด, ๋ถ„์‚ฐ๋˜์–ด ์ €์žฅ๋˜๊ณ  ์ด๋กœ ์ธํ•ด ์‰ฝ๊ฒŒ ์žŠํžˆ๊ฒŒ ๋œ๋‹ค.

![](assets/pasted image 0.png)

๋ธŒ๋ผ์šฐ์ €์˜ ๋ถ๋งˆํฌ๋‚˜ ๋ฉ”๋ชจ์žฅ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋งํฌ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•„์š”ํ•œ ๋งํฌ๋ฅผ ๋‹ค์‹œ ์ฐพ์•„๋ณผ ๋•Œ ๋ถ๋งˆํฌ๋‚˜ ๋ฉ”๋ชจ์žฅ์˜ ๊ฒฝ์šฐ ๋งํฌ์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜ค์ง€ ์•Š๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด, ๋งํฌ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ ค ๋งํฌ๋ฅผ ์ €์žฅํ•œ ์˜๋ฏธ๊ฐ€ ํ‡ด์ƒ‰๋œ๋‹ค.

![](assets/pasted image 0 (1).png)

![](assets/pasted image 0 (2).png)

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์—์„œ ์ฐฉ์•ˆํ•˜์—ฌ ๋งํฌ๋ฅผ ๋ณด๋‹ค ๋ณด๊ธฐ ์‰ฝ๊ณ , ์ €์žฅํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ, ๋‹ค์‹œ ์ฐพ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” Linking์ด๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•œ๋‹ค. Linking์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ๋งํฌ๋ฅผ ์ฃผ์ œ์— ๋งž๊ฒŒ ํ•œ ์ €์žฅ์†Œ์— ๋ชจ์•„ ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. Linking์€ 'Link all in one workspace' ๋ผ๋Š” ์Šฌ๋กœ๊ฑด ์•„๋ž˜, ๋ณธ์ธ์ด ๊ด€์‹ฌ ์žˆ๋Š” ๋ถ„์•ผ์™€ ๊ด€๋ จ๋œ ์ฝ˜ํ…์ธ ์˜ ๋งํฌ๋ฅผ ๋ชจ์•„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋‹ค.

1.2 ๋ชฉํ‘œ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ๋งํฌ ๊ณต์œ  ์„œ๋น„์Šค ์ด์šฉ์ž๋ฅผ ์œ„ํ•œ ์ƒ์‚ฐ์„ฑ ๋„๊ตฌ์ธ ๋งŒํผ, ํ•ด๋‹น ์„œ๋น„์Šค ๊ตฌํ˜„์„ ํ†ตํ•ด๋‹ค๋ฅธ Stakeholder์˜ ๋ฌธ์ œ๋“ค๋„ ํ•จ๊ป˜ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•œ๋‹ค.

๋งํฌ ๊ณต์œ  ์„œ๋น„์Šค ์ด์šฉ์ž์˜ ๋ฌธ์ œ์ธ, ๋งํฌ ์ €์žฅ, ํƒ์ƒ‰ ๋ฐ ๊ณต์œ ์˜ ์–ด๋ ค์›€์„ ๊ฐ€์žฅ ํฐ ๋ชฉํ‘œ๋กœ ๋‘๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ ค ํ•œ๋‹ค.

๋งํฌ ๊ณต์œ  ์„œ๋น„์Šค ์ด์šฉ์ž ๋ฌธ์ œ ํ•ด๊ฒฐ
์ €์žฅ๋œ ๋งํฌ์˜ ์ •๋ณด๋ฅผ ์•Œ๊ธฐ ์–ด๋ ค์›€ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ํฌ๋กค๋ง์„ ํ†ตํ•œ ๋งํฌ์— ๋Œ€ํ•œ ์ œ๋ชฉ๊ณผ ์„ค๋ช… ํฌ๋กค๋ง
์ €์žฅ๋œ ๋งํฌ๋ฅผ ํ•„์š”์— ์˜ํ•ด ํƒ์ƒ‰์„ ํ•˜๋ ค ํ•  ๋•Œ, ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ ์–ด๋ ค์›€ ์ €์žฅ๋œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ, ํƒœ๊ทธ, ์œ ์ € ์„ค๋ช… ๋ชจ๋‘์—์„œ ์ „์ฒด ํƒ์ƒ‰
๋งํฌ๋ฅผ ํ•œ ๋ฒˆ์— ๊ณต์œ ํ•˜๊ธฐ ์–ด๋ ค์›€ ๋งํฌ๋ฅผ ๋ชจ์€ ์ €์žฅ์†Œ๋ฅผ ์œ ์ €๊ฐ„์— ํ•œ๊บผ๋ฒˆ์— ๊ณต์œ 

1.3 ์‚ฌ์šฉ ๊ธฐ์ˆ 

1.3.1 Semantic UI

semantic ui๋Š” UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์นดํ…Œ๊ณ ๋ฆฌ์— ์†ํ•˜๋Š” ์ œํ’ˆ์ด๋‹ค. ์ด ๋„๊ตฌ๋Š” ์ž˜ ๋งŒ๋“ค์–ด์ง„ ๊ธฐ๋ณธ component๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— react ์ƒ์—์„œ ํ™œ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•„์š”์— ๋”ฐ๋ผ์„œ๋Š” ๊ฐœ์กฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งค๋ฒˆ component๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ƒ์‚ฐ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ํ”„๋กœ์ ํŠธ ํŠน์„ฑ์ƒ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋ถ€์กฑํ•œ ์ƒํ™ฉ์—์„œ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์˜€๋‹ค.

1.3.2 React Hooks

React.js์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ์ƒํƒœ์™€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ธฐ์กด์— ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ชปํ•˜๋˜ ์ƒํƒœ๊ฐ’ ๊ด€๋ฆฌ, ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์‘์ง‘์„ฑ๊ณผ ์กฐ๋ฆฝ ๊ฐ€๋Šฅ์„ฑ์„ ์–ป๊ณ  ํ˜„์žฌ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์˜€๋‹ค.

1.3.3 Cheerio

Cheerio๋Š” ์›น ์Šคํฌ๋ž˜ํ•‘์„ ์œ„ํ•œ ๋ชจ๋“ˆ์ด๋‹ค. ์›น ์Šคํฌ๋ž˜ํ•‘์€ ์›นํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. Linking ์„œ๋น„์Šค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋งํฌ์—์„œ meta data๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์นด๋“œ๋ทฐ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅํ•ด์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅํ•œ URL์—์„œ ์ถ”์ถœ์— ํ•„์š”ํ•œ HTML ํƒœ๊ทธ๋ฅผ ์‚ฌ์ „์— ์„ค์ •ํ•ด๋‘๊ณ  meta data๋ฅผ ์ถ”์ถœํ•ด ๋‚ธ๋‹ค. ์ •์ƒ์ ์œผ๋กœ meta data์˜ ์ถ”์ถœ์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ์—๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์นด๋“œ๋ทฐ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ๋˜๋„๋ก ์ž‘์„ฑํ•˜์˜€๋‹ค.

2. ๊ตฌํ˜„ ๊ธฐ๋Šฅ

2.1 Meta ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋ถ€ ๊ตฌํ˜„

Node์—์„œ fetch๋ฅผ ํ†ตํ•ด ์ „์ฒด HTML์„ ๋ถˆ๋Ÿฌ์™€ Cheerio ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ Meta๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ๊ฐ์ฒด๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

const axios = require("axios");
const cheerio = require("cheerio");

class Scraper {
    constructor(url) {
        this.url = url;
    }

    async getResponse() {
        const { data } = await axios.get(this.url);

        return data;
    }

    filterByTarget({ data, target }) {
        return data.filter(elem => {
            const itemprop = elem.itemprop ? elem.itemprop : "";
            const property = elem.property ? elem.property : "";
            const name = elem.name ? elem.name : "";
            return (
                itemprop.includes(target) ||
                property.includes(target) ||
                name.includes(target)
            );
        });
    }

    getData(html) {
        const $ = cheerio.load(html);
        let data = [];

        $("meta").each((i, elem) => {
            const attrib = elem.attribs;
            if (attrib.itemprop || attrib.property || attrib.name)
                data = [...data, attrib];
        });

        const pageTitle = $("title").text();

        const [title, ...titleArg] = this.filterByTarget({
            data,
            target: "title"
        });
        const [desc, ...descArg] = this.filterByTarget({
            data,
            target: "description"
        });
        const [imgUrl, ...imgUrlArg] = this.filterByTarget({
            data,
            target: "image"
        });

        return {
            title: title ? title.content : pageTitle ? pageTitle : this.url,
            desc: desc ? desc.content : "",
            imgUrl: imgUrl ? imgUrl.content : ""
        };
    }
}
module.exports = Scraper;

2.2 ๋กœ๊ทธ์ธ ํ™”๋ฉด

๋ณ„๋„์˜ ๋กœ๊ทธ์ธ ์—†์ด ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ๋งŒ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

Linking%20700594c064734a159d1c198589e93b06/Untitled.png

2.3 ์‚ฌ์šฉ์ž ์›Œํฌ์ŠคํŽ˜์ด์Šค ํŽ˜์ด์ง€

Linking%20700594c064734a159d1c198589e93b06/Untitled%201.png

์ฆ๊ฒจ์ฐพ๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ์˜ ๊ธฐ๋Šฅ ์ œ๊ณต

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.26.41.png

2.4 ๋งํฌ ์ €์žฅ ๊ธฐ๋Šฅ

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.26.56.png

2.4.1 ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”์ถœ

๋งํฌ๋ฅผ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ๋ณ„๋„์˜ ์Šคํฌ๋ž˜ํผ๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค.

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.27.05.png

2.5 ๋””๋ ‰ํ† ๋ฆฌ ๊ณต์œ  ๊ธฐ๋Šฅ

2.5.1 ๊ณต์œ ๋ฐ›๊ธฐ

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.27.17.png

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.27.35.png

2.5.2 ๊ณต์œ ํ•˜๊ธฐ

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.27.43.png

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.27.52.png

2.6 ๊ฒ€์ƒ‰๊ธฐ๋Šฅ

2.6.1 ๋งํฌ๊ฒ€์ƒ‰

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.28.03.png

2.6.2 ์‚ฌ์šฉ์ž๊ฒ€์ƒ‰

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.28.09.png

2.6.3 ํƒœ๊ทธ๊ฒ€์ƒ‰

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.28.15.png

2.7 ํŒ”๋กœ์ž‰/ํŒ”๋กœ์›Œ ๊ธฐ๋Šฅ

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.28.22.png

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.28.28.png

2.8 ๋””๋ ‰ํ† ๋ฆฌ ๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.28.45.png

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.28.50.png

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.28.55.png

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.29.01.png

Linking%20700594c064734a159d1c198589e93b06/_2020-05-14__10.28.39.png

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •