ํ์ฌ ์ ์ธ๊ณ ๊ฑฐ์ ๋ชจ๋ ํ์ฌ๋ ์น ๋ฆฌ์์ค์์ ์ฌ์ฉ์ ์์
์ ๋ํ ํต๊ณ๋ฅผ ์์งํฉ๋๋ค. ๋๊ธฐ๋ ๋ถ๋ช
ํฉ๋๋ค. ๊ธฐ์
์ ์ ํ/์น์ฌ์ดํธ๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์๊ณ ์ถ์ดํ๋ฉฐ ์ฌ์ฉ์๋ฅผ ๋ ์ ์ดํดํ๊ณ ์ถ์ดํฉ๋๋ค. ๋ฌผ๋ก ์์ฅ์๋ ๋์๋ณด๋์ ๊ทธ๋ํ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๋ถ์ ์์คํ
๋ถํฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์๋ง์ ๋๊ตฌ๊ฐ ๋์ ์์ต๋๋ค(์:
ํ์ง๋ง ์์ง ํด๊ฒฐ๋์ง ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๋ฆฌํ์ฌ ํ์ํ๋ค
์ ์ฐ๋ฆฌ๋ง์ ์๋น์ค๋ฅผ ๊ฐ๋ฐํด์ผ ํ ๊น์?
2019๋
๋์๊ณ , ์ฐ๋ฆฌ๋ ์ต์ ์ ๋คํด ์ด์ ๋จ์์ต๋๋ค. XNUMX๋
API First ๊ณ ๊ฐ ๋ฐ์ดํฐ ํ๋ซํผ์ ๊ฐ๋ฐํ์ต๋๋ค. kSense, ๋ณด๋ค ํธ๋ฆฌํ ๋ฐ์ดํฐ ๋ถ์, ์ข
์์ฑ ์๋ณ ๋ฑ์ ์ํด ๋ค์ํ ์์ค(Facebook ๊ด๊ณ , Stripe, Salesforce, Google Play, Google Analytics ๋ฑ)์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ ์ ์๊ฒ ๋์์ต๋๋ค. ๋ง์ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ ๋ถ์, ํนํ Google Analytics(์ดํ GA) ํ๋ซํผ์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ผ๋ถ ์ฌ์ฉ์์ ๋ํ๋ฅผ ๋๋ ๊ฒฐ๊ณผ GA๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ ์ ํ์ ๋ํ ๋ถ์ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์์ง๋ง
๊ทธ๋ค์ ์น ๋ฆฌ์์ค์ ์ธ๊ทธ๋จผํธ ์๋ฐ์คํฌ๋ฆฝํธ ํฝ์ ์ ์ค์นํ๊ณ ์ฌ์ฉ์์ ํ๋์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์ง์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค(์: 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
{
"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
๋ํ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ํํฐ์
๋ํ๊ฑฐ๋ ๋๋ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ๊ณ ํ
์ด๋ธ ์ด๋ฆ์ ์์ ๋๋ ๋ณ์๋ก ์ค์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
tableName: '{{.product_type}}_{{._timestamp.Format "2006_01"}}'
๊ทธ๋ฌ๋ ์์ ์ด๋ฒคํธ์ ๊ตฌ์กฐ๋ ๋ฐํ์ ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๊ธฐ์กด ํ ์ด๋ธ ๊ตฌ์กฐ์ ๋ค์ด์ค๋ ์ด๋ฒคํธ ๊ตฌ์กฐ์ ์ฐจ์ด๋ฅผ ํ์ธํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ์ต๋๋ค. ์ฐจ์ด์ ์ด ๋ฐ๊ฒฌ๋๋ฉด ํ ์ด๋ธ์ด ์ ํ๋๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ํจ์น SQL ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์.
#ะัะธะผะตั ะดะปั Postgres
ALTER TABLE "schema"."table" ADD COLUMN new_column character varying
๊ตฌ์กฐ
์ด๋ฒคํธ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ๊ธฐ๋กํ๋ ๊ฒ์ด ์๋๋ผ ํ์ผ ์์คํ
์ ๊ธฐ๋กํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ๋ง์ ์์ ์ฝ์
์ ์ฒ๋ฆฌํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํญ์ ์ ๋๋ก ์๋ํ๋ ๊ฒ์ ์๋๋๋ค(
์คํ์์ค์ ์์ผ๋ก์ ๊ณํ
์ด๋ ์์ ๋ถํฐ ์๋น์ค๊ฐ ๋ณธ๊ฒฉ์ ์ธ ์ ํ์ฒ๋ผ ๋ณด์ด๊ธฐ ์์ํ๊ณ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์คํ ์์ค๋ก ์ถ์ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ํ์ฌ Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake์์ ํตํฉ์ด ๊ตฌํ๋์์ต๋๋ค. ๋ชจ๋ ํตํฉ์ ๋ฐ์ดํฐ ๋ก๋์ ๋ฐฐ์น ๋ฐ ์คํธ๋ฆฌ๋ฐ ๋ชจ๋๋ฅผ ๋ชจ๋ ์ง์ํฉ๋๋ค. API๋ฅผ ํตํ ์์ฒญ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
ํ์ฌ ํตํฉ ์ฒด๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๋น์ค๋ ๋
๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ง๋ง(์: Docker ์ฌ์ฉ)
โ
โ
โ
EventNative๊ฐ ๊ทํ์ ๋ฌธ์ ํด๊ฒฐ์ ๋์์ด ๋๋ค๋ฉด ๊ธฐ์๊ฒ ์ต๋๋ค!
๋ฑ๋ก๋ ์ฌ์ฉ์๋ง ์ค๋ฌธ ์กฐ์ฌ์ ์ฐธ์ฌํ ์ ์์ต๋๋ค.
๊ทํ์ ํ์ฌ์์๋ ์ด๋ค ํต๊ณ์์ง ์์คํ ์ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
-
48,0%Google Analytics12
-
4,0%์ธ๊ทธ๋จผํธ1
-
16,0%๋ ๋ค๋ฅธ (๋๊ธ๋ก ์ ์ด์ฃผ์ธ์)4
-
32,0%์๋น์ค ๊ตฌํ8
25๋ช
์ ์ฌ์ฉ์๊ฐ ํฌํํ์ต๋๋ค. 6๋ช
์ ์ฌ์ฉ์๊ฐ ๊ธฐ๊ถํ์ต๋๋ค.
์ถ์ฒ : habr.com