์ฝ๋ ์ ์ ๋ถ์์ด๋ผ ํจ์ ์ค์ ํ๋ก๊ทธ๋จ์ ์คํํ์ง ์๊ณ ์ฝ๋๋ง์ ํํ์ ๋ํ ๋ถ์์ ๋งํ๋ค. ์ด๋ฅผํ
๋ฉด ๋์๋๋ ์ฝ๋(?)๋ผ๋์ง, ์ํ์ฑ์ด ์๋ ์ฝ๋, ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น์ด๋ ์ฝ๋ฉ ํ์ค์ ์ค์ํ๋์ง์ ๋ํ ๋ถ์์ ๋งํ๋๋ฐ java ๊ธฐ์ค์ผ๋ก๋ ์๋ ๋ค์ํ (์ ์๋ ค์ง) ์ ์ ๋ถ์ ๋๊ตฌ๋ค์ด ์๋ค. PMD ๋ฏธ์ฌ์ฉ ๋ณ์, ๋น์ด์๋ ์ฝ๋ ๋ธ๋ฝ, ๋ถํ์ํ ์ค๋ธ์ ํธ ์์ฑ๊ณผ ๊ฐ์ Defect์ ์ ๋ฐํ ์ ์๋ ์ฝ๋๋ฅผ ๊ฒ์ฌ https://pmd.github.io FindBugs ์ ํด์ง ๊ท์น์ ์ํด ์ ์ฌ์ ์ธ ์๋ฌ ํ์
์ ์ฐพ์์ค http://findbugs.sourceforge.net CheckStyle ์ ํด์ง ์ฝ๋ฉ ๋ฃฐ์ ์ ๋ฐ๋ฅด๊ณ ์๋์ง์ ๋ํ ๋ถ์ http://checkstyle.sourceforge.net ์ด์ธ์ SonarQube ๋ผ๋ ํด์ด ์๋๋ฐ ๊ฐ์ธ์ ์ผ๋ก ์ ์๋ ค์ง ๋ค๋ฅธ ํด๋ค์ ์ข
ํฉํ(?)์ด๋ผ๊ณ ์๊ฐ์ด ๋ค์๊ณ , ๊ทธ์ค ๊ฐ์ฅ ์ธ์๊น์๋ ๊ธฐ๋ฅ์ด github๊ณผ ์ฐ๋์ด ๋๊ณ ์ ์ ํ ๊ตฌ์ฑ์ ํ๊ฒ ๋๋ฉด ์ฝ๋๋ฅผ ์์ ํ๋๊ณผ ๋์์ ์๋์ผ๋ก ๋ถ์์ ํ๊ณ ๋ฆฌํฌํ
๊น์ง ํด์ค๋ค๋ ๋ถ๋ถ์ด์๋ค. ( ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ ๋ค๋ฅธ ๋๊ตฌ๋ค์ ์๋์ผ๋ก ๋๋ ค์ค์ผ ํ๊ณ ๋ฆฌํฌํ
๋ํ Activeํ์ง ๋ชปํ(?) ์์ฌ์ด ์ ์ด ์์๋ค. )
์ง๊ธ๋ถํฐ Jenkins + github web-hook + SonarQube ๋ฅผ ๊ตฌ์ฑํ์ฌ ์ฝ๋๋ฅผ ์์ ํ๊ณ PullRequest๋ฅผ ์ฌ๋ฆฌ๊ฒ ๋๋ฉด ์์ ํ ํ์ผ์ ๋ํด ์๋์ผ๋ก ์ ์ ๋ถ์์ด ์ด๋ค์ง๊ณ , ๊ทธ์๋ํ ๋ฆฌํฌํ
์ด ํด๋น PullRequest์ ๋๊ธ๋ก ๋ฌ๋ฆฌ๋๋ก ์ค์ ์ ํด๋ณด๊ฒ ๋ค. (์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๋ด(?)์ด ์๋์ผ๋ก ํด์ฃผ๋๊ฒ ์ผ๋ง๋ ํธํ ์ผ์ธ๊ฐ…)
๊ธฐ๋ณธ ์ปจ์
์ ์ฒด์ ์ธ ์ปจ์
์ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
์ ์ฒด ์ปจ์
" ์ ์ฒด ์ปจ์
IDE์์ ์ฝ๋์์ ์ ํ๊ณ remote ์ ์ฅ์์ commit & push๋ฅผ ํ๋ค. ๊ทธ ๋ค์ github์์ master(ํน์ stableํ branch)์ ๋ํด ์์
branch๋ฅผ PullRequest ์ฌ๋ฆฐ๋ค. ๋ฏธ๋ฆฌ ๋ฑ๋กํ github์ web-hook์ ์ํด PullRequest ์ ๋ณด๋ค์ jenkins์ ์ ์กํ๋ค. ์ ๋ฌ๋ฐ์ ์ ๋ณด๋ฅผ ์ฌ ๊ฐ๊ณตํ์ฌ SonarQube๋ก ์ ์ ๋ถ์์ ์์ฒญํ๋ค. SonarQube์์ ๋ถ์ํ ์ ๋ณด๋ฅผ ๋ค์ jenkins๋ก return ํด์ค๋ค. SonarQube์ผ๋ก๋ถํฐ return ๋ฐ์ ์ ๋ณด๋ฅผ ํด๋น PullRequest์ ๋๊ธ์ ๋ฆฌํฌํ
์ ํด์ค๋ค. ๊ฐ๋จํ ๋ณด๋ฉด (๋ญ ๊ฐ๋จํ๋ ์ฝ๋ค~) ๋ผ๊ณ ๋ณผ์๋ ์๊ฒ ์ง๋ง ๋๋ ์ด๋ฐ ์ ์ฒด ํ๋ฆ์ ์ค์ ํ๋๋ฐ ์์ด ์ด๋ ค์ ๋ค.
์ฌ์ค ์
ํ
ํ๋ ๊ณผ์ ์์ ์ ์ง์์ ์ฝ์ง์ ํ์๊ธฐ์, ์ด ํฌ์คํ
์ ์ ๋ ์ด์ ์ผ์๋ ์๊ฒ ๋ค. ๋๋ถ์ด ๊ฒ์์ ํด๋ด๋ ์ด๋ ๊ฒ ์ ์ฒดํ๋ฆ์ด ์ ๋ฆฌ๋ ๊ธ์ด ์ ์๋ณด์ฌ์ + ๋ด๊ฐ ํ ์ฝ์ง์ ๋ค๋ฅธ ๋๊ตฐ๊ฐ๋ ํ ๊ฒ๊ฐ์์(?)
Maven ์ค์น ๊ธฐ๋ณธ์ ์ผ๋ก Maven์ H2DB๋ฅผ ์ฌ์ฉํ๋ฏ๋ก SonarQube๋ฅผ ์ค์นํ๊ธฐ์ ์ Maven๋ถํฐ ์ค์นํด์ค์ผ ํ๋ค.
$ wget http://apache.mirror.cdnetworks.com/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz $ tar -zxvf apache-maven-3.5.2-bin.tar.gz (ํ๊ฒฝ๋ณ์ ์
ํ
ํ ) $ mvn -version Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T16:58:13+09:00) ... SonarQube ์ค์น ์ ์ ๋ถ์์ ๋์์ฃผ๋ SonarQube๋ฅผ ์ค์นํด๋ณด์.
$ wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.7.1.zip $ unzip sonarqube-6.7.1.zip $ cd sonarqube-6.7.1/bin/linux-x86-64 $ ./sonar.sh start Starting SonarQube... Started SonarQube. ๊ธฐ๋ณธ์ ์ผ๋ก 9000ํฌํธ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ ๋ค๋ฅธํฌํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด /sonarqube-6.7.1/conf/sonar.properties ๋ด sonar.web.port=9000 ์ ์์ ํด์ฃผ๋ฉด ๋๋ค. (SonarQube๋ Elasticsearch๋ฅผ ์ฌ์ฉํ๊ตฌ๋…) ์ค์นํ ์คํ์ ํ๋ค ์๋ฒIP:9000์ ์ ์ํด๋ณด๋ฉด ์๋ ํ๋ฉด์ฒ๋ผ ๋์จ๋ค. (ํน์ ์ ์์ด ์๋๋ค๊ฑฐ๋ ์๋ฒ๊ฐ ์คํ์ด ์๋๋ค๋ฉด ./sonar.sh console๋ก ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ๋ฌธ์ ํด๊ฒฐ์ ๋์์ด ๋ ์๋ ์๋ค. )
SonarQube ๋ฉ์ธํ๋ฉด" SonarQube ๋ฉ์ธํ๋ฉด SonarQube Scanner ์ค์น ์์ค๋ฅผ ์ฐ๋์์ผ ์ ์ ๋ถ์์ ํ๊ธฐ ์ํด์๋ SonarQube Scanner ๋ผ๋๊ฒ ํ์ํ๋ค๊ณ ํ๋ค. ์๋ url์์ ๋ค์ด๋ฐ์ ์ ์ ํ ๊ณณ์ ์์ถ์ ํ์ด๋์. https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
$ wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip $ unzip sonar-scanner-cli-3.0.3.778-linux.zip # jenkins ์ค์น ๋ฐ SonarQube ์ฐ๋ jenkins ์ค์น๋ ๊ฐ๋จํ๋ ๋ณ๋ ์ธ๊ธ์ ์ํ๊ณ ๋์ด๊ฐ…๋ ค๊ณ ํ์ผ๋, ํ๋๋ถํฐ ์ด๊น์ง ์ ๋ฆฌํ๋ค๋ ๋ง์์ผ๋ก~ https://jenkins.io/download/ ์์ ์ต์ ๋ฒ์ ์ tomcat/webapps/ ์๋์ ๋ค์ด๋ฐ๊ณ server.xml ์ ์ ์ ํ๊ฒ ์์ ํด์ค๋ค.
$ wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war $ vi tomcat/conf/server.xml <Connector port="19001" protocol="HTTP/1.1" # ํฌํธ ๋ณ๊ฒฝ <Context path="/jenkins" debug="0" privileged="true" docBase="jenkins.war" /> #์ถ๊ฐ # tomcat/bin/startup.sh jenkins ์ค์น๋ฅผ ์๋ฃ ํ ํ ํ์ํ ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐ๋ก ์ค์นํด์ค๋ค.
Python Plugin GitHub Pull Request Builder GitHub plugin ์ ์ : ์๋ฒIP:19001 (์ฐธ๊ณ ๋ก ํ ์๋ฒ์์ ๋ค ์ค์นํ๋ค๋ณด๋ port ์ถฉ๋์ ์ ๊ฒฝ์ฐ๊ฒ๋์๋ค. ) ์ฒ์ jenkins๋ฅผ ์คํํ๋ฉด ์ด๋ฐ์ ๋ฐ ์ค์ ์ ํ๋๋ฐ ํน๋ณํ ์ค์ ๋ณ๊ฒฝ์์ด next๋ฒํผ์ ์ฐ์ ๋๋ฌ๋ฉด ์ค์น๊ฐ ์๋ฃ ๋๊ณ , SonarQube๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด SonarQube Scanner for Jenkins๋ผ๋ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ฃผ์.
PullRequest๊ฐ ๋ฐ์ํ๋ฉด ์๋ฆผ์ ๋ฐ๊ณ ์ถ๋ค๊ฑฐ๋, ๋ด๊ฐ ๊ด๋ฆฌํ๋ ๋ ํ์งํ ๋ฆฌ์ ๋๊ธ์ด ๋ฌ๋ฆด๋๋ง๋ค ๋๋ ์ด์๊ฐ ์์ฑ๋ ๋๋ง๋ค ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ถ๋ค๊ฑฐ๋. ์ข
ํฉํด๋ณด๋ฉด Github์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์ด๋ค ๋์์ ํด์ผ ํ ๊ฒฝ์ฐ Github์์ ์ ๊ณตํ๋ Webhook ์ ์ฌ์ฉํ์ฌ ๋ชฉ์ ์ ๋ฌ์ฑํ ์ ์๋ค. ์ ๋น์ฐํ ์ด์ผ๊ธฐ์ด์ง๋ง ์ธ๊ธํ๊ณ ๋์ด๊ฐ๊ป ์๋ค๋ฉด, Github์์ Jenkins Job์ ํธ์ถํ๊ธฐ ์ํด์๋ Jenkins๊ฐ ์ธ๋ถ์ ๊ณต๊ฐ๋์ด ์์ด์ผ ํ๋ค. (๋ด๋ถ์ฌ์ค๋ง์ด๋ private ํ ์ค์ ์ด ๋์ด์๋ค๋ฉด ํธ์ถ์ด ์๋์ด Webhook๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.)
Jenkins Security ์ค์ Jenkins Job์ ์ธ๋ถ์์ URL๋ก ์คํ์ ํ๊ธฐ ์ํด์๋ ์๋ ์ค์ ์ด ๊ผญ ํ์ํ๋ค. (์ด ์ค์ ์ ๋ชฐ๋ผ์ ์๋ง์ ์ฝ์ง์ ํ๋ค.) CSRF Protection ์ค์ ์ฒดํฌ๋ฅผ ํ์ด์ค์ผ ํ๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ธ๋ถ์์ Job์ ๋ํ ํธ๋ฆฌ๊ฑฐ๋ง์ด ๊ฐ๋ฅํด ์ง๋ค.
Jenkins > Configure Global Security" Jenkins > Configure Global Security Jenkins Job ์ค์ Github ์์ Webhook์ ์ํด Jenkins Job์ ์คํํ๊ฒ ๋ ํ
๋ฐ, ๊ทธ๋ ์ ๋ณด๋ค์ด payload๋ผ๋ ํ๋ผ๋ฏธํฐ์ ํจ๊ป POST ํ์์ผ๋ก ํธ์ถ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ Job์์ ๋ฐ๋ ์ค๋น(?)๋ฅผ ํด๋ฌ์ผ ํ๋ค. ์ค์ ์ ๊ฐ๋จํ๊ฒ ๋ค์๊ณผ ๊ฐ์ด Job ํ๋ผ๋ฏธํฐ ์ค์ ์ ํด์ฃผ๋ฉด ๋๋ค.
Jenkins > ํด๋น Job > configure" Jenkins > ํด๋น Job > configure Github Webhook ์ค์ ์ด์ Github Repository ์ Hook ์ค์ ๋ง ํ๋ฉด ๋์ด๋๋ค. ํด๋น Repository > Settings > Hooks ์ค์ ์ ๋ค์ด๊ฐ์ Add webhook์ ์ ํํ์ฌ Webhook์ ๋ฑ๋กํด์ค๋ค. URL์ {jenkins URL}/jenkins/job/{job name}/buildWithParameters์์ผ๋ก ์ค์ ํด์ฃผ๊ณ Content Type ์ application/x-www-form-urlencoded์ผ๋ก ์ ํํ๋ค. ์ธ์ Webhook์ ํธ๋ฆฌ๊ฑฐ๋ง ์ํฌ๊บผ๋๋ ์ต์
์์๋ ์ํ๋ ์ค์ ์ ๋ง์ถ๋ฉด ๋๊ฒ ์ง๋ง ๋๋ pullRequest๊ฐ ๋ฑ๋ก ๋ ๋๋ง ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ Jenkins Job์ ์คํ์ํฌ ๊ณํ์ด์์ผ๋ Let me select individual events.์ ์ค์ ํ๊ณ Pull Request์ ์ฒดํฌ๋ฅผ ํด์ค๋ค. ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋ง์ด๋ค.
ํด๋น Repositroy > Settings > Hooks" ํด๋น Repositroy > Settings > Hooks ์ด๋ ๊ฒ ๋ฑ๋กํ๊ณ ๋ค์ ๋ค์ด๊ฐ์ ๋งจ ์๋ซ ๋ถ๋ถRecent Deliveries์ ๋ณด๋ฉด ping test ๊ฐ ์ด๋ฃจ์ด์ ธ ์ ์์ ์ผ๋ก ์๋ต์ ๋ฐ์๊ฒ์ ํ์ธํ ์๊ฐ ์๋ค.
Webhook ๋ฑ๋ก ๊ฒฐ๊ณผ" Webhook ๋ฑ๋ก ๊ฒฐ๊ณผ ์ด๋ ๊ฒ ์ค์ ์ ๋ค ํ ๋ค PullRequest๋ฅผ ๋ฐ์์ํค๋ฉด Jenkins ํด๋น Job์์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ผ๋ฉฐ ์คํ์ด ๋๊ฒ์ ํ์ธํ ์๊ฐ ์๋ค.
Jenkins Job ์คํ ๊ฒฐ๊ณผ" Jenkins Job ์คํ ๊ฒฐ๊ณผ ๋~
Jenkins์์ Github์ ์์ค๋ฅผ ๊ฐ์ ธ์์ ๋น๋๋ฅผ ํ๋ ๋ฑ Github๊ณผ Jenkins์ ์ฐ๋์ ์์ผ์ค์ผํ๋ ์ํฉ์์, ๋ณ๋์ ์ ํ ์์
์ด ํ์ํ๋ค. ๋ค๋ฅธ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์์ ์๋๋ฐ ์ฌ๊ธฐ์๋ SSH๋ก ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ณ ์ ํ๋ค.์ฐ์ Jenkins๊ฐ ์ค์น๋์ด์๋ ์๋ฒ์์ ์ธ์ฆํค๋ฅผ ์์ฑํ์.
$ ssh-keygen -t rsa -f id_rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in id_rsa. Your public key has been saved in id_rsa.pub. The key fingerprint is: SHA256:~~~~~ ~~~@~~~~~ The key's randomart image is: +---[RSA 2048]----+ | o*+**=*=**+ | | o B=o+o++o | | E+.o+ + oo .| | oo. * o ...| | .+ S = o | | . + o . | | . . . | | . | | | +----[SHA256]-----+ $ ls id_rsa id_rsa.pub ๊ฐ์ธํค(id_rsa)๋ ์ ํจ์ค์ ์ค์ ํด์ค๋ค. (์ฒ์๋ถํฐ ๋๊น์ง ๋ณต์ฌ, ์ฒซ์ค ๋ง์ง๋ง์ค ๋นผ๋ฉด ์๋๋ค… )
์ ํจ์ค์ SSH ๊ฐ์ธํค ์ค์ " ์ ํจ์ค์ SSH ๊ฐ์ธํค ์ค์ ๊ทธ ๋ค์ ๊ณต๊ฐํค(id_rsa.pub)๋ Github์ ์ค์ ์ ํด์ค๋ค.
Github์ SSH ๊ณต๊ฐํค ์ค์ " Github์ SSH ๊ณต๊ฐํค ์ค์ ์ด๋ ๊ฒ ํ๋ค Jenkins ์์ ์์๋ก job์ ์์ฑํ๊ณ job ์ค์ > ์์ค์ฝ๋ ๊ด๋ฆฌ ์์ git ๋ถ๋ถ์ ์๋์ฒ๋ผ ํ
์คํธ๋ฅผ ํด์ ์ ์์ ์ผ๋ก ์ฐ๋์ด ๋๊ฒ์ ํ์ธํ๋ค. Credentials ๊ฐ์ ์์์ ์ค์ ํ ๊ฐ์ธํค๋ก ์ค์ ํ๊ณ , repo ์ฃผ์๋ฅผ SSH์ฉ์ผ๋ก ์ ์์๋ ์๋ฌ๊ฐ ์๋์ค๋ฉด ์ฑ๊ณตํ๊ฒ์ด๋ค.
์ ์ ์ฐ๊ฒฐ๋๋ฉด Jenkins ์ค๋ฅ๋ ์๊ณ , github SSH ํค์ ๋
น์๋ถ์ด ๋ค์ด์จ๋ค." ์ ์ ์ฐ๊ฒฐ๋๋ฉด Jenkins ์ค๋ฅ๋ ์๊ณ , github SSH ํค์ ๋
น์๋ถ์ด ๋ค์ด์จ๋ค. ๋~
ํ
์คํธ ์ฝ๋๋ก ์๋๋ ์ค์ ๋ธ๋ผ์ฐ์ ๋จ ์ฌ์ฉ์ฑ ํ
์คํธ๋ฅผ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ฅผํ
๋ฉด ํ๋ฉด์ด ๋จ๊ณ , ์ด๋ค ๋ฒํผ์ ๋๋ฅด๋ฉด, ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์์ผ ํ๋ ์ผ๋ จ์ Regression Test. ์ด๋ ํ์ฉํ ์ ์๋๊ฒ ๋ค์ํ ๋๊ตฌ๊ฐ ์์ง๋ง ์ด๋ฒ์ selenium ์ ๋ํด์ ์์๋ณด๊ณ ์ ํ๋ค.์ฒ์๋ถํฐ ์ฌ์ค web application ํ
์คํธ๋ฅผ ํ๋ ค๊ณ selenium ๋ฅผ ์์๋ณด๊ฒ ๋๊ฑด ์๋๊ณ , ๋ด๊ฐ ์ฐธ์ฌํ๊ณ ์๋ ํน์ ๋ฐด๋(๋ค์ด๋ฒ BAND)์์ ์ผ์ฃผ์ผ์ ํ๋ฒ์ฉ ๋์ผํ ํํ์ ๊ธ์ ์ฌ๋ฆฌ๊ณ ์๋๋ฐ (์ผ์ข
์ ํ์ฃผ ์ถ์์ฒดํฌ ๊ฐ์…) ์ด๋ฅผ ์๋ํ ํด๋ณผ์ ์์๊น ํ๋ฉฐ ๋ฐด๋ API๋ฅผ ์ฐพ์๋ณด๋ค selenium ๋ผ๋๊ฒ์ ์๊ฒ๋์๊ณ , ๋งคํฌ๋ก์ฒ๋ผ ์ด๋ค๋ฒํผ ๋๋ฅด๊ณ ๊ทธ๋ค์ ์ด๋ค๋ฒํผ ๋๋ฅด๊ณ ํ๋ ์ผ๋ จ์ ๊ณผ์ ์ ์ฝ๋๋ก ๊ตฌ์ฑํ ์ ์๋ค๋ ์ ์ ๊ฐ๋์ ๋ฐ์(?) + ๋ณ๋์ API๋ฅผ ๋ฐ๊ธ๋ฐ์ง ์์๋ ๋์ด ์ฌ์ฉํ๊ฒ ๋์๋ค. (๋ฌผ๋ก UI๊ฐ ๋ฐ๋๋ฉด ๊ณจ์น์ํ๊ฒ ์ง๋ง…)
์ฌ๊ธฐ์๋ selenium ์ด ๋ฌด์์ธ์ง์ ๋ํ ์ค๋ช
์ ํ์ง ์๋๋ค. (์ธํฐ๋ท์ ๋๋ณด๋ค ์ ๋ฆฌ ์๋๊ธ์ด ๋ง์ผ๋…) ๋จ, linux ํ๊ฒฝ์์ ์
ํ
ํ๋ ์ ๋ณด๊ฐ ๋๋ฌด ์๊ณ ๋ช์ผ๋์ ์ฝ์ง์ ํ๊ฒ ์์ฌ์์ ๊ทธ ๊ณผ์ ์ ํฌ์คํ
ํด๋ณธ๋ค. (๋๊ฐ์ ๋ถ์ด ์ด ๊ธ์ ๋ณด๊ณ ๋์์ด ๋์ค๊บผ๋ผ๋ ๊ธฐ๋๋ฅผ ๊ฐ์ผ๋ฉฐ…)
โป ์ฃผ์ : ๋ณธ ํฌ์คํ
์ ๋ฐด๋ ์๋น์ค์ ๊ธ์ ์ฌ๋ฆด์ ์๋ ๋น ์ ์์ ์ธ ๋ฐฉ๋ฒ์ ๊ณต์ ๊ฐ ์๋, selenium์ ๋ํ ์ฌ์ฉ ํ๊ธฐ(?)์ ๋ํ ๊ธ์
๋๋ค. (์ฐธ๊ณ ๋ก ๋งํ์ด์ -ใ
-)
์ค์ ํ๊ธฐ ์๋ฒ ํ๊ฒฝ์ CentOS 7.4 64Bit + Python 3.6.3 + jdk 8 ์ด๋ค. ์ฐ์ selenium ์ ์ค์นํด์ค๋ค.
$ sudo python3.6 -m pip install selenium ๊ทธ ๋ค์ CentOS์์ ํฌ๋กฌ๋ธ๋ผ์ฐ์ ๋ฅผ ์ค์นํ๊ธฐ ์ํ์ฌ yum ์ ์ฅ์๋ฅผ ์ถ๊ฐํ๋ค. (๊ผญ ํฌ๋กฌ์ด ์๋๋๋ผ๋ ํ์ด์ดํญ์ค๋ ์ง๊ธ์ ์ง์์ด ๋๊ธด ํฌํ
JS ๊ฐ์๊ฒ์ผ๋ก ํ์ฉํ ์๋ ์์ผ๋ ๋ค๋ฅธ๊ฒ๋ค๋ ํด๋ดค๋๋ฐ ์๊พธ ์ค์ ์์ ๊ฑธ๋ ค์ ํฌ๋กฌ์ ๋ํ ๋ด์ฉ์ ํฌ์คํ
ํ๋ค.)
$ sudo vi /etc/yum.repos.d/google-chrome.repo [google-chrome] name=google-chrome baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64 enabled=1 gpgcheck=1 gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub ๊ทธ๋ฆฌ๊ณ ๋ yum ์ผ๋ก ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ค์นํ๋ค. (๋ด๊ฐ ์ค์นํ์๋์ ๋ฒ์ ์ google-chrome-stable.x86_64 0:64.0.3282.119-1)
$ yum install google-chrome-stable ํฌ๋กฌ๋๋ผ์ด๋ฒ๋ฅผ ์ค์นํด์ผํ๋ค. ๋ค์ url์์ ๋ฐ์์ ์๋๋ฐ https://sites.google.com/a/chromium.org/chromedriver/downloads ๋๋ 2.35 linux64 ๋ฒ์ ์ ๋ฐ์๋ค. ๋ค์ด๋ฐ๊ณ unzip ํ๋ฉด ๋ฑํ๋ ํ์ผ์ด ์๋๋ฐ ๋์ค์ selenium ์ ์ฌ์ฉํ ๋ ์ด์ฉ๋๋ path๋ฅผ ์์๋์.
๊ทธ๋ค์ ํ์ด์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ๋ด๊ฐ ์ง ํ์ด์ฌ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์คํ์ด ๋๋ค.
๋ฐด๋ ์ ์ ( https://band.us/home ) ๋ก๊ทธ์ธ ํน์ ๋ฐด๋ ์ ํ ๊ธ์ฐ๊ธฐ ๋ฒํผ ๋๋ฅด๊ณ ์์์ ๋ง์ถฐ ๊ธ ์์ฑ ๊ธ ๋ฑ๋ก ํ์ด์ฌ ์ฝ๋๋ ์๋์ฒ๋ผ ์์ฑํ์๋ค. (์ค์๋ถ๋ถ๋ง.. ๊ทธ ์๋๋ ์์ )
from selenium import webdriver from selenium.webdriver.chrome.options import Options # ์ด๊ธฐํ -------------------------------------------- chrome_options = Options() chrome_options.add_argument("--headless") driver = webdriver.Chrome(executable_path='home/~~~/chromedriver', chrome_options=chrome_options) driver.implicitly_wait(3) driver.get('https://band.us/home') # ๋ก๊ทธ์ธ -------------------------------------------- driver.find_element_by_class_name('_loginLink').click() ...์๋ต ๊ทธ๋ฆฌ๊ณ ์คํ์ ํด๋ณด๋ฉด ์๋์ด ์~ ๋๋ค. selenium + python ์ผ๋ก ์๋์์ฑ๋ ๋ฐด๋ ๊ธ" selenium + python ์ผ๋ก ์๋์์ฑ๋ ๋ฐด๋ ๊ธ
๋ง์น๋ฉฐ selenium ์ ๋ํด ์ฐพ์๋ณด๋ฉด ๊ฑฐ์ ์๋์ฐ ํ๊ฒฝ์์ ๋์๊ฐ๋๊ฒ๋ค์ ๋ํ ํฌ์คํ
์ด ๋ง์๋ค. ๋ ๋ฆฌ๋
์ค ํ๊ฒฝ์์ ์ค์ผ์ฅด๋ฌ(์ ํจ์ค ๊ฐ์)๋ฅผ ํตํด ์๋์ผ๋ก ํ๋ฉด์์ด ์๋์ํค๊ณ ์ถ์๋๋ฐ ์๋ฌด๋ฆฌ ์ฐพ์๋ด๋ + ์ฝ์งํด๋ ์ ์๋์๋ค. ๊ฒฐ๊ตญ ์ฌ๋ด์๋ ๋๊ฐ์ ์ฝ์ง์ ํ์ ๋ถ์ ์ฐพ๊ณ ๋ฌป๊ณ ๋ฌผ์ด ํฌ๋กฌ๋๋ผ์ด๋ฒ๋ง ์์ด์ผ ํ๋๊ฒ์ด ์๋๋ผ ํฌ๋กฌ์ฑ๋ํ ์์ด์ผ ๋์์ ํ๋ค๋๊ฒ์ ์๊ฒ ๋์๋ค. ์ญ์, ๋ด๊ฐ ํ ์ฝ์ง์ ๋๊ตฐ๊ฐ ์ด๋ฏธ ํ ์ฝ์ง์ด๋ผ๋๊ฑธ ๋ค์ํ๋ฒ ๊นจ๋ณ์ ์ข์(?) ์๊ฐ์ด์๋ค.
์ด๊ฑธ๋ก ๋์ค์ ๋ด๊ฐ ๋งก๊ณ ์๋ ์๋น์ค์ ๋ํ ์น ์๋ ํ
์คํธ ํด๋ ๋ง๋ค์ด ๋ณผ ์๊ฐ์ด๋ค.
apache access log ๋ฅผ ๋ถ์ํ๊ณ ์ถ์ ์ํฉ์ด ์๊ฒผ๋ค. ์๋ ๊ทธ๋ณด๋ค apache access์ ๋ํด์ ์ค์๊ฐ์ผ๋ก ๋ณด๊ณ ์ถ์๊ณ , log๋ฅผ ๊ฒ์ & ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ ์ ์๋ฏธํ ๋ถ์๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด ๋ณด๊ณ ์ถ์๋ค. ๊ทธ์ ์๊ฐํ๊ฒ์ด (์ญ์) ElasticStack.์ฒ์์ ์๊ฐํ ๋ฐฉ์์ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋จ์ํ๋ค. ์ฒ์ ์๊ฐํ ๋จ์ํ ๊ตฌ์กฐ" ์ฒ์ ์๊ฐํ ๋จ์ํ ๊ตฌ์กฐ
ํ์ง๋ง, ๋ด ๋จ์ํ(?) ์์์ ์ญ์ ๋น๋๊ฐ๊ณ logstash์์๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๋ฅผ ๋ด๋ฑ์๋ค.
retrying individual bulk actions that failed or were rejected by the previous bulk request
request๊ฐ ๋ง์์ง์ ๋ฐ๋ผ elasticsearch๊ฐ ๋ฒ๋ฒ
๊ฑฐ๋ฆฌ๋๋ logstash์์ ๋๋์์
์ ๊ฑฐ๋ถํ๊ฒ ๋ค๋ฉฐ ์ธ๋ฑ์ฑ์ ๋ฉ์ท๋ค. ๊ณ ๋ฏผ๊ณ ๋ฏผํ๋ค elasticsearch์ ์ธ๋ฑ์ฑํ ๋ ๋ถํ๊ฐ ๋ง์ด ๊ฑธ๋ฆฌ๋ ์ํฉ์์ ์ค๊ฐ์ ๋ฒํผ๋ฅผ ๋ ๊ฒฝํ์ด ์์ด์ facebook๊ทธ๋ฃน์ ๋ฌธ์๋ฅผ ํด๋ดค๋ค. https://www.facebook.com/groups/elasticsearch.kr/?multi_permalinks=1566735266745641 ์ญ์ ๋๋ณด๋ค ํ์ฐธ์ ์์๊ฐ์๋ ๋ถ๋ค์ ์ด๋ฏธ ์๋ฌ๊ฐ ๋ญ์ง ์๊ณ ์์ผ์
จ๊ณ , ์ค๊ฐ์ ๋ฒํผ๋ฅผ ๋๊ณ ํ๋ ์๋๋ค๋ ์๊ฒฌ์ด ์์ด ๋๋ ๋ฐ๋ผํด๋ดค๋ค. ๋ฌผ๋ก ๋ต๋ณ์ค์ ๋์จ redis๊ฐ ์๋ ๊ธฐ์กด์๋ ๋น์ทํ ๊ตฌ์กฐ์์ ์ฌ์ฉํ๊ณ ์๋ kafka๋ฅผ ์ ์ฉ. ์, ๊ทธ์ ์ ํ์ฌ๊ตฌ์ฑ์ Elasticsearch ๋
ธ๋๊ฐ ์ด 3๋๋ก ํด๋ฌ์คํฐ ๊ตฌ์กฐ๋ก ๋์ด์๋๋ฐ ๋
ธ๋๋ฅผ ์ถ๊ฐ๋ก ๋๋ฆฌ๋ฉฐ ์ค์ผ์ผ ์์์ ํด๋ณด๊ธฐ์ ์ ํ ์์๋ ๋ง์ง๋ง ๋ฐฉ๋ฒ์ด๋ค ์๊ฐํ๊ณ ์ค๊ฐ์ kafka๋ฅผ ๋ฌ์ ๋ถํ๋ฅผ ์ค์ฌ๋ณด๊ณ ์ถ์๋ค. (์ธ์ ๋ถํด๊ฐ ๋ง์น ์ฌ๋ฌ๊ฐ์ ํฑ๋๋ฐํด๊ฐ ๋ง๋ฌผ๋ ค ๋์๊ฐ๋๋ฏํ ์์คํ
์ค๊ณ๋ฅผ ํ๋๊ฒ ์ฌ๋ฐ์๋ค.) ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋ง์ด๋ค.
๊ทธ๋๋ง ์ข๋ ์๊ฐํ ๊ตฌ์กฐ" ๊ทธ๋๋ง ์ข๋ ์๊ฐํ ๊ตฌ์กฐ ๊ทธ๋ฌ๋๋ ๊ฑฐ์ง๋ง ์ฒ๋ผ ์๋ฌํ๋ ์์ด ์ ์ธ๋ฑ์ฑ์ด ๋ ์ ์์๋ค. logstash๊ฐ ์์ชฝ์ ์๋๊ฒ ์ฝ๊ฐ ๊ฑธ๋ฆฌ๊ธด ํ์ง๋ง, ์ฒ์์ ์๊ฐํ ๊ตฌ์กฐ๋ณด๋ค๋ ์๋ฌ๊ฐ ์๋๋ ๋คํ์ด๋ผ ์๊ฐํ๋ค.
์ด ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ๋ฉด์ ์ป์ Insight๊ฐ ์๊ธฐ์, ๊ฐ ํญ๋ชฉ๋ณ๋ก ์ ์ด ๋ณด๊ณ ์ ํ๋ค. ( ์ด๊ฒ๋ง ์ ์ด๋๊ธฐ์ ๋๋ฌด ์์ด๋ณด์ฌ์.. )
access log ๋ฅผ ์ด๋ป๊ฒ ๋ถ์ํ์ฌ ์ธ๋ฑ์ฑ ํ ๊ฒ์ธ๊ฐ? apache 2.x๋ฅผ ์ฌ์ฉํ๊ณ ๋ณ๋์ ๋ก๊ทธ ํฌ๋งท์ ์ ํ์ง ์์ผ๋ฉด ์๋์ ๊ฐ์ access log๊ฐ ์ฐํ๋ค. 123.1.1.1 - - [25/Jan/2018:21:55:35 +0900] "GET /api/test?param=12341234 HTTP/1.1" 200 48 1144 "http://www.naver.com/" "Mozilla/5.0 (iPhone; CPU iPhone OS 11_1_2 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Mobile/15B202 NAVER(inapp; blog; 100; 4.0.44)" ๊ทธ๋ผ ์ด ๋ก๊ทธ๋ฅผ ์๋ฌด ํฌ๋งทํ
์์ด ๋ก๊น
์ ํ๋ฉด ๊ทธ๋ฅ ํ์ค์ ํ
์คํธ๊ฐ ์ธ๋ฑ์ฑ์ด ๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด elasticsearch ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฌ๊ฐ๊ณตํ๊ฑฐ๋ ๋ณ๋์ ์์
์ด ํ์ํ ์๋ ์์ผ๋ ์ค๊ฐ์ ์๋ logstash์๊ฒ ์ผ์ ์์ผ ์ข๋ nice ํ ๋ฐฉ๋ฒ์ผ๋ก ์ธ๋ฑ์ฑ์ ํด๋ณด์. ๋ฐ๋ก logstash ์ filter ๊ธฐ๋ฅ์ด๋ค. ๊ทธ์ค Grok filter ๋ผ๋๊ฒ ์๋๋ฐ ํจํด์ ์ ์ฉํ์ฌ row data ๋ฅผ ํํฐ๋งํ๋ ๊ธฐ๋ฅ์ด๋ค. ์กฐ๊ธ ์ฐพ์๋ณด๋ ๋๋ฌด ๊ณ ๋ง๊ฒ๋ ์ํ์น ํํฐ ์์ ๊ฐ ์์ด ์์ ํ์ฌ ์ ์ฉํ ์ ์์๋ค. http://grokconstructor.appspot.com/do/match?example=2 ๊ทธ๋์ ์ ์ฉํ ํํฐ์ค์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
filter { grok { match => { message => "%{IP:clientIp} (?:-|) (?:-|) \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:httpMethod} %{URIPATH:uri}%{GREEDYDATA}(?: HTTP/%{NUMBER})?|-)\" %{NUMBER:responseCode} (?:-|%{NUMBER})" } } } ์ด๋ ๊ฒ ํ๊ณ elasticsearch ์ ์ธ๋ฑ์ฑ์ ํ๋ฉด ํค๋ฐ๋์์ ๋ค์๊ณผ ๊ฐ์ด ๋ณผ์ ์๋ค. ํค๋ฐ๋์ ๋ด๊ฐ ์ํ๋ ๊ตฌ์กฐ๋๋ก ์ด์๊ฒ ๋ค์ด๊ฐ ์๋ access log" ํค๋ฐ๋์ ๋ด๊ฐ ์ํ๋ ๊ตฌ์กฐ๋๋ก ์ด์๊ฒ ๋ค์ด๊ฐ ์๋ access log
๊ฐ ํ๋๊ฐ ์๋ ํ์ค๋ก ์ธ๋ฑ์ฑ์ด ๋์ด๋ฒ๋ฆฐ๋ค. Elasticsearch ์ ์ธ๋ฑ์ฑ์ด ๋๊ธด ํ๋๋ฐ ๋ก๊ทธ ํ์ค์ด ํต์งธ๋ก ๋ค์ด๊ฐ ๋ฒ๋ฆฐ๋ค. message๋ผ๋ ์ด๋ฆ์ผ๋ก… ์๊ณ ๋ณด๋ ํ์ฌ ๊ตฌ์กฐ๋ logstash๊ฐ kafka ์ ๋ค์ ์๋ค๋ณด๋ producer logstash ์ consumer logstash ์ codec์ด ๋ง์์ผ ์ ๋๋ก ์ธ๋ฑ์ฑ์ด ๋ ์ ์์๋ค. ๋จผ์ access log์์ kafka ๋ก produce ํ๋ logstash ์์๋ output ํ ๋ codec ์ ๋ง์ถฐ์ฃผ๊ณ
output { kafka { bootstrap_servers => "123.1.2.3:9092,123.1.2.4:9092" topic_id => "apache-log" codec => json{} } } kafka ์์ consume ํ๋ logstash ์์๋ input ์์ codec ์ ๋ง์ถฐ์ค๋ค.
input { kafka { bootstrap_servers => "123.1.2.3:9092,123.1.2.4:9092" topic_id => "apache-log" codec => json{} } } ๊ทธ๋ ๊ฒ ๋๋ฉด codec์ด ๋ง์ ๊ฐ ํ๋๋ก ์ด์๊ฒ ์ธ๋ฑ์ฑ์ ํ ์ ์๊ฒ ๋์๋ค.
ํ์์๋ uri๋ ์ ์ธํ๊ณ ์ธ๋ฑ์ฑํ ์ ์์๊น? /์ผ๋ก๋ uri ๋ผ๋์ง /server-status๊ฐ์ด ์๊ณ ์์ง๋ง ์ธ๋ฑ์ฑ์ ํ๊ธฐ ์ซ์ ๊ฒฝ์ฐ๋ ๊ฐ๋จํ๊ฒ ์๋์ฒ๋ผ if๋ฌธ์ผ๋ก ์ ์ธ์ํฌ์ ์์๋ค.
ํ์ด์ฌ 2.x ์์๋ depreate ๋ ๋ชจ๋๋ ๋ง๊ณ 3.x์์๋ง ์ง์๋๋ ๋ฒ์ ๋ค์ด ๋ง์์ง๋ฉด์ ์ค์ปท ๊ฐ๋ฐ์ ํด๋ ํ์ด์ฌ ๋ฒ์ ๋๋ฌธ์ ๋ค์ ์ง์ผํ๋ ์ํฉ์ด ์๊ธด๋ค. ํ์ด์ฌ ๋ฒ์ ์
์ ํ๊ณ ์ถ์ด ๊ตฌ๊ธ๋ง์ ํด๋ณด๋ฉด ์ด๋ ๋คํ ์ ๋ฆฌ๋ ๋ฌธ์๊ฐ ์ ์๋์จ๋ค. (์์ด๋ก๋ ํฌ์คํธ๋ ๋ง์ด ์๊ธด ํ๋, ํ์์ ํ๊ฒฝ๊ณผ๋ ๋ง์ง ์๋ …)๊ทธ๋์ ์ด๊ฒ์ ๊ฒ ์ฝ์ง์ ํ ๊ฒฐ๊ณผ ํ์ด์ฌ ๋ฒ์ ์ ์ฌ๋ฆด์ ์์๊ณ , ์ด๋ฅผ ํฌ์คํ
ํด๋ณด๊ณ ์ ํ๋ค.
๊ทธ๋ฌ๋ณด๊ณ ๋ 2018๋
์ฒซ ํฌ์คํ
์ด๋ค… ์ฌํด๋ ์ ๋ง ์ ์ด๋ ํ๋ฌ์ 1~2๊ฐ๋ ์ฌ๋ฆด์ ์๋ ๋ด๊ฐ ๋๊ธฐ๋ฅผ…
ํ๊ฒฝ CentOS 6.9 ๊ธฐ๋ณธ์ผ๋ก python 2.6 ์ด ์ค์น๋์ด ์๋๊ฒ์ ํ์ธํ ์ ์๋ค. (ํ๊ฒฝ๋ง๋ค ๋ค๋ฅผ์ ์์.) $ python -V Python 2.6 ์ค์น์์ ํ์ํ ์ ํธ๋ฆฌํฐ๋ฅผ ์ค์นํ๋ค. $ sudo yum update $ sudo yum install yum-utils $ sudo yum groupinstall development yum ์ ์ฅ์์์๋ ์ต์ ํ์ด์ฌ ๋ฆด๋ฆฌ์ฆ๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก RPM ํจํค๋ฅผ ์ ๊ณตํ๋ IUM ์ด๋ผ๋ ์ถ๊ฐ ์ ์ฅ์๋ฅผ ์ค์น $ sudo yum install -y https://repo.ius.io/ius-release-el7.rpm ํ์ด์ฌ 3.6 ๋ฒ์ ์ ์ค์น $ sudo yum install python36u pip ๋ฑ ํจํค์ง ๊ด๋ จ ๋ชจ๋๋ ํจ๊ป ์ค์น sudo yum install python36u-pip sudo yum install python36u-devel ์ฌ๊ธฐ๊น์ง ํ๋ฉด ๊ธฐ์กด ํ์ด์ฌ 2.6๊ณผ ์๋ก ์ค์น๋ ํ์ด์ฌ 3.6 ์ด ์ค์น๋์ด์๋ค. $ ll /usr/bin/python* -rwxr-xr-x 1 root root 9997450 Jan 2 16:02 python lrwxrwxrwx 1 root root 6 Jan 1 06:02 python2 -> python -rwxr-xr-x 1 root root 9032 Aug 19 2016 python2.6 -rwxr-xr-x 1 root root 1418 Aug 19 2016 python2.6-config -rwxr-xr-x 2 root root 6808 Oct 12 08:19 python3.6 lrwxrwxrwx 1 root root 26 Jan 2 20:48 python3.6-config -> /usr/bin/python3.6m-config -rwxr-xr-x 2 root root 6808 Oct 12 08:19 python3.6m -rwxr-xr-x 1 root root 173 Oct 12 08:19 python3.6m-config -rwxr-xr-x 1 root root 3339 Oct 12 08:16 python3.6m-x86_64-config lrwxrwxrwx 1 root root 16 Apr 25 2017 python-config -> python2.6-config ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํด์ค๋ค. $ sudo mv python python_backup $ sudo ln -s python3.6 python ํ์ธ $ python -V Python 3.6.3 pip ๋ฅผ ์ด์ฉํ ๋ชจ๋ ์ค์น pip๋ Python Package Index ์ ์ฝ์๋ก ๊ณต์ํํ์ด์ง๋ ๋ค์๊ณผ ๊ฐ๋ค. ( https://pypi.python.org/pypi/pip ) ์ค์นํ ๋ชจ๋์ ๋ค์๊ณผ ๊ฐ์ด ์ค์นํด์ฃผ๋ฉด ๋๋ค. ex : requests ๋ชจ๋์ธ ๊ฒฝ์ฐ $ sudo python3.6 -m pip install requests
์๋
์ ํ์ ์ฎ๊ธฐ๋ฉด์ ๋ก๊น
์ ๋ํด์ ๊ด์ฌ์ ๊ฐ๊ธฐ ์์ ํ์๊ณ ์ฐพ์๋ณด๋ค ElasticStack ์ด ์ ํฉํ๋ค๊ณ ํ๋จ, ํ ๋ด์์ ๋ํ๋ก ์ฝ์งํด๊ฐ๋ฉฐ ์ง๊ธ์ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง ์์คํ
์ ๊ตฌ์ถํ์๋ค. ๊ทธ์ ElasticStack ์ ๊ด์ฌ์ ๊ฐ๋ ์ฐฐ๋ ์ง๋ ํ์์ผ(12์ 12์ผ)์ ์์๋ Elastic On Tour์ ์ฐธ์์ ํ์๊ณ ๋ค์ํ ๊ธฐ์ ์ ์ธ์ฌ์ดํธ๋ฅผ ์ป์์ ์์๋๋ฐ ๊ทธ ๊ฐ๋(?)์ ์๊ธฐ ์ซ์ด ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
Registration + Partner Showcase ์ฝ์์ค ์ธํฐ์ปจํฐ๋จํ ํธํ
์์ ์งํ๋์๋ค. ์ญ์ ์ธ๊ตญ๊ณ ๊ธฐ์
์ด์ฌ์ ๊ทธ๋ฐ์ง ํ์ฌ ๊ท๋ชจ๊ฐ ์ด๋ง์ด๋ง ํ๋ค. ์ด์ ํ๋ฅผ ๋ฐ๋ผ ์งํ๋ก ๊ฐ์ ๋ฑ๋ก์ ํ๊ณ , ElasticStack ์ ์ด์ฉํด์ ์๋น์ค๋ฅผ ํ๊ณ ์๋ ํํธ๋์ฌ๋ค์ ๋ถ์ค๋ฅผ ๊ธฐ์๊ฑฐ๋ฆฌ๋ฉฐ ElasticStack์ ์ ๋ ฅ(?)์ ๋ค์ํ๋ฒ ์ค๊ฐ์ ํ ์ ์์๋ค. ํนํ Elatic ๋ณธ์ฌ์์ ๋์จ๋ฏํ ์ธ๊ตญ์ธ๋ค์ด Q&A ๊ฐ์๊ฑธ ํด์คฌ๋๋ฐ ๋ต๋ณ์ ํด์ฃผ๋ ์ธ๊ตญ์ธ๋ ๋๋จํด ๋ณด์๋๋ฐ ์ง๋ฌธ์ ํ๋ ํ๊ตญ์ฌ๋(?)๋ค์ด ๋ ๋๋จํ๊ฒ ๋ณด์๋ค. ๊ณผ์ฐ ๋ ์ ๋ ๊ฒ ์๋ฌด๋ ์ง ์๊ณ ํ๋กํ์
๋(?)ํ๊ฒ ์ง๋ฌธ์ ํ ์ ์์๊น? Registration + Partner Showcase" Registration + Partner Showcase
Track 1 : Partner Sessions Track 1 ๊ณผ 2๋ก ๋๋์๋๋ฐ 2๋ Elastic Stack ์ ๊ฒฝํํ์ง ๋ชปํด๋ดค๊ฑฐ๋ ์๊ฐํ๋ ์๋ฆฌ๊ฐ์์ Track 1๋ฅผ ๋ฃ๊ธฐ๋ก ํ์๋ค. ๋ด๊ฐ ๋์
์ ํ ๋๋ง ํด๋ ๊ด๋ จ ์๋ฃ๊ฐ ์ ์์๊ณ , ์ ๋ง ํน์ด ์ผ์ด์ค๊ฐ ์๋ ์ด์์ ์ ์ฌ์ฉํ์ง ์๊ฒ ๊ตฌ๋ ํ๋ ๋๋์ด์๋๋ฐ ๋ฐํํ์๋ ๋ถ๋ค์ ๋ณด๊ณ ์๋ ์๊ฐ์ด 180๋ ๋ฐ๋์๋ค. ๋๋ฌด ํ์ฉ๋ค์ ์ ํ๋ฉฐ ์๋น์ค๋ฅผ ํ๊ณ ์์๊ณ ๋จ์ํ๊ฒ ๊ฒ์์์ง์ด ์๋ ์ํฉ์ ๋ง๋ ์ปค์คํฐ ๋ง์ด์ง์ด๋ ๋ค๋ฅธ ๊ธฐ์ ์คํ์ ํจ๊ป ์ฌ์ฉํจ์ผ๋ก์จ ์๋์ง ํจ๊ณผ๋ฅผ ๋ด๊ณ ์์๋ค.
Microsoft OpenSource ์ ์์ข์ ์ด๋ฏธ์ง๊ฐ ์์ผ๋ ์ค๋์ ๋ถํฐ ํฌ์๋ฅผ ๋ง์ด ํด์๋ค๊ณ ์ค๋ช
์ ํ๋ฉฐ Azure๋ผ๋ ์๋น์ค์์ Elastic Stack ์ ์ด๋ค์์ผ๋ก ํ์ฉํ๋์ง ๋ฐํ๋ฅผ ํ์๋ค. ์๋นํ ์ฌํํ๊ณ ์ฒ์ ์ ํ๋ ์ฌ๋๋ ํด๋ฆญ ๋ช๋ฒ์ผ๋ก ES Cluster๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค๋๊ฒ ์ฅ์ ์ด์์ผ๋, ์ ๋ฃ + ์ปค์คํฐ๋ง์ด์ง ์ ํ ์ด ์์ฌ์ ๋ค. S-Core : ์์ค์ฝ์ด ๊ฒฝํ์ ๊ธฐ๋ฐํ Elastic ํ์ฉ๋ฒ EZFarm (์ธ๋ชจ ๋นํ๋ ์๋์ง๋ง)๋๋ถ ์ฒ๋ผ ์๊ธฐ์ ๋ถ์ด ๋์์ ๊ธฐ์ ์ ๋ํด ๋ง์ํ์๋๊ฒ ์ ๊ธฐํ ๋ฐํ์๋ค. ๊ฐ๋จํ ๋งํ๋ฉด ๋ผ์ง๊ฐ ๋ฌผ ๋จน๋ ๋ ๋ฑ ๋์
/์ถ์ฐ์
์ ๋ฐ์ดํฐ๋ฅผ ES์ ๋ด๊ณ ๋จธ์ ๋ฌ๋์ ํตํ์ฌ ํจ์จํ ํ๋ ๋ฐฉ์ ์ด์๋๊ฒ ๊ฐ๋ค. MEGAZONE ํํธ๋ ๋ถ์ค์์ ํฐ์
์ธ ๋ฅผ ์ค(?) ๊ณณ์ด์๋๋ฐ Elastic Cloud Seoul ์ ๋ฐํํ์๋ค. (๋๋์ด ํ๊ตญ์๋ ์ด๋ฐ ์๋น์ค๊ฐ!) OpenBase ํค๋ฐ๋ ํ๋ฌ๊ทธ์ธ์ ์ง์ ๊ฐ๋ฐํ๊ณ ์ปค์คํ
UI์ ์ฌ๋ก๋ฅผ ๋ณด์ฌ์ฃผ์๋ค. ํค๋ฐ๋ ์์ค์ค์ ์์
๋ค์ด๋ก๋๊ฐ ํ๊ธ๋ก ์๋์ด ๊ณ ์ณ๋ณธ๊ฒ ๋ง๊ณค ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ฐํ ์๊ฐ์ ์์๋๋ฐ ์ ๋ง ๊ฐ๋ฐ์ ์ค๋ฌ์ด ๋ฐํ์๋ค. DIREA ๊ฒฐ์ ๊ด๋ จ ์ฅ์ ์ถ์ ๋ฐ ์์ธก ์์คํ
์ ๋ฐํํ์๋ค. ๋ง์นจ ๋ด๊ฐ ํ๊ณ ์๋ ์๋น์ค์ ๋น์ทํ๊ณ , ๋ด๊ฐ ๊ตฌํํด๋ณด๋ ค๊ณ ํ๋ ๋ถ๋ถ๊ณผ ๊ฑฐ์ ์ผ๋งฅ์ํตํ ๋ถ๋ถ์ด ์์ด์ ์๋ฆ์ด์๋ค. Track 1 : Partner Sessions" Track 1 : Partner Sessions Opening Keynote ์์ ์ด๋ค ๋ฐํ์์ ElasticSearch๊ฐ ํ์ํ๊ฒ๋ ๊ณ๊ธฐ๊ฐ ์ด๋ค ๋ถ์ด ์๋ฆฌ์ฌ๊ฐ ๋๋ ค๋ ์๋ด๋ฅผ ์ํด ์กฐ๋ฆฌ๋ฒ์ ๋ ๋นจ๋ฆฌ ๊ฒ์ํ ์ ์๋ ์์ง์ ๋ง๋ค์๋ค๊ณ ํ๋๋ฐ ๊ทธ ์ด๋ค๋ถ์ด ๋ด๋์์ ๋ํ๋ ๋ฐํ๋ฅผ ํ์
จ๋ค. ํ Elastic CEO ์ด์ Shay Banon ์ด์๋ค. (์ด์ํ ๋์ ํต์ญ์ผ๋ก ์ดํดํ์์ง๋ง) ๊ทธ๋ถ์ด ๊ฐ์กฐํ์ Elastic ํ์ฌ ์ ์ ์ธ “๊ฐ๋จํ๊ฑด ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด์ผ ํ๋ฉฐ ์ฌ์์ผ ํ๋ค.” ๊ฐ ์ฐ์ค์ค์ ๊ฐ์ฅ ์ธ์์ ์ด์๊ณ , ํต์ญํ์ ์์ฃผ๋จธ๋(?)๋๋ฌธ์ด์๋์ง ์ ๋ฌํ์๋ ์๋๋ฅผ ์ ํํ ํ์
ํ๊ธด ์ด๋ ค์ ์ผ๋ ์ผ๋จ CEO๋ฅผ ํฌํจํ ์ ์ฒด ํ์ฌ ๋ถ์๊ธฐ๊ฐ ์ ์ด๋ณด์ธ๋ค๋๊ฑธ ๋๋์ ์์๋ค.
Shay Banon key note" Shay Banon key note Break (์์ฌ์๊ฐ) ์ด๋ฐ ์ธ๋ฏธ๋? ์ปจํผ๋ฐ์ค? ๋ฅผ ๋ง์ด ๋ค๋
๋ณธ๊ฑด ์๋์ง๋ง ์ญ๋๊ธ์ผ๋ก ์ข์๋ ์ ์ฌ์์ฌ์๋ค. ;) ์ฌ์ค ํผ์์์ ๋ฐฅ์ ์ด๋ป๊ฒ ํด๊ฒฐํ๋ ํ๋๋ฐ ์ฐ๋ฅด๋ฅด๋ฅด ํธํ
์ง์๋ถ๋ค์ด ๊ฐ ์๋ฆฌ์ ๋์๋ฝ์ ๋๋ น(?)ํด์ฃผ์
์ ๋ง์๊ฒ ๋จน์์ ์์๋ค. ์ฐธ ์ฌ๋์ด ๊ฐ์ฌํ๊ฒ, ์์นจ์ ์กธ๋ฆฐ๋ ๋น๋ฒผ๊ฐ๋ฉฐ ์ง์ฅ์ฒ ๊ณ ์์ ๋ซ๊ณ ์์ ํ๋ค์์ง๋ง ๋ฐฅ์ ๋จน์ผ๋ฉด์ ์์นจ์ ๊ทธ ๊ณ ์์ ๋๋
น๋ฏ ์ฌ๋ผ์ก๋ค.
ํธํ
๋์๋ฝ!!" ํธํ
๋์๋ฝ!! Deep Dive (Elasticsearch, Ingest, Kibana, Machine Learning) ๊ฐ ์คํ(?)์ ๋ํด์ ๋ณํ๋ ๋ถ๋ถ, ๊ทธ๋ฆฌ๊ณ ํ์ฉ๊ฐ๋ฅ์ฑ๊ณผ ์ต๊ทผ ์ถ์ํ 6.
ํ์๊ฐ ๋งก๊ณ ์๋ ์๋น์ค์ Elastic Stack ์ ๋์
ํ๋ฉด์ ์ค๊ฐ์ ๋ฒํผ๊ฐ ํ์ํ์ฌ Message-Queue ์์คํ
๋ค์ ์์๋ณด๋ ์ค Kafka ์ ๋ํด ์์๋ณด๊ณ , ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ฒ ๋๋ค.
๊ธฐ๋ณธ์ค๋ช
๋ฐ ๊ธฐ์กด ๋ฉ์ธ์ง ์์คํ
๊ณผ ๋ค๋ฅธ์ ๋ฉ์ธ์ง ํ์ ์ผ์ข
๋ง ๊ทธ๋๋ก ๋ถ์ฐํ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ, LinkedIn์์ ์ฌ๋ฌ ๊ตฌ์ง + ์ฑ์ฉ ์ ๋ณด๋ค์ ํ๊ณณ์์ ์ฒ๋ฆฌ(๋ฐํ/๊ตฌ๋
)ํ ์ ์๋ ํ๋ซํผ์ผ๋ก ๊ฐ๋ฐ์ด ์์ ๋์ฉ๋์ ์ค์๊ฐ ๋ก๊ทธ ์ฒ๋ฆฌ์ ํนํ๋์ด ์ค๊ณ๋ ๋ฉ์์ง ์์คํ
, ๊ธฐ์กด ๋ฒ์ฉ ๋ฉ์์ง ์์คํ
๋๋น TPS๊ฐ ๋งค์ฐ ์ฐ์ ๋ฉ์์ง๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๊ธฐ์กด ๋ฉ์์ง ์์คํ
๊ณผ๋ ๋ฌ๋ฆฌ ๋ฉ์์ง๋ฅผ ํ์ผ ์์คํ
์ ์ ์ฅ โ ์นดํ์นด ์ฌ์์์ผ๋ก ์ธํ ๋ฉ์ธ์ง ์ ์ค ์ฐ๋ ค ๊ฐ์ ๊ธฐ์กด์ ๋ฉ์์ง ์์คํ
์์๋ broker๊ฐ consumer์๊ฒ ๋ฉ์์ง๋ฅผ pushํด ์ฃผ๋ ๋ฐฉ์์ธ๋ฐ ๋ฐํด, Kafka๋ consumer๊ฐ broker๋ก๋ถํฐ ์ง์ ๋ฉ์์ง๋ฅผ ๊ฐ์ง๊ณ ๊ฐ๋ pull ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ consumer๋ ์์ ์ ์ฒ๋ฆฌ๋ฅ๋ ฅ๋งํผ์ ๋ฉ์์ง๋ง broker๋ก๋ถํฐ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ต์ ์ ์ฑ๋ฅ์ ๋ผ ์ ์๋ค. ์นดํ์นด ์ฃผ์ ๊ฐ๋
producer : ๋ฉ์ธ์ง ์์ฐ(๋ฐํ)์. consumer : ๋ฉ์ธ์ง ์๋น์ consumer group : consumer ๋ค๋ผ๋ฆฌ ๋ฉ์ธ์ง๋ฅผ ๋๋ ์ ๊ฐ์ ธ๊ฐ๋ค.offset ์ ๊ณต์ ํ์ฌ ์ค๋ณต์ผ๋ก ๊ฐ์ ธ๊ฐ์ง ์๋๋ค. broker : ์นดํ์นด ์๋ฒ๋ฅผ ๊ฐ๋ฆฌํด zookeeper : ์นดํ์นด ์๋ฒ (+ํด๋ฌ์คํฐ) ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ cluster : ๋ธ๋ก์ปค๋ค์ ๋ฌถ์ topic : ๋ฉ์ธ์ง ์ข
๋ฅ partitions : topic ์ด ๋๋ ์ง๋ ๋จ์ Log : 1๊ฐ์ ๋ฉ์ธ์ง offset : ํํฐ์
๋ด์์ ๊ฐ ๋ฉ์์ง๊ฐ ๊ฐ์ง๋ unique id ์นดํ์นด๋ ์ด๋ค์์ผ๋ก ๋์๊ฐ๋๊ฐ zookeeper ๊ฐ kafka ์ ์ํ์ ํด๋ฌ์คํฐ ๊ด๋ฆฌ๋ฅผ ํด์ค๋ค.
์ ํด์ง topic ์ producer ๊ฐ ๋ฉ์ธ์ง๋ฅผ ๋ฐํํด๋์ผ๋ฉด consumer ๊ฐ ํ์ํ ๋ ํด๋น ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ ธ๊ฐ๋ค. (์ฌ๊ธฐ์ ์นดํ์นด๋ก ๋ฐํ๋ ๋ฉ์ธ์ง๋ค์ consumer๊ฐ ๋ฉ์ธ์ง๋ฅผ ์๋นํ๋ค๊ณ ํด์ ์์ด์ง๋๊ฒ ์๋๋ผ ์นดํ์นด ์ค์ log.retention.hours(default : 168[7์ผ])์ ์ํด ์ญ์ ๋๋ค.)
partition ๊ฐ์์ consumer group ๊ฐ๋
ํ์์(consumer-01) : ํํฐ์
๊ฐ์๊ฐ 4๊ฐ์ธ๋ฐ ๋นํด ์ปจ์๋จธ๊ฐ 3๊ฐ, ์ด๋ ๊ฒ ๋๋ฉด ์ด๋ ์ปจ์๋จธ๊ฐ ๋๊ฐ์ ํํฐ์
์ ๋ด๋นํด์ผํ๋ ์ํฉ์ด ์๊ธด๋ค. ์ฃผํฉ์(consumer-02) : ํํฐ์
๊ฐ์๊ฐ 4๊ฐ์ธ๋ฐ ๋นํด ์ปจ์๋จธ๊ฐ 5๊ฐ, ์ด๋ ๊ฒ ๋๋ฉด ํ๋์ ๋
ธ๋(?) ์ปจ์๋จธ๊ฐ ์๊ธฐ๋ ์ํฉ์ด ์๊ธด๋ค. ๊ฐ์ฅ ์ ์ ํ ๊ฐ์๋ ์ ํด์ง์ง ์์์ง๋ง ํต์ ์ปจ์๋จธ๊ทธ๋ฃน์ ์ปจ์๋จธ ๊ฐ์์ ํํฐ์
๊ฐ์๋ฅผ ๋์ผํ๊ฒ ๊ฐ์ ธ๊ฐ๊ณค ํ๋ค. ์ฐธ๊ณ url http://kafka.apache.org/ http://www.popit.kr/author/peter5236/ http://jinhokwon.tistory.com/168 http://programist.tistory.com/entry/Apache-Kafka-ํด๋ฌ์คํฐ๋ง-๊ตฌ์ถ-๋ฐ-ํ
์คํธ https://www.elastic.co/kr/blog/just-enough-kafka-for-the-elastic-stack-part1 https://www.slideshare.net/springloops/apache-kafka-intro20150313springloops-46067669
๋ฒ์จ 10๋ฒ์งธ Naver์์ ์ฃผ์ตํ๋ Deview. ์ฌํด๋ ์ด๊น์์ด ์ฐธ์์ ํ๊ฒ ๋์๊ณ , ์ด๋ฒ์ ๋ณด๊ณ ๋ฃ๊ณ ๋๊ผ๋ ๋ถ๋ถ๋ค์ ์กฐ๊ธ์ด๋ผ๋ ๊ฐ์งํ๊ณ ์ถ์ ๋ง์์ ๋ฐ๋ก ๋ธ๋ก๊น
์ ํ๋ ค๊ณ ํ๋ค. (์ค๋๋ง์ ๋ธ๋ก๊น
์ด๊ธด ํ์ง๋ง…)ํญ์ Deview์ ์ฌ๋๋ง๋ค ๋๋ผ๋ ๋ถ๋ถ์ธ๋ฐ ์ด๋ฒ์ฐธ์์ด 3๋ฒ์งธ ๋๋๋ฏ ํ๋ค ์ธ์์ ์ข๊ณ ๋ฅ๋ ฅ์๋ ๋ง์ผ๋ฉฐ ๋ด๊ฐ ํ๋ฒ์ฏค ๋ณธ๊ฒ๋ค์ ์ด๋ฏธ ์ง๋๊ฐ ๊ธฐ์ ๋ค์ด๋ผ๋๊ฒ, ๋๋ถ์ด ๋จ์์์ ์ฌ๋ผ๊ฐ ๋ฐํํ๋ ์ฌ๋๋ค๋ ์์ ์ ๋์ ๋๊ฐ์ด ๋ฐํ๋ฅผ ๋ฃ๋ ์ผ๋ฐ ์ฌ๋์ด์๋ค๋๊ฒ. ์ด๋ฒ์๋ ๋ง์ ์๊ฐ์ ํ๊ฒ ๋์๋ค. ๊ตฌ๊ตฌ์ ์ ๊ฐ์ธ์ ์ผ๋ก ๋๋์ ์ ์ ๋๊ฒ์ ์์ ๊ฐํ ๊ธฐ์ต์ด ๋จ์๋ ๋ช๋ช ์ธ์
๋ค์ ๋ํด์ ๊ฐ๋ตํ๊ฒ ๋ฆฌ๋ทฐ๋ฅผ ๋จผ์ ํ๋๊ฒ ๋ง๋ ์์๊ฐ๋ค.
์ฑ
์ฝ์ด์ฃผ๋ ๋ฅ๋ฌ๋ ( ๊นํํ / ๋ฐ๋ธ์์คํฐ์ฆ ) ์ฌ๋ผ์ด๋ ์๋ฃ
๋ค์ด๋ฒ์์ ์ ์ธ๋์ ๋ชฉ์๋ฆฌ๋ก ์ฑ
์ ์ฝ์ด์ฃผ๋๊ฒ์ ๋ณด๊ณ ํฅ๋ฏธ๋ฅผ ์ป์ด ๊ฐ๋ฐํ๊ธฐ ์์ํ๋ค๊ณ ํ๋ค. ์์ฑํฉ์ฑ์ ๋ฐ์ดํฐ๊ฐ ๋ง์์ผ ๋จธ์ ๋ฌ๋์ด๋ ๋ฅ๋ฌ๋ ๊ธฐ์ ์ ์ ๋ชฉ์ํค๋๋ฐ ๋์์ด ๋๋๋ฐ ๋ฐ๊ทผํ ์ ๋ํต๋ น, ๋ฌธ์ฌ์ธ ๋ํต๋ น, ์์ํฌ ์๋์ด์์ ์์์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ๋ฌธ์ฅ๋ณ๋ก ํ
์คํธ-์์ฑ์ ๋ง์ถ๊ณ (pair) ๋จธ์ ๋ฌ๋ + ๋ฅ๋ฌ๋ ๊ธฐ์ ์ ์ด์ฉํด์ ๋ง๋ค์ ์์๋ค๊ณ ํ๋ค. ์ถํ ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์๋๋ก ํ์ด์ฌ ๋ชจ๋๋ก ์ ๊ณตํ๋ค๊ณ ํ๋, ๊ฐ์ฌํ ๋ฐ๋ฆ์ด๋ค. ์ฌ์ค ๋จธ์ ๋ฌ๋์ ๊ด์ฌ๋ง์์์ง ์ด๋ ๋คํ ๊ณต๋ถ๋ ์ง์ ๊ตฌํ์ ๋จํ๋ฒ๋ ์ํด๋ณด๊ณ ํด๋น ์ธ์
์ ๋ค์ด๋ณด๋ ๊ทธ๋ฅ ์ฐ์ ์ ๊ธฐํ๋ค์ ๋์๋๋ฐ. ์ด๋ฒ๊ธฐํ์ ์์๊ฒ๋ถํฐ ํ๋์ฉ ์์ํ๋ฉด์ ์์ฆ์ ํซํ(?) ํธ๋๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ ๊ฒ๋ ๊ด์ฐฎ์ ๋ฐฉ๋ฒ๊ฐ์ ๋ณด์ธ๋ค. (์, ์ฐ์ ํ์ด์ฌ๋ถํฐ…)
๊ทธ๋ฐ REST API๋ก ๊ด์ฐฎ์๊ฐ ( ์ด์์ค / ๋น๋ฐ๋ฆฌํผ๋ธ๋ฆฌ์นด ) ์ฌ๋ผ์ด๋ ์๋ฃ
๋ฐํ์๋ถ์ ์ด๋์ ๋ง์ด ๋ดค๋ค ํ๋๋๋ง ์์ ์ ์ฐ๋ฆฌ ํ์ฌ ์ฌ๋์ด์๋ค. ์์
๋ ๋ค์ด๋ดค๊ณ , ๊ฐ์ด ์๊ณ ๋ฆฌ์ฆ ์คํฐ๋๋ ํ๊ณ (ํ๋ฒ ๋๊ฐ์ง๋ง…). ๋ฐํ ์ฒซ ๋ถ๋ถ์ ์์ ์ด 10๋
์ ์ ๋ฐ๋ทฐ staff ๋ฅผ ์์ํ๋๋ฐ 10๋
์ ๋ค ๋ชป์ฑ์ฐ๊ณ ํด์ฌ๋ฅผ ํ๋ค๊ณ ใ
ใ
.. ์๋ฌดํผ ๊ฐ์ธ์ ์ผ๋ก ๋๋ฆ ๋ฐ๊ฐ์ด ๋ถ์ด๋ผ ๋ ๊ด์ฌ๊ฐ๊ณ ๋ฃ๊ฒ ๋์๋ค. REST ๊ฐ ๋ฌด์์ธ๊ฐ?์ ๋ํ ๋ฐํ๋ค. ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ์๋ 3๊ฐ์ง์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค.
REST API ๋ฅผ ๊ตฌํํ๊ณ REST API๋ผ๊ณ ๋ถ๋ฅธ๋ค. REST API ๊ตฌํ์ ํฌ๊ธฐํ๊ณ HTTP API ๋ผ๊ณ ๋ถ๋ฅธ๋ค. REST API ๊ฐ ์๋์ง๋ง REST API ๋ผ๊ณ ๋ถ๋ฅธ๋ค. (ํ์ฌ ๋๋ถ๋ถ์ API๋ค์ ์ํ) REST API๋ฅผ ๊ตฌ์ฑํ๋ ์คํ์ผ์ค ๋์ฌ๊ฒจ ๋ณผ๋งํ ๋ถ๋ถ์ ํฌ๊ฒ ๋๊ฐ์ง๊ฐ ์๋ค๊ณ ํ๋ค. (uniform interface)
self-descriptive messages : ๋ฉ์์ง๋ ์ค์ค๋ก ์ค๋ช
์ด ๋์ด์ผ ํ๋ค. hypermedia as the engine of application state (HATEOAS) : ์ ์ด(์ํ์ ์ด๋)๊ฐ ๋ ์์๋ ์ ๋ณด๊ฐ ์์ด์ผ ํ๋ค. ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ฉด REST API๋ก ๋ง๋ค๋ ค๋ฉด ์ ๋๋ก ์๊ณ ๋ง๋ค์ด๋ผ ๋ผ๋ ๋ฉ์์ง๊ฐ ๊ฐํ ๋ฐํ๋ด์ฉ๊ฐ๋ค. ๋๋ ์ด์ ๊น์ง๋ ๊ทธ๋ฅ json ์ผ๋ก ๋ด๋ ค์ค๋ค๋ ๊ฒ, GETใPOST ๋ฑ HTTP Method ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก๋ง ์๊ณ ์์๋๋ฐ ๊ฐ์ธ์ ์ผ๋ก๋ ๋ฐํ์๋ถ์ด ๋ง์ํ์ ๋๊ฐ์ง ๋ด์ฉ์ ์งํค๋๊ฒ ๋ง๋ค๊ณ ์๊ฐํ๋ค. ์ฆ, ์ ๋ง REST ํ๊ฒ ๋ง๋ค๊บผ๋ฉด ์ ํํ ์ฌ์ฉ๋ฒ์ ์๊ณ ๋ง๋๋๊ฒ ์ข์๋ณด์ธ๋ค.
๋๋ค ์ปคํผ์ต๋ ์ฌ์ด๋ ์ค๋๋ฅผ ์ธ ์ ์์๊น? ( ํํ, ๋๋์ง / ์ผ์ฑ์ ์[Lunch class] ) ์ฌ๋ผ์ด๋ ์๋ฃ
์ค๋ ๋ฐํ์ค์ ๊ฐ์ฅ ๋ค์ด๋ณด๊ณ ์ถ์๋ ์ธ์
. ์์ ๋ถํฐ ์ฌ์ด๋ ์ค๋๊ฐ ์ด๋ค์์ผ๋ก ๋์ํ๋์ง + ์ฐ๋ฆฌํ์ฌ ์ปคํผ์๋ ์ฌ๋ด ์ฑ์ ํ์ฉํด์ ๋ง๋ค์ด ๋ณผ์ ์์์ง(์์ด๋์ด) ์ด๋ฐ์ ๋ฐ ์๊ฐ์ด ๋ง์์๋๋ฐ ๋ฑ! ์ํ๋ ๋ฐํ๊ฐ ์์ด ๋ฃ๊ฒ ๋์๋ค. ์ผ์ฑ์ ์ ์์์ด์ ๋ถ๋ค์ด ๋ฐ๋ก ๊ทธ๋ฃน์ ๋ง๋ค์ด ์งํํ๋ฉด์ ๋ง๋ ๋ถ๋ถ๋ค์ ๋ฐํํด์ฃผ์
จ๋๋ฐ ์ ๊ธฐํ ๊ธฐ์ ๋ค์ด ๋ง์ ๋ฃ๋ ๋ด๋ด ํฅ๋ฏธ์ง์ง ํ๋ค.
PWA(Progressive Web App) : PWA ๋ก ๋ชจ๋ฐ์ผ ์ฒญ์ฒฉ์ฅ์ ๋ง๋ค์๋ค๊ณ ํ๋ค. (๊ฒฐํผ์ ์ ๋ ์
๋๋ค. ์ค๋ ๊ฒฐํผํฉ๋๋ค. ์ด๋ฒคํธ[์ถ์ฒจ]๋ฅผ ์งํํฉ๋๋ค. ๋ฑ๋ฑ..) Physical Web(Beacon), NFC … Browser Fingerprint (Device ๊ตฌ๋ถ) Push Nofification Web Payment ๊ฒฐ๊ตญ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ฉด ๋๋ค ์ปคํผ์ต์์ ์ฌ์ด๋ ์ค๋๋ฅผ ์ฌ์ฉํ๊ธฐ์ํด ์ด๋ฌ์ ๋ฌํ ๊ธฐ์ ๋ค์ ์๋ํด๋ดค๋ค~์ธ๋ฐ. ๊ฐ ๊ธฐ์ ๋ค์ ์์ด ํ์ค์ ์ธ ์ํฉ์ ํ๊ณ์ ์ด ์๊ณ , ๊ทธ๋์ ๊ฒฐ๊ตญ ์ฒ์์ ์ด์ผ๊ธฐ ๋ ๋๋ค ์ปคํผ์ต์์ ์ฌ์ด๋ ์ค๋๋ฅผ ์ฌ์ฉ์ ๋ํ ๊ฒฐ๊ณผ๋ฌผ์ด ์์ด์ ์์ฌ์ ๋ค. ์์ฒญ ๊ธฐ๋ํ๋๋ฐ ๋ง์ด๋ค. ํ์ง๋ง PWA๋ฅผ ์ด์ฉํด์ ๋ชจ๋ฐ์ผ ์ฒญ์ ์ฅ์ ๋ง๋ ๋ถ๋ถ์ ์ ๋ง ์ฐฌ์ฌ๋ฅผ ๋ณด๋ด์ฃผ๊ณ ์ถ์ ์์ด๋์ด ๊ฐ๋ค.๋๋ ๋์ค์ ํด์ผ์ง~ ์์ “๋ ์จ"๋ผ๋ ์น์๋น์ค๋ฅผ ๋ง๋ค๋ฉด์ ์น์ด๋ผ๋ ํ๊ฒฝ์์ ๊ธฐ์์๋ณด๋ ๊ฐ์์ค๋ฌ์ด ๋/๋น ์๋ฆผ์ ๋จ์ํ ํ๋ฉด์ ๋ฟ๋ ค์ฃผ๋๊ฒ์ด ์๋๋ผ ์ฌ์ฉ์ ๊ธฐ๊ธฐ์ ๋
ธํฐ(ํธ์)ํด์ค์๋ ์์๊นํ๋ฉฐ ์ ๊น ๋ณธ ๊ธฐ์ ์ด PWA ์๋๋ฐ ๋ ํ๋กํ ํ์ดํ๋ง ํด๋ณธ ์์ค์ด์ง๋ง ์ด๋ถ๋ค์ ์ค์ ๋ก ๋ณธ์
๊ณผ๋ ๋ณ๊ฐ๋ก ๊ตฌํ์ ํด๋ณด๋ ๋
ธ๋ ฅ์ ํ๋ค๋๊ฒ์ ๋ด ์์ ์ด ๋ถ๋๋ฌ์ ์ง๋ค.
์๋ฒ๋ฅผ ์ด์ํ๋ค๋ณด๋ฉด ๊ฐํน ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณค ํ๋ค. ์ด๋ฅผํ
๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ค๋ฅธ์ด์ ์์ด ์ฌ๋ผ๊ฐ๋ค๊ฑฐ๋, ์ฌ์ฉ์ ์
์ฅ์์ ์๋ต์๋๊ฐ ๊ฐํ์ ์ผ๋ก ๋๋ฆฐ๋ค๊ฑฐ๋. ๊ทธ๋ด๋๋ง๋ค ์ ๋ฐฐ๊ฐ๋ฐ์๋ถ๋ค๊ป์ ๊ฐ์ฅ๋จผ์ ์
์ ์ค๋ฅด๋ด๋ฆฌ๋ ๋จ์ด. keepAlive
.