๋ฐ์—”์œผ๋กœ ์„ฑ์žฅ์ค‘ ๐ŸŒฑ

๊ฐœ๋ฐœ ์ผ์ง€ 7

4. ์ž ์‹œ ๋ณด๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.

์ „๋‚  ๋ฉด์ ‘ ์ œ์˜๊ฐ€ ์™€์„œ, ์–ด์ œ ์ง„ํ–‰ํ•œ ์ดํ›„๋กœ ์Šคํ†ฑ ์ƒํƒœ์ผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์— ๋กค ๋‹‰๋„ค์ž„ ๊ด€ํ•ด์„œ ์ •์ฑ…์ด ๋ฐ”๋€๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ํ˜น์‹œ ์ด์— ๋”ฐ๋ผ์„œ API ์ •์ฑ…๋„ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์–ด์„œ ๊ฒธ์‚ฌ๊ฒธ์‚ฌ ๊ธฐ๋‹ค๋ ค๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์†Œํ™˜์‚ฌ ์ด๋ฆ„์—์„œ Riot ID๋กœ ์ „ํ™˜ ํ˜„์žฌ ๋ฆฌ๊ทธ ์˜ค๋ธŒ ๋ ˆ์ „๋“œ์˜ ์„ธ๊ณ„๋ฅผ ๋” ์ž˜ ๋ฐ˜์˜ํ•˜๊ณ  ๋ผ์ด์—‡์˜ ๊ฒŒ์ž„ ๊ฐ„ ์—ฐ๊ณ„์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋™์‹œ์— ๊ธฐ์ˆ  ์ฐจ์›์—์„œ ์ด๋ฆ„์˜ ๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ณ ์ž ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„์„ ์ง€์นญํ•˜๋Š” ์šฉ์–ด๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. www.riotgames.com +) ์ œ๊ฐ€ ๋ฉด์ ‘ ๊ธฐ๊ฐ„ ์ค‘์— ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒŒ๋„ ํ•œ ํšŒ์‚ฌ์— ํ•ฉ๊ฒฉํ•˜๊ฒŒ ๋˜์–ด ์ž…์‚ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค...! ์ถ”ํ›„ ํฌ์ŠคํŒ…์ด ์•„๋งˆ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ‹ˆํ‹ˆ์ด ์ค€๋น„ํ•ด์„œ ๊ตฌ์ƒ‰์ด ์–ด์ƒ‰ํ•˜๋”๋ผ๋„ ๊ผญ ๋งˆ๋ฌด๋ฆฌ ์ง“๊ณ  ์‹ถ๋„ค์š”! (์ ์–ด๋„ Spark๊นŒ์ง€ ์ ์šฉํ•ด๋ณด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ...โœจ)

3. kafka์™€ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ grafana ์„ธํŒ…

์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๊ฐ„๋‹จํ•œ API ๊ตฌ์ถ• ํ…Œ์ŠคํŠธ๋ฅผ ์™„๋ฃŒํ–ˆ๋‹ค. 0. Kafka ๊ฐœ๋… ๊ณต๋ถ€ํ•˜๊ธฐ 1. docker-compose๋กœ Kafka ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ถ•ํ•˜๊ธฐ ์ด์ œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก Kafka๋ฅผ docker-compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์ถ•ํ•ด๋ณด์•˜๋‹ค. kafka broker 3๊ฐœ, zookeeper 3๊ฐœ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ฌ๋ ค ์ง„ํ–‰ํ–ˆ๋‹ค. | docker-compose.yml version: '2' services: zookeeper-1: image: confluentinc/cp-zookeeper:latest ports: - "12181:2181" environment: ZOOKEEPER_SERVER_ID: 1 ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 20..

2. ์†Œํ™˜์‚ฌ๋ช… ๊ฒ€์ƒ‰์œผ๋กœ ์ •๋ณด ๊ฐ€์ ธ์˜ค๋Š” API ๊ตฌํ˜„ํ•˜๊ธฐ

์•ž์˜ ํฌ์ŠคํŒ…์—์„œ ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ธํŒ…์„ ์™„๋ฃŒํ–ˆ์œผ๋‹ˆ, ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์—์„œ API๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž. 0. ๋””์ž์ธ ํŒจํ„ด... ๋‚ด๊ฐ€ ์•„๋Š” ๊ฒƒ์ด๋ผ๊ณ ๋Š” MVC ๋ฟ์ด๋ผ ใ…‹ใ…‹ใ…‹ ์–ด๋–ป๊ฒŒ ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ๊ตฌ์กฐ๋ฅผ ์งœ์•ผํ• ์ง€ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๋‹จ service์™€ controller๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. | SummonerService.java package sungmin.LOLDataPipeline.service; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import sun..

1. Riot API ์‹ ์ฒญ & Spring Boot ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

0. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ ๋ญํ•˜์ง€? ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌด๋ฃŒ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ๋ฐ์ดํ„ฐ ์–‘๋„ ๋งŽ์€ ๊ณณ์„ ๊ฝค ์ฐพ๊ธฐ ์–ด๋ ค์› ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ง€์ง„ ๋ฐ์ดํ„ฐ, ํ•ญ๊ณต ๋ฐ ์„ ๋ฐ• ๋ฐ์ดํ„ฐ ๊ฐ™์ด ์žฌ๋ฏธ๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ค„์„œ ์ด๊ฒƒ ์ €๊ฒƒ ๋‹ค์–‘ํ•œ ๊ฒฐ๊ณผ๋„ ๋งŒ๋“ค์–ด ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด๋‹ค ํ•ด์™ธ ์‚ฌ์ดํŠธ๊นŒ์ง€ ๊ฐ€์ž…ํ•ด์„œ ์‹ ์ฒญ๋„ ํ•ด๋ดค์ง€๋งŒ ๊ฒฐ๊ตญ Fail... ์–ด๋–ค ํ”„๋กœ์ ํŠธ ์ฃผ์ œ๋ฅผ ํ•ด๋ณผ์ง€ ์ด๊ฒƒ์ €๊ฒƒ ์ฐพ์•„๋ณด๊ณ  ์‹œ๋„ํ•˜๋‹ค๊ฐ€, ์ฆ๊ฒจํ•˜๋Š” ๊ฒŒ์ž„์ธ ๋กค(League of Legends, LOL) ๋ฐ์ดํ„ฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ๋งˆ์นจ ๊ด€๋ จ ํ”„๋กœ์ ํŠธ๋ฅผ ์ด๋ฏธ ์ง„ํ–‰ํ•˜์‹  ์„ ๋ก€์˜ ๋ธ”๋กœ๊ทธ๊ฐ€ ์žˆ์–ด, ๋งŽ์ด ์ฐธ๊ณ ํ•˜๊ณ  ์‘์šฉํ•ด๋ณด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค ใ…Žใ…Ž ๊ฑฐ์ฐฝํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†๊ฒ ์ง€๋งŒ, ๊ทธ๋™์•ˆ ๋‹ค๋ค„๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ๊ธฐ์ˆ  ์Šคํƒ๋“ค(ํŠนํžˆ Kafka๋ž‘ Spark ๋“ฑ๋“ฑ)..

์•ฑ ์„œ๋น„์Šค ์šด์˜ ํ•œ ๋‹ฌ ํ›„๊ธฐ

Android๋Š” 5์›” 18์ผ ์ถœ์‹œ. iOS๋Š” 5์›” 17์ผ ์ถœ์‹œ. ๋ฒŒ์จ ๊ฐ ์Šคํ† ์–ด์— ์•ฑ์„ ์ถœ์‹œํ•œ์ง€ ํ•œ ๋‹ฌ์ด ์ง€๋‚ฌ๋Š”๋ฐ, ๊ทธ ๋™์•ˆ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์žˆ์—ˆ๋˜ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์ด๋‚˜ ์•„์‰ฌ์šด ์ ? ๋“ฑ... ํšŒ๊ณ ๋ฅผ ํ•œ ๋ฒˆ ํ•ด๋ณด๋ ค ํ•œ๋‹ค. โธ๏ธ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํšŒ๊ณ ํ•˜๊ธฐ ์ „์—, ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ์˜์ƒ ๊ฐ™์€ ๊ฑธ ํ•œ ๋ฒˆ๋„ ์—…๋กœ๋“œํ•œ ์ ์ด ์—†์–ด์„œ ์•ฑ ์‹คํ–‰ ์˜์ƒ๊ณผ ํ•ด๋‹น ์•ฑ์— ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์žˆ๋Š”์ง€ ์†Œ๊ฐœํ•˜๋ ค ํ•œ๋‹ค. ์•ฑ ๊ธฐ๋Šฅ ์„ค๋ช… 1. ์‚ฌ์šฉ์ž๊ฐ€ ์›”~๊ธˆ์š”์ผ์˜ ์‹๋‹จํ‘œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ขŒ์šฐ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. 2. ์š”์ผ์— ๋งž๋Š” ์‹๋‹จํ‘œ๋ฅผ ๋ฐ”๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”๋กœ ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์˜ค๋Š˜์ด ํ™”์š”์ผ์ด๋ผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์Šคํฌ๋กคํ•˜์ง€ ์•Š์•„๋„, ์ž๋™์œผ๋กœ ํ™”์š”์ผ ์‹๋‹จํ‘œ๋กœ ๋„˜์–ด๊ฐ€ ๋ณด์—ฌ์ฃผ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. (์ฃผ๋ง์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์›”์š”์ผ์— ์œ„์น˜..

๊ตฌ๋‚ด์‹๋‹น ์‹๋‹จํ‘œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ์„ , ์•ฑ ์ถœ์‹œ๊นŒ์ง€

๐ŸŽฏ ๊ฐœ๋ฐœ ๋ชฉํ‘œ ์ง€๋‚œ ๋ฒˆ ๊ฐœ๋ฐœ ์ผ์ง€์— ์ž‘์„ฑํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ถ€๋ถ„๊ณผ ์ถ”๊ฐ€์ ์ธ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. Lambda ํ•จ์ˆ˜์—์„œ์˜ ๋ฐ˜๋ณต์ ์ธ OCR ํ˜ธ์ถœ → Lambda ํ•จ์ˆ˜ ๋ถ„ํ•  ๋ฐ DB ๋„์ž… ๊ธฐ์กด Lambda ํ•จ์ˆ˜๋Š” OCR์— ์ด๋ฏธ์ง€๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์•„ ๋ฐ”๋กœ gateway์— ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค OCR์— ์ด๋ฏธ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์ด ์ˆ˜ํ–‰๋˜์–ด ๋น„ํšจ์œจ์ ์ธ ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค. Lambda ํ•จ์ˆ˜๋ฅผ ๋‘ ๊ฐœ๋กœ ์ชผ๊ฐœ์–ด, ํ•˜๋‚˜์˜ Lambda ํ•จ์ˆ˜๋Š” OCR๋กœ ์‹๋‹จํ‘œ ์ •๋ณด๋ฅผ ํ…์ŠคํŠธ๋ฅผ ๋ฐ›์•„์™€ DB์— ์ €์žฅํ•˜๋„๋ก ํ•˜์˜€๋‹ค. ๋‹ค๋ฅธ Lambda ํ•จ์ˆ˜๋Š” DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ gateway๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋„๋ก ํ•˜์˜€๋‹ค. ํ•ด๋‹น ๊ตฌ์กฐ๋กœ ๋ฐ˜๋ณต์ ์ธ OCR ํ˜ธ์ถœ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์—†์•จ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ˜„์‹ค์ ์ธ ์„œ..

AWS Lambda ๋ฐ S3, Naver OCR ๋กœ ์‹๋‹จํ‘œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ

๐ŸŽฏ ๊ฐœ๋ฐœ ๋ชฉ์  ๊ฐœ๋ฐœ ๊ณ„๊ธฐ ํ˜„์žฌ ๋“ฃ๊ณ  ์žˆ๋Š” ๊ต์œก์žฅ ๊ทผ์ฒ˜์— '๋ฉ”๊ฐ€์Šคํ„ฐ๋””์˜ ๊ตฌ๋‚ด์‹๋‹น' ์ด ์žˆ์–ด, ๊ต์œก์žฅ ํ•™์ƒ๋ถ„๋“ค๊ณผ ์ง์›๋ถ„๋“ค์ด ์ž์ฃผ ์ ์‹ฌ ์‹์‚ฌ๋กœ ์• ์šฉํ•˜๋Š” ๊ณณ์ด๋‹ค. ์šฐ๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ทผ์ฒ˜ ์ง์žฅ์ธ ๋ถ„๋“ค๋„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋“ฏํ•˜๋‹ค. โžก๏ธ ์‚ฌ์šฉ ๋Œ€์ƒ ํŒŒ์•… ๊ฐ€๋Šฅ "๊ธฐ์กด ์‹œ์Šคํ…œ ์ ‘๊ทผ์„ฑ ๋ฌธ์ œ" ๊ทธ๋Ÿฌ๋‚˜, ๋งค๋ฒˆ ์ ์‹ฌ ๋ฉ”๋‰ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ธ”๋กœ๊ทธ์— ๋“ค์–ด๊ฐ€ ํ•ด๋‹น ํฌ์ŠคํŒ…์„ ์ผ์ผ์ด ํ™•์ธํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋”๊ตฐ๋‹ค๋‚˜ ๊ฐ™์ด ์ˆ˜๋ฃŒํ•˜๋Š” ๋ถ„๋“ค๋ผ๋ฆฌ "์˜ค๋Š˜ ๋ฉ”๊ฐ€ ๋ฉ”๋‰ด ๋ญ์•ผ?", "๋ชฐ๋ผ?" ๋ผ๋Š” ๋Œ€ํ™”๋งŒ ๋ฉฐ์น  ๋‚ด๋‚ด ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์—...(๋‚˜๋„ ๋งค๋ฒˆ ๋“ฃ๊ณ  ์žˆ๋Š” ๊ฑด ์•ˆ๋น„๋ฐ€) ๋‹ค๋“ค ๋ฉ”๋‰ด ์ด๋ฏธ์ง€๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๊ณ , ๊ทธ๋•Œ ๊ทธ๋•Œ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐพ์•„ ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜, ์Šฌ๋ž™์—์„œ ๊ณต์œ ๋œ ๋งํฌ๋ฅผ ํ†ตํ•ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ ๊ฐ™๋‹ค. โžก๏ธ ๋ถˆํŽธ ์‚ฌํ•ญ ํ™•์ธ : ๋ธ”๋กœ๊ทธ๋ฅผ ํ†ตํ•œ ๋ฉ”๋‰ด ํ™•์ธ์œผ๋กœ ์ ‘๊ทผ..