์˜คํ”ˆ ์†Œ์Šค์˜ ์—ญ์‚ฌ: Go์—์„œ ๋ถ„์„ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ์ œ๊ณตํ•œ ๋ฐฉ๋ฒ•

ํ˜„์žฌ ์ „ ์„ธ๊ณ„ ๊ฑฐ์˜ ๋ชจ๋“  ํšŒ์‚ฌ๋Š” ์›น ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉ์ž ์ž‘์—…์— ๋Œ€ํ•œ ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐ๋Š” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์—…์€ ์ œํ’ˆ/์›น์‚ฌ์ดํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์–ดํ•˜๋ฉฐ ์‚ฌ์šฉ์ž๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‹œ์žฅ์—๋Š” ๋Œ€์‹œ๋ณด๋“œ์™€ ๊ทธ๋ž˜ํ”„ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ถ„์„ ์‹œ์Šคํ…œ๋ถ€ํ„ฐ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋งŽ์€ ๋„๊ตฌ๊ฐ€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Google Analytics)๋ฅผ ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ ํ”Œ๋žซํผ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋“  ์ฐฝ๊ณ ์˜ ๋‹ค์–‘ํ•œ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๊ตฌํš).

ํ•˜์ง€๋งŒ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ ํƒ„์ƒํ–ˆ๋‹ค ์ด๋ฒคํŠธ๋„ค์ดํ‹ฐ๋ธŒ โ€” ์˜คํ”ˆ ์†Œ์Šค ๋ถ„์„ ์„œ๋น„์Šค. ์šฐ๋ฆฌ๊ฐ€ ์ž์ฒด ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด์œ , ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์ œ๊ณตํ•œ ๊ฒƒ, ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์—‡์ธ์ง€(์ฝ”๋“œ ์กฐ๊ฐ ํฌํ•จ) ์ฝ์–ด๋ณด์„ธ์š”.

์˜คํ”ˆ ์†Œ์Šค์˜ ์—ญ์‚ฌ: Go์—์„œ ๋ถ„์„ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ์ œ๊ณตํ•œ ๋ฐฉ๋ฒ•

์™œ ์šฐ๋ฆฌ๋งŒ์˜ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•ด์•ผ ํ• ๊นŒ์š”?

2019๋…„๋Œ€์˜€๊ณ , ์šฐ๋ฆฌ๋Š” ์ตœ์„ ์„ ๋‹คํ•ด ์‚ด์•„ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค. XNUMX๋…„ API First ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ ํ”Œ๋žซํผ์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. kSense, ๋ณด๋‹ค ํŽธ๋ฆฌํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์„, ์ข…์†์„ฑ ์‹๋ณ„ ๋“ฑ์„ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์†Œ์Šค(Facebook ๊ด‘๊ณ , Stripe, Salesforce, Google Play, Google Analytics ๋“ฑ)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ ๋ถ„์„, ํŠนํžˆ Google Analytics(์ดํ•˜ GA) ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‚ฌ์šฉ์ž์™€ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆˆ ๊ฒฐ๊ณผ GA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ›๋Š” ์ œํ’ˆ์— ๋Œ€ํ•œ ๋ถ„์„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์ง€๋งŒ Google ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ GA ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํŽธ์˜์˜ ํ‘œ์ค€์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๋“ค๊ณผ ์ถฉ๋ถ„ํ•œ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆด๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Segment ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. 3.2์–ต ๋‹ฌ๋Ÿฌ์— ๋งค๊ฐ).

๊ทธ๋“ค์€ ์›น ๋ฆฌ์†Œ์Šค์— ์„ธ๊ทธ๋จผํŠธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”ฝ์…€์„ ์„ค์น˜ํ–ˆ๊ณ  ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€์ •๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(์˜ˆ: Postgres)์— ๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Segment์—๋Š” ๊ฐ€๊ฒฉ์ด๋ผ๋Š” ๋‹จ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ๋ฆฌ์†Œ์Šค์— 90,000 MTU(์›”๋ณ„ ์ถ”์  ์‚ฌ์šฉ์ž)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณ„์‚ฐ์›์—๊ฒŒ ๋งค์›” ~1,000๋‹ฌ๋Ÿฌ๋ฅผ ์ง€๋ถˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ๋ฌธ์ œ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ(์˜ˆ: AdBlock)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋ถ„์„ ์ •๋ณด ์ˆ˜์ง‘์„ ์ฐจ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์˜ http ์š”์ฒญ์€ GA ๋ฐ ์„ธ๊ทธ๋จผํŠธ ๋„๋ฉ”์ธ์œผ๋กœ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ๊ฐ์˜ ํฌ๋ง์— ๋”ฐ๋ผ ์ „์ฒด ๋ฐ์ดํ„ฐ ์„ธํŠธ(์ƒ˜ํ”Œ๋ง ์—†์ด)๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ฌด๋ฃŒ์ด๋ฉฐ ์ž์ฒด ์ธํ”„๋ผ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์„ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์ž‘๋™ ๋ฐฉ์‹

์„œ๋น„์Šค๋Š” ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. JavaScript ํ”ฝ์…€(๋‚˜์ค‘์— TypeScript๋กœ ๋‹ค์‹œ ์ž‘์„ฑ), ์„œ๋ฒ„ ๋ถ€๋ถ„์€ GO ์–ธ์–ด๋กœ ๊ตฌํ˜„๋˜๋ฉฐ Redshift ๋ฐ BigQuery๋ฅผ ์‚ฌ๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค(๋‚˜์ค‘์— ์ง€์› ์ถ”๊ฐ€). Postgres, ClickHouse ๋ฐ Snowflake).

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

//'ga' - ัั‚ะฐะฝะดะฐั€ั‚ะฝะพะต ะฝะฐะทะฒะฐะฝะธะต ะฟะตั€ะตะผะตะฝะฝะพะน Google Analytics
if (window.ga) {
    ga(tracker => {
        var originalSendHitTask = tracker.get('sendHitTask');
        tracker.set('sendHitTask', (model) => {
            var payLoad = model.get('hitPayload');
            //ะพั‚ะฟั€ะฐะฒะบะฐ ะพั€ะธะณะธะฝะฐะปัŒะฝะพะณะพ ัะพะฑั‹ั‚ะธั ะฒ GA
            originalSendHitTask(model);
            let jsonPayload = this.parseQuery(payLoad);
            //ะพั‚ะฟั€ะฐะฒะบะฐ ัะพะฑั‹ั‚ะธั ะฒ ะฝะฐัˆ ัะตั€ะฒะธั
            this.send3p('ga', jsonPayload);
        });
    });
}

Segment ํ”ฝ์…€์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ด์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•œ ๋ฏธ๋“ค์›จ์–ด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.


//'analytics' - ัั‚ะฐะฝะดะฐั€ั‚ะฝะพะต ะฝะฐะทะฒะฐะฝะธะต ะฟะตั€ะตะผะตะฝะฝะพะน Segment
if (window.analytics) {
    if (window.analytics.addSourceMiddleware) {
        window.analytics.addSourceMiddleware(chain => {
            try {
		//ะดัƒะฑะปะธั€ะพะฒะฐะฝะธะต ัะพะฑั‹ั‚ะธั ะฒ ะฝะฐัˆ ัะตั€ะฒะธั
                this.send3p('ajs', chain.payload);
            } catch (e) {
                LOG.warn('Failed to send an event', e)
            }
	    //ะพั‚ะฟั€ะฐะฒะบะฐ ะพั€ะธะณะธะฝะฐะปัŒะฝะพะณะพ ัะพะฑั‹ั‚ะธั ะฒ Segment
            chain.next(chain.payload);
        });
    } else {
        LOG.warn("Invalid interceptor state. Analytics js initialized, but not completely");
    }
} else {
    LOG.warn('Analytics.js listener is not set.');
}

์ด๋ฒคํŠธ ๋ณต์‚ฌ ์™ธ์—๋„ ์ž„์˜์˜ json์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.


//ะžั‚ะฟั€ะฐะฒะบะฐ ัะพะฑั‹ั‚ะธะน ั ะฟั€ะพะธะทะฒะพะปัŒะฝั‹ะผ json ะพะฑัŠะตะบั‚ะพะผ
eventN.track('product_page_view', {
    product_id: '1e48fb70-ef12-4ea9-ab10-fd0b910c49ce',
    product_price: 399.99,
    price_currency: 'USD'
    product_release_start: '2020-09-25T12:38:27.763000Z'
});

๋‹ค์Œ์œผ๋กœ ์„œ๋ฒ„ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋Š” http ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ  ์ง€๋ฆฌ ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ์ •๋ณด๋กœ ์ฑ„์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งฅ๋งˆ์ธ๋“œ ์ด๋ฅผ ์œ„ํ•ด) ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ์˜ ๊ตฌ์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ตœ๋Œ€ํ•œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋“ค์–ด์˜ค๋Š” json ์ด๋ฒคํŠธ์˜ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์œ ํ˜•์€ ๊ฐ’์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋Š” ๋ถ„ํ•ด๋˜์–ด ํ‰๋ฉด ๊ตฌ์กฐ๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค.

//ะฒั…ะพะดัั‰ะธะน json
{
  "field_1":  {
    "sub_field_1": "text1",
    "sub_field_2": 100
  },
  "field_2": "text2",
  "field_3": {
    "sub_field_1": {
      "sub_sub_field_1": "2020-09-25T12:38:27.763000Z"
    }
  }
}

//ั€ะตะทัƒะปัŒั‚ะฐั‚
{
  "field_1_sub_field_1":  "text1",
  "field_1_sub_field_2":  100,
  "field_2": "text2",
  "field_3_sub_field_1_sub_sub_field_1": "2020-09-25T12:38:27.763000Z"
}

๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ์—ด์€ ํ˜„์žฌ ๋‹จ์ˆœํžˆ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ฐ˜๋ณต ํ•„๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„ ํƒ์  ๋งคํ•‘ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, json ํ•„๋“œ์— ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ(field_3_sub_field_1_sub_sub_field_1 ์œ„์˜ ์˜ˆ์—์„œ), ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํƒ€์ž„์Šคํƒฌํ”„ ์œ ํ˜•์˜ ํ•„๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ์— ๋งคํ•‘ ๊ทœ์น™์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ๋จผ์ € json ๊ฐ’์— ์˜ํ•ด ๊ฒฐ์ •๋œ ๋‹ค์Œ ์œ ํ˜• ์บ์ŠคํŒ… ๊ทœ์น™(๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ)์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” STRING, FLOAT4, INT64 ๋ฐ TIMESTAMP์˜ 64๊ฐ€์ง€ ์ฃผ์š” ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งคํ•‘ ๋ฐ ์œ ํ˜• ์บ์ŠคํŒ… ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

rules:
  - "/field_1/subfield_1 -> " #ะฟั€ะฐะฒะธะปะพ ัƒะดะฐะปะตะฝะธั ะฟะพะปั
  - "/field_2/subfield_1 -> /field_10/subfield_1" #ะฟั€ะฐะฒะธะปะพ ะฟะตั€ะตะฝะพัะฐ ะฟะพะปั
  - "/field_3/subfield_1/subsubfield_1 -> (timestamp) /field_20" #ะฟั€ะฐะฒะธะปะพ ะฟะตั€ะตะฝะพัะฐ ะฟะพะปั ะธ ะฟั€ะธะฒะตะดะตะฝะธั ั‚ะธะฟะฐ

๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ฒฐ์ •ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  • json ๊ตฌ์กฐ๋ฅผ ํ”Œ๋žซ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜
  • ๊ฐ’์œผ๋กœ ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜• ๊ฒฐ์ •
  • ๋งคํ•‘ ๋ฐ ์œ ํ˜• ์บ์ŠคํŒ… ๊ทœ์น™ ์ ์šฉ

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋“ค์–ด์˜ค๋Š” json ๊ตฌ์กฐ์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

{
    "product_id":  "1e48fb70-ef12-4ea9-ab10-fd0b910c49ce",
    "product_price": 399.99,
    "price_currency": "USD",
    "product_type": "supplies",
    "product_release_start": "2020-09-25T12:38:27.763000Z",
    "images": {
      "main": "picture1",
      "sub":  "picture2"
    }
}

๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

"product_id" character varying,
"product_price" numeric (38,18),
"price_currency" character varying,
"product_type" character varying,
"product_release_start" timestamp,
"images_main" character varying,
"images_sub" character varying

๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒํ‹ฐ์…”๋‹ํ•˜๊ฑฐ๋‚˜ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์ƒ์ˆ˜ ๋˜๋Š” ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‘œํ˜„ ๊ตฌ์„ฑ์—์„œ. ์•„๋ž˜ ์˜ˆ์—์„œ ์ด๋ฒคํŠธ๋Š” product_type ๋ฐ _timestamp ํ•„๋“œ์˜ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋œ ์ด๋ฆ„์œผ๋กœ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: ์†Œ๋ชจํ’ˆ_2020_10):

tableName: '{{.product_type}}_{{._timestamp.Format "2006_01"}}'

๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์‹  ์ด๋ฒคํŠธ์˜ ๊ตฌ์กฐ๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ํ…Œ์ด๋ธ” ๊ตฌ์กฐ์™€ ๋“ค์–ด์˜ค๋Š” ์ด๋ฒคํŠธ ๊ตฌ์กฐ์˜ ์ฐจ์ด๋ฅผ ํ™•์ธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ํ…Œ์ด๋ธ”์ด ์ƒˆ ํ•„๋“œ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ํŒจ์น˜ SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

#ะŸั€ะธะผะตั€ ะดะปั Postgres
ALTER TABLE "schema"."table" ADD COLUMN new_column character varying

๊ตฌ์กฐ

์˜คํ”ˆ ์†Œ์Šค์˜ ์—ญ์‚ฌ: Go์—์„œ ๋ถ„์„ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ์ œ๊ณตํ•œ ๋ฐฉ๋ฒ•

์ด๋ฒคํŠธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๊ธฐ๋กํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋งŽ์€ ์ˆ˜์˜ ์‚ฝ์ž…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•ญ์ƒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค(ํฌ์ŠคํŠธ๊ทธ๋ ˆ์Šค ๊ถŒ์žฅ ์‚ฌํ•ญ). ์ด๋ฅผ ์œ„ํ•ด Logger๋Š” ๋“ค์–ด์˜ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๊ณ  ๋ณ„๋„์˜ ๊ณ ๋ฃจํ‹ด(์Šค๋ ˆ๋“œ)์—์„œ ํŒŒ์ผ ๋ฆฌ๋”๊ฐ€ ํŒŒ์ผ์„ ์ฝ์€ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™˜๋˜๊ณ  ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ์ž๊ฐ€ ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ๊ฐ€ ์ตœ์‹  ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•œ ํ›„์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ๊ด„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์ „ํ™˜๊ณผ ๊ฐ™์ด ๋งŽ์ง€ ์•Š์€ ์ด๋ฒคํŠธ์— ์ด ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜คํ”ˆ์†Œ์Šค์™€ ์•ž์œผ๋กœ์˜ ๊ณ„ํš

์–ด๋Š ์‹œ์ ๋ถ€ํ„ฐ ์„œ๋น„์Šค๊ฐ€ ๋ณธ๊ฒฉ์ ์ธ ์ œํ’ˆ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์˜คํ”ˆ ์†Œ์Šค๋กœ ์ถœ์‹œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake์™€์˜ ํ†ตํ•ฉ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ†ตํ•ฉ์€ ๋ฐ์ดํ„ฐ ๋กœ๋“œ์˜ ๋ฐฐ์น˜ ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋“œ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. API๋ฅผ ํ†ตํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ†ตํ•ฉ ์ฒด๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜คํ”ˆ ์†Œ์Šค์˜ ์—ญ์‚ฌ: Go์—์„œ ๋ถ„์„ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ์ œ๊ณตํ•œ ๋ฐฉ๋ฒ•

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

โ†’ GitHub์˜
โ†’ ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั
โ†’ ๋Š์Šจํ•˜๊ฒŒ

EventNative๊ฐ€ ๊ท€ํ•˜์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด ๋œ๋‹ค๋ฉด ๊ธฐ์˜๊ฒ ์Šต๋‹ˆ๋‹ค!

๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž๋งŒ ์„ค๋ฌธ ์กฐ์‚ฌ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์ œ๋ฐœ

๊ท€ํ•˜์˜ ํšŒ์‚ฌ์—์„œ๋Š” ์–ด๋–ค ํ†ต๊ณ„์ˆ˜์ง‘ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

  • 48,0%Google Analytics12

  • 4,0%์„ธ๊ทธ๋จผํŠธ1

  • 16,0%๋˜ ๋‹ค๋ฅธ (๋Œ“๊ธ€๋กœ ์ ์–ด์ฃผ์„ธ์š”)4

  • 32,0%์„œ๋น„์Šค ๊ตฌํ˜„8

25๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. 6๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ถŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€