์คํ๋ง ๊ธฐ๋ฐ์ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๋ค ๋ณด๋ฉด ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ ๋งจ ์ฒ์์ ์์นํ๊ณ ์๋ Controller(์ดํ ์ปจํธ๋กค๋ฌ)๋ผ๋ ๋ ์ด์ด๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. ๊ทธ๋ด๋๋ฉด ์ฌ์ฉ์๊ฐ ์ด๋ค ์์ฒญ(Request)์ ํ์๋์ง์ ๋ํด ํ์ธ์ด ํ์ํ ์ ์๋ค. ๋ฌผ๋ก ํ์ธ์ ์ํด๋ ๋ฌด๋ฐฉํ์ง๋ง ๊ฐ๊ธ์ ๋ก๊น
์ ์์คํ
๋ก์ง์ ์ํฅ์ ์ฃผ์ง ์๋ ๋ฒ์์์ ์ต๋ํ ๋ค์ํ๊ฒ ๋ฏธ๋ฆฌ ํด๋๋๊ฒ ๋์ค์ ์ ์ง๋ณด์์ ํธํ ์ ์๋ค. (์์ ์กฐ์ง์ฅ๋๊ป์ ๋ง์ํ์ ๊ฒ ์์ง๋ ๋จธ๋ฆฟ์์ ๊ฝ ์๋ฆฌ์ก๊ณ ์๋ค…) ์~์ฃผ ์ผ๋ฐ์ ์ผ๋ก, ์ปจํธ๋กค๋ฌ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ์๋ ๋จ์๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ๋ก๊น
ํ๊ฒ ๋๋ค.
@Slf4j @RestController public class SampleController { @GetMapping("/test1") public String test1(@RequestParam String id) { log.info("id : {}", id); return "length : " + id.length(); } } ์ด๋ ๊ฒ ๋๋ฉด ์ฌ์ฉ์๊ฐ GET /test1 ์ด๋ผ๋ ์์ฒญ์ ๋ณด๋ผ๋ ์ด๋ค ํ๋ผ๋ฏธํฐ๋ก ํธ์ถํ์๋์ง์ ๋ํด ๋ก๊น
์ด ๋จ๊ฒ ๋๋๋ฐ ํญ์ log.info("id : {}", id); ๊ณผ ๊ฐ์ด ์๋์ผ๋ก ๋ก๊น
์ ๋จ๊ฒจ์ผ ํ๋ ๋ถํธํจ์ด ์๊ธด๋ค. ๋ฌผ๋ก ๊ผผ๊ผผํ๊ฒ ๋ฉ์๋๋ง๋ค ๋ก๊น
์ ์ ์ด์ฃผ๋ฉด ์ ํ ๋ฌธ์ ๋ ๊ฒ ์์ง๋ง ์ด๋ฌํ ์ปจํธ๋กค๋ฌ ~ ๋ฉ์๋๊ฐ ํ๋๊ฐ๊ฐ ์๋ ์์ญ ๋๋ ์๋ฐฑ๊ฐ์ผ ๊ฒฝ์ฐ์ ๊ทธ๋๋ง๋ค ๋ก๊น
์ ์ ์ด์ค์ผ ํ๋ ๋ถํธํจ์ด ์์ ์ ์๋ค. ๋ํ ์์นซ ๊น๋ฐํ๊ณ ๋ก๊น
์ ๋นผ๋จน๊ณ ๋ฐฐํฌ๋ฅผ ํ๊ฒ ๋ ๊ฒฝ์ฐ ๋ชจ๋ํฐ๋ง์ ๋ก๊น
์ ํ์ง ์์์ ๋ค์ ๋ก๊น
ํ๊ณ ๋ฐฐํฌ๋ฅผ ํ๋, ๋ณ๊ฒ๋ ์๋๋ฐ(?) “์ ๋ง ๋ถํธํ” ์ํฉ์ด ์์ ์ ์๋ค. ์ด๋ฒ ํฌ์คํ
์์๋ ์ฌ์ฉ์์ ์์ฒญ์ ๋ชจ๋ํฐ๋ง ํ๊ธฐ ์ํด ์ปจํธ๋กค๋ฌ๋ง๋ค ์ฝ๋๋ฅผ ์์ฑํด๊ฐ๋ฉฐ ๋ก๊น
์ ํ๋๊ฒ์ด ์๋๋ผ HttpServletRequestWrapper ๋ผ๋ ๊ฒ๊ณผ Filter, AOP๋ฅผ ์ด์ฉํ์ฌ Request์ ์ ๋ณด๋ฅผ ํ๊ณณ์์ ์ฐ์ํ๊ฒ ๋ก๊น
ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
์๊ตฌ์ฌํญ ์ ๊ฐ๋ฐํ์์!์ถ์ฒ : https://gfycat.com/ko/brightevilaoudad" ์ ๊ฐ๋ฐํ์์!
์ถ์ฒ : https://gfycat.com/ko/brightevilaoudad ํฌ์ฐ์ฌ๊ฐ ํ๋๋ ๋นจ๊ฐ ์ฒ์ ๋ณด๋ฉฐ ๋์งํ๋ ํฉ์์ฒ๋ผ (์ฐ๊ณ ๋ณด๋ ๋๋ฌด TMI ๊ฐ๋ค….) ๋น์ฅ ์ฝ๋ฉ์ ์์ํ๋ฉฐ ๊ฐ๋ฐ์ ํ ์๋ ์์ง๋ง ์ ์ ์ํ๋ ๊ธฐ๋ฅ์ด ๋ฌด์์ธ์ง ์ฒ์ฒํ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ ํ์๊ฐ ์๋ ๊ฒ ๊ฐ๋ค. (์ด์ฉ๋ ์คํ๋ ค ํ์๊ฐ ๋ ๋น ๋ฅธ ๊ฐ๋ฐ์ ํ๊ฒ ๋๋๊ฒ ๊ฐ๋ค.)
GET, POST ๋ฑ ๋ค์ํ http method ๋ก ๊ตฌํ๋ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ ํ๋ผ๋ฏธํฐ์ ๊ธฐํ Request ์ ๋ณด๊ฐ ๋ก๊น
์ด ๋์ผ ํ๋ค. ์ปจํธ๋กค๋ฌ, ๋ฉ์๋๊ฐ ๋์ด๋ ๋๋ง๋ค ๋ณ๋์ ์ฝ๋ ์ถ๊ฐ ์์ด ํ๊ณณ์์ ๊ณตํต์ ์ผ๋ก ๋ก๊น
์ด ๋์ผ ํ๋ค. URL ์ค ํน์ ํจํด์ผ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ก๊น
์ ํ๊ฑฐ๋, ๋ก๊น
์์ ์ ์ธํ ์ ์์ด์ผ ํ๋ค. ์์ ๋งํ๋ฏ ๋ค๋ฅธ ๋น์ง๋์ค ๋ก์ง์ ์ํฅ์ ์ฃผ์ง ์์์ผ ํ๋ค. ๊ตฌํํ๊ธฐ - Request ์ ํ๋ผ๋ฏธํฐ ์ ๋ฆฌ Request ์ ๋ชจ๋ ๋ก๊น
์ ํ๊ณณ์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ filter(ํํฐ)๋ฅผ ํ์ฉํ์๋ค. ํํฐ๋ Dispatcher servlet์ ์๋จ์ ์์นํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋๋ฐ ์ฉ์ดํ๋ค. ๋ฌผ๋ก ์ธํฐ์
ํฐ๋ฅผ ํ์ฉํด์๋ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ๋ณธ ํฌ์คํ
์์๋ ํํฐ๋ฅผ ํ์ฉํด์ ๊ตฌํํ๋๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค. (์ฌ์ค ์ธํฐ์
ํฐ๋ก ๋ช๋ฒ ์๋ํด๋ณด๋ค๊ฐ ์คํจํด์…์ ์ )
Spring MVC Request Life Cycle์ถ์ฒ : https://justforchangesake.wordpress.com/2014/05/07/spring-mvc-request-life-cycle/" Spring MVC Request Life Cycle
์ถ์ฒ : https://justforchangesake.wordpress.com/2014/05/07/spring-mvc-request-life-cycle/ Filter๋ฅผ ๋ง๋ค๊ธฐ ์ ์ Filter์์ ์ฌ์ฉํ ์ฃผ์ ํต์ฌ(?) ํด๋์ค๊ฐ ํ์ํ๋ฐ HttpServletRequest ๋ฅผ Wrapping ํด์ ์ฌ์ฉํ๊ธฐ ์ํด HttpServletRequestWrapper๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๋ง๋ค์. Request ์ ๋ด๊ฒจ์๋ param ๊ณผ body๋ก ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ body์ ์๋ ๋ด์ฉ์ param ์ ๋ด๋ ๋ก์ง์ด๋ค. ์ฃผ์ ์ค๋ช
์ ์ฝ๋ ์์์ ์ฃผ์์ผ๋ก ์ค๋ช
ํ๊ฒ ๋ค.
public class ReadableRequestWrapper extends HttpServletRequestWrapper { // ์์ private final Charset encoding; private byte[] rawData; private Map<String, String[]> params = new HashMap<>(); public ReadableRequestWrapper(HttpServletRequest request) { super(request); this.params.putAll(request.getParameterMap()); // ์๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฅ String charEncoding = request.getCharacterEncoding(); // ์ธ์ฝ๋ฉ ์ค์ this.encoding = StringUtils.isBlank(charEncoding) ? StandardCharsets.UTF_8 : Charset.forName(charEncoding); try { InputStream is = request.getInputStream(); this.rawData = IOUtils.toByteArray(is); // InputStream ์ ๋ณ๋๋ก ์ ์ฅํ ๋ค์ getReader() ์์ ์ ์คํธ๋ฆผ์ผ๋ก ์์ฑ // body ํ์ฑ String collect = this.getReader().lines().collect(Collectors.joining(System.lineSeparator())); if (StringUtils.isEmpty(collect)) { // body ๊ฐ ์์๊ฒฝ์ฐ ๋ก๊น
์ ์ธ return; } if (request.getContentType() != null && request.
ํ์ฌ์ผ์ ํ๋ค ๋ณด๋ฉด ์ํค๋ ๋๋ก ํน์ ํ์ ๋ชฉํ์ ๋ถํฉํ๊ธฐ ์ํด ์ด์ฉ ์ ์์ด ํด์ผ ํ๋ ์ผ์ ํ๊ฒ ๋๋ค. ๊ทธ๋ฌํ ์ผ์ด ์ฌ๋ฏธ์๊ณ ๊ฒฐ๊ณผ๋ฌผ์ ๋ํ ๋ง์กฑ๋๊ฐ 100% ๋ผ๋ฉด ๋คํ์ด์ง๋ง ๊ฐํน ์ฌ๋ฏธ๋ ์๊ณ ์์ผ์ ํ๋ ์ผ์ ๋ฐค์ ๊ผฌ๋ฐ ์ ๊ฐ๋ฉด์ ์์ฑ์ ํด๋ ์ฉ ๊ทธ๋ ๊ฒ ๋ง์กฑ์ค๋ฝ์ง ๋ชปํ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ธ ๊ฒ ๊ฐ๋ค.(๋ฌผ๋ก ํ์ฌ์ผ์์ ์์ ๋ง์ ์ธ์ฌ์ดํธ๋ฅผ ์ฐพ๋๋ค๋ฉด ๊ธ์์ฒจํ๊ฒ ์ง๋ง… + ๋งค๋ฒ ํ์ฌ์ผ์ด ์ฌ๋ฏธ์๊ณ ํ๊ธฐ ์ซ์๊ฑด ์๋) ์ธ์ ๋ถํฐ์ธ์ง ํ์๋ ์ด๋ฌํ ๋ถ๋ถ์ ๊ฐ์ฆ์ ๋๋ผ๋ฉฐ ํ์ฌ์๋ ๋ณ๋๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ด ๋ณด๊ณ ์ถ์ ๋ง์์ด ๋ฌด๋ญ๋ฌด๋ญ ์๊ฒจ๋ ์ฆ์ facebook ํ์๋ผ์ธ์์ ๊ฐ๋ฐ์์ ๋์์ด๋๊ฐ ์ฝ 7์ฃผ๊ฐ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ D.light ํฌ๊ฒ๋ํค ์ด๋ผ๋ ํ์ฌ๊ฐ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ ๋๋ฆ ์ ์ฑ์ค๋ ์ง์์๋ฅผ ์์ฑ ํ ํฉ๊ฒฉ ๋ฉ์ผ์ ๋ฐ๊ฒ ๋๋ค. (GDG Facebook ํด๋น ๊ฒ์๊ธ) ์ด๋ฒ ํฌ์คํ
์์๋ ํด์ปคํค๊ณผ๋ ์ด์ง ์ฑ๊ฒฉ์ด ๋ค๋ฅธ D.light ํฌ๊ฒ๋ํค์ ์งํํ๋ฉด์ ๋๊ผ๋ ๋ถ๋ถ๋ค๊ณผ ์งํํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ํด ๊ฐ๋ตํ ๋ฆฌ๋ทฐ๋ฅผ ํด๋ณด๋ฉฐ ์ ๋ง ๊ธํ์ฒ๋ผ ์ง๋๊ฐ ์ฝ 7์ฃผ๊ฐ์ ๋์ด์ผ ๋ณด๋ ์๊ฐ์ ๊ฐ๊ณ ์ ํ๋ค.
ํ ๋น๋ฉ ๋๋ ๋ชป๋ง์ฃผ์น ์ ๋๋ก ์ด์ํ ์ฒซ๋ Team. ๊ทธํฝ" ๋๋ ๋ชป๋ง์ฃผ์น ์ ๋๋ก ์ด์ํ ์ฒซ๋
Team. ๊ทธํฝ ์ด 6๊ฐ ํ ์ค์ ํ์๋ ์ฌ์ ๋์์ด๋ ๋ ๋ถ, ๋จ์ ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ๋ ๋ถ์ ํฌํจํ ํ์ ์ํ๊ฒ ๋์๋ค. 5๋ช
์ค ํด์ปคํค ์ฐธ์ฌ ๊ฒฝํ์ด ์๋ค๋ ์ด์ ๋ง์ผ๋ก ์ฌ์ ๋์์ด๋ ๋ถ๊ป์ ํ์ฅ์ด ๋์๊ณ , 7์ฃผ๋ผ๋ ์๊ฐ์ด ์ ๋ง ๊ธํ๊ฒ ์ง๋๊ฐ ๊ฒ ๊ฐ๋ค๋ ์ต์ง(?) ์ด์ ๋ฅผ ๋ค๋จน์ฌ ๊ทธํฝ์ด๋ผ๋ ํ ์ด๋ฆ์ด ์ ํด์ก๋ค. ๊ทธ๋ ๊ฒ “์ฐ๋ฆฌ๊ฐ ์ ๋ง ๋ฌด์์ ๋ง๋ค ์ ์์๊น?” ํ๋ ์๊ตฌ์ฌ ์์ ํ๋ก์ ํธ๊ฐ ์์์ด ๋์๋ค.
ํ๋ก์ ํธ ์งํ ์ ๋ฐ ์ ๊ธฐํ๊ฒ๋ ์ฐ๋ฆฌ 5๋ช
์ ๊ฐ๊ฐ ์ฌ๋ ์ง์ญ์ด ์ ๋ถ ๋ฌ๋๋ค. (์ฌ์ง์ด ํ ๋ถ์ ๋งค์ฃผ ์ ๋ฉ๋ฆฌ ์ถฉ์ฒญ๋จ๋ ์ฒ์์์ ์ฌ๋ผ์ค์
์ผ ํ๋ ์๊ณ ๋ฅผ ใ
ใ
) ๋งค ์ฃผ๋ง๋ง๋ค ์คํ๋ผ์ธ์ผ๋ก ๋ง๋์ ํ์๋ฅผ ์งํํ๋ค. ๊ทธ๋์ผ ๊ธธ๋ค๋ฉด ๊ธธ๊ณ ์งง๋ค๋ฉด ์งง์ 7์ฃผ ์์ ์์ฑ๋ ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ์์์๋ค. ํ๋ก์ ํธ์ ์ฃผ์ ๋ฅผ ์ ํ๋ ์์ด๋์ด ํ์์์ ์ ํด์ง ์ฐ๋ฆฌ์ ๋ชฉํ๋ “๋๋ค ๋งํธ ํ ์ธ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ๋ ์ฑ"์ ๋ง๋ค๊ธฐ๋ก ํ์๋ค.
์๊ฐ๊ฐ๋์ค ๋ชฐ๋๋ ์์ด๋ฐ์ด์
ํ์" ์๊ฐ๊ฐ๋์ค ๋ชฐ๋๋ ์์ด๋ฐ์ด์
ํ์ ํ์ํฌ๊ฐ ์ค์ํ ํฌ๊ฒ๋ํค ์์๋ ๋ถ๊ตฌํ๊ณ ์ฌ๋ ์ฒ์ฌ ๋์์ด๋, ์ฒ์ฌ ๊ฐ๋ฐ์์ฒ๋ผ ์ผ๋น๋ฐฑ ์คํ์ผ๋ก ๋๋ฑ ๋ง๋๋ ๊ทธ๋ฐ ํ๋ก์ ํธ์ ์งํ ๋ฐฉ์์ ํผํ๋ ค๊ณ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋
ธ๋ ฅํ์๋ค. ๋๋๋ก์ด๋ฉด ์ด๋ ๊ฒ ๋ชจ์ธ ๋ค์ฏ ๋ช
์ด ํ๋ง์ ํ๋ป์ผ๋ก ๊ฐ์๊ฐ ์๊ฐํ๋ ํฌ๊ธฐ์ ์์ ๋ค๋ฅด๊ฒ ์ง๋ง ์ด ํ๋ก์ ํธ๋ฅผ ํตํด ๋ฌด์์ด๋ผ๋ ๋ฐฐ์ธ ์ ์์์ผ๋ฉด ํ๋ค. ๋์์ด๋ ๋ถ๋ค์ ์๋ก ๋์์ธํ์ ์์์ ๋ํด ๊ณต์ ๋ฅผ ํ๋ฉด์ ๊ฐ์ ํด ๋๊ฐ๋ ๋ชจ์ต๊ณผ, ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ๋๋ถ์ (๊ฑฐ์ ๋งค์ผ) ๋ฐค๋ง๋ค ์๋ก ์ฌ๋์์ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ ๋ํด ์คํฐ๋๋ฅผ ํ๋ ๋ชจ์ต์ด ๋ณด๊ธฐ ๋๋ฌด ๋ณด๊ธฐ ์ข์๋ค. ๋ฌผ๋ก ํ์๋ ์๋ฌด๊ฒ๋ ์๋ ํ๊ฒฝ์์ ๋ฐฑ์๋ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ณ API๋ฅผ ๋ง๋๋ ๊ณผ์ ์์์ ์ ๋ง ๋ง์๊ฒ์ ๋ฐฐ์ธ ์ ์์๋ค. ๊ทธ๋ ๊ฒ ์๊ฐ์ด ํ๋ฌ ๋ง์ง๋ง ๋ฐํํ๋ ์ ๋ ์ ํ์ ๋ช ๋ถ๊ณผ ํจ๊ป ๊ผฌ๋ฐ ๋ฐค์ ์์ฐ๋ฉฐ ํ๋ก์ ํธ ๊ฒฐ๊ณผ๋ฌผ์ ์์ฑ๋๋ฅผ ๋์ด๋๋ฐ ๋
ธ๋ ฅํ์๊ณ ํ์ ๊ฐ์ธ์ ์ผ๋ก ์์ฃผ ์ฑ๊ณต์ ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ ์ ์์๋ค.
๊ฐ๋ฐ ์งํ ์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ถ๋ค์ ์ฝํ๋ฆฐ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ์ ํ์๋ค. ์ฌ๋ฌ ๋์์ธ ํจํด๊ณผ ๋ค์ํ ๊ธฐ์ ๋ค์ ์ฌ์ฉํ์๋ค๊ณ ๋ค์๋๋ฐ ํ์๋ ์์ฝ๊ฒ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ ์ ๋ถ๋ฅผ ์ดํดํ์ง๋ ๋ชปํ์๋ค. ์์ ์ ํ ์ด ํ๋ก์ ํธ๋ฅผ ํ์ด์ฌ ๊ธฐ๋ฐ์ผ๋ก ํด๋ณธ ๊ฒฝํ์ด ์์ด์ Flask ๋๋ Django ๊ธฐ๋ฐ์ผ๋ก API ์๋ฒ๋ฅผ ๊ตฌ์ถํด๋ณผ๊น ํ๊ณ ๊ณ ๋ฏผํ์๋ค. ํ์ง๋ง (Spring Boot ๊ธฐ๋ฐ์ผ๋ก๋ ํด๋ณด๊ณ ์ถ์๊ณ ) ํ์ด์ฌ๋ณด๋ค๋ ์๋ฐ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ํ ์ดํ๋ฆฌ์ผ์ด์
์ ์๊ตฌ ์ฌํญ์ ๊ฐ๋ฐํ๋๋ฐ ์กฐ๊ธ ๋ ๋ฅ์ํ ๊ฒ ๊ฐ์์ Spring Boot ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ฑํ์๋ค. ์๋ฒ๋ AWS ํ๋ฆฌํฐ์ด์ EC2๋ฅผ ๋ฐ๊ธ๋ฐ๊ณ DB ๋ํ AWS์์ ์ ๊ณตํด์ฃผ๋ RDS(mysql)์ ๋ฐ๊ธ๋ฐ์ ๊ตฌ์ฑํ์๋ค. ๊ทธ๋ฆฌ๊ณ DNS๋ ์์ ์ ๋ฌด๋ฃ ๋๋ฉ์ธ์ ์ฐพ๋ค๊ฐ ์๊ฒ ๋ http://mooo.com/ ๋ผ๋ ์๋น์ค์์ ๋ฐ๊ธ๋ฐ์ ์ฐ๊ฒฐํ์๊ณ , ํ๋ก์ ํธ ๊ธฐ๋ฅ ์ค์ ์๋ฒ์์ ์ฑ์ผ๋ก ํธ์๋ฅผ ํ๋ ๊ธฐ๋ฅ์ด ์์๋๋ฐ Firebase๋ฅผ ํ์ฉํด์ ๊ตฌ์ฑํ ์ ์์๋ค.
์ฌ์ฉํ ๊ธฐ์ ๋ค" ์ฌ์ฉํ ๊ธฐ์ ๋ค Entity Relationship Diagram (ERD) ๋ ๋ฌด๋ฃ๋ก ์ธํฐ๋ท์์ ์ฌ์ฉํ ์ ์๋ ํด์ด ์๋์ง ์ฐพ๋ค๋ณด๋ http://aquerytool.
์ค๋ฌด์์ ์๋ฐ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ์ ํ๊ณ ์๋น์ค๋ฅผ ์ด์์ ํ๋ค๋ณด๋ฉด ์ฒ์์ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ฐ ์ฌ์ฉ์๊ฐ ๋ชฐ๋ฆฌ๋ ๋ฑ ์ด๋ฒคํธ์ฑ์ผ๋ก ํธ๋ํฝ์ด ๋ง์์ง ๊ฒฝ์ฐ ๊ผญ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ ๋ง๋ จ์ด๋ค. ๊ทธ๋ด๋๋ฉด ๋ค๋ฆ๊ฒ ๋ถ๋ด๋ถ๋ด ์์ธ์ ์ฐพ๊ณ ๊ฐ์ ํ๊ธฐ ๋ฐ๋น ์ง๊ฒ ๋๋ค. (์๋ง ์๋ถ๋ค์๊ฒ ํผ๋๋ฉด์?ใ
ใ
) ํ์์ ์ด๋ฐ ์ฑ๋ฅ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๊ณ ๋ฏธ๋ฆฌ ๋ชจ๋ํฐ๋ง ํ ์์๋ ๋ถ๋ถ์ ๋ํด ๊ด์ฌ์ ๊ฐ๊ณ ์์๋ ์ฐฐ๋, ์ฐ์ํ ํ์ ๋ค์์ 5์ ์ฐ์ํ ํ
ํฌ ์ธ๋ฏธ๋๋ฅผ ํ๋ค๊ธฐ์ ๋ถ๋ด๋ถ๋ด ์ฅ๋ฌธ์ ๊ธ๋ก ์ ์ฒญ์ ํ์๊ณ ์ด์ด ์ข์ ๋น์ฒจ์ด ๋์๋ค. ํ์ฐฝ ํ์ฌ์์ ์๋ก์ด ์๋น์ค ์ถ์, ๊ทธ๋ฆฌ๊ณ ์ ์ ์ค์ฌ๊ฐ๋ฉฐ ๋ณ๋๋ก ์งํํ๊ณ ์๋ ํ ์ดํ๋ก์ ํธ ๋ฑ ์ฌ๋ฌ๊ฐ์ง๋ก ๋ฐ์ ์๊ธฐ์์ง๋ง ํนํ ์์ ๋ถํฐ ๋ต๊ณ ์ถ๋ ์ด์๋ฏผ๋๊ป์ ์ง์ ๊ฐ์๋ฅผ ํด์ฃผ์ ๋ค๊ธฐ์ ํผ๊ณคํ ์ฌ์ ์ ์ด๋๊ณ ์ธ๋ฏธ๋์ ์ฐธ์ํ์๊ณ ๊ทธ ํ๊ธฐ๋ฅผ ์ ์ด๋ณด๊ณ ์ ํ๋ค.
๋๋ ์ด๋ก ๋ง๋์ ๋ฐํ์๋ฃ๋ฅผ ๊ณต์ ํด ์ฃผ์
จ์ง๋ง ์ ์๊ถ ๋ฌธ์ ๋ ์๊ณ ํด์ ํ์๊ธฐ์ค์์ ์ดํดํ ๋ถ๋ถ์ ๋ํด์๋ง ๊ณต์ ํ๊ณ ์ ํ๋ค. ๋๋ถ์ด ๊ทธ๋ฅ ๋ฃ๊ณ ์ต๋ฌด์์ฒ๋ผ ๋ฐํ๋ด์ฉ ๊ทธ๋๋ก๋ฅผ ๊ณต์ ํ๋๊ฑด ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐ๋์ด…
ํฌ์คํฐ๋ง ๋ด๋ ๋ฒ์จ๋ถํฐ ๊ฐ์ด์ด ๋ด๋ค(?)." ํฌ์คํฐ๋ง ๋ด๋ ๋ฒ์จ๋ถํฐ ๊ฐ์ด์ด ๋ด๋ค(?). ์ฑ๋ฅ ๊ตฌ๊ธ์์ ์์ฑํ ์ฑ๋ฅ์ด ์ค์ํ ์ด์ ๋ผ๋ ์ํฐํด์ ๊ณต์ ํด ์ฃผ์
จ๋ค. (์๊ฐ์ด ๋๋ค๋ฉด ํ๋ฒ ์ฝ์ด๋ณด๊ธธ ๊ฐ์ถ, ๋ฌด๋ ค ํ๊ธ!) ์ดํ๋ฆฌ์ผ์ด์
์์ ์ฑ๋ฅ์ ์ฌ์ฉ์์ ์ฆ๊ฐ, ์ดํ์จ, ์๋ต์๋์ ์ํฅ์ด ์๊ณ ์ด๋ ๊ฒฐ๊ตญ ์ถ๊ตฌํ๋ ๊ฐ์น(์ด๋ฅผ ํ
๋ฉด ์์ต)์ ์ง๋ฉดํ๋ค๊ณ ํ๋ค. ์ฌ์ฉ์๋ ์ด๋ ๊ด์ ์์ ๋ฐ๋ผ๋ณด๋๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ณ ๊ฐ ๊ด์ ์ ๋ฐ๋ผ ์ฑ๋ฅ์ ์ฑ๊ฒจ์ผ ํ๋ ๋ถ๋ถ์ด ๋ฌ๋ผ์ง๋ค. ์๊ฐ์ ์ฒญ์ ํ๋ ์์ ์์์ ์ฌ์ฉ์์ ๋ด์ค ํ์ด์ง๋ฅผ ์ฝ๋ ์์ ์์์ ์ฌ์ฉ์๋ ๊ฐ ์ฑ๊ฒฉ์ด ์์ฐํ ๋ค๋ฅธ๊ฒ์ฒ๋ผ.
์์คํ
๊ด๋ฆฌ์ ๋ฑ๋ก๋ / ๋ฑ๋ก๋์ง ์์ ์ฌ์ฉ์ ์๋ฒ ๊ด์ ๋ก๊ทธ์ธ๋ / ๋ก๊ทธ์ธ ํ์ง ์์ ์ฌ์ฉ์ ์ฑ๋ฅ ํ
์คํฐ ๊ด์ Active User ์๋ฒ์ ๋ถํ๋ฅผ ์ฃผ๋ ์ฌ์ฉ์ ๋ฉ๋ด๋ ๋งํฌ๋ฅผ ๋๋ฅด๊ณ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ฌ์ฉ์ ์ฑ๋ฅํ
์คํธ์ Vuser์ ๊ฑฐ์ ๋์ผ ( Vuser : ๊ฐ์์ฌ์ฉ์(virtual user) ) Concurrent user ์๋ฒ์ ๋ถํ๋ฅผ ์ฃผ๊ณ ์๊ฑฐ๋, ์ค ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ๋์ ์๋น์ค์ ์ ์์ค์ธ ์ฌ์ฉ์ ์น ํ์ด์ง๋ฅผ ๋์๋์ ์ฌ์ฉ์ TPS(Transaction Per Seconds)๋ ์ด๋น ์ผ๋ง๋ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋์ง์ ๋ํ ์์คํ
์ ์ ๋์ ์ธ ์์น๋ก ๋ณผ์์๋ค. (๊ฐ๋ฐ์๋ ์ด๋์ํฉ์์๋ ์ง ๋์ถฉ ๊ฐ์ผ๋ก ์ด์ผ๊ธฐ ํ์ง๋ง๊ณ ์ ํํ ์์น๋ก ์ด์ผ๊ธฐ ํด์ผํ๋ค๋ ๋ผ๋ฅผ ๋๋ฆฌ๋ ์กฐ์ธ๊ณผ ํจ๊ป…) TPS๋ Scale out/up์ ํตํด ์ฆ๊ฐ์ํฌ์ ์์ง๋ง Response Time ์ ๋ถ๊ฐ๋ฅํ๋ค. ๋ฌผ๋ก ์ดํ๋ฆฌ์ผ์ด์
์ ํ๋ํ๋ฉด ๋ ์์น ๋ชจ๋ ๊ฐ์ ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฌํ TPS์ Response Time์ ์ต๋์น๋ ์ถ์์ ์ ๋ฐ๋์ ํ
์คํธ๋ฅผ ํตํด ์๊ณ ์์ด์ผ ์ด์๋ฐ์์ ๋์ํ๋๋ฐ ์ ์ฉํ๋ค. Bottleneck ์ฆ ๋ณ๋ชฉ์ ์ฅ๋น, ์ดํ๋ฆฌ์ผ์ด์
, ์ ์ฅ์, ์ค์ ๋ฑ ๋ค์ํ ์ํฉ์์ ๋ฐ์ํ ์ ์๋ค. ๊ทธ์ค์ “์์ฃผ ์ผ๋ฐ์ "์ผ๋ก ๊ฐ์ฅ ๋ณ๋ชฉ์ด ๋ง์ด ๋ฐ์ํ๋ ๊ตฌ๊ฐ์ DB์ด๊ณ ๊ทธ ๋ค์์ผ๋ก ํด๋ผ์ด์ธํธ(Web page, App), Network์ด ์์ ์ ์๋ค. ๊ฒฐ๋ก ์ Performance engineering is “Composite Art” of IT ๋ผ๋ ํ๋์ ๋ฌธ์ฅ์ผ๋ก ์ ๋ฆฌ๋ฅผ ํด์ฃผ์
จ๋ค. ์๋ฌด๋ฆฌ ์ด์ ๋์์ธ๊ณผ ์ด๋ ต๊ณ ๋ณต์กํ ๊ธฐ๋ฅ์ด ์์์ง๋ผ๋ ์ฑ๋ฅ์ด ๋ท๋ฐ์นจ ์๋๋ค๋ฉด ๋์ฉ๋ ํธ๋ํฝ ์ํฉ์์๋ ๋ฌด์๋ฏธํด์ง๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์๋ฐ ์๋ฐ์ ์ญ์ฌ์ ๋ํด ์ค๋ช
ํด ์ฃผ์
จ๋ค. ( ์ญ์ฌ์ ๋ํ ๋ณด๋ค ์์ธํ ์ค๋ช
์ https://www.whatap.io/blog/12/ ์ฐธ๊ณ ) ์ธ์ ๋ถํฐ์ธ๊ฐ JDK ๋ผ์ด์ผ์ค ์ด์๊ฐ ๋ง์์๋๋ฐ ์ค๋ฌด์์ ๊ฐ๋ฐํ๋ ์
์ฅ์์๋ java 8 ์์๋ ๋ฌธ์ ๊ฐ ์๋๊ณ java 11๋ถํฐ ๋ผ์ด์ผ์ค ๋ฌธ์ ๊ฐ ๋ณต์กํ๊ฒ ์๊ธธ์ ์๋ค๊ณ ํ๋ค. ์ด๋ถ๋ถ์ ๊ณต์๋ฌธ์(?)๋ฅผ ์ฐพ์๋ณด๋๊ฒ ์ข์๋ฏ ํ๋ค. (๊ฐ์ธ ๋๋ ํ์ฌ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ํฉ์ ๋ฐ๋ผ ๋ฒ์ ์ด์๊ฐ ์๊ธธ์๋, ์์๊ธธ์๋ ์๋ ๋ณต์กํ ๋ฌธ์ ๊ฐ ์์ด๋ณด์ฌ์… ํ์๋ ์ ๋๋ก ์ดํดํ์ง๋ ๋ชปํ๋คใ
)
๊ทธ๋ฆฌ๊ณ ๊ฐ ์๋ฐ ๋ฒ์ ์์ ๋ฐํํ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํด ์ค๋ช
ํด์ฃผ์
จ๋ค.
Java 8 lambda, stream, default method, LocalDate / LocalTime ์ถ๊ฐ stream ๊ณผ foreach ์ ์ฑ๋ฅ์ ๊ฑฐ์ ์ฐจ์ด ์์ (์คํ๋ ค ๊ฐ๋
์ฑ์ด ๋๋น ์ง์๋ ์๋ค.) ParallelStream ์ ํด๋น ์ฅ๋น์ cpu ๊ฐ์๋งํผ ์ค๋ ๋ ํ์ ๋ง๋ค์ด ์ฌ์ฉ (์คํ๋ ค ๋
์ด ๋ ์ ์์ผ๋ ์ ์์๋ณด๊ณ ์ฌ์ฉํ ๊ฒ) Java 9 Compact Strings : char[] > byte[] G1 default GC : https://www.
์ค๋ฌด์์ ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๊ณผ๊ฑฐ ๋๊ตฐ๊ฐ ์ ๊ตฌ์ฑํด ๋์ ๋ฐฅ์(legacy)์ ์๊ฐ๋ฝ๋ง ์น๋ ๋๋์ผ๋ก ๋ก์ง ๊ตฌํ๋ง ํ ๋๊ฐ ์๋ค. ๊ทธ๋ฌ๋ค๋ณด๋ฉด ๊ฐ์ข
๋ ์ด์ด๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ(์ค์ )๋์ด์๋์ง๋ ๋ชจ๋ฅด๊ณ ๊ฐํน ์ค์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด “์ ๋ด๊ฐ ์ด๊ฒ๋ ๋ชจ๋ฅด๊ณ ์ด์ ๊น์ง ๊ฐ๋ฐ์ ํด์๋” ํ๋ ์๊ดด๊ฐ์ด ๋ค๋ฉฐ ๋ช์๊ฐ์ ์ฝ์งํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๊ทธ๊ฒ ์ง๊ธ์ ํ์์ธ๊ฒ ๊ฐ๋ค. (๋๋ฌผ…)
์ถ์ฒ : http://blog.naver.com/PostView.nhn?blogId=ondo_h&logNo=221437452142" ์ถ์ฒ : http://blog.naver.com/PostView.nhn?blogId=ondo_h&logNo=221437452142 ์ฌ์ด๋ ํ๋ก์ ํธ ์ด๊ธฐ์
ํ
์ ํ๋ฉฐ ํธ๊ธฐ๋กญ๊ฒ spring boot ์ต์ ๋ฒ์ ์์ db๋ฅผ ์ฐ๋ํ๋ ค ํ๋๋ฐ ๋ง์ ์์ ๋ฐ๋ฅ๋ถํฐ ํด๋ณธ ๊ฒฝํ์ด ์ ๋ค๋ณด๋ (spring boot 2 ๋ฒ์ ์์๋ ๋์ฑ๋…) ์ด๋์๋ถํฐ ๋ญ ์ค์ ์ ํด์ผํ ์ง… ๊ทธ๋ฆฌ๊ณ ์ด๋ด๋ ๋ณด๋ ๋ํ๋จผํธ๋ฅผ ๋ด๋ ์ ์ดํด๊ฐ ์๋์ด ์ฝ์ง์ ํด๊ฐ๋ฉฐ ๋นํฉํ๊ธฐ ์ผ์ค์๋ค. ์ด๋ฒ ํฌ์คํ
์์๋ ์๋์ ๊ฐ์ ๊ตฌ์ฑ์ ํ๋๋ฐ ๋ชฉํ๋ฅผ ๋๊ณ ์ ํ๋ค.
Spring Boot 2 ํ๋ก์ ํธ๋ฅผ ์ฒ์ ๋ง๋ค๊ณ mybatis ๋ฅผ ์ฌ์ฉํด์ mysql ์ ์ฐ๋ํ๋๊ฒ (AWS ์ RDS๋ฅผ ์ฌ์ฉ, ์ถํ RDS์ฌ์ฉ๋ฒ์ ๋ํด ๋ธ๋ก๊น
์์ ) ์์ ๊ฐ์ ์ํฉ์ ์ฒ์ ์ ํ๋ ๋ถ๋ค๊ป ๋์์ด ๋์์ผ๋ฉด ํ๋ ๋ฐ๋จ์ผ๋ก ์งง๊ฒ๋๋ง ํ์์ ์ฝ์ง๊ธฐ๋ฅผ ์ฌํํด๋ณด์.
Spring boot 2 ํ๋ก์ ํธ ๋ง๋ค๊ธฐ ํ์๋ IntelliJ๋ฅผ ์ฌ์ฉํ๊ณ ์์ด์ ์๋ก ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ ๋ ํด๋ฆญ ๋ช๋ฒ๋ง์ผ๋ก dependency ์ค์ ๊น์ง ๋ค ํด์ฃผ๊ธฐ ๋๋ฌธ์ ํธํ๊ณ ์ข์๋ค. ํน ์ดํด๋ฆฝ์ค๋ ๋ค๋ฅธ IDE๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด https://start.spring.io/ ์ ์ฐธ๊ณ ํ๋ฉด ๋์์ด ๋ ๊ฒ๊ฐ๋ค. ์ฌ๊ธฐ์๋ ํด๋ฆญ ๋ช๋ฒ์ผ๋ก IntelliJ ์์ ํด์ฃผ๋ ๊ฒ์ฒ๋ผ ๋ด๊ฐ ์ฌ์ฉํ ๋ชจ๋์ ์ ํํ๊ณ generate ๋ฅผ ๋๋ฅด๋ฉด ํ๋ก์ ํธ๊ฐ ์์ฑ๋์ด ๋ค์ด๋ก๋ ๋ฐ์์ง๋ค. (์ฐธ ์ข์ ์ธ์…) ์ฐ์ File โ New โ Project ๋ฅผ ๋๋ฌ์ ์๋ ์ฐฝ์ ์ด์ด๋ณด์. ๊ทธ๋ฆฌ๊ณ ๋ญ๊ฐ ๋ค ํด์ค๊ฒ ๊ฐ์ (๊ฐ๋ฐ๋ ํด์ฃผ๋ฉด ์๋๋…) Spring Initializr์ ์ ํํ ์๋์ ๊ฐ์ ์ค์ ์ ์ ์ด์ค ๋ค ๋ค์์ ๋๋ฌ์ค๋ค.
์ฌ์ฉํ ๋ชจ๋์ ์ ํํด์ฃผ์. ํ์๋ ์ด๊ฒ์ ๊ฒ(?)์ ๋์์ฃผ๋ lombok๊ณผ Mybatis, MySQL์ ์ ํํ๊ณ ํ๋ก์ ํธ๋ฅผ ์์ฑํ์๋ค. ๊ทธ๋ฌ๋ฉด ์ด์(?) pom.xml ๊ณผ ํจ๊ป ๋น์ฅ ๊ฐ๋ฐ์ ์์ํ ์ ์๋ ํ๊ฒฝ์ด ์ ๊ณต๋๋ค.
<dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> ์ฐ์ ์ฌ๊ธฐ๊น์ง ์ ๋์๋์ ํ์ธํด๋ณด๊ธฐ ์ํด Controller ์ ํ์ฌ์๊ฐ์ ์ถ๋ ฅํ๋๊ฑธ ๋ง๋ค์ด ๋ณด๊ณ
@RestController public class ApiController { @GetMapping(path = "/helloWorld") public String helloWorld() { return LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); } } ํฐ์ผ์ ์คํํด๋ณด๋ฉด ์ ์์ ์ผ๋ก ์ ์๊ณผ ์ถ๋ ฅ์ด ๋๋๊ฒ์ ํ์ธํ ์ ์๋ค.
MySQL ์ฐ๋ํ๊ธฐ ํ์๊ฐ ํ๋ฅ์ง๋ฅ ํ๋์ ์ค ํ๋๋ MyBatis์ MySQL์ ๋์์ ์ฐ๋ํ๋ ค๊ณ ํ๋ค๋ณด๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํด๋ ์ด๋์์ ๋ฌธ์ ์ธ์ง๋ฅผ ์ ๋๋ก ํ์
ํ์ง ๋ชปํ๊ณ ์ฝ์งํ๋ค๋ ์ ์ด๋ค. ์ฌ๊ธฐ์ ์ ํํ ์ง๊ณ ๋์ด๊ฐ๋ฉด ์ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ORM์ธ MyBatis๋ฅผ ์
ํ
ํด์ค ๋ค์ MySQL์ ์ฐ๋ํด์ฃผ๋ ์์ผ๋ก ๋ถ๋ฆฌํด์ ์ค์ ์ ํ๋ฉด ํ๊ฐ๋ฆฌ์ง ์๊ณ (๋์๊ฐ์ง ์๊ณ ) ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ค์ ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ๋ค. (์ฌ๊ธฐ์ ์์๋ ์ค์ํ์ง ์๊ณ ๋ณ๋๋ก ์ค์ ํด์ผ ํ๋ค๋ ๊ด์ ์ด ์ค์ํ๊ฒ ๊ฐ๋ค.) ์ฐ์ src/main/resourcesํด๋์ ์๋ application.properties ์ ๋ค์์ฒ๋ผ ์์ฑํด์ฃผ์.
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.hikari.jdbc-url=jdbc:mysql://{url}:{port}/{db} spring.datasource.hikari.username={id} spring.datasource.hikari.password={password} ์์ jdbc-url ํญ๋ชฉ์์ AWS์์ ์ ๊ณตํ๋ RDS๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ RDS์์ ์ ๊ณตํด์ฃผ๋ ์๋ํฌ์ธํธ์ ํฌํธ๋ฅผ ์ ์ด์ฃผ๋ฉด ๋๋ค. (์ถํ AWS - RDS์ ๋ํด ๋ธ๋ก๊น
์์ ์ด๋ค.) Spring Boot 2.0 ์ดํ๋ถํฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ปค๋ฅ์
ํ์ด HikariCP๋ก ๋ณ๊ฒฝ๋์๋ค๊ณ ํ๋ค. (๋งํฌ) ์ปค๋ฅ์
ํ ์ข
๋ฅ์ค ์ฑ๋ฅ์ด ์ข๋ค๊ณ ํ๋๋ฐ ๋งํฌ๋ฅผ ๊ฐ๋ณด๋ฉด ๋ค๋ฅธ ์ปค๋ฅ์
ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๋ฅ์ ๋น๊ตํ ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค. ์์ฒ๋ผ spring.datasource.hikari ๊ฐ prefix๋ก ๋ถ๊ณ ๊ฐ์ข
์ ๋ณด๋ค์ ์ ์ด์ฃผ์ด config ์์ ์ธ์๋ ์ ์๋๋ก ํด์ฃผ์. ๊ทธ ๋ค์ DataSource ์ค์ ์ ํด์ค๋ค.
@Slf4j @Configuration @PropertySource("classpath:/application.properties") public class DatabaseConfiguration { @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public HikariConfig hikariConfig() { return new HikariConfig(); } @Bean public DataSource dataSource() { DataSource dataSource = new HikariDataSource(hikariConfig()); log.info("datasource : {}", dataSource); return dataSource; } } ์ ๋ด์ฉ์ DataSource ๋ฅผ hikariConfig์์ ์ค์ ํ ์ ๋ณด๋ก ๋ง๋ค์ด ์ค๋ค๋ ์๋ฏธ์ด๋ค. ์ด๋ ๊ฒ๋ง ํ๊ณ ํ๋ก์ ํธ๋ฅผ ๋ค์ ์คํ์์ผ๋ณด๋ฉด logger ์ ์ํด datasource ์ ์ ๋ณด๋ฅผ ๋ณผ์๊ฐ ์๋ค.
2019-04-22 00:27:35.048 INFO 23040 --- [ main] com.
IT ์ชฝ์ ์ผ์ ํ๊ณ ์๊ฑฐ๋ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์๋ ์ฌ๋์ด๋ผ๋ฉด ํ๋ฒ์ฏค์ ๋ค์ด๋ดค์ AWS(Amazon Web Services). ์ด๋ฆ์์๋ ์์์๋ ๊ฒ์ฒ๋ผ ์๋ง์กด์์ ์ ๊ณตํ๋ ๊ฐ์ข
์๊ฒฉ ์ปดํจํ
์น์๋น์ค์ด๋ค. ์๋ง์กด์ ์ด๋ฌํ ์๋น์ค๋ฅผ ๋๊ตฌ๋ ์ฝ๊ฒ ์ ๊ทผํด๋ณผ์ ์๋๋ก AWS ํ๋ฆฌํฐ์ด๋ฅผ ์ ๊ณตํด ์ฃผ๋๋ฐ ์ด ํ๋ฆฌํฐ์ด ๋ง์ผ๋ก๋ ๊ณผ๊ธ์์ด (๋๋ ์ต์ํ ํ์ฌ) ์น์๋น์ค๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค. ํ์๊ฐ ์ด์ํ๊ณ ์๋ ๊ธฐ์ ๋ธ๋ก๊ทธ ๊ตฌ๋
์๋น์ค๋ํ AWS ํ๋ฆฌํฐ์ด๋ก ์ด์๋๊ณ ์๋ค. ์ต๊ทผ GDG Seoul, P-typer, Sketch Seoul ์์ ์ฃผ์ตํ D.light 345 ํฌ๊ฒ๋ํค์ ์ฐธ๊ฐํ๋ฉฐ ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ํ๊ณ ์๋๋ฐ ๋ง์นจ AWS๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค. ์์ ์ ์ฌ์ฉํ์๋๋ ์ฅ๋ ์ฝ๋ผ๋ฆฌ ๋ง์ง๋ฏ์ด ์ค์ ์ ํ์๋๋ฐ ์ด๋ฒ๊ธฐํ๋ฅผ ํตํด ๋ค์ํ๋ฒ ์ ๋ฆฌ๋ฅผ ํด๋ณธ๋ค. ๋ณธ ํฌ์คํ
์์๋ AWS ๊ณ์ ์ ๋ฐ๊ธ๋ฐ๊ณ ์ ์ฉ์นด๋ ํ์ธ๊น์ง ๋ ๊ณ์ ์์ EC2 ์๋ฒ๋ฅผ ๋ฐ๊ธ๋ฐ๊ณ putty๋ฅผ ํ์ฉํ์ฌ ์๋ฒ์ ์ ๊ทผ์ ํด๋ณด๋๊ฒ์ ๋ชฉํ๋ก ๋๋ค.
(์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์) ์๋ง๋ ์น์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ฉด์ AWS๋ฅผ ํ์ฉํ๋ ๋ถ๋ถ์ ๋ํด ์๋ฆฌ์ฆ๋ฌผ๋ก ํฌ์คํ
์ ํ๊ฒ ๋ ๊ฒ ๊ฐ๋ค. ์ฌ์ค ๋๋ฌด ๊ฐ๋จํด์ ์ด๋ฐ๊ฑธ ๊ธ๋ก ์ฐ๋? ๋ผ๊ณ ํ ์๋ ์์ง๋ง ๋์ผ๋ก๋ง ๋ณด๋๊ฒ๊ณผ ์ง์ ํด๋ณด๋ ๊ฒ์ด ๋ค๋ฅด๊ณ , ์ด๊ฑธ ๋ค์ ๊ธ๋ก์จ ์ ๋ฆฌ๋ฅผ ํ๋๊ฒ ๋ํ ์์ ๋ค๋ฅธ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ํฌ์คํ
์ ํด๋ณธ๋ค.
EC2 ์์ฑํ๊ธฐ EC2? Amazon Elastic Compute Cloud์ ์ฝ์๋ก ๋ฌผ๋ฆฌ์๋ฒ๊ฐ ์๋ ํด๋ผ์ฐ๋ ์๋ฒ๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. EC2์ ์ฅ์ ์ ์๋ฒ์ ์คํ์ ์ฝ๊ณ ์์ ๋กญ๊ฒ ์กฐ์ ํ ์ ์๋์ ์ด ๊ฐ์ฅ ๋งค๋ ฅ์๊ฒ ์๊ฐํ๋ค. ์ฐ์ ์ฝ์์ ๋ค์ด๊ฐ EC2๋ฅผ ๊ฒ์ํ ์ ์์ ํ๊ณ ์ธ์คํด์ค ์์์ ๋๋ฌ์ ์ธ์คํด์ค ์์ฑ ํ๋ฉด์ผ๋ก ๋ค์ด๊ฐ๋ค.
AMI ์ฆ ์์ฑํ ์ด๋ฏธ์ง๋ฅผ ์ ํํ๋ ๋ถ๋ถ์ธ๋ฐ ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ์๋ชป์ ํ ํ๋ค๊ฐ ๊ณ์ ๋ง๋ค์์๋์ ์นด๋๋ก ์๊ฐ์ง๋ ๋ชปํ ๊ธ์ก์ด ๊ฒฐ์ ๊ฐ ๋๋ฒ๋ฆด์๋ ์๋ค. (์ค์ ๋ก ํ์๋ AWS๋ฅผ ์ฒ์ ๋ง์ ธ๋ณผ๋ ์๋ฌด์๊ฐ์์ด ์ข์๋ณด์ด๋๊ฑธ๋ก ํ๋ค๊ฐ ํ 30๋ฌ๋ฌ ์ ๋๋ฅผ ์ง๋ถํ์ด์ผ๋ง ํ๋ค…) ์ข์ธก์ ๋ณด๋ฉด ํ๋ฆฌ ํฐ์ด๋ง์ด๋ผ๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ฒดํฌํ๊ณ ์์ ์ด ์ํ๋ ์ด๋ฏธ์ง๋ฅผ ์ ํํ์. ์ผ๋ฐ์ ์ธ ๋ฆฌ๋
์ค ์๋ฒ๋ฅผ ๋ฐ๊ธ๋ฐ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๋นจ๊ฐ ์์ญ์ ์ด๋ฏธ์ง๋ฅผ ์ ํํ๊ณ ์ ํํ ์ด๋ฏธ์ง์ ์คํฉ์ ๋ค์ํ๋ฒ ํ์ธํ์. (cpu 1๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ 1๊ธฐ๊ฐ… ๋๋ฌด ์ง์ง๋ง ๋ฌด๋ฃ๋๊น…)
๋ง์ง๋ง์ผ๋ก ์์ํ๊ธฐ ๋ฅผ ๋๋ฅด๋ฉด ํค ํ์ด๋ฅผ ์ ํ ๋๋ ์์ฑํ๋๋ก ์๋ด๊ฐ ๋์ค๋๋ฐ ๋น์ฐํ ์๋ฌด๊ฒ๋ ์ํ ์ํ๋ผ ์ ํค ํ์ด ์์ฑ์ ์ ํํด ์ฃผ๊ณ ์ด๋ฆ์ ์ง์ ํ๋ค ํค ํ์ผ์ ๋ฐ์์ค๋ค. ์ด ๋ถ๋ถ์์๋ ์กฐ์ฌํด์ผํ ์ ์ด ํค ํ์ด๋ฅผ ํ๋ฒ ๋ค์ด ๋ฐ์ผ๋ฉด ๋ค์ ๋์ผํ ํค ํ์ด๋ฅผ ๋ค์ด๋ฐ์์๊ฐ ์๊ฒ ๋๋ค. (๋์ค์ ๋ค์ ๋ฐ๊ธ์ ๋ฐ์์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์ด ๋ฌธ์ ๊ฐ…) ๋ค์ด์ ๋ฐ๊ณ ์์ด๋ฒ๋ฆฌ์ง ์๋๋ก ์ ๋ณด๊ดํด๋์.
ํค ํ์ด๋ฅผ ๋ค์ด ๋ฐ์ผ๋ฉด ์์ฑ์ค์ด๋ผ๋ ๋ฉ์ธ์ง์ ํจ๊ป ๊ฒฐ๊ณผํ๋ฉด์ด ๋์จ๋ค. ์ฌ๊ธฐ์๋ ์ค์ํ ๋ถ๋ถ! ํ๋ฆฌํฐ์ด๋ผ๋ ๋ฌ์ฝคํ ํค์๋ ๋๋ฌธ์ ๋ค๋ฌ ๋ง์์ผ๋ก ์ฑ๊ธํ๊ฒ ๋นจ๋ฆฌ ์๋ฒ๋ฅผ ๋ฐ์๋ณด๊ณ ์ถ๋ค๊ณ ๋ค์๋ค์ ์ ๊ณต์ ํ๋ค๋ณด๋ฉด ์์นซ ๊ฐ๊ณผํ ์๊ฐ ์๋๋ฐ ํ๋ฉด์ ๋ณด๋ฉด ๊ฒฐ์ ์๋ฆผ ์์ฑ์ด๋ผ๋ ๋คํ์ค๋ฌ์ด ๊ธฐ๋ฅ์ด ์๋ค. ๋ณ ์ด๋ ค์ด ์ค์ ์ด ์๋๋ ๊ผญ ์ค์ ์ ํด์ ํ์๊ฐ์ด ๊ธฐ๋ถ(?)๋ฅผ ํ๋ ์ผ์ด ๋ฐ์ํ์ง ์์์ผ๋ฉด ํ๋ค…
EC2 ์ธ์คํด์ค๊ฐ ์์ฑ์ด ๋์๋ค. ์ธ์คํด์ค์ ๊ฐ์ข
์ ๋ณด๋ฅผ ํ์ธํ ์๊ฐ ์๋๋ฐ public IP, public DNS ๊น์ง ์ ๊ณต๋๋๊ฒ์ ํ์ธํ ์ ์๋ค. (์ถํ DNS๋ฅผ ๊ตฌ์
ํ๊ฒ ๋๋ค๋ฉด ์ด IP์ ์ฐ๊ฒฐ์ ์์ผ ๋๋ฉ์ธ์ผ๋ก ํด๋น ์๋ฒ์ ์ ์์ ํ ์๊ฐ ์๊ฒ ๋๋ค.)
putty ๋ก ๋ฐ๊ธ๋ฐ์ EC2 ์ธ์คํด์ค์ ์ ์์ ํด๋ณด์. ์ด์ ๋ฐ๊ธ๋ฐ์ EC2 ์ธ์คํด์ค์ ์ ์์ ํด๋ณผ ์ฐจ๋ก์ด๋ค. ๋ค์ํ ์๋ฒ ์ ์ํด์ด ์์ง๋ง ํ์๋ putty๋ฅผ ๊ฐ์ฅ ์ ํธํ๋ค. ๋์์ธ์ ๊ตฌ๋ฅ๋ค๋ฆฌ์ฒ๋ผ ๋ณด์ผ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ์ง๊ด์ ์ธ UI์ ๊ฐ๋ฒผ์ด ํ๋ก๊ทธ๋จ์ด๋ผ ์๊ฐ์ด ๋ ๋ค. ์ฐ์ putty๋ฅผ ๋ค์ด ๋ฐ๊ณ putty.exe๋ฅผ ์คํ์ํจ๋ค์ ๋ฐ๋ก ssh ์ ์์ ํ๋ฉด ๋๋ฌด ๊ฐ๋จํ๊ฒ ์๋ฒ ์ ์์ ์ฑ๊ณต์ ํ ์ ์์ง๋ง ์์์ ๋ฐ์ ํค ํ์ด ํ์ผ์ ๋ค์ private key ๋ก ์ ํํด์ผ ํ๋๋ฐ putty๋ฅผ ๋ค์ด๋ฐ์ผ๋ฉด ๋์ผํ ํด๋์ puttygen.exe๋ผ๋ ํ์ผ์ ์คํ์์ผ์ฃผ์. ๊ทธ๋ค์ pemํ์ผ์ ๋ถ๋ฌ์์ ๋ง์ฐ์ค๋ฅผ ์์ง์ฌ์ ๊ฒ์ด์ง(?)๋ฅผ ๋ค ์ฑ์ฐ๊ณ save private key๋ฅผ ์ค๋ฌ ์ ์ฅ์ ํ๋๋ฐ ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ppkํ์ผ๋ช
์ pemํ์ผ๋ช
๊ณผ ๋์ผํ๊ฒ ์ ์ฅํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. (์๊ทธ๋ฌ๋ฉด ์๋ฒ ์ ์์ ์คํจ๊ฐ ๋จ… ์ฝ์ง…)
putty.exe๋ฅผ ์คํ์ํจ๋ค Connection > SSH > Auth ํญ์์ ๋ฐฉ๊ธ ๋ง๋ค์ด ๋์ ppkํ์ผ์ ๋ถ๋ฌ์ค๊ณ , ๋ค์ Sessionํญ์์ host name ์ ์
๋ ฅํด์ฃผ๊ณ ์ ๋นํ ์ด๋ฆ์ผ๋ก ์ ์ฅ์ ๋๋ฌ์ค๋ค.
ํ์๋ ElasticStack์ ์ฌ์ฉํ๋ฉด์ ์ฒ์ ์นดํ์นด๋ฅผ ์ ํ๊ฒ ๋์๋ค. ๋ฉ์ธ์ง ํ ๋ผ๋ ๊ฐ๋
๋ ์ ํ ๋ชจ๋ฅด๋ ์ํ์์ ์ค์น๋ถํฐ ElasticStack ์ฐ๋๊น์ง ์ฌ์ฉํ๋ฉฐ ์ ๋ง ๊ฐ์ ๋ก ์นดํ์นด์ ๋ํด ๊ณต๋ถ๋ฅผ ํ๊ฒ ๋์๋ค. ์นดํ์นด๋ฅผ ์์ฃผ ๋ค๋ฃจ๊ณ ๋ฉ์ปค๋์ฆ์ ๋ํด ์์ธํ ์ดํด๋ณด๋ค ์ ๊น ํด์ดํด์ง ๋ฌด๋ ต ์นดํ์นด ํ๊ตญ ์ฌ์ฉ์ ๋ชจ์์์ ๋ฐ์
์ ํ๋ค๊ณ ํ๊ธธ๋ ๋น์ ์๋๋ก ์ ์ฒญ, ์๋ง๋ 1๋ฑ์ผ๋ก ์ ์ฒญํ์ง ์์์๊น ์ถ๋ค.์ฌ์ค ์๋
์นดํ์นด ๋ฐ์
์ ๋ชป๊ฐ๊ฒ ๋๋ฌด ํ(?)์ด ๋์ด ์ด๋ฒ์ ํ์ฌ ์
๋ฌด ๋ฑ ์ฌ๋ฌ๊ฐ์ง๋ก ํ์ฐฝ ๋ฐ์์ง๋ง “์ง๊ธ์ด ์๋๋ฉด ์๋ผ” ๋ผ๋ ์๊ฐ์ผ๋ก ๋ฐ์
์ ๋ค๋
์๊ณ , ์งง์ง๋ง ํ๊ธฐ๋ฅผ ์์ฑํด ๋ณด๊ณ ์ ํ๋ค.
(์์ฆ ์ ์ด๋ ๊ฒ ๋ฐ์์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง… ์ ๊ธฐํ๊ฒ๋ ๊ทธ ๋ฐ์ ์ผ์ ๋ค์ด ํ๋๋ ๊ฒน์น์ง ์๋๊ฒ ๋ ์ ๊ธฐํ๋ค… )
์ผ์ฑ SDS ๊ฑด๋ฌผ์์ ์งํ๋ ์นดํ์นด ๋ฐ์
" ์ผ์ฑ SDS ๊ฑด๋ฌผ์์ ์งํ๋ ์นดํ์นด ๋ฐ์
์ฐธ๊ณ ๋ก ํ์๋ ์นดํ์นด์ ๋ํด ์์ฃผ ์กฐ๊ธ ๊ฑด๋๋ ค๋ณธ ์์ค์ด๋ผ ๋ฐํํ์๋ ๋ถ๋ค์ ์ ๋ถ๋ฅผ ์ต๋ํ๊ธฐ์ ๋ค์ ๊ทธ๋ฆ์ด ์์์ ์ผ๋ถ ์ธ์
์ ๊ฑฐ์ “๊ทธ๋ฐ๊ฐ๋ณด๋ค~” ํ๊ณ ๋ค์ ์ ๋ฐ์ ์์๋ค. ํ๊ธฐ๋ ์๋ง ๊ทธ๋ฐ ๋งฅ๋ฝ์ผ๋ก ์์ฑํ ๋ฏ ์ถ๋ค.
Kafka ํ๊ตญ ์ฌ์ฉ์ ๋ชจ์ ๋งํฌ : https://www.facebook.com/groups/kafka.kru ์นดํ์นด๋ฅผ ํ์ฉํ ์บ์ ๋ก๊ทธ ์ฒ๋ฆฌ - ๊นํ์ค(์นด์นด์ค) ์ด๋ฏธ์ง ๋ฑ ์บ์์๋ฒ์ ๋ก๊ทธ๋ฅผ ๋ถ์ํ๊ธฐ ์ํ ์์คํ
์ ๊ตฌ์ถํ๋๋ฐ ElasticStack ์ ํ์ฉ Elasticsearch ๋ก ๋ฆ๊ฒ ๋ค์ด์์ ์ฌ๋ก๋ฅผ ์ฐพ์๋ณด๋ ๋์ฉ๋ ๋ก๊น
์ฒ๋ฆฌ์ ์๋จ์ ๋ฉ์ธ์ง ํ๋ฅผ ๋ฌ์ผ ํ๋ค๊ณ ํ๊ณ ๊ทธ๊ฒ ์นดํ์นด ์นดํ์นด ๋ชจ๋ํฐ๋ง์ ๊ทธ๋ผํ๋๋ก ํ์ฉ lag์ด ์๊พธ ์๊น ํํฐ์
์ ์ชผ๊ฐ๊ฑฐ๋, ์ปจ์๋จธ๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ด ์์ auto.commit.interval.ms ์ enable.auto.commit=true ๋ก ์กฐ์ interval์ ์ค์ด๋ lag์ด ์ค์ด๋ฌ ํ์ฌ๋ ์๋ฐฑ๋ ์บ์์๋ฒ์ ๋ก๊ทธ๋ฅผ ์ด๋น 15๋ง๊ฑด ์ด์ ์ฒ๋ฆฌ์ค ์ง๋ฌธ์ ํ๋ค. ํ์๋ lag์ด ๋์์ง๋ฉด ์ด์ฉ์ง ํ๋ ๋ถ์๊ฐ๊ณผ ๋์์ง๋ฉด ์ปจ์๋จธ๋ฅผ ๋๋ฆฌ๋ฉด ๋๊ฒ ์ง ํ๋ ๋ง์ฐํจ์ด ์์๋๋ฐ commit interval์ ์ค์ด๋ฉด lag์ด ์ค์ด๋ ๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด ์ค์ด๋ฉด ์ข์๊ฐ์ ๋ต๋ณ์ ์นดํ์นด๋ฅผ ๊ด๋ฆฌํ๋ ์ฃผํคํผ์ชฝ์ ๋ฌด๋ฆฌ๊ฐ ๊ฐ๋ค๊ณ ์ค๋ช
ํด ์ฃผ์
จ๋ค. ์ญ์ ๋ง๋ณํต์น์ฝ์ ์๊ณ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์์คํ
๊ด๋ฆฌ์๊ฐ ์กฐ์ ํด๊ฐ๋ฉฐ ์ด์ํด์ผ ํ๋์ ์ ๋๊ผ๋ค.
์ฐธ๊ณ URL : https://kafka.apache.org/documentation/#adminclientconfigs ์นดํ์นด๋ฅผ ํ์ฉํ ์๋ผ์คํฑ์์น ์ค๋ฌดํ๋ก์ ํธ ์๊ฐ - ์ด์ํ(๋ฉ๊ฐ์กด) ์นด๋์ฌ์ ํ๋ก์ ํธ๋ฅผ ์ฝ 3๊ฐ์๊ฐ ๊ฐ๋ฐํ์๊ณ ์ ์ฒด ์ํคํ
์ณ ์ค์ ์ผ๋ถ๋ถ์ kakfa๋ฅผ ํ์ฉ Elasticsearch ๋ฐ์ดํฐ๋ฅผ hadoop์ ๋ฐฑ์
ํํ๋ก ์ฎ๊ธฐ๋ฉฐ ๊ด๋ฆฌ filebeat > kafka > spark streaming ์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ์ ๊ฒ์ฆ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅ (ํน์ ์ํฉ์์์ ๊ด๋ฆฌ์์๊ฒ ์๋ฆผ ๋ฑ) logstash ์ ruby ํํฐ๋ฅผ ํ์ฉํ์ฌ ์ผ์ ์ ์์
์ ํด์ฃผ๋ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ ๊ฐ๋ฅ (๊ฐ์ธ์ ๋ณด ์๋ณ ๋ฑ) logstash ๋ cronํํ์ ๋ฐฐ์น๋ก๋ ๊ฐ๋ฅ ๋ ์ง๋ฌธ์ ํ์๋ค. (์นดํ์นด ๋ฐ์
๊ณผ๋ ๋ฌด๊ดํ์ง๋ง…) logastsh ๋ฅผ ์ฌ์ฉํ๋ฉด์ ํํฐ์ชฝ์ ๋ก์ง์ด ๋ค์ด๊ฐ๋ฉด ์ฑ๋ฅ์ ๊ด์ฐฎ๋๋ ์ง๋ฌธ์ ํ๋ฃจ์ 15์ต๊ฑด์ ์ฒ๋ฆฌํ๊ณ ์๊ณ ๋ฌธ์ ๊ฐ ์์๋ค๊ณ ํ๋ค. ํ์๋ ์ํ์น ์์ธ์ค ๋ก๊ทธ๋ฅผ logstash๋ก ์ฒ๋ฆฌํ๋ฉด์ ๊ฐํน ๋ป๊ฑฐ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ ์๋ง ํ์ผ์ logstash๊ฐ ์ง์ ๋ฐ๋ผ๋ณด๊ณ ์ฒ๋ฆฌ๋ ํ๊ฒํด์ ๊ทธ๋ฐ๊ฒ ๊ฐ๋ค. (์ง๊ธ์ filebeat๊ฐ shipper ์ญํ์ ์ํํ๊ณ ์๊ณ ํฐ ๋ฌด๋ฆฌ ์์ด ์ด์์ค)
์นดํ์นด๋ฅผ ํ์ฉํ rabbitMQ ๋ก๊ทธ์ฒ๋ฆฌ - ์ ์๋น (์นด์นด์ค) ๋ ๋น์ ํ๋ erlang์ผ๋ก ๊ตฌํ๋ AMQP ๋ฉ์์ง ๋ธ๋ก์ปค์ด๊ณ TCP๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ Kafka ๋ ๊ฒ์ผ๋ฅด์ง๋ง ๋ฉ์ฐ ํจ์จ์ฑ์ด ๋ฐ์ด๋จ, ๋ฐ๋ฉด RabbitMQ ๋ ๋๋ํ์ง๋ง ๋ณด๋ค ๋๋ฆผ Kafka ์์ Elasticsearch ๋ก์ ingset ๋ NIFI๋ฅผ ํ์ฉ ๋ ๋น์ ํ์ ์นดํ์นด์ ์ฐจ์ด Kafka RabbitMQ ์ปจ์๋จธ ์ถ๊ฐ ์ฌ๋ฌ ์ปจ์๋จธ๊ฐ ํ๋์ ๋ฉ์ธ์ง๋ฅผ ๋์์ ํ ์ ์์ด ํ์ฅ์ ์ฉ์ดํจ ํ์ฅํ ๋๋ง๋ค ํ๋ฅผ ์ถ๊ฐ ์์ฑํด์ผํจ ๋ฉ์ธ์ง ์ ์ฅ ๋ก๊ทธ๊ธฐ๋ฐ์ผ๋ก ๋์คํฌ์ ์ ์ฅ, ๋ฆฌํ
์
์ดํ ์ญ์ ํ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ ์ปจ์๋จธ๊ฐ ๋ฉ์ธ์ง ์์ ์ ์ฆ์ ์ญ์ ๋ฉ์ธ์ง ์ฒ๋ฆฌ ๋ฐ์กํ์ธ ๊ฐ๋ฅ / ์์ ํ์ธ ๋ถ๊ฐ๋ฅ ๋ฐ์กํ์ธ/์์ ํ์ธ ๊ฐ๋ฅ ์นดํ์นด๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ณ์ ํ์ฉํ๊ธฐ - ์ด๋์ง (์ํ์น ์ํํธ์จ์ด ํ์ด๋ฐ์ด์
) ์นดํ์นด ์คํธ๋ฆผ์ฆ ์๊ฐ (Interactive Query) ์นดํ์นด๋ฅผ ํ์ฉํ์ฌ ๋ง์ดํฌ๋ก์๋น์ค์์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ์์ ๊ณต๊ฐ์ ๋ฃ์ด๋๊ณ (redis ๊ฐ์?
ํ์๋ ํ์ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฅ ์ค์ํ ๋๋ชฉ ์ค ํ๋๊ฐ ๊ธ์ฐ๊ธฐ๋ผ๊ณ ์๊ฐํ๊ณ ์๋ค. ๋ง์นจ ๊ธ์ฐ๊ธฐ์ ๊ธฐ์ ์ ์ ์ ์ ๊ณ ๋ฏผํ๊ณ ์ด์ผ๊ธฐํ๋ “Write The Docs ์์ธ ๋ฐ์
”(๋งํฌ) ์ด ์๋ค๊ณ ํ์ฌ ์ฌ๊ณ ์ถ๋ ์ฃผ๋ง์ด์ง๋ง ๋ง์ฌ๋ฅผ ์ง์ด์น์ฐ๊ณ ์ฐธ์ํ๊ฒ ๋์๋ค. ์ฌ์ค ์ฐ์์ธ ๊ฐ๋ฐ์๋ถ๋ค์ ์ง์ ๋ง๋ ์ ์๋ค๋ ๊ธฐ๋๊ฐ๋ ์์๊ธฐ ๋๋ฌธ์ด๋ค. (๋ฐํํ์๋ ๋ฐ๋ก ์์๋ฆฌ์ ์์๋๋ฐ ์ ์ ํ๋ง๋๋ ๋ชป ๊ฑด๋ธ์ง๋ง…)
๋ฐ์
๊ฐ๋ฅ๊ธธ ๋ฌธ๋ ๋๋ฅผ ์ฌ๋ก์ก์๋ ๋ฌธ๊ตฌ์ ๋ฐ์
์ฅ์ ๋ง๋ฃจ 180" ๋ฐ์
๊ฐ๋ฅ๊ธธ ๋ฌธ๋ ๋๋ฅผ ์ฌ๋ก์ก์๋ ๋ฌธ๊ตฌ์ ๋ฐ์
์ฅ์ ๋ง๋ฃจ 180 ๋ฐํ์ ์์ “์ด ๋ฐํ ์๋ฃ๋ ๊ณต๊ฐํ ์์ ์ด๋ ํ๊ธฐํ์ค ํ์๊ฐ ์๋ค"๋ผ๊ณ ํ์
จ๋ค. ํ์ง๋ง ๋คํต์๋ฅผ (์ข์ ์๋ฏธ) ๋ช ๋ ์๋ ๋ช์ญ๋ ๋ง์ ๋๋์ด๋ผ ์ ๋ฆฌ๋ฅผ ํ์ง ์์ ์๊ฐ ์์๊ณ ์ค๋ ๋๋ผ๊ณ ๋ฐฐ์ด ๋ง์์ ์ญ ์ ์งํ๊ณ ์ถ์ด(๋ด ๊ฒ์ผ๋ก ๋ง๋ค๊ณ ์ถ์ด) ํ๊ธฐ๋ฅผ ์์ฑํด ๋ณธ๋ค. ๋๋ถ์ด ์ ๋ชฉ์ ๊ฐํ ๊ฐ๋ฐ์ ๊ฐ์ถ!๋ผ๊ณ ์ ์๋งํผ ์ต๊ทผ ๋ฐ์
ํ์ฌ ์ค์ ์๊ผฝ์ ์ ๋๋ก ์ข์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ๋๋ก ์๊ฒ ๋ง์๊ฑด ์๋๋ค…์ถ์ฒ : https://namu.moe/w/๋คํต์" ์ด์ ๋๋ก ์๊ฒ ๋ง์๊ฑด ์๋๋ค…
์ถ์ฒ : https://namu.moe/w/๋คํต์ ๋ณ์ฑ์ค(์์นด) - ๊ธ์ฐ๋ ๊ฐ๋ฐ์ ๋ชจ์, ๊ธ๋ ๋ณ์ฑ์ค ๋" ๋ณ์ฑ์ค ๋ ํ์๋ ๊ฐ์
๋ง ํ๊ณ ํ๋์ ์ ํ๋ ์ค์ธ “๊ธ ์ฐ๋ ๊ฐ๋ฐ์ ๋ชจ์ - ๊ธ๋” ๋ชจ์์ ๋ํด ์๊ฐํด์ฃผ์
จ๋ค. ๊ธ์ ๊พธ์คํ ์์ฑํ๊ธฐ ์ํด ๋ง๋ค์๊ณ , ์ผ์ ์ ์์น๊ธ์ ๋ด๊ณ ์ ํด์ง ๊ท์น์ ์ํด ๋ธ๋ก๊ทธ์ ๊ธ์ ์ฌ๋ฆฌ๋ฉด ๋ค์ ๋์ ํ๊ธ๋ฐ๋ ๋ฐ๊ฐ์ ์ ์ธ ๋ชจ์์ด๋ผ๊ณ ํ๋ค. ๊ทธ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ๋ค์ด ๊ธ์ ์จ์ ๊ณต์ ๋ฅผ ํ๋ฉด ์ฑ์ค๋์ด ์ง์ ํผ๋๋ฐฑ์ ์ฃผ๋ฉฐ ๊ฐ๋ฐ ์ ๋ฆฌํฉํ ๋ง์ ํ๋ฏ ๋ ๋์ ํ์ง์ ๊ธ์ ์ธ ์ ์๋๋ก ๋์์ ์ฃผ๊ณ ์๋ค๊ณ ํ์ ๋ค. ์ด๋ฌํ ํผ๋๋ฐฑ ๋ฌธํ๊ฐ 1:N์ด ์๋ N:N์ด ๋๋ฉด ๋ ๋ค๋ฅธ ๋๊ธฐ๋ถ์ฌ๊ฐ ๋ ๊ฒ ๊ฐ์๋ฐ … ํ๋ ์์ฌ์์ ๋๊ผ๋ค. ์ฌ์ค “๊ธ์ ๊พธ์คํ ์์ฑ"ํ๋ ๋ถ๋ถ์ด ํ์๋ ๋งค์ฐ ๊ณต๊ฐ์ด ๋๋ค. ๋ฐ์๊ณ , ๊ท์ฐฎ๊ณ , ๊ธ์ ์ฐ๋ ค๋ฉด ์์ฌ์ด ์๊ธฐ๊ณ ๊ทธ๋ฌ๋ค ๋ฏธ๋ฃจ๊ณ … ๊ทธ ๋๊ธฐ๋ถ์ฌ๊ฐ “๋” ์ผ์๋ฐ์ ์๋ ํ์ค์ด ์์ฝ๊ธด ํ๋ฐ ์คํ๋ ค ๊ทธ “๋"๋งํผ ๋๊ธฐ๋ถ์ฌ๊ฐ ์ ๋๋ ๊ฒ๋ ์์๊ฒ ๊ฐ๋ค. (ํฌ์ค์ฅ 1๋
๊ถ ๊ณ์ฝํ๊ณ ๋์ด ์๊น์์๋ผ๋ ๋๊ฐ๋ ๋๋์ผ๋ก…) ์ฌํด ์๋ก์ด ๊ธฐ์๋ฅผ ๋ชจ์งํ๋ค๊ณ ํ๋ ๊ทธ๋๋ ๊ผญ ์ง์ํด์ ๊ธ์ ๊พธ์คํ ์ฐ๋ ์ต๊ด์ ๊ธธ๋ฌ๋ณด๊ณ ์ถ๋ค.
๊น๋๊ถ(๋น๊ทผ๋ง์ผ) - ๊ธฐ์ ๋ธ๋ก๊ทธ ์์กด ์ ๋ต : ๊ตฌ๊ธ ์๋์ ๊ธ์ฐ๊ธฐ ๊น๋๊ถ ๋" ๊น๋๊ถ ๋ ์ผ๋ง ์ ์ ํ๋ฒ ์ฑ ๋ณด๊ณ ์ ๋
ํ ์๋ฐ์ ์๋ ํฌ์คํ
์ธ [์ข์ ๊ธฐ์ ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค์ด ๋๊ฐ๊ธฐ ์ํ 8๊ฐ์ง ์ ์ธ](https://www.44bits.io/ko/post/8-suggestions-for-tech-programming-blog ์ ์์ฑํ์๊ณ , ํด๋น ๊ธฐ์ ๋ธ๋ก๊ทธ ๋ฅผ ์ด์ํ์๊ณ ๊ณ์๋ ๊น๋๊ถ ๋๊ป์ ๊ธ์ ์ ์ฐ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ํ๋ฉด ์ฌ๋๋ค์๊ฒ ์ ์ฝํ ์ ์์์ง์ ๋ํด ๊ตฌ๊ธ ๊ฒ์์์ง ๊ด์ ์์ ์ ๋ฆฌํด์ฃผ์
จ๋ค. ์ฐ๋ฆฌ๋ ๋ณดํต ์ฝํ๊ธฐ ์ํด ๊ณต๊ฐ๋ ๊ธ์ ์ฐ๊ธฐ ๋๋ฌธ์ ์ข์ ๊ธ์ ์ฐ๋ ๊ฒ ์ ํ๋์ด์ผ ํ์ง๋ง ๋ฐ๋๋ก ์ด๋ป๊ฒ ํ๋ฉด ์ ์ฝํ ์ ์์์ง์ ๋ํด ๊ณ ๋ฏผ์ด ํ์ํ ๋ถ๋ถ ๊ฐ๋ค. ์์ฆ์ ์์
๋ฏธ๋์ด๋ ๊ฒ์์ ํตํด ๊ธ์ด ๊ณต์ ๋๊ณ ๊ฒ์๋๋๋ฐ ์ฅ๊ธฐ์ ์ผ๋ก ๋ดค์ ๋๋ ๊ฒ์์์ง์ ๋
ธ์ถ์ด ๋ผ์ผ ํ๋ค๊ณ ํ์ ๋ค. ๋ํ ๊ฒ์์์ง์ ๋ฐฑ๊ณผ์ฌ์ ์ฒ๋ผ ์ ๋ต์ ์๋ ค์ฃผ๋๊ฒ์ด ์๋ “๊ฑฐ๋ํ ์ถ์ฒ ์์คํ
"์ ๊ด์ ์ผ๋ก ์ ๊ทผํด์ผ ํ๋ฉฐ, ๊ธ์ ์์ด ๋๋ฌด ํฌ๊ฑฐ๋ ์ ์ผ๋ฉด ์ ๋๊ณ ์ ๋นํ(?) ์์ค์ ์ง์ผ์ผ ์ด๋ฅผ ๊ฒ์์์ง์ด ์์์ ํ๋จํ๋ค๊ณ ํ๋ค. ๋ํ [What nobody tells you about documentation (๋ฒ์ญ๋ณธ)](http://blog.weirdx.io/post/60414 ์ด๋ผ๋ ๊ฒ๋ ์๊ฐํด์ฃผ์๋ฉฐ ๊ฒฐ๊ตญ์ ๊ธ ๋ด์ฉ์ ์์ฒด๊ฐ ์ข์์ผ ํ๋ค๊ณ ์ฌ์ฐจ ๊ฐ์กฐํ์
จ๋ค. (๋งค์ฐ ๊ณต๊ฐ, SEO ์๋ฌด๋ฆฌ ์ ์ค์ ํด๋ดค์ ๋ด์ฉ์ด ์ ์ข์ผ๋ฉด ๋ง์งฑ ๊ฝ)
ํ์ฐ์(LINE) - To. ์ง์ ๊ณต์ ๋ฅผ ์์ํ๋ ค๋ ๊ฐ๋ฐ์, From. ๋น์ ์ ๋ ๋ ํ ์ํฌํฐ Developer Relationsํ ํ์ฐ์ ๋" ํ์ฐ์ ๋ ๋ค์ ์์ํ Developer Relations ํ์ ๋ํด ์๊ฐ๋ฅผ ํด์ฃผ์๋ฉฐ ๊ผญ ๊ธฐ์ ๊ด์ ์ด ์๋ ๋ค์ํ ๋ถ์ผ์์ ํด๋น ํ์ด ์ด๋ค ์ง์์ ํด์ฃผ๊ณ ์๋์ง์ ๋ํด ์๋ ค์ฃผ์
จ๋ค. ๊ธฐ์ ๋ธ๋ก๊ทธ ์ด์, ์์
ํ์ด์ง ๊ด๋ฆฌ, ๊ฐ๋ฐ ์ปจํผ๋ฐ์ค, ์ธ๋ฏธ๋, ์ปค๋ฎค๋ํฐ ํ์ ๋ฑ๋ฑ ๊ฐ๋ฐ์์ ๊ฐ๋ฐ ๋ฌธํ๋ฅผ ์๋ฆฌ๋ ๋ชจ๋ ์ผ์ ํ๊ณ ์๋ค๊ณ ํ๋ค.
์ด๋ ํ ์์
(Job)์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด๋ฅผ “์ ํด์ง ์๊ฐ์ ์ฃผ๊ธฐ์ ” ์ด๋ “ํ์ํ ๋” ์์
์ ์ํํ๊ณ ์ถ๋ค๋ฉด ์ด๋ค ํด(Tool)์ด ๋ ์ค๋ฅด๋๊ฐ? ๊ทธ๋ฆฌ๊ณ ์ด ์์
(Job)๋ค์ ์คํ์ด๋ ฅ ๋ฑ ์ ์ฒด์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ํ์์ ๋ฐ๋ผ ๋ค์ํ ํ๋ฌ๊ทธ์ธ์ ํ์ฉํ์ฌ ์
๋ง์ ๋ง๋ ์์
(Job)์ผ๋ก ๊ตฌ์ฑํ๊ณ ์ถ์๋ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ๋ก ๋ ์ค๋ฅด๋ ํด์ ๋ฐ๋ก “Jenkins” ๋ค. (๊ทนํ ํ์ ๊ฐ์ธ์ ์ธ ์๊ฐ์ผ์๋ ์์ง๋ง… ) ๋ฌผ๋ก ๋ฆฌ๋
์ค ๊ธฐ๋ฐ์ crontab ์ด๋ ๋ค๋ฅธ ์ค์ผ์ฅด๋ฌ๋ฅผ ํ์ฉํ ์๋ ์๋ค. ๋ค๋ง ํ์ ๊ฐ์ธ์ ์ธ ๋๋์ผ๋ก ๋๋ง์ Jarvis(?)์ฒ๋ผ ๋ด๊ฐ ์ํ๋๋ฐ๋ก ์ค์ ๋ง ํด๋๋ฉด ์ ํด์ง ์๊ฐ์ ์ํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ฒจ๋๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ ์๋ฆผ๋ ๋ฐ์์ ์์ผ๋ ๋๋ฌด ์ข์ ํด์ด๋ผ ์๊ฐ์ด ๋ ๋ค.
์ค์ ๋ก Jarvis๊ฐ ์๋ค๋ฉด ์ผ๋ง๋ ํธํ ๊น์ถ์ฒ : https://gfycat.com/ko/colossalsociablebuffalo" ์ค์ ๋ก Jarvis๊ฐ ์๋ค๋ฉด ์ผ๋ง๋ ํธํ ๊น
์ถ์ฒ : https://gfycat.com/ko/colossalsociablebuffalo ์ง๋ ํฌ์คํ
์์๋ Jenkins ๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์๋ค. (์ ํํ ๋งํ๋ฉด ์นํธํค ์์ค์… ) ์ด๋ฒ ํฌ์คํ
์์๋ Jenkins์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ์ฌ master-slave ๋ถ์ฐํ๊ฒฝ์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ Jenkins ๋ฒ์ ์ ์
๊ทธ๋ ์ด๋ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
๋ง์นจ ํ์์ ํ์์ ์ ํจ์ค๋ฅผ ๋ถ์ฐํ๊ฒฝ์ผ๋ก ์ด์ํ๊ณ ์์๋๋ฐ ๋ฒ์ ์ 1.x … ๊ฐํ์ ์ผ๋ก Jenkins ๋ฒ์ ์ด์๋ก ์๋ฌ๊ฐ ๋ฐ์ํด์ ์
๊ทธ๋ ์ด๋๋ฅผ ํด์ผํ๋ ์ํฉ์ด ์๊ธด๊ฒ์ด๋ค. ์ํค์ง๋ ์์ ์ผ์ ํ๋ฉด์ ํ์ ๋์๋ ๋ ๊ฒธ, ํฌ์คํ
๋ ํ ๊ฒธ, 1์ 2์กฐ ํจ๊ณผ. ์๋ฒ ํ๊ฒฝ์ CentOS 7.4 64Bit ์์ ํ
์คํธ ํ์๋ค.
Jenkins ๋ฒ์ ์
๊ทธ๋ ์ด๋ ํ๊ธฐ Jenkins๋ฅผ ์
๊ทธ๋ ์ด๋ ํ๊ฒ๋๋ฉด ๊ธฐ์กด์ ์์๋ Jenkins์ ํ๊ฒฝ์ค์ ์ ์ด๋ป๊ฒ ๋ง์ด๊ทธ๋ ์ด์
ํ ๊น? Job ์คํ๊ธฐ๋ก๋ค์ ๊ทธ๋ฅ ๋ ๋ ค๋ฒ๋ ค์ผ ํ๋? ๊ฑฑ์ ์ ํ๋ฉฐ ๊ตฌ๊ธ๋ง์ ํด๋ณธ๋ค. ๊ทธ๋ฌ๋ฉด “์ํด๋ณธ๊ฒ์ ๋ํ ๋๋ ค์” ์ ๊ฐ๋ ํ์์ ๋ง์์ด ๋ฌด์ํ ์ ๋๋ก ๋๋ฌด ๊ฐ๋จํ๊ฒ๋ ๊ทธ๋ฅ ๊ธฐ์กด์ ์๋ war ํ์ผ์ ์ต์ ๋ฒ์ ์ผ๋ก ๊ต์ฒดํ๊ณ ์ฌ์์ ํ๋ผ๊ณ ๋์จ๋ค. ์ญ? ๋ญ์ด๋ฆฌ ๊ฐ๋จํด? ๋๋ถ๋ถ์ ๋ฌธ์ ๋ค์ ์ง๋ ๊ฒ๋ถํฐ ๋จน๊ณ ์คํ์ ์ฎ๊ธฐ์ง ๋ชปํด์ ์์์ ํด๊ฒฐ์ ํ์ง ๋ชปํ๋๊ฒ ์ ๋ฐ ์ด์๊ฐ๋ค. ์, ๋ฐ๋ก ์คํ์ ์ฎ๊ฒจ๋ณด์. ์ฐ์ ๋ฒ์ ์
๊ทธ๋ ์ด๋๋ฅผ ํ
์คํธ ํ๊ธฐ ์ํด ์ผ๋ถ๋ฌ ๋ฎ์๋ฒ์ ์ผ๋ก ์ค์น๋ฅผ ํด๋๋ค. (ํ์๋ 1.609.1๋ก ์ค์นํด๋ดค๋ค.) ๊ทธ๋ฆฌ๊ณ ๋ฒ์ ์
๊ทธ๋ ์ด๋ ํ ์ค์ ์ด ๊ทธ๋๋ก ์ฎ๊ฒจ์ง๋์ง๋ฅผ ํ์ธํ๊ธฐ์ํด Security ์ค์ ์ ํด์ Jenkins ์ ๊ทผ์ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ๋ฌผ์ด๋ณด๋ก ์ค์ ํด๋๋ค.
์ฐ์ธก ํ๋จ์ ๋นจ๊ฐ์์ญ์ผ๋ก ๋ฎ์๋ฒ์ ์ด ์ค์น๋๊ฒ์ ํ์ธํ ์ ์๋ค." ์ฐ์ธก ํ๋จ์ ๋นจ๊ฐ์์ญ์ผ๋ก ๋ฎ์๋ฒ์ ์ด ์ค์น๋๊ฒ์ ํ์ธํ ์ ์๋ค. ์ค์ ์ด ์๋ฃ๋์์ผ๋ฉด ์ต์ ๋ฒ์ ์ war๋ฅผ ๋ค์ด๋ฐ์ ๊ต์ฒดํ๊ณ ์ฌ์์์ ํด์ค๋ค. ๊ทธ๋ฌ๋ฉด ๋๋ฌด๋๋ ๊ฐ๋จํ๊ฒ ๋ฒ์ ์ด ์
๊ทธ๋ ์ด๋๊ฐ ๋๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒ์์ ์ค์ ํ Security ์ค์ ๊น์ง ๊ทธ๋๋ก ์ ์ง๋๋๊ฒ ๋ํ ํ์ธ์ด ๊ฐ๋ฅํ๋ค. ๋ฌผ๋ก ๊ตฌ ๋ฒ์ ์์ ์ค์น๋์๋ ํ๋ฌ๊ทธ์ธ๋ค์ด ๋ฒ์ ์
์ด ๋๋ฉฐ ๊ทธ์ ๋ฐ๋ผ ์ง์ํ์ง ์๋ ๋ฌธ์ ๋ค์ด ์๊ธธ ์ ์๋๋ฐ ์ด ๋ถ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ์
๊ทธ๋ ์ด๋๋ฅผ ํด์ค๋ค๊ฑฐ๋ ๊ฐ ์ํฉ์ ๋ง๋ ๋์์ ํด์ค์ผ ํ๋ค. ์ด๋ ๊ฒ ํด์ ์๊ฐ๋ณด๋ค(?) ๋๋ฌด ๊ฐ๋จํ๊ฒ ๋ฒ์ ์
์ด ์๋ฃ๋์๋ค.
์
๊ทธ๋ ์ด๋ ํ ํ๋ฌ๊ทธ์ธ ์
๊ทธ๋ ์ด๋๋ ๋์ผํ๊ฒ ๋ง์ถฐ์ฃผ๋๊ฒ ์ค์ํ๋ค." ์
๊ทธ๋ ์ด๋ ํ ํ๋ฌ๊ทธ์ธ ์
๊ทธ๋ ์ด๋๋ ๋์ผํ๊ฒ ๋ง์ถฐ์ฃผ๋๊ฒ ์ค์ํ๋ค. Jenkins ๋ถ์ฐํ๊ฒฝ ๊ตฌ์ฑํ๊ธฐ (๋
ธ๋ ์ถ๊ฐํ๊ธฐ) ์ด๋ฒ์ Jenkins๋ฅผ ๋ถ์ฐํ๊ฒฝ์ผ๋ก ๊ตฌ์ฑํด๋ณด๊ณ ์ ํ๋ค. ์ด๋ ๊ฒ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ฉฐ ๋ถ์ฐํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ์ด์ ๋ ๋ง์คํฐ-์ฌ๋ ์ด๋ธ(Master-Slave) ํจํด์ ์ฅ์ ์ ์ป๊ณ ์ ํจ์ด๋ค. ๋ง์คํฐ๋ ์์
์ ์ชผ๊ฐ๊ณ ์ฌ๋ ์ด๋ธ๋ก ๊ตฌ์ฑ๋ ๋
ธ๋์๊ฒ ๋ถ๋ฐฐ๋ฅผ ํ๊ฒ๋๋ฉด ์ฌ๋ ์ด๋ธ ์๋ฒ๋ ๋ง์คํฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ฆฌํดํ๊ฒ ๋๋ค. ๋ง์น ์คํํฌ๋ํํธ์์ ์ผ๊พผ์ ๋๋ ค์ ๋ฏธ๋ค๋๊ณผ ๊ฐ์ค๋ฅผ ๋ ๋นจ๋ฆฌ ์ป๋๊ฒ์ฒ๋ผ ๋ง์ด๋ค.
์ฌ๊ธฐ์ ํ์๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฝ์งํ ๋ถ๋ถ. ์ฌ๋ ์ด๋ธ ์๋ฒ๋ฅผ ์ถ๊ฐํ๋๋ฐ ์ฌ๋ ์ด๋ธ ์๋ฒ๊ฐ ๋๋ ์๋ฒ์ ๋์ผํ๊ฒ ์ ํจ์ค๋ฅผ ์ค์นํ๊ณ ๊ทธ๋ค์ ๋ชจ๋ ์ฐ๊ฒฐํ๋ ค ํ๋๊ฒ… ๋ง์น ํด๋ฌ์คํฐ๋ง ํ๋๊ฒ์ฒ๋ผ… ๋น์ฐํ Jenkins ๋ค์ ๋ฌถ์ํํ(?) ๊ฐ ๋์ผ ํ ๊ฒ๊ฐ์ ์๊ฐ์ผ๋ก ์๋ํ์์ง๋ง ์์ฒญ๋ ์ฝ์ง์ ์ฐ์์ด ๋์ด๋ฒ๋ ธ๋ค. ์๊ณ ๋ณด๋ ๋ง์คํฐ Jenkins์์ ์ฌ๋ ์ด๋ธ ์๋ฒ์ ์์
์ ์ ๋ฌํ ์ ์๋๋ก ์ฐ๋๋ง ์์ผ์ฃผ๋ฉด ์๋์ผ๋ก Agent๋ฅผ ๋ง์คํฐ Jenkins๊ฐ ์ฌ๋ ์ด๋ธ ์๋ฒ์ ์ค์น/์คํ์ ํ๊ณ ์์
์ ๋ถํ ํ๋๊ฒ์ ํ์ธํ ์ ์์๋ค. ์, ๊ทธ๋ผ ์์ํด๋ณด์.
๋ง์คํฐ ์๋ฒ์์ ๊ณต๊ฐํค์ ๊ฐ์ธํค ์์ฑ ๋จผ์ ๋ง์คํฐ ์๋ฒ์ ์ฌ๋ ์ด๋ธ ์๋ฒ๋ฅผ SSH๋ก ํต์ ํ ์ ์๋๋ก SSH ํค ์ค์ ์ ํด์ค๋ค. ํต์ ํ ๋๋ ํ ๋ฆฌ ํ์ .ssh ํด๋์์ ์์ฑํ๋ค. ssh ํค ์์ฑ $ ssh-keygen -t rsa Generating public/private rsa key pair.
์๋
7์ 12์ผ๋ถํฐ ์์ํ ํ์์ ์ฒซ ํ ์ดํ๋ก์ ํธ์ธ ๊ธฐ์ ๋ธ๋ก๊ทธ ๊ตฌ๋
์๋น์ค. ์คํํ ๋๊น์ง๋ง ํด๋ “AWS ํ๋ฆฌํฐ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ 1๋
์์ ๊ตฌ๋
์๊ฐ ์ค๋ง 1,000๋ช
์ด ๋๊ฒ ์ด?” ๋ผ๊ณ ์๊ฐ์ ํ์๋๋ฐ ์คํ์ ํ๊ณ 220์ผ์งธ ๋๋ ๋ฐ๋ก ์ด์ ์ด๋๋ง ๋ฒ์จ ๊ตฌ๋
์๊ฐ 1,000๋ช
์ ๋ฌ์ฑํ๊ฒ ๋์๋ค. ๊ทธ ๊ธฐ๋
์ผ๋ก ๊ทธ๋์ ๋ฏธ๋ค๋์๋ ๊ธฐ์ ๋ธ๋ก๊ทธ ๊ตฌ๋
์๋น์ค ๊ฐ๋ฐ ํ๊ธฐ ์๋ฆฌ์ฆ์ 3๋ถ๋ฅผ ์ฐ๊ณ ์ ํ๋ค.
์ค์~ 1,000๋ช
์ด๋ค! ๋กํ! ์ถ์ฒ : https://gfycat.com/ko/leafytorngroundbeetle" ์ค์~ 1,000๋ช
์ด๋ค! ๋กํ! ์ถ์ฒ : https://gfycat.com/ko/leafytorngroundbeetle ํน์ ์ ์ ๋ด์ฉ์ ๋ณด๊ณ ์ ํ๋ฉด ์๋ ๋งํฌ์์ ํ์ธํ ์ ์๋ค.
1๋ถ : ์ ๋ง๋ค๊ฒ ๋์๋๊ฐ ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๊ตฌ์กฐ๋ก ๋ง๋ค์๋๊ฐ 2๋ถ : ๋ฌธ์ ๋ฐ์ ๋ฐ Trouble Shooting 3๋ถ : ์์ผ๋ก์ ๊ณํ๊ณผ ๋ฐฉํฅ์ฑ ๊ทธ๊ฐ ์ด๋ค ์์ผ๋ก ์๋น์ค๋ฅผ ์ด์ํ๋๊ฐ? (ํ๋ง๋๋ก ์ ๋ฆฌํ ์ ์๋ ์ง๋ 220์ผ์ด์์ง๋งโฆ) ๋ฑ ํ๋ง๋๋ก ์ ๋ฆฌํ์๋ฉด ์์ฒญ๋๊ฒ ๋ง์ ๊ฒ์ ๋ฐฐ์ฐ๊ณ ๊ฒฝํํ ์ ์์์ผ๋ ๊ทธ๋งํผ ํ๋ค์๋ ์๊ฐ๋ค์ด๋ผ๊ณ ๋งํ ์ ์์ ๊ฒ ๊ฐ๋ค. 2๋ถ์์ ์ด์ผ๊ธฐํ ๋ฌธ์ ๋ฐ์์ ๋ฐ๋ฅธ Trouble Shooting๋ค๋ ์์์ง๋ง ์ด์์ ํด์ค๋ค ๋ณด๋ ์ฌ์ ์ ์๊ฐํ์ง๋ ๋ชปํ ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ์ ๋ง ๋ค์ํ ๊ฒฝํ์ ํ ์ ์์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ธ๋ก๊ทธ ํฌ์คํ
์ ์์งํ๋ ๊ณผ์ ์์์ ๋ฌธ์ ์ผ๋ถ ๋ธ๋ก๊ทธ RSS url์ ์ ๊ทผ์ ํ ๋ ์์ฒญ์ ๋ํ ์๋ต์ด ๋ฌดํ๋๋ก ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ํ์์ด ๊ฐํ์ ์ผ๋ก ์์๋ค. ์ด๋ ๋ณ๋์ ํ์์์์ ์ค์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ด๋ ์ ๋์ ํ์์์์ ๋๊ณ ์๊ฐ ๋ด์ ์๋ต์ด ์์ ๊ฒฝ์ฐ ๋ค์ ํฌ์คํ
์ผ๋ก ๋์ด๊ฐ๋๋ก ํ์๋ค. (ํ์์์์ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ถ๋ถ์ธ๋ฐ…) requests.get(rss_url, timeout=10.0) ๋ฉ์ผ ๋ฐ์กํ๋ ๊ณผ์ ์์์ ๋ฌธ์ ๊ฐ๋ ๋ฉ์ผ์ด ์ค์ง ์๋๋ค๊ณ ์น์ ํ๊ฒ ํ์ ๊ฐ์ธ ๋ฉ์ผ๋ก ์ฐ๋ฝ์ด ์ค๋ ๊ฒฝ์ฐ๊ฐ ์์๋ค. ๊ทธ๋๋ง๋ค ์๋ฒ์ ์ํ๋ฅผ ๋ณด๋ฉด ์๋ฒ์ ์ง์ ์ ์์กฐ์ฐจ ์ ๋ ์ ๋๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋๋ฌด ๋ง์์ ๊ทธ๋๋ง๋ค AWS ์น ์ฝ์์์ ๊ฐ์ ๋ก ์๋ฒ๋ฅผ ์ฌ๋ถํ
์ ํ๊ณค ํ์๋ค. ์์ ์๋ ์ด์ผ๊ธฐํ ๊ฒ์ฒ๋ผ AWS ํ๋ฆฌํฐ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค ๋ณด๋ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ 1๊ธฐ๊ฐ๋ฐ์ ๋์ง ์์์ … ์ ํ๋ ์์คํ
์์ ์๋น์ค ์ด์์ ํ ์๋ฐ์ ์๋ ์ํฉ์ด์๋ค. ๊ทธ๋์ ์์ง/๋ฐ์ก ์ํ๋ฅผ ๋ก๊น
์ผ๋ก ์ฝ๊ฒ ๋ณผ ์ ์๊ณ ์ค์ผ์ค๋ง์ ํ๊ธฐ ์ํด ๋์๋ Jenkins(tomcat)๋ฅผ ์ค๋จํ๊ณ crontab์ผ๋ก ์ค์ผ์ค๋ง์ ํ๋๋ก ํ์๊ณ , ๋ก๊น
์ ๋ณ๋์ ํ์ผ๋ก ๋ก๊น
ํ๋๋ก ๋ณ๊ฒฝํ์๋ค. /usr/bin/python3.6 /home/~~~/email_send.py > /home/~~~/logs/job/email_send_`date +\%Y\%m\%d\%H\%M\%S`.log 2>&1 ๋ํ ๊ธฐ์กด์๋ ๋น ๋ฅด๊ฒ ๋ฐ์กํ๊ธฐ ์ํด ๋
๋ค ์ค๋ ๋๋ก ๋๋ ธ๋๋ฐ ๊ตฌ๋
์ ์๊ฐ ๋ง์์ง๋ค ๋ณด๋ RuntimeError: can't start new thread ๋ผ๊ณ ์ค๋ ๋๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ๋ ํ๋ค. ๊ทธ๋์ Pool์ ์ฌ์ฉํ๋ ๋ฐฉ์์ multiprocessing ์ ๋์
ํ์ฌ ์ค๋ ๋๋ก ๋ฐ์กํ ๋๋ณด๋ค๋ ์์ฒญ๋๊ฒ ๋น ๋ฅธ ์๋๋ ์๋์ง๋ผ๋ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ผ๋ก 2๋ถ ์์ 1,000๋ช
์๊ฒ ์์ ๋ ๋ฉ์ผ์ ๋ณด๋ผ ์ ์๊ฒ ๋์๋ค. (์ฌ๋ด์ด์ง๋ง ๋ฉ์ผ์ด ์ ์จ๋ค๊ณ ์๋ ค์ฃผ์
จ๋ ๋ถ๋ค๊ป ์ด ์๋ฆฌ๋ฅผ ๋น๋ ค ๊ฐ์ฌ์ ์ธ์ฌ๋ฅผ ์ ํ๊ณ ์ถ๋ค.)
from multiprocessing import Pool ... pool = Pool(20) pool.map(sendMail, email_list) Heroku ๋ Netlify ๊ฐ์ด ์๋ฒ๋ฅผ ์ง์ ๋ค์ด๊ฐ์ง ์๊ณ ์ฑ ํํ๋ก ๋ฐฐํฌํ๋ ์์ผ๋ก ํ ์๋ ์๋ค. ํ์ง๋ง ์ด๊ธฐ์ ์ด ํ ์ดํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ์ค ์๋น์ค์ ์ต๋ํ ๋์ผํ ์์คํ
์ผ๋ก ์ด์ํด๋ณด๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์ค์นํ๋ ๊ฒ๊น์ง ์์๋ณด๋ค ๊ฒฐ๊ตญ AWS๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๊ฒ ๋์๋ค. ๊ทธ๋ ๋ค๋ฉด AWS ํ๋ฆฌํฐ์ด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ณ๋์ ์๋ฒ๋ฅผ ๊ตฌ๋งคํ๋ฉด ์ ๋ ๊น? ํ๋ ์๊ฐ๋ ํด๋ดค์ง๋ง ์ต์ํ์ ์ธํ๋ผ๋ก ์ต๋ํ์ ์ฑ๋ฅ์ ๋ด๋ณด๊ณ ์ถ์ ์์ฌ(?) ๋๋ฌธ์ 1๋
๊ฐ์ ํ๋ฆฌํฐ์ด๋ก ์ด์ํ๊ณ ๊ทธ๋ค์์ (ํน์ ์ํํธ์จ์ด์ ์ผ๋ก ํ๊ณ๊น์ง ๋๋ฌํ๋ค๋ฉด) ์๋ฒ๋ฅผ ๊ตฌ๋งคํด์ ์ด์ํ๊ฒ ๋ ๊ฒ ๊ฐ๋ค. (์ ์ด๋ ์ดํ์๋ ์ด ์๋น์ค๋ฅผ ์ ์งํ๋ค๋ ๊ฐ์ ํ์…)
๋๋ถ์ ๋ง์์ผ๋ก… ์ถ์ฒ : http://www.iwithjesus.com/news/articleView.html?idxno=2511" ๋๋ถ์ ๋ง์์ผ๋ก… ์ถ์ฒ : http://www.iwithjesus.com/news/articleView.html?idxno=2511 ์์นจ 10์๊ฐ ๋๋ฉด ์๋์ผ๋ก ๋ฉ์ผ์ด ์ ๋ฐ์ก๋์๋์ง, ํน ์ด์ ์์ง๋ ๊ฒ์ด ์๋๋ผ ์์ ์ ์์ง๋ ๋ด์ฉ์ด ์ค๋ณต ๋ฐ์ก๋ ๊ฑด ์๋์ง, ๋ฐ์ก์ ๊ตฌ๋
ํ ์ฌ๋ ์ ๋ถ์๊ฒ ์ ๋ณด๋ด์ก๋์ง… ๊ฑฐ์ ๋งค์ผ๊ฐ์ด Daily-DevBlog ์๋น์ค๋ฅผ ์ดํผ๋ฉฐ ์ง๋ธ ๊ฒ ๊ฐ๋ค. (ํ๋ฃจ๋ผ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๋ฐค์ ์์์๋ผ๋ ์์ธ์ ํ์
ํ๊ณ ๋ค์ ๋ฐ์ก์๋ ์ ์์ ์ผ๋ก ๋ฐ์ก๋๋๋ก ์์ ํ๊ธฐ๋ ํ๋ค.)
์์ผ๋ก์ ๊ณํ๊ณผ ๋ฐฉํฅ์ฑ ์ฌ๋ ฅ์ด ๋๋ ๋ฐ๊น์ง ์ด ์๋น์ค๋ฅผ ์ด์ํ ๊ณํ์ด๋ค.
ํ์๊ฐ Elastic Stack์ ์๊ฒ๋๊ฑด 2017๋
์ด๋ ์ฌ๋ฆ ๋๊ธฐํ์ด ๊ณต๋ถํ๊ณ ์๋๊ฒ์ ๋ณด๊ณ ํธ๊ธฐ์ฌ์ ๋ฐ๋ผํ๋ฉฐ ์์ํ๊ฒ ๋์๋ค. ๊ทธ๋๊น์ง๋ง ํด๋ ๋ฒ์ ์ด 2.x ์๋๋ฐ ์ง๊ธ ๊ธ์ ์ฐ๊ณ ์๋ 2019๋
2์์ด ์ต์ ๋ฒ์ ์ด 6.6์ด๋ ์ ๋ง ๋น ๋ฅด๊ฒ ๋ณํํ๋๊ฒ ๊ฐ๋ค. ๋น ๋ฅด๊ฒ ๋ณํํ๋ ๋ฒ์ ๋งํผ ์ฌ๋๋ค์ ๊ด์ฌ๋ (๋๋ผ๋งํฑํ๊ฒ๋ ์๋์ง๋ง) ๊พธ์คํ ๋์ด๋ ๊ฐ์ธ์ ์ผ๋ก, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์๋ ํ์ฉํ๋ ๋ฒ์๊ฐ ๋ง์์ง๊ณ ์๋๊ฒ ๊ฐ๋ค.
trends.embed.renderExploreWidget("TIMESERIES", {"comparisonItem":[{"keyword":"elasticsearch","geo":"KR","time":"today 5-y"}],"category":0,"property":""}, {"exploreQuery":"date=today%205-y&geo=KR&q=elasticsearch","guestPath":"https://trends.google.co.kr:443/trends/embed/"}); ๊ทธ๋์ ๊ทธ๋ฐ์ง ์ต๊ทผ๋ค์ด (์์ฃผ ์ฝ๋ฑ์ง๋งํผ ์กฐ๊ธ์ด๋ผ๋ ๋ ํด๋ณธ) ํ์์๊ฒ Elastic Stack ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ํด ๋ฌผ์ด๋ณด๋ ์ฃผ๋ณ ์ง์ธ๋ค์ด ๋์ด๋๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์ ํ์ฐฝ ๊ณต๋ถํ์๋์ ๋ฒ์ ๋ณด๋ค ๋ง์ด ๋ฐ๊ผ๊ธฐ์ ์ด ๊ธฐํ์ “๊ทธ๋๋ก ๋ฐ๋ผ๋ง ํ๋ฉด Elastic Stack์ ๊ตฌ์ฑํ ์ ์์๋งํ ๊ธ"์ ์จ๋ณด๊ณ ์ ํ๋ค. ์ฌ์ค ํ์๊ฐ ์์ ์ “๋ํ๋จผํธ๋ฅผ ๋ณด๊ธฐ์ ๋๋ฌด ์ด๋ ค์ ๋ณด์ด๋ ๋๋์ ์ธ ๋๋” ๋๋ฌธ์ ์ฝ์งํ๋ฉฐ ๊ตฌ์ฑํ ํ๋ค์๋ ๊ธฐ์ต์ ๋์ด๋ ค ์ต๋ํ ์ฌํํ๊ณ ์ฒ์ ํด๋ณด๋ ์ฌ๋๋ ๋ฐ๋ผํ๊ธฐ๋ง ํ๋ฉด “์~ ์ด๊ฒ Elastic Stack ์ด๊ตฌ๋!”, “์ด๋ฐ์์ผ๋ก ๋์๊ฐ๋ ๊ฑฐ๊ตฌ๋!” ํ๋ ๋์์ ์ฃผ๊ณ ์ถ๋ค.
+ ๊ทธ๋ฌ๋ฉด์ ์ต์ ๋ฒ์ ๋ ์ดํด๋ณด๊ณ … 1์2์กฐ, ์ด๋ฐ๊ฒ ๋ฐ๋ก ๋ธ๋ก๊ทธ๋ฅผ ํ๋ ์ด์ ์ด์ง ์์๊น? ๋ค์ํ๋ฒ ๋งํ์ง๋ง ๋ํ๋จผํธ๊ฐ ์ต๊ณ ์ง์นจ์์ด๊ธด ํ๋ค…
Elastic ๊ณต์ ํํ์ด์ง์ ๊ฐ๋ฉด ๊ฐ ์ ํ๊ตฐ๋ค์ ๋ํด ๊ทธ๋ฆผ์ผ๋ก ๋ ์์ธํ ์ค๋ช
๊ณผ ๋ํ๋จผํธ๊ฐ ์์ง๋ง ์ด๋ค์ ์ด๋ค์์ผ๋ก ์กฐํฉํ์ฌ ์ฌ์ฉํ๋์ง์ ๋ํ ์ ์ฒด์ ์ธ ํ๋ฆ์ ๋ณผ ์ ์๋ ๊ณณ์ ์์ด ๋ณด์ธ๋ค. (์ง๊ธ ๋ณด๋ฉด ๋ํ๋จผํธ๊ฐ ๊ทธ ์ด๋๋ณด๋ค ์ค๋ช
์ด ์๋์ด ์๋ค๊ณ ์๊ฐ๋์ง๋ง ์ฌ์ ์ง์์ด ์ ํ์๋ ์ํ์์๋ ๋ด๋๋ด๋ ์ด๋ ค์ ๋ณด์๋ค.) ์ด๋ฒ ํฌ์คํ
์์๋ Apache access log๋ฅผ Elasticsearch์ ์ธ๋ฑ์ฑ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช
ํด๋ณด๊ณ ์ ํ๋ค.
์ ์ฒด์ ์ธ ํ๋ฆ ํ์๋ ๊ธ๋ณด๋ค๋ ๊ทธ๋ฆผ์ ์ข์ํ๋ ํธ์ด๋ผ ์ ์ฒด์ ์ธ ํ๋ฆ์ ๊ทธ๋ฆผ์ผ๋ก ๋จผ์ ๋ณด์.
์ธ๋ถ์์์ ์ ๊ทผ์ด ๋ฐ์ํ๋ฉด apache ์น์๋ฒ์์ ์ค์ ํ ๊ฒฝ๋ก์ access log๊ฐ ํ์ผ๋ก ์์ฑ์ด ๋๊ฑฐ๋ ์๋ ํ์ผ์ ์ถ๊ฐ๊ฐ ๋๋ค. ํด๋น ํ์ผ์๋ ํ์ค๋น ํ๋์ ์์ธ์ค ์ ๋ณด๊ฐ ๋จ๊ฒ ๋๋ค. fileBeat์์ ํด๋น ํ์ผ์ ํธ๋ํน ํ๊ณ ์๋ค๊ฐ ๋ผ์ธ์ด ์ถ๊ฐ๋๋ฉด ์ด ์ ๋ณด๋ฅผ logstash ์๊ฒ ์ ๋ฌํด์ค๋ค. logastsh ๋ filebeat์์ ์ ๋ฌํ ์ ๋ณด๋ฅผ ํน์ port๋ก input ๋ฐ๋๋ค. ๋ฐ์ ์ ๋ณด๋ฅผ filter ๊ณผ์ ์ ํตํด ๊ฐ ์ ๋ณด๋ฅผ ๋ถํ ๋ฐ ์ ์ ํ๋ค. (ip, uri, time ๋ฑ) ์ ๋ฆฌ๋ ์ ๋ณด๋ฅผ elasticsearch ์ ouput ์ผ๋ก ๋ณด๋ธ๋ค. (์ ํํ ๋งํ๋ฉด ์ธ๋ฑ์ฑ์ ํ๋ค.) elasticsearch ์ ์ธ๋ฑ์ฑ ๋ ์ ๋ณด๋ฅผ ํค๋ฐ๋๋ฅผ ํตํด ์์ฝ๊ฒ ๋ถ์์ ํ๋ค. ํ๋ฒ์ ์ค์น๊ณ ์ผ๋ จ์ ๊ณผ์ ์ด ๋๋ฑ ๋๋ค๋ฉด ๋๋ฌด ํธํ๊ฒ ์ง๋ง, ๊ฐ๊ฐ์ ๋ ์ด์ด๊ฐ ๋๋์ด์ ธ์๋ ์ด์ ๋ ํ๋ ์ญํ์ด ์ ๋ฌธ์ ์ผ๋ก(?) ๋๋์ด์ ธ ์๊ณ ๊ฐ ๋ ์ด์ด์์๋ ์ธ๋ถ ์ค์ ์ ํตํด ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
beats๋ผ๋ ๋ ์ด์ด๊ฐ ๋์ค๊ธฐ ์ ์๋ logstash์์ ์ง์ file์ ๋ฐ๋ผ๋ณด๊ณค ํ์๋๋ฐ beats๊ฐ logstash ๋ณด๋ค ๊ฐ๋ฒผ์ด shipper ๋ชฉ์ ์ผ๋ก ๋์จ agent ์ด๋ค๋ณด๋ ํต์ logstash ์๋จ์ filebeat๋ฅผ ์์น์ํค๊ณค ํ๋ค๊ณ ํ๋ค.
์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์ ์์ ๊ฐ๊ณ , ์ด์ ์ด ๊ธ์ ๋ณด๊ณ ์๋ ์ฌ๋ฌ๋ถ๋ค์ด ๋ฐ๋ผํ ์ฐจ๋ก์ด๋ค. ๊ฐ ๋ ์ด์ด๋ณ๋ก ํ๋์ฉ ์ค์น๋ฅผ ํด๋ณด๋ฉฐ ๊ตฌ์ฑ์ ํด๋ณด์. ์ค์น์์๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์์์ ๋ง์ถฐ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ค์น๋ฅผ ํด์ผ ํจ์จ์ ์ผ๋ก ๋ณผ์๊ฐ ์๋ค. (์๋์์๋๋ก ํ์ง ์์๊ฒฝ์ฐ ์ค์น/์์/์ข
๋ฃ ๋ฅผ ๊ฐ๊ฐ์ ํ์ด๋ฐ์ ๋ง์ถ์ด ํด์ค์ผ ํ ๊ฒ ๊ฐ์ ๋ณต์กํ ๊ฒ๊ฐ๋ค.)
elasticsearch โ logstash โ kibana โ filebeat ์ด ํฌ์คํ
์ CentOS 7.4์์ Java 1.8, apache 2.2๊ฐ ์ค์น๋์ด์๋ค๋ ๊ฐ์ ํ์ ๋ณด๋ฉด ๋ ๋ฏํ๋ค. ๋ํ ๊ฐ ๋ ์ด์ด๋ณ ์ค๋ช
์ ๊ตฌ๊ธ๋ง์ ํ๊ฑฐ๋ Elastic ๊ณต์ ํํ์ด์ง์ ๊ฐ๋ณด๋ฉด ์์ธํ ๋์์์ผ๋ ๊ธฐ๋ณธ ์ค๋ช
์ ์ํ๋๊ฒ์ผ๋ก ํ๊ณ , ๊ฐ ๋ ์ด์ด์ ์ธ๋ถ ์ค์ ์ ํ์ง ์๋๊ฒ์ผ๋ก ํ๋ค.
Elasticsearch ๊ณต์ ํํ์ด์ง
๋ค์ด๋ฐ๊ณ ์์ถํ๊ณ ์ฌ๋ณผ๋ฆญ ๊ฒฝ๋ก ๋ง๋ค๊ณ (์ฌ๋ณผ๋ฆญ ๊ฒฝ๋ก๋ ์ ํ์ฌํญ) $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.tar.gz $ tar zxvf elasticsearch-6.6.0.tar.gz $ ln -s elasticsearch-6.6.0 elasticsearch ์ค์ ํ์ผ์ ์ด๊ณ ์ถ๊ฐํด์ค๋ค. $ cd elasticsearch/conf $ vi elasticsearch.yml path.data: /~~~/data/elasticsearch (๊ธฐ๋ณธ๊ฒฝ๋ก์์ ๋ณ๊ฒฝํ ๋์ถ๊ฐ) path.logs: /~~~/logs/elasticsearch network.host: 0.0.0.0 # ์ธ๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก (์ค์ ip๋ฅผ ์ ์ด์ค๋ ๋จ) elasticsearch ์ ์์๊ณผ ์ข
๋ฃ๋ฅผ ์กฐ๊ธ์ด๋๋ง ํธํ๊ฒ ํ๊ธฐ์ํด ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ค (์ด๊ฒ๋ํ ์ ํ์ฌํญ) $ cd ../bin $ echo '.