νμ΄μ¬μ΄λΌλ μΈμ΄λ λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄λ€μ λΉν΄ μ½κ³ μ§κ΄μ μ΄λΌ κ·Έλ°μ§ νλ‘κ·Έλλ°μ μ²μ μμνλ μ¬λλ€μκ² λμ±μ΄ μ£Όλͺ©μ λ°κ³ μλκ² κ°λ€. μ λ§ λ€μν λͺ¨λλ€μ΄ λ§μ μ¬λ¬λΆμΌμμ νμ©λκ³ μκ³ νΉν μΈμ λΆν°μΈκ° ν«! ν΄μ§ λΆμΌ(?)λΌ ν΄λ κ³ΌμΈμ΄ μλμ λμΈ “λ¨Έμ λ¬λ” λΆμΌμμλ λ€μνκ² μ¬μ©λκ³ μλκ² κ°λ€.
λ§μΉ¨ νμκ° μν΄ μλ ν λ΄μ λ¨Έμ λ¬λ μ€ν°λκ° μμμ΄ λμκ³ , κ·Έμ νμ΄μ¬μ μ΄μ©νμ¬ μ€ν°λλ₯Ό ν΄μΌνλ μν©. νμ§λ§ μ€ν°λλ₯Ό νλ νμ μ λ° μ΄μμ΄ νμ΄μ¬μ μ΄μ©ν κ°λ° κ²½νμ΄ μμκ³ , μλ‘ λ°°μ΄κ²μ 곡μ λ₯Ό νλ©΄μ μ€ν°λλ₯Ό νλ©΄ λ μ’κ² λ€λ μκ°μ΄ λ€λ μ¦μ. μΈμ μ΄λμ κ° λ΄€λκ²μ΄ λ¨Έλ¦Ώμμ μ€μ³ μ§λκ°λ€. 그건 λ°λ‘ Jupyter(μ΄ν μ£ΌνΌν°).
μΆμ² : https://jupyter.org/" μΆμ² : https://jupyter.org/ μ£ΌνΌν°λ μμ κ°μ νλ‘κ·Έλλ° μΈμ΄μμ λν ν μ»΄ν¨ν
μμν μ€ν μμ€ μννΈμ¨μ΄, μ€ν νμ€ λ° μλΉμ€λ₯Ό κ°λ°νκΈ° μν ν΄μ΄λΌκ³ νλ€. μ΄ ν¬μ€νΈλ₯Ό μμ±νκΈ° μ κΉμ§λ§ ν΄λ “μ£ΌνΌν° == νμ΄μ¬ μΉ κ°λ°ν΄” μ΄λΌκ³ λ§ μκ³ μμλλ° μ’λ μ°Ύμ보λ λ€μν μΈμ΄λ₯Ό μ§μνλκ² κ°λ€.
κ·ΈλΌ μ΄λ¬ν μ£ΌνΌν°λ₯Ό νΉμ μλ²μ μ€μΉνκ³ λ‘컬μ νμ΄μ¬μ μ€μΉνμ§ μμλ μ격μΌλ‘ νμ΄μ¬ μ½λ©μ ν΄λ³΄λ©΄ μ’λ μ€ν°λμ λμμ΄ λμ§ μμκΉ νλ λ§μμ΄ λ€μλ€. λν νκ΅μμ μ΄λμ₯μ μλλ₯Ό κΉμμ λ§κ» λ°λμ μκ² νλ λλμΌλ‘ νμλ€μ μν΄ μ€μΉλ₯Ό ν΄λκ³ μ격μΌλ‘ μ μν μ μκ² ν΄λλ©΄ λͺ¨λκ° νΈνκ³ μ½κ² νμ΄μ¬μ λν΄ κ²½νμ ν΄λ³Ό μ μμ§ μμκΉ νλ λ§μμΌλ‘ μ£ΌνΌν°λ₯Ό μ€μΉλ₯Ό ν΄ λ³΄κ³ μ νλ€.
λ³Έ ν¬μ€ν
μ λͺ©νλ λ€μκ³Ό κ°λ€.
νκ²½ : CentOS 7.4 64Bit, python 2.7 (κΈ°λ³Έ) λͺ©ν anaconda λ₯Ό νμ©νμ¬ μμ€ν
κΈ°λ³Έ νμ΄μ¬μ 건λλ¦¬μ§ μλ κ°μνκ²½μ ꡬμΆνλ€. μ£ΌνΌν°λ₯Ό μ€μΉνκ³ μ격μΌλ‘ μ μν μ μλλ‘ μ€μ νλ€. μ¬κΈ°κΉμ§ 보면 νμκ° μμ²λκ² νμ΄μ¬μ λν΄ μ μλκ²μ²λΌ 보μΌμλ μμ΄ λ―Έλ¦¬ λ§νμ§λ§ νμλ μ° μλ° κ°λ°μμ΄λ©΄μ νμ΄μ¬ κ°λ° μμ€μ κΈ°λ³Έμ μΈ μ€ν¬λ¦½νΈλ₯Ό μμ±νλ μ λμ΄λ€. κ·Έλ¬λ μ΄ ν¬μ€νΈλ₯Ό μ½κ³ μλ νμκ°μ νμλͺ»(?) λΆλ€λ μΆ©λΆν μ€μΉκ° κ°λ₯νλ€. (μ΅λν λ°λΌν μ μμ μ λμ μΉνΈν€ μμ€μΌλ‘ μμ± νκ³ μ νλ€.)
μλμ½λ€ μ€μΉ (λ€μΌλ‘ μ€μΉλλ μ£ΌνΌν°) μ°μ μλμ½λ€λ₯Ό μ€μΉνμ. μλμ½λ€λ Anaconda(μ΄μ : Continuum Analytics)λΌλ κ³³μμ λ§λ νμ΄μ¬ λ°°ν¬νμΌλ‘, μλ°± κ°μ νμ΄μ¬ ν¨ν€μ§λ₯Ό ν¬ν¨νκ³ μλ€κ³ νλ€. μ¦, μλμ½λ€λ₯Ό μ€μΉνκ³ λ§λ€μ΄μ§ κ°μνκ²½μμ νμ΄μ¬ κ°λ°μ νλ©΄ λ€μν λͺ¨λμ΄ μ΄λ―Έ μ€μΉλμ΄ μκΈ° λλ¬Έμ νΈλ¦¬νλ€λ μ΄μΌκΈ°.
μΆμ² : https://www.anaconda.com/" μΆμ² : https://www.anaconda.com/ λλΆμ΄ μμ€ν
μ κΈ°λ³ΈμΌλ‘ μ€μΉλμ΄ μλ νμ΄μ¬μ 건λ리면 μ¬λ¬ 볡μ‘ν λ¬Έμ κ° λ°μν μ μκΈ°μ. μλμ½λ€λ₯Ό νμ©νμ¬ νμ΄μ¬ 3μ μ¬μ©νλ κ°μνκ²½μ λ§λ€μ΄ 보μ. μ€μΉλ μμ£Ό κ°λ¨νλ€. μλμ½λ€ μ€μΉνμΌμ λ€μ΄λ°κ³ μ΄λ₯Ό μ€ννλ©΄ λ. (user λ λ²¨μ΄ root λ©΄ sudo λͺ
λ Ήμ΄λ₯Ό μλ΅ν΄λ λλ€.)
$ wget https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh $ sudo bash Anaconda3-2019.10-Linux-x86_64.sh Welcome to Anaconda3 2019.10 In order to continue the installation process, please review the license agreement. Please, press ENTER to continue >>> =================================== Anaconda End User License Agreement =================================== Copyright 2015, Anaconda, Inc. ~~~ μ€λ΅ ~~~ Do you accept the license terms? [yes|no] [no] >>> yes # yes!! Anaconda3 will now be installed into this location: /root/anaconda3 - Press ENTER to confirm the location - Press CTRL-C to abort the installation - Or specify a different location below [/root/anaconda3] >>> /home/anaconda3 # μ€μΉλ κ²½λ‘λ₯Ό μ€μ ν΄μ£Όκ³ κΈ°λ³Έ μ€μ κ°μ μ€μΉνλ €λ©΄ κ·Έλ₯ μν° ~~~λκ° μμ² μ€μΉλλ€. λ¬Ό νμ λ¨Ήκ³ μ€μ.~~~ installation finished. Do you wish the installer to initialize Anaconda3 by running conda init? [yes|no] [no] >>> yes # yes!! μ΄λ κ² λλ©΄ μ€μΉλ λ. νκ²½λ³μλ₯Ό μ€μ ν΄μ κΈ°λ³Έ νμ΄μ¬ νκ²½μ μλμ½λ€μ μν΄ μ€μ λλλ‘ λ§μΆ°μ£Όμ.
sudo vi .bashrc __conda_setup="$('/home/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/home/anaconda3/etc/profile.
μλΉμ€λ₯Ό μ²μ λ§λ€κΈ° μμν λλ©΄ κ° μ§κ΅°λ³λ‘ μκ°νλ ν¬μΈνΈκ° λ€μνλ€. μ€κ³, κΈ°ν, λμμΈ, κ°λ°. μ¬κΈ°μ κ°λ°μ νλ‘μ νΈ μ
ν
μ μ΄λ»κ² ν΄μΌνμ§? νλ κ³ λ―Όμ νκΈ° λ§λ ¨μ΄λ€. μμ£Ό κ°λ¨νκ² νλμ λͺ¨λλ‘ λͺ¨λ κΈ°λ₯μ λ΄λΉνλλ‘ λ§λ€ μ μμ§λ§ κΈ°λ₯λ³λ‘ λͺ¨λμ λλ μ μ
ν
νλκ² κ΄λ¦¬μΈ‘λ©΄μμ μ₯μ μ΄λΌ μκ°νλ€.μλ₯Ό λ€μ΄λ³΄μ. λμκ΄μ λ€μ΄μ¨ μ±
μ 보λ₯Ό μΈλΆμ μ 곡νλ “API”, μ£ΌκΈ°μ μΌλ‘ μ±
μ 보λ₯Ό μ
λ°μ΄νΈ νλ “Batch”. μ΄λ κ² ν¬κ² λκ°μ§μ λͺ¨λμ΄ μμ΄μΌ νλ€κ³ κ°μ νμλ μ΄λ€μμΌλ‘ λͺ¨λμ μ€κ³ν μ μμκΉ?
μ΄λ² ν¬μ€ν
μμλ μ€νλ§ λΆνΈμ λ©μ΄λΈμ νμ©ν΄μ νλμ νλ‘μ νΈ(μ»΄ν¬λνΈ)μμ μ¬λ¬ λͺ¨λμ κ΄λ¦¬ν μ μλ Spring Multi Moduleμ μ
ν
νλ λ°©λ²μ λν΄ μμλ³΄κ³ μ νλ€. νμλ μ
ν
νκΈ° μ μλ “κ·Έλ₯ νλ©΄ λλκ±° μλμΌ?“λΌλ©° μ°μ΅κ² λ³΄λ€ μμ£Ό μ¬μν λΆλΆλ€μμ μμ²λ μ½μ§μ ν΄μ κ·Έλ°μ§ κΌ ν¬μ€ν
μΌλ‘ λ¨κ²¨λμΌ κ² λ€κ³ λ€μ§νκ³ μ΄λ κ² μ 리λ₯Ό ν μ μκ² λμ΄μ λ€νμ΄λΌ μκ°νλ€.
μ΄μ©λ©΄ μ°λ¦¬κ° μλ νλ λ©ν°λͺ¨λμ΄ μλκΉ? μΆμ² : https://bcho.tistory.com/813" μ΄μ©λ©΄ μ°λ¦¬κ° μλ νλ λ©ν°λͺ¨λμ΄ μλκΉ? μΆμ² : https://bcho.tistory.com/813 μ λ©ν°λͺ¨λλ‘ μ
ν
ν κΉ? μμμ μμλ‘ μ΄μΌκΈ° νκ²μ²λΌ νμ¬ μ°λ¦¬κ° μ
ν
ν΄μΌν λͺ¨λμ ν¬κ² λκ°μ§ μ΄λ€.
API : μΈλΆμ λμκ΄μ λ€μ΄μ¨ μ±
μ 보λ₯Ό μλ €μ£Όλ λͺ¨λ Batch : μ£ΌκΈ°μ μΌλ‘ λμκ΄μ μ±
μ 보λ₯Ό κ°±μ νλ λͺ¨λ νλ² μκ°μ ν΄λ³΄μ. μμμ λ§ν λͺ¨λλ€ μ€μ λμμ μ¬μ©ν κ²λ§ κ°μ μ λ³΄κ° μλ€. “μ±
μ 보”. κ° λͺ¨λλ§λ€ “μ±
μ 보"λ₯Ό κ°μ Έμ€λ λ‘μ§μ μμ±νλκ² λ³΄λ€ νκ³³μμ ν΄λΉλ‘μ§μ ꡬννκ³ μ΄λ₯Ό μ¬λ¬κ³³μμ μ¬μ©νλκ² μ¬μ©νλκ² μ€λ³΅μ½λλ₯Ό λ°©μ§ν μ μλ λ°©λ²μ΄λ건 μ½κ² μμ차릴μ μλ€. κ·Έλ λ€λ©΄ μ΄λ»κ² λͺ¨λμ λΆλ¦¬ν μ μμκΉ?
νμμ κ²½νμΌλ‘ λ―Έλ£¨μ΄ λ³Όλ ν¬κ² λκ°μ§ λ°©λ²μ΄ μλκ² κ°λ€.
곡ν΅μΌλ‘ μ¬μ©νλ λͺ¨λμ jarλ‘ λ§λ€κ³ μ΄λ₯Ό λ©μ΄λΈ μ격 μ μ₯μμ deploy, μ¬μ©νλ λͺ¨λμμ λνλμμ μΆκ°νμ¬ μ¬μ© λ©ν°λͺ¨λλ‘ κ΅¬μ±νκ³ μ¬μ©νλ λͺ¨λμμ λνλμμ μΆκ°νμ¬ μ¬μ© 첫λ²μ§Έ λ°©λ²μ κ°μ₯ ν° λ¨μ μ, 곡ν΅μΌλ‘ μ¬μ©νλ λͺ¨λμ΄ λ³κ²½λ λλ§λ€ λ²μ μ λ°κΏμ£Όκ³ (μλ°κΏλ λμ§λ§ μ¬μ©νλ λͺ¨λμμ μΊμ κ°±μ μ ν΄μΌνλ λΆνΈν¨μ΄ μκΈ΄λ€.) λ©μ΄λΈ μ격 μ μ₯μμ deployλ₯Ό ν΄μ€μΌ νλ€. κ·Έμ λ°ν΄ λλ²μ§Έ λ°©λ²μ μ΄λ°κ³Όμ μμ΄ ν¨κ» λΉλλ§ ν΄μ£Όλ©΄ λλκ³ IDEμμ κ°λ°μ ν λͺ¨λμμ λμμ μμ κ³Ό μ¬μ©μ΄ κ°λ₯νκΈ° λλ¬Έμ ν¨μ¬ νΈλ¦¬νλ€.
μμ΄μμ μλ€ λΌλ λ§μ²λΌ, μ λ΅μ μλ€. νμ§λ§ μ΄λ°μ λ° λ°©λ²λ€μ 미리 μμλλ©΄ μ μμ μμ μ¬μ©ν μ μλ. νμκ° λ€λ₯ΈκΈλ€μμλ μΈκΈμ μμ£Όνλ “λλ§μ 무기"κ° λμ§ μμκΉ?
λ©ν°λͺ¨λ μ
ν
νκΈ° μμμ μ΄μΌκΈ° νλ “API”, “Batch"μλ λ³λλ‘ κ³΅ν΅μΌλ‘ μ¬μ©νλ λͺ¨λμΈ “Core” μ΄λ κ² μ΄ 3κ°μ λͺ¨λμ λ§λ€μμ μ΄λ€.
λ€λ₯Έ μ΄μΌκΈ°μ§λ§, 곡ν΅μΌλ‘ μ¬μ©ν κ² “κ°μμ” λ―Έλ¦¬ 곡ν΅λ‘μ§μ μμ±νλ μ΅κ΄μ μ’μ§ μλκ² κ°λ€. κ·Έλ¬λ€λ³΄λ©΄ μΈλ°μμ΄ κ³΅ν΅λ‘μ§μ΄ 무거μμ§λ―λ‘ μ€μ λ‘ μ¬μ©νλ©΄μ μ€λ³΅μ½λκ° λ°μν λ κ·Έλ 곡ν΅λ‘μ§μΌλ‘ 리νν λ§ ν΄λ λ¦μ§ μλκ² κ°λ€. (κΌ°λ°μΈκ°…)
ꡬννλ νκ²½μ λ€μκ³Ό κ°λ€.
Spring Boot 2.2.3 Maven IntelliJ μ°μ IDEμ νμ λΉλ € νλμ μ€νλ§ λΆνΈ νλ‘μ νΈλ₯Ό μμ±ν΄λ³Έλ€.
λ€μ > λ€μ > λ€μ" λ€μ > λ€μ > λ€μ κ·Έ λ€μ λ§λ νλ‘μ νΈμμ μ°ν΄λ¦ ν μλ‘μ΄ λͺ¨λμ μ ν. Maven λͺ¨λμ μ ννκ³ μ λΉν μ΄λ¦μ μ μ΄μ€λ€. λ€μ > λ€μ > λ€μ 222" λ€μ > λ€μ > λ€μ 222
“API”, “Batch”, “Core” λΌλ λͺ¨λμ μΆκ°νκ³ μ€μ λͺ¨λμ΄ λλ “API”, “Batch"μ parent μ dependencies μ μ€μ ν΄μ£Όμ. κ·Έλ κ² νκ³ κ° Pom.xmlμ 보면 μλμ κ°λ€. (“API” λͺ¨λμ λν΄μλ§ μ§μ€μ μΌλ‘ μ΄μΌκΈ° νλ € νλ€. “Batch” λͺ¨λλ λμΌν νμμΌλ‘ μμ±νκΈ° λλ¬Έ.)
μ΅ μμ Pom.xml (library) modules νμμ λ©ν°λͺ¨λλ‘ μ€μ ν λͺ¨λλ€μ μ΄λ¦μ΄ λ€μ΄κ° μλκ²μ νμΈν μ μλ€. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>pom</packaging> <modules> <module>api</module> <module>core</module> <module>batch</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.taetaetae</groupId> <artifactId>library</artifactId> <version>0.
“νκ³ "λ λΉλ¨ κ°λ° λΈλ‘κ·Έ λΏλ§ μλλΌ μ΄λ ν κ³Όμ μ λ§μ§λ§μλ κΌ ν΄μΌν μ€μν μκ°μΈ κ² κ°λ€. μλ§λ³΄κ³ λ¬λ €κ°μ! λ₯곡! λΌλ λ§μ΄ μμ§λ§ μ¬μ€ μ΄ λ§μ΄ μ±λ¦½λκΈ° μν΄μ μ§λ κ³Όκ±°μ λν μ 리μ λ°μ± κ·Έλ¦¬κ³ λ¬΄μμ νλ €κ³ νλλ° μ΄λ€ μ΄μ λ‘ λͺ»νλμ§μ κ·Έ λμμ λ μμ μ λ°λΌλ³Ό μ μλ μ΄ “νκ³ ” μκ°μ΄ νμνλ€. λ²μ¨ 2019λ
λ λ§λ¬΄λ¦¬κ° λμ΄κ°λ€. μλ
λ³΄λ€ λ μ μ μμ΄ λ¬λ €μ¨ μ¬ν΄. λ΄λ
μ μ¬ν΄λ³΄λ€ λ λ©μ§κ³ νμ°¨κ² μΆλ°νκΈ° μν΄ νμμ ν ν΄λ₯Ό λμλ³΄κ³ μ νλ€.
κ·Έλ λ€λ©΄ νκ³ λ μ΄λ»κ² νλκ² κ°μ₯ μ’μκΉ? 무μμ νμλΌμΈ κΈ°λ°μΌλ‘ 1μμ λνκ³ 2μμ λνκ³ … μ΄ λ°©λ²μ΄ ν린건 μλμ§λ§ νμλΌμΈ κΈ°λ°μΌλ‘ μ 리λ₯Ό ν λ€ ν€μλλ³λ‘ λ€μ μ 리νλ λ°©μμ΄ κ°μ₯ λ§μκ² κ°λ€λ μκ°μ΄λ€. 무μμ νκ³ , λκ° μ’μκ³ μ΄λ€κ±΄ μμ¬μ κ³ . κ·Έλμ λ΄λ
μ μ΄λ»κ² ν κ²μ΄κ³ . κ°μμ νκ³ λ°©μμλ μ°¨μ΄κ° μκ² μ§λ§ νκ³ λ₯Ό νλ μ΄μ , κ·Έλ¦¬κ³ νκ³ λΌλ λͺ©ν μ€μ 곡ν΅μ μ “λ€λ₯Ό λμλ³΄κ³ , μμ 보기μν νμ μ°Ύλκ²” μ΄ μλκΉ μΆλ€.
λ΄λ
νκ³ λ₯Ό ν λλ νλ°±μ΄ μλ μ»¬λ¬ μ¬μ§μ λ£μ μ μλ λΆμκΈ°κ° λ κΉ?… μΆμ² : http://www.nanum.com/site/poet_walk/820914" λ΄λ
νκ³ λ₯Ό ν λλ νλ°±μ΄ μλ μ»¬λ¬ μ¬μ§μ λ£μ μ μλ λΆμκΈ°κ° λ κΉ?… μΆμ² : http://www.nanum.com/site/poet_walk/820914 νμ¬λ μ±μ₯μ 곡κ°μ΄ μλκ²μ κΉ¨λ³λ μκ°. (μ΄μΌκΈ°μ μμ νμλ νμ¬ μλΉμ€ κ°λ°μμμ λ°νλ€.)
λ΄λ
μ΄ λλ©΄ μ»΄ν¨ν°μμ΄κ° λμ§ λ²μ¨ 8λ
μ°¨. 맀λ
μ±μ₯μ κ·Έλνλ₯Ό κ·Έλ €λ³΄λ©΄ μλ
κΉμ§λ§ ν΄λ μ°μν₯μ΄μλ€. (κ·Έλνμ κΈ°μΈκΈ°λ 맀λ
λ¬λμ§λ§) νλ μ¬ν΄λ κΈ°μΈκΈ°κ° 0 μ΄κ±°λ μ€νλ € λ§μ΄λμ€κ° λ κ² κ°μ λλμ΄λ€. μμΌκΉ.
ν€λ μ λμ΄μ μ±μ₯μ μν κΉ? (μ°μ…) μΆμ² : http://www.guro1318.or.kr/bbs/board.php?bo_table=data&wr_id=1723" ν€λ μ λμ΄μ μ±μ₯μ μν κΉ? (μ°μ…) μΆμ² : http://www.guro1318.or.kr/bbs/board.php?bo_table=data&wr_id=1723 νμ¬λ₯Ό λ€λλ€ λ³΄λ©΄ μμ£Ό μΌλ°μ μΌλ‘ “μν€λ μΌ"μ νκ³€ νλ€. μ£Όμ΄μ§ μ
무λ₯Ό μ ν΄μ§ κΈ°κ° μμ μ€νμ λ§μΆ° κ°λ°νλ. μμ£Ό κ·Ήλ¨μ μΌλ‘ λμκ² λ§νλ©΄ “λꡬ"λ‘ μ λ½λμ΄λ²λ¦΄ μλ μλ μκ°λ€. (κ°λ°μκ° λκ΅¬κ° λλ€λ λ§μ λ무λλ λ£κΈ° μ«μ λ§μ€μ νλ.) νν λ§νλ CRUD(Create, Read, Update, Delete) μ±μ κ°λ° μ
무λ₯Ό νκ³€ νλ€. νμ§λ§ κΌ μ±κ³Όμ align(λ μ’μ νκ΅λ§μ μ°Ύκ³ μΆμλ°…) νλ μΌ λ§κ³ λ νλλ μΌ(μΌμ’
μ μμ€ν
μ΄λ?)μ ν κ²½μ°λ μλλ° κ·Έκ² λ§μ½ μ¬λ―Έμλ μΌμ΄λΌλ©΄ μ΄λ¨κΉ?
νμλ κ·Έλ κ² “μν€λ μΌλ§ νλ©° μ¬λ―Έμλ νμ¬μν” λ³΄λ€ “μ¬λ―Έμκ² κ°λ°νλ©° μ±μ₯μ ν μ μλ νμ¬μν” μ΄λΌλ κΈ°μ€μ κ°μ§κ³ ν ν΄λ₯Ό μ§λ΄μ¨ κ² κ°λ€. μ¦, “μν€λ μΌ"μ΄ μλ “μν€μ§λ μμ μΌ"μ μ°Ύμμ ν΄κ°λ©°. μ컨λ, μ²μμ μ‘μλ μλΉμ€ κ΅¬μ‘°κ° μ¬μ©μκ° λ§μμ§κ³ μꡬμ¬νμ΄ λ§μμ§μ λ°λΌ 볡μ‘νκ³ μ±λ₯μ μ ν΄νλ μν©μ λ°κ²¬νκ³ λ―Έλ¦¬ ꡬ쑰κ°μ μ ν΅ν΄ μ±λ₯κ³Ό ν¨μ¨μ΄λΌλ λλ§λ¦¬μ ν λΌλ₯Ό μ‘λλ€κ±°λ. μ§λ μΈλΆ μΈλ―Έλμμ λ£κ³ μΈμ¬μ΄νΈλ₯Ό μ»μ΄ νλ΄μλ μ μ©ν΄λ³Έ λ°°μΉ λ¬΄μ€λ¨ λ°°ν¬ κΈ°λ₯. ν λ΄ μ½λ리뷰μ νμ±νμ μλμΌλ‘ ν΄μΌν μ
무λ€μ λ©μ μ λ΄μ νμ©νμ¬ μλν νλ€κ±°λ. μλΉμ€ μ§ν λμ보λλ₯Ό λ§λ€μ΄ νλμ μλΉμ€ μν©μ λ³Ό μ μκ² λ³λμ κ°λ° νμ΄μ§λ₯Ό λ§λ€μ΄ 보λ λ±. λ€μν μ
무 λ΄/μΈ μ μΌλ‘ μΌμ μ°Ύμκ°λ©° + νμμ κ°μΈ μκ°μ ν μ ν΄ κ°λ©΄μ μ λ§ μ¬λ―Έμκ² λ³΄λ΄μ¨ κ² κ°λ€.
νμ§λ§ λ€λ₯Ό λμ보면 “μ±μ₯ νλκ°?” λΌλ μ§λ¬Έμ΄ μλ€λ©΄ “κ·Έλ κ² νκ³ μλκ² κ°μμ μ λκ² ν΄μλλ° λμ보λ λ§μ λνλ νλ λλμ΄ λ λ€” λΌκ³ λ§ν μ μμ μ λλ‘ μ¬λ¬κ°μ§λ₯Ό λ§μ΄ νλ©° λ€μν “κ²½ν"μ μ»κΈ΄ νμ§λ§ μ€μ§μ μΈ “μ±μ₯"μ μμ½μ§λ§ λΆμ‘±ν ν ν΄ μλκ² κ°λ€.
νμ¬κ° μνλ, μ°μ°¨μ λ§λ μ
무 μλκ³Ό κ°λ° νμμμ μμΉλ₯Ό μΆ©μ‘±μν€κΈ°μ νμ¬ μμμ μ±μ₯νκΈ°μ νκ³κ° μλ€κ³ νλ¨μ΄ λ€μλ€. (μ΄ μκ°μ΄ μ μ΄μ μμΌ λ€μμκΉ.) μ€νμμ€λ μλ‘μ΄ μΈμ΄λ₯Ό νμ¬ λ°μμ νΌμμ κ³΅λΆ νλμ§ μ¬λ¬λͺ
μ΄μ μ€ν°λλ₯Ό ν΅ν΄ μ΅λμ ν΄μΌνκ³ ν μ΄νλ‘μ νΈ λν νμ¬μ λ³λλ‘ μ§ννλ©° κ°λ° μ€ν¬μ λλ €μΌ ν κ² κ°λ€. κ·Έ μ΄μ λ νμ¬μμμ μ±μ₯μ΄ κ²°κ΅ λμ μ±κ³Όλ‘ μ‘ν μλ μλλ° κ΄μ리 κΈ°λλ₯Ό νκ² λκΈ°λ νκ³ νΉν μλΉμ€λ₯Ό μ΄μνλ νμμλ μμ¦ ν« νλ€λ κ°λ° λ°©λ²λ‘ μ΄λ μ루μ
μ λμ
νκΈ°μλ λ€μ λ¬΄λ¦¬κ° μκΈ° λλ¬Έμ΄λ€.
μ μ
μμ . λ°°μμΌ ν κ²λ νμ¬ μ
무λ λ§μ νμ°μ λλ λκ° μμλ€. κ·Έλ κ² ν루μ 3~4μκ° μλ©° μ μ μμ΄ ν루λ₯Ό 보λ΄λ λ λ¬Έλ λκΈ° νμ΄ “κ°λ°μλ κΈ°μ λΈλ‘κ·Έλ₯Ό ν΄μΌ λΌ!“λΌλ μ ν μ΄ν΄κ° μ λλ λ§μ ν΄μ¨λ€. μ΄λ κ² λ°λΉ μ£½κ² λλ° λΈλ‘κ·Έμ κΈκΉμ§ μ°λΌκ³ ? λ§μ΄ λλ μ릴 νλΌλ©° λ°λ°νλ€ λͺ»λ΄ μ΄κΈ°λ μ² νλ λ κΈμ μ°κΈ° μμνκ³ , λ€λ₯Έ μ λͺ
λΈλ‘κ±°μ²λΌ μμ²λμ§ μμ§λ§ ν루μ 1,000~2,000λͺ
μ λ λ€μ΄μ€λ©° μ μ μ±μ₯ν΄ κ°λ λλ§μ κΈ°μ λΈλ‘κ·Έκ° λμλ€.
λ―Έμ½νμ§λ§ μ²μ보λ€λ μ±μ₯νκ³ μλ λΈλ‘κ·Έ PV(Page View)" λ―Έμ½νμ§λ§ μ²μ보λ€λ μ±μ₯νκ³ μλ λΈλ‘κ·Έ PV(Page View) λν νμμ κ°λ°μ κ²½λ ₯(?)μ λμ΄μΌ 보μλ©΄ κΈ°μ λΈλ‘κ·Έλ₯Ό νκΈ° μ κ³Ό νκ³ λ νλ‘ λλ λ§νΌ κΈ°μ λΈλ‘κ·Έλ κ°μΈμ μΌλ‘ μμ²λ μν₯λ ₯μ΄ λμλ€.
μ΄ κΈ°νλ₯Ό λΉμ΄ λκΈ° νμκ² κ°μ¬μ μΈμ¬λ₯Ό μ νκ³ μΆλ€. ν. λ³΄κ³ μμ£ ? ;]
μ΄λ² ν¬μ€ν
μ κΌ “λΈλ‘κ·Έλ₯Ό νμ” λΌκΈ° λ³΄λ€ “κΈμ μ μ¨μΌ νκ³ μ΄λ»κ² μ¨μΌ νλμ§"μ λν΄ μ΄μΌκΈ°ν΄λ³΄κ³ μ νλ€. μ²μ μ΄ κΈμ μ°λ €κ³ λ§μλ¨Ήμμ λ κ°λ°μλΌλ μ§κ΅°μ κ΅νλμ§ μκ³ λꡬμκ²λ μ μ©λ μ λμ λ²μ©μ μΈ κΈμ μ°λ € νμΌλ “S"μ μ‘°μΈμΌλ‘ λ
μ(νκΉ)μ μ΅λν κ°λ°μμ λ§μΆ° μ¨λ³΄κ³ μ νλ€. thanks to “S”
μ¬μ€ μ‘°κΈλ§ κ²μμ ν΄λ³΄λ©΄ νΉν κ°λ°μμκ² κΈμ°κΈ°κ° μΌλ§λ μ€μνμ§ μ°Ύμλ³Ό μ μμ μ λλ‘ λ€μν κΈλ€μμ “κ°λ°μκ° μ κΈμ μ¨μΌ νλκ°"μ λν λ΄μ©μ΄ μΈκΈμ΄ λκ³€ νμλ€. κΈμ μ°μ§ μλ κ°λ°μ. νμ§λ§ μ§κΈμ κΈμ°κΈ°κ° μ λ§ μ€μνλ€κ³ λλΌλ©° μ μ΄λ 2μ£Όμ νλ μ΄μμ κΈμ μ°λ €λ νμ
κ°λ°μμ μμ μμ μ 리λ₯Ό ν΄λ³΄κ³ μ νλ€. κ·Έλ¦¬κ³ λ§μΉ¨ λ©ν λ§ ν΄μ£Όκ³ μλ λΆκ»λ κΈ μ°λκ²μ λν μ€μμ±μ μλ €μ£Όκ³ μΆμκ³ , ν λ΄μλ 곡μ λ₯Ό νκ³ μΆμ΄ κ²Έμ¬κ²Έμ¬.
μ κΈμ μ¨μΌ ν κΉ? λΉλ‘μ λ΄ κ²μ΄ λκΈ° μν κ³Όμ νλ‘κ·Έλλ° μΈμ΄λ₯Ό μ²μ λ°°μΈλ κΌ λ§λλ 문ꡬ Hello Worldλ₯Ό μΆλ ₯νμμ€. μ΄κ² μλ―Ένλ μλ―Έκ° λ¬΄μμΌκΉ? μ λ§ μλ‘μ΄ μΈκ³λ₯Ό μλ €μ£Όλ € νλ κ² μΌκΉ?(κ·Έλ΄μλ μλ€…) μ°λ¦¬κ° μ΄μκ°λ©° “λ°°μ"μ΄λΌλ κ³Όμ μ λλΆλΆ λΉμ·νκ² μ§λ§ νΉν IT κΈ°μ μ μ±
μ λ€ μ½μλ€λ μ§, λμμ κ°μλ₯Ό λ€ λ€μλ€κ³ ν΄μ λ΄ κ²μ΄ λμλ€κ³ λ§νκΈ°λ μ΄λ €μΈ κ² κ°λ€. μ§μ ν€λ³΄λλ₯Ό λλλ € κ°λ©° κ±°κΈ°μ μ»μ μ μλ λ λ€λ₯Έ “μΈμ¬μ΄νΈ” κ° μκΈΈ μλ μκΈ° λλ¬Έμ΄λ€.
λ€λ₯Έ μλ‘, μ΄μνλ μμ€ν
μ΄λ μλΉμ€μμ μ₯μ λ₯Ό λ§μλ€κ³ κ°μ ν΄λ³΄μ. νμ§λ§ μ°λ¦¬λ λ κ·Έλμλ― μ΄λ»κ²λ μ₯μ λ₯Ό ν΄κ²°ν κ²μ΄λ€. μ΄λ¬ν μν©μμ λΆλͺ
“λ¬Έμ μ μμΈ"μ΄ μμμ ν
κ³ “ν΄κ²° κ³Όμ "μ΄ μκΈ° λ§λ ¨μΈλ° μ΄κ³³μμλ “μΈμ¬μ΄νΈ"κ° λΆλͺ
μμ κ²μ΄λ€.
μ΄λ¬ν “μΈμ¬μ΄νΈ"λ₯Ό κΈλ‘ μ λ€ λ³΄λ©΄ κ·Έλ₯ “μ~ κ·Έλ ꡬλ, κ·Έλ¬μ짔 νλ λ¨Έλ¦Ώμμμμ κΈ°μ΅λ³΄λ€λ ν¨μ¬ λ μ€λ λ¨μ κ²μ΄κ³ νΉμ¬ κΈμμ μ 리λ₯Ό μλͺ»ν΄ λ€λ₯Έ μ¬λλ€μ νΌλλ°±μ΄ μλ€λ©΄ λν λμ μμ΄ μ’μ ν¨κ³ΌλΌκ³ μκ°μ΄ λλ€. (μ΄κ²μ΄ λ°λ‘ 곡μ μ ν!)
λλΆμ΄ κΈμ μΈ λ μ¬λ°λ₯Έ μ 보μ κΈ°λ°νμ¬ μ°λ μ΅κ΄μ΄ μ€μνλ° κ·Έλ¬λ€ 보면 μλ μ°λ €κ³ νλ λ΄μ©λ³΄λ€ λ κΉκ² μμκ°λ κ³Όμ μμμ λ λ€λ₯Έ λ°°μμ μ»μ μ μλ λ°κ°μ μ κΈ°νκ° μκΈΈ μ μλ€. λκ° μν€μ§ μμμ΄λ λ°°μ΄ κ²μ λν νμ©μ νκ³ μΆμ μκ°μ΄ λ€κ³ μ΄λ₯Ό λ κΈλ‘ μ°κ³ . κΈμ μ μΈ μν μμ μ겨λλ μμ λ°μκ΅μΌμ§λΌλ μ±μ₯ν΄κ°λ μμ μ λλ μ μμ κ²μ΄λ€.
λͺΈμ΄ κΈ°μ΅νλ μ 리νλ μ΅κ΄ κ°λ°μ νλ€ λ³΄λ©΄ μ λ§ κ°λ¨ν “CRUD”(Create, Read, Update, Delete) λΆν° μμν΄μ μμ²λκ² λ³΅μ‘ν λλ©μΈ μ§μμ κΈ°λ°νμ¬ κ°λ°μ ν΄μΌ νλ μν©μ΄ μκΈ΄λ€. κ·Έλ΄ λλ©΄ λ¨Έλ¦ΏμμΌλ‘ μ 리νλ κ²λ³΄λ€ κ·Έλ¦Όμ΄λ κΈμ μ¨κ°λ©΄μ μ 리νλ κ² μ’λ€λ 건 κ΅³μ΄ λ§νμ§ μμλ μλ μ¬μ€. κΈμ μ°λ€ 보면 κΈ°μΉμ κ²°μ μ 리 λ°©λ²κ³Ό λͺ©μ μ΄ λ¬΄μμ΄κ³ κ·Όκ±°κ° λ¬΄μμΈμ§μ λν΄ κ΅¬λΆνλ μ€ν¬μ΄ λμ΄λλ κ² κ°λ€.(μ μ΄λ νμλ κΈ°μ λΈλ‘κ·Έλ₯Ό μ΄μνλ©΄μ μ 리νλ μ€ν¬μ΄ κ·Έμ λ³΄λ€ μμ²λκ² λμ΄λ¬λ€κ³ μλΆνλ€.)
μ€κ΅ μλ΄μ€μ νλ, λ¨Έλ¦Ώμμ λ°ν λμ€μ§ μλλ€.
μ§λ ν¬μ€ν
, κ·Έλ¬λκΉ μ°μν νμ λ€μμ μ΄λλ₯Ό λ°μ Spring batch μ λν ν
ν¬μΈλ―Έλμ λ€λ
μλ€. κ·Έ μ€ κ°μ₯ μΈμκΉμλ λΆλΆμ΄ λ°λ‘ 무μ€λ¨ λ°°ν¬. μ°¨μΌνΌμΌ λ―Έλ£¨λ€ νμκ° μν νμμλ λ°°ν¬λλ§λ€ κ°μ₯ λΆνΈμ λλΌκ³ μμλ λΆλΆμ΄μκΈ°λ νκ³ , κ·Έλ°κ°λ³΄λ€ νλ©° κ°λ
λ§ μκ³ λμ΄κ°κΈ°μ 무μΈκ° μμ¬μ μ°λ € μ§μ 무μ€λ¨ λ°°ν¬λ₯Ό ν μ μλλ‘ κ΅¬μ±μ ν΄λ³΄κ³ ν
μ€νΈκΉμ§ ν΄λ³΄κ³ μ νλ€.
μν© λ° λ¬Έμ μ 리λ
μ€ μλ²μ Jenkinsκ° μ€μΉλμ΄ μκ³ , Spring batch λͺ¨λμ μ€νμν€κ³ μλ€. μλμΌλ‘ μ€νμ νκ±°λ, Jenkins RestApiλ₯Ό μ΄μ©ν΄μ μ€νμ ν μ μμ§λ§ μ£Όλ‘ μ ν΄μ§ μκ° μ¦, μ€μΌμ₯΄λ§μ μν΄ μ€νλκ³€ νλ€. μ€μΌμ₯΄λ§μ κ°μ₯ μμ λ¨μλ 1λΆλ¨μ λ°°μΉλ μκΈ° λλ¬Έμ 24μκ° λ©μΆμ§ μκ³ μ€νλκ³ μλ€κ³ 무방νλ€. νμ§λ§ λ°°μΉ λͺ¨λμ΄ μμ λκ³ , λ°°ν¬λ₯Ό νκΈ° μν΄μλ λ€μκ³Ό κ°μ μλ리μ€λ‘ μ§νμ΄ λλ€.
Jenkins μ€μ μ λκΈ°μ μ€λΉ λ₯Ό μ€ννμ¬ λμ΄μ Jenkinsμ μν΄ Spring batch λͺ¨λ(μ΄ν Job)μ΄ μ€νλμ§ μλλ‘ νλ€. μλ‘μ΄ Jobμ λμ΄μ μ€νλμ§ μμ§λ§ μ΄λ―Έ μ€νμ€μ΄μλ Job μ κ°μ λ‘ μ€λ¨μ νκ±°λ Job μ΄ λλ λκΉμ§ κΈ°λ€λ¦°λ€. μ€νμ€μΈ Jobμ΄ μμ κ²½μ° μ΄μ λ°°ν¬λ₯Ό μ§ννλ€. λ°°ν¬κ° μλ£λλ©΄ Jenkins μ€μ μ λκΈ°μ μ€λΉλ₯Ό ν΄μ νλ€. μ€νμ€μΈ Jobμ΄ μλλλ©΄ λ§λ₯ κΈ°λ€λ¦΄ν
κ°? μΆμ² : https://m.post.naver.com/viewer/postView.nhn?volumeNo=14100660&memberNo=2032633" μ€νμ€μΈ Jobμ΄ μλλλ©΄ λ§λ₯ κΈ°λ€λ¦΄ν
κ°? μΆμ² : https://m.post.naver.com/viewer/postView.nhn?volumeNo=14100660&memberNo=2032633 μ€νλλ Jobμ μ€λ¨νμ§ λͺ»νλ μν© μ¦, μ€νμ€μ μ€λ¨νλ©΄ νΈλμμ
μ΄ κΉ¨μ Έ 무쑰건 κΈ°λ€λ €μΌλ§ νλ μν©μ΄λΌλ©΄ λ°°ν¬ λν κ³μ μ§μ°λ μ λ°μ μλ μν©μΈ κ²μ΄λ€. Spring bootμ java config λ₯Ό νμ©νκ³ λ± jar νμΌ νλλ₯Ό μ€ννλ λ°©μμ΄λΌλ©΄ jarνμΌμ λ°κΏμΉκΈ° νλ μμΌλ‘ κ³ λ―Όμ ν΄λ³Όμλ μμκ² κ°λ€. νμ§λ§ Legacy μ½λκ° μμ§ μ‘΄μ¬νμ¬ μΌλ° Spring μ xml λ‘ config νλ λ°©μμΌλ‘ μ΄μμ€μ΄λΌ jarνμΌ νλλ§ λ°κΏμΉκΈ° νκΈ°μ λ¬΄λ¦¬κ° μλ μν©.
μμ΄μμ²λΌ μ΄λμμλ μ¬μ©μ΄ κ°λ₯ν λ§λ³ν΅μΉμ½ κ°μ λ°©λ²μ μλ€. μΈμ λ κ·Έλ¬λ― νμ¬ μμ€ν
(xml config λ°©μ)μ κ°μ₯ μ΅μ νλ λ°©λ², κ·Έλ¦¬κ³ java config λ°©μμμλ μ¬μ©μ΄ κ°λ₯ν κ² κ°μ λ°©λ²μ μκ°ν΄ 보μλ€.
무μ€λ¨ λ°°ν¬λ₯Ό κ°λ₯μΌ νλ 3κ°μ§ ν΅μ¬ 1. λ°°ν¬λ₯Ό λ§€λ² μλ‘μ΄ κ²½λ‘μ λ°°ν¬νλ€. κ° νμ¬λ§λ€, κ·Έλ¦¬κ³ μλΉμ€λ§λ€ μ λ§ λ€μν λ°°ν¬ μμ€ν
μ΄ μλ€. κ·Έλ€μ 곡ν΅μ μ μ격μλ²μ νΉμ κ²½λ‘μ λΉλλ νμΌλ€μ λ°μ΄ λ£μ΄μ€λ€λ κ². μλ리μ€λ λ€μκ³Ό κ°λ€.
λ°°ν¬ν λλ§λ€ λ³λμ λλ ν 리λ₯Ό μμ±νλ€ μ¬λ³Όλ¦ λ§ν¬λ₯Ό μ°κ²°ν΄μ€λ€. λ°°ν¬λ 1μμ μ°κ²°ν μ¬λ³Όλ¦ λ§ν¬μ λ°°ν¬λλλ‘ μ€μ , κ²°κ΅ λ§€λ² λ§λ€μ΄μ§λ λλ ν 리μ λ°°ν¬κ° λκ² λλ€. μ¬κΈ°μ μ€μνμ μ “λ°°ν¬ν λλ§λ€ μλ‘μ΄ λλ ν 리μ λ°°ν¬κ° λλ€” μ λ°°ν¬μμλ νμ μ¬λ³Όλ¦ λ§ν¬μλ§ λ°°ν¬λ₯Ό νλ©΄ λκΈ° λλ¬Έμ “λ°°ν¬μμ€ν
μ΄ μλ‘ λ§λ€μ΄μ§λ λλ ν 리μ κ²½λ‘λ₯Ό λͺ°λΌλ 무방νλ€"λ μ μ΄λ€.
#!/bin/sh cd /~~~/deploy/ # μμ λλ ν 리 DIRECTORY_NAME=batch_$(/bin/date +%Y%m%d%H%M%S) mkdir $DIRECTORY_NAME μ μ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ©΄ batch_20191012205218 μ κ°μ λλ ν λ¦¬κ° μμ±μ΄ λλ€. μ¬λ³Όλ¦ λ§ν¬ κ΄λ ¨ν΄μλ λ°λ‘ μλ μ΄μ΄μ μ€λͺ
νκ² λ€.
2. μ¬λ³Όλ¦ λ§ν¬μ μλ λ§ν¬λ₯Ό μ¦μ λ³κ²½ λ³΄ν΅ μ¬λ³Όλ¦ λ§ν¬ (μ¦, λ°λ‘κ°κΈ°) μ κ²½λ‘λ₯Ό λ³κ²½νκΈ° μν΄μλ μλμ²λΌ μ§μ λ€κ° μμ νλ μμΌλ‘ νμλλ°
$ mkdir directory_a $ mkdir directory_b $ ln -s directory_a asdf $ ll asdf -> directory_a directory_a directory_b # directory_a μμ directory_b λ‘ λ°κΎΈλ κ²½μ° (μ¬λ³Όλ¦ λ§ν¬ μ체λ₯Ό μμ νκ³ λ€μ μ¬λ³Όλ¦ λ§ν¬ μμ±) $ rm asdf $ ln -s directory_b asdf $ ll asdf -> directory_b directory_a directory_b μ΄λ κ² λλ©΄ μμ νκ³ ~ λ€μ λ§λ€μ΄μ§λ νμ΄λ°μ λ°°ν¬κ° λκ±°λ μ€νμ΄ λλ μ¦, ν΄λΉ κ²½λ‘μ μμΈμ€ νλ κ²½μ° μ΄μ μ κ²½λ‘λ₯Ό λ°λΌλ³Έλ€κ±°λ μλνλ λ°©μμΌλ‘ μ€νμ΄ λμ§ μλ μν©μ΄ λ°μνλ€. (μ°°λμ νμ΄λ° μ΄μ§λ§ νμλ μ΄λ¬ν λ¬Έμ λ‘ μ΄μ μ κ²½λ‘λ₯Ό λ°λΌλ³΄λ λ¬Έμ κ° λ°μνμλ€.) κ·Έλμ ln μ μ΅μ
μ€μΈ -Tfsμ΅μ
μΌλ‘ μ¦μ λ³κ²½μ ν΄μ£Όλλ‘ νμ. (ln man μ°Έκ³ )
# λ§λ μμ λλ ν λ¦¬λ‘ λ°°ν¬λ μ μλλ‘ μ€μ νλ€.
μ§λμ£Ό μ°μν νμ λ€μμ μ§ννμλ “9μ μ°μν ν
ν¬ μΈλ―Έλ - μ°μν μ€νλ§ λ°°μΉ” μ λ€λ
μλ€. νμμκ² μ΄λ² 9μμ μ μ μ΄ μ΄λμ μλμ§ λͺ¨λ₯Όλ§νΌ λ°μκ³ νλ€μμ§λ§ μμ λΆν° κΆκΈνκΈ°λ νκ³ μμ¦λ€μ΄ κ΄μ¬μ κ°λ “λ°°μΉ μ΄ν리μΌμ΄μ
"μ μ΄λ»κ² νλ©΄ “μ°μν λ°©λ²"μΌλ‘ μ¬μ©ν μ μμμ§μ λν΄ μ¬λ¬ μκ°λ€μ΄ μμκΈ°μ ν° κΈ°λλ₯Ό κ°μ§κ³ μ§μ₯μ² μ 견λλ©° μ μ€ κ·Όμ²μ μλ μ°μν νμ λ€ μμμ§μΌλ‘ κ°κ² λμλ€. μ΄λ€ λ΄μ©μ λ°ννμλμ§μ λν΄ κΈ°μ΅μνλ λλν μ΅λ¬΄μκ° λμ΄ μ 리νκΈ° λ³΄λ€ μ£Όμ ν¬μΈνΈμ λν μκ°κ³Ό ν¨κ» μ°Έμ¬λ₯Ό λͺ»ν λΆλ€ μν΄μλΌκΈ° λ³΄λ€ λ΄ μ€μ€λ‘ μ 리λ₯Ό νκΈ° μν΄ ν¬μ€ν
μ μμ±ν΄ λ³΄κ³ μ νλ€. (μ΄λ²μλ λΆλ¬μ£Όμ
μ κ°μ¬ν©λλ€ ^=^)
μΈνΈλ‘ μ°μ¬μ λΆμ μλμ μ λͺ
νμ λΆμ΄λΌ λ³λμ μ€λͺ
μ΄ νμ μμ΄ μ΄μνμλ λΈλ‘κ·Έ μ£Όμλ‘ λ체λ₯Ό ν΄λ³Έλ€. μ΄λ² νμ¬μ μ΄λλμ λΆλ€μ νλ²μ΄λΌλ μ€νλ§ λ°°μΉλ₯Ό μ¨λΆ λΆλ€μ λμμΌλ‘ μ§ννκ² λμλ€κ³ νλλ° λ§μΉ¨ νμλ ν λ΄μμ μ΄μνκ³ μλ λ°°μΉ μ΄ν리μΌμ΄μ
μ λ³΄λ€ ν¨μ¨μ μ΄κ³ μ°μνκ² λ°κΏλ³΄κ³ μ νλ λμ¦κ° μμκΈ°μ μλ§ μ΄λλκ² μλκΉ μΆλ€.
μκΈ°μκΈ°ν μ°μν νμ λ€ κ±΄λ¬Ό λ΄λΆ" μκΈ°μκΈ°ν μ°μν νμ λ€ κ±΄λ¬Ό λ΄λΆ λλΆμ΄ λ°νμ μ κ°λ΅ν νμ¬κ° μνλ μΈμ¬μ λνμ¬ μΈκΈν΄μ£Όμ
¨λλ° κ·Έκ² μ΄μ°λ 곡κ°μ΄ κ°λμ§. μμ μκ°μ΄ λ¨λ€λ₯Έ νμ¬κ΅¬λ νκ³ λ€μνλ² μκ°μ.
μκΈ°λ³΄λ€ κ²½νμ΄ “μ μ” μ¬λμκ² “μ€λμ λΉν μ” μμ΄μΌ νκ³ , μκΈ°λ³΄λ€ κ²½νμ΄ “λ§μ μ¬λμ μ€λ” μν¬ μ μμ΄μΌ νλ€.
κΈ°λ³ΈνΈ λ°°μΉ μ΄ν리μΌμ΄μ
μ΄λ μ»΄ν¨ν°μμ μ¬λμ μνΈμμ©μμ΄ μ΄μ΄μ§λ νλ‘κ·Έλ¨(μμ
)λ€μ μ€νμ΄λΌκ³ μν€νΌλμμ κ°κ²°&λͺ
λ£νκ² μ 리λμ΄ μλ€. κ·Έλ§νΌ μΌλ°μ μΈ μΉ μ΄ν리μΌμ΄μ
κ³Όμ μ°¨μ΄κ° μλλ° μΉ μ΄ν리μΌμ΄μ
μ μ€μκ° μ²λ¦¬κ° κΈ°λ³Έμ΄κ³ μμ²μ λν μλ΅μ μ 곡ν΄μΌ νλ μ무λλ μλκ° μλμ μ΄λ©° QAμ νΈν λΆλΆμ΄ μλ€. κ·Έμ λ°ν΄ λ°°μΉ μ΄ν리μΌμ΄μ
μ μΉ μ΄ν리μΌμ΄μ
μμ λ§νλ μμ²μ΄λΌλ κ°λ
λ³΄λ€ νμμ²λ¦¬μ κ°κΉκ³ , μλ λν μ λμ μ΄λ©° QAκ° λ³΅μ‘νλ€λκ² νΉμ§μ΄λ€. λ°λΌμ ν
μ€νΈμ½λλ μΉ μ΄ν리μΌμ΄μ
λ³΄λ€ λ°°μΉ μ΄ν리μΌμ΄μ
μ΄ λ νμνλ€κ³ λ³Ό μ μλ€. λ°°μΉ μ΄ν리μΌμ΄μ
μ΄ νμν μν©μ ν¬κ² λκ°μ§λ‘ λλ λ³Ό μκ° μλ€κ³ νλ€.
μΌμ μ£ΌκΈ°λ‘ μ€ν λμ΄μΌ ν λ μ€μκ° μ²λ¦¬κ° μ΄λ €μ΄ λλμ λ°μ΄ν°λ₯Ό μ²λ¦¬ ν λ νμ 첫λ²μ§Έ μν©λ§ μκ°νκ³ λ°°μΉ μ΄ν리μΌμ΄μ
μ μμ±νκ³€ νμλλ° λλ²μ¬ μν©μ λν΄ μκ°μ μκ°μ λ ν΄λ³΄λ μ€νλ§ λ°°μΉλ₯Ό κ°λ¨νκ²λ§ (Tasklet) μ¬μ©νκ³ μλ건 μλκ° νλ λ°μ±μ ν΄λ³΄κ³€ νλ€. (Reader, Processor, Writer λ± λ€μν λ μ΄μ΄κ° μλλ°λ…)
νΉν μ€νλ§ λ°°μΉμμλ κΈ°λ³Έμ μΌλ‘ λͺ¨λ λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬μ μμ§ μλ μ‘°νλ°©μλΌκ³ νλ€. (DBκΈ°μ€) Paging νΉμ Cursorλ‘ pageSizeλ§νΌλ§ μ½μ΄μ€κ³ chunkSizeλ§νΌλ§ commit νλ νν. μ΄λ¬ν κ° λ μ΄μ΄λ³ sizeλ₯Ό μ μ‘°μ νκΈ°λ§ ν΄λ μ μ λ
Έλ ₯μΌλ‘ ν° μ±λ₯μ μ»μ μ μλ λΆλΆμ΄ νλ μμν¬λ₯Ό μ¬μ©νλ μ΄μ μλκΉ λΌκ³ μκ°ν΄λ³Έλ€.
λν @JobScope λ @StepScopeλ Late Binding μ¦ λ°°μΉ μ΄ν리μΌμ΄μ
μ΄ μ€νλλ μμ μ΄ μλλΌ Job μ΄ μ€νλ λ μμ±μ΄ λκΈ° λλ¬Έμ μ΄λ₯Ό νμ©νμ¬ λμ μΌλ‘ reader / processor / wirter λ μ΄μ΄λ₯Ό λ§λ€ μ μλ€κ³ νλ€.
νμ©νΈ μ€νλ§ λ°°μΉλ₯Ό μ΄μ©ν λ°°μΉ μ΄ν리μΌμ΄μ
μ΄ μκ³ μ΄λ₯Ό μ€μΌμ₯΄λ§ λ± κ΄λ¦¬λ₯Ό ν΄μ£Όλ λꡬλ€μ μ΄μΌκΈ°λ₯Ό ν΄μ£Όμ
¨λ€.
Cron 리λ
μ€λ₯Ό μ΄λμ λ μ¬μ©ν΄λ΄€λ€λ©΄ μλ§ν 리λ
μ€ κΈ°λ³Έ μ€μΌμ₯΄λ§ νλ‘κ·Έλ¨μΈ Cron. νμλ Cron μΌλ‘ μ£ΌκΈ°μ μΌλ‘ μ€ννλλ‘ μ€μ ν΄λ³΄κΈ°λ νμμ§λ§ λ°°μΉ μ΄ν리μΌμ΄μ
μ νΉμ±μ λ‘κ·Έ λ° μ€ν/μ’
λ£ λ± μ νμ¬νμ΄ λ§μ 건 μ¬μ€μΈκ² κ°λ€. Spring MVC + API Call μ£Όλ³μμ μ¬μ©νκ³ μλ€κ³ νλ λ°©μ. μ΄ λ°©μμ μ₯μ μ νμ λ μκΈ° λλ¬Έμ μ΄ν리μΌμ΄μ
ꡬλμκ°μ΄ λ³λλ‘ νμ μλ€λ μ₯μ μ΄ μμ§λ§ μ λ°μ μΈ κ΄λ¦¬κ° μ΄λ €μ΄ λ¨μ μ΄ μλκ² κ°λ€. λ¬Όλ‘ μΈλ©° 겨μλ¨ΉκΈ° μμΌλ‘ λ¨μ μ 극볡ν λ°©λ²μ μ¬λ¬κ°μ§κ° μκ² μ§λ§ λͺ¨λ 건 νμ Trade off Spring Batch Admin (Deprecated) μμ νλΆμ΄ μλ €μ£Όμ
μ μ κΉ λ΄€λ λΆλΆμ΄κΈ΄ νλ° μ΄λμ¬μ΄μ Deprecated λμλ€κ³ νλ€. Quertz + Admin http://www.quartz-scheduler.org/ μμ£Ό μ€λμ μ μ¨λ³Έ κΈ°μ΅μ΄ μμ§λ§ λ°°λ³΄λ€ λ°°κΌ½μ΄ λ ν° μν©κ°μλ νλ€μλ κΈ°μ΅λ€λ§ λ¨μμλ ꡬνλ°©λ²μΈκ² κ°λ€.
λͺ¨λν°λ§μ μλΉμ€ λ‘μ§ κ°λ° λ§νΌ νλ²μ© κ³ λ―Όν΄λ³΄κ³ κ²½νν΄ λ΄€μ μ€μν μμμ΄λΌ ν μ μλ€. κ·Έμ€ μΉμλ²μμ μ 곡ν΄μ£Όλ μμΈμ€ λ‘κ·Έλ μ΄μνκ³ μλ μΉμλΉμ€μ λν΄ μ¬λ¬κ°μ§ μΈ‘λ©΄μμ λΆμν μ μλ κ°μ₯ κ°λ ₯ν μμ΄ν
μ€μ νλλΌκ³ μκ°νλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μλ€μ΄ μ΄λ€ urlμ λ§μ΄ νΈμΆνκ³ , μ΄λ€ user-agentννλ₯Ό μ¬μ©νλμ§ μκ² λλ©΄ κ·Έμ λ°λΌ μλΉμ€ μ λ΅μ λ³κ²½ν μλ μκ³ μ
μμ μΌλ‘ 곡격μ μΈ μμ²μ λν΄ μΉμλ²λ¨μμ μ°¨λ¨μ ν μ μκΈ° λλ¬Έμ΄λ€. μ΄λ κ² inbound νΈλν½(μΈλΆμμ λ€μ΄μ€λ μμ²)μ λν΄μλ μμΈμ€ λ‘κ·Έλ₯Ό μ λΆμνλ©΄ κΈ°μ‘΄μ μΉ μ΄ν리μΌμ΄μ
κ³Όλ μ ν 무κ΄νκ² λͺ¨λν°λ§μ΄ κ°λ₯νμ§λ§ λ°λλ‘ outbund νΈλν½(μΈλΆλ‘ λκ°λ μμ²)μ λν΄μλ μ΄λ€μμΌλ‘ λͺ¨λν°λ§μ ν μ μμκΉ?
μκΈν΅μ₯μ inbound νΈλν½λ³΄λ€ outbound νΈλν½μ΄ λ무 λ§μ μμ¦…μ΄λ―Έμ§ μΆμ² : https://www.app24moa.com/feedDetail/2/2002" μκΈν΅μ₯μ inbound νΈλν½λ³΄λ€ outbound νΈλν½μ΄ λ무 λ§μ μμ¦…
μ΄λ―Έμ§ μΆμ² : https://www.app24moa.com/feedDetail/2/2002 μ컨λ°, λ μ¨ μλΉμ€λ₯Ό νκΈ° μν΄ μΈλΆμμ μμΈλ μ¨λΌλ νμ΄μ§λ₯Ό μ‘°ννμ κ²½μ° κΈ°μμ² APIμμ λ겨λ°μ λ°μ΄ν°λ₯Ό κ°κ³΅νμ¬ λ³΄μ¬μ€λ€κ³ κ°μ ν΄λ³΄μ. μ΄λ κΈ°μμ²μμ μ 곡ν΄μ£Όλ νΉμ APIμ€μ μ΄λ νλκ° λ¦κ² μλ΅μ΄ μ¨λ€κ±°λ, νΉμ μκ°λμ μλ¬μλ΅μ λ°μκ²½μ° κ³Όμ° μ΄λ₯Ό μ΄λ€μμΌλ‘ λͺ¨λν°λ§ ν μ μμκΉ? μ΄ν리μΌμ΄μ
μ½λμ λͺ¨λν°λ§μ μν μ½λλ₯Ό μΆκ°ν κ²μΈκ°? νΉ νλμ μλ²μμ Aλͺ¨λμ javaλ‘, Bλͺ¨λμ pythonμΌλ‘ κ°λ°λμμ κ²½μ° κ°κ° λͺ¨λλ§λ€ λͺ¨λν°λ§μ μν μ½λλ₯Ό μΆκ°νλ μμΌλ‘ νλ€λ³΄λ©΄ λΉμ§λμ€ λ‘μ§μ λ°©ν΄νκ±°λ μ€νλ € μΆκ°ν μ½λ λν κ΄λ¦¬ν΄μΌ νλ λ°°λ³΄λ€ λ°°κΌ½μ΄ λ μ»€μ Έλ²λ¦΄ μν©λ μκΈΈμ μλ€. μ΄ν리μΌμ΄μ
μ λΉμ§λμ€ λ‘μ§κ³Όλ 무κ΄νκ² μλ² μ체μμ μΈλΆλ‘ λκ°λ λ€νΈμν¬ νΈλν½μ λν΄ λͺ¨λν°λ§μ ν μ μλ κ°λ²Όμ°λ©΄μλ μ¬νν λͺ¨λμ μ°Ύκ³ μΆμλ€. μ΄ν리μΌμ΄μ
μ κ°λ°μΈμ΄κ° 무μμ΄λ μκ΄μμ΄ λ³λμ μμ΄μ νΈ νμμΌλ‘ λμλκΈ°λ§ νλ©΄ λ€νΈμν¬ νΈλν½μ μμ§ λ° λΆμ, λμκ°μλ λͺ¨λν°λ§κΉμ§ ν μμλ… κ·Έλμ μ°Ύλ€λ³΄λ μμλ μ΄λ¬ν κ³ λ―Όμ λκ΅°κ°λ νκ³ μμκ³ μ€νμμ€κΉμ§ λμ΄μλ Elastic Stack μ Beatμ€ PacketbeatλΌλ λ°μ΄ν° μμ§λͺ¨λμ μκ² λμλ€.
μμ λ΄κ° νκ³ μλ κ³ λ―Όμ μ΄λ―Έ λκ΅°κ° νλ κ³ λ―Όλ€… μ΄λ¬ν κ³ λ―Όμ λν΄ ν΄κ²°νλ λ°©λ²μ λ³΄λ€ λΉ¨λ¦¬ μ°Ύλκ² κ²½μλ ₯μ΄ λ ν
λ°…
μ΄λ² ν¬μ€ν
μμλ Packetbeat μ λν΄ κ°λ¨ν μμλ³΄κ³ μ΄λ₯Ό νμ©νμ¬ outbound νΈλν½μ λν΄ λͺ¨λν°λ§μ ν΄λ³΄λ©° μ΄λ€μμΌλ‘ νμ©ν μ μλμ§μ λν΄ μμλ³΄κ³ μ νλ€.
Packetbeat ? ElasticStack μ€μ λ°μ΄ν° μμ§κΈ° νλ«νΌμΈ Beatsμ€ λ€νΈμν¬ νΈλν½ λ°μ΄ν°μ λν΄ μμ§μ ν μ μλ λ°μ΄ν° μμ§κΈ°λ₯Ό μ 곡νκ³ μλ€. pcapλΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄μ©νμ¬ μλ²μ λ€νΈμν¬ λ 벨μμ λ°μ΄ν°λ₯Ό μμ§ λ° λΆμν ν μΈλΆλ‘(Elasticsearch, Logstash, Kafka λ±) μ μ‘ν΄μ£Όλ κ²½λ λ€νΈμν¬ ν¨ν· λΆμκΈ°λΌκ³ 곡μ ννμ΄μ§μ μκ°λκ³ μλ€. λͺλ² μ¬μ©ν΄λ³΄λ©΄μ λλ μ₯μ λ€μ λ€μκ³Ό κ°λ€.
μ€μΉ λ° μ€νμ΄ λ무 κ°λ¨νλ€. μ€μ κ° νλμ ν΅ν΄ κ°λ¨νμ§λ§, κ·Έλ¬ν κ°λ¨ν¨μ λΉν΄μ λ무 κ°λ ₯ν μμ§μ΄ κ°λ₯νλ€. μμ μ΄μΌκΈ° νλ μ΄ν리μΌμ΄μ
μ½λμλ μ ν 무κ΄νκ² μλνλ€. 무μμ ν΄λ³Όκ²μΈκ°?! (a.k.a. λͺ©ν) νμκ° μ΄μνλ Daily-DevBlog λΌλ μλΉμ€κ° μλ€. (κ°λΆ μλΉμ€ ν보) μ¬λ¬ μ¬λλ€μ rssλ₯Ό μ‘°ννκ³ νμ±ν΄μ λ©μΌμ 보λ΄μ£Όλ μλΉμ€ μΈλ°, packetbeat μ¬μ© μμλ₯Ό λ€κΈ°μν΄ μ‘°κΈ λ³ννμ¬ λͺ¨λ rssλ₯Ό μ κ·Όνκ³ κ°μ₯ μ΅μ κΈμ μ λͺ©μ μΆλ ₯νλ μμ£Ό κ°λ¨ν python μ€ν¬λ¦½νΈλ‘ outbound νΈλν½μ λ°μμμΌ λ³΄κ³ μ νλ€. κ·Έλ¦¬κ³ packetbeat λ₯Ό μ΄μ©νμ¬ μΈλΆλ‘ νΈμΆλλ νΈλν½μ μμ§νκ³ Elasticsearch λ‘ μΈλ±μ± νμ¬ μ΅μ’
μ μΌλ‘λ μ΄λ rssμ μλκ° κ°μ₯ λλ¦°μ§ μ€νλλ pythonμ½λμλ μ ν κ΄λ ¨μμ΄ λͺ¨λν°λ§ ν΄λ³΄κ³ μ νλ€. python μ½λλ λ€μκ³Ό κ°λ€.
μ°Έκ³ λ‘ νμλ awesome-devblogμ μ΄μμλΆκ» ν΄λΉ λ°μ΄ν° μ¬μ©μ λν΄ νλ½μ λ°μ μνμ΄λ€.
import requests, yaml, feedparser blog_info_list_yml_url = 'https://raw.githubusercontent.com/sarojaba/awesome-devblog/master/db.yml' blog_info_list_yml = requests.get(url=blog_info_list_yml_url).text blog_info_yaml_parse_list = yaml.load(blog_info_list_yml) for blog_info in blog_info_yaml_parse_list : if 'rss' not in blog_info.keys() or not blog_info['rss']: continue rss_url = blog_info['rss'] try : parse_feed = feedparser.parse(rss_url) except : continue parse_feed_data = parse_feed.entries[0] print(blog_info['name'], '|', parse_feed_data['title'], '|', parse_feed_data['link']) μ μ½λλ₯Ό μ€ννλ©΄ μλμ²λΌ μμ£Ό κ°λ¨νκ² λΈλ‘κ·Έ μ£ΌμΈμ μ΄λ¦κ³Ό μ΅μ κΈ μ λͺ©, λ§ν¬κ° μΆλ ₯μ΄ λλ€.
μΉμλ² νλλ§ μ¬μ©νκ±°λ WAS νλλ§μ μ¬μ©νλ©° μΉμλΉμ€λ₯Ό μ΄μνλ κ²½μ°λ κ·Ήν λλ¬Όλ€. μΉμλ²μ μ₯μ κ³Ό WASμ μ₯μ κ·Έ λλ§λ¦¬μ ν λΌλ₯Ό λ€ μ‘κΈ° μν΄ λ³΄ν΅ μλ¨μ μΉμλ²λ₯Ό λκ³ κ·Έ λ€μ WASλ₯Ό λλ©° μλΉμ€λ₯Ό μ΄μνκ³€ νλ€. νλ° μ΄μνλ μλΉμ€κ° μΈκΈ°κ° λ§μμ Έ(?) μ¬μ©λμ΄ λ§μμ§λ€λ©΄ κ·Έλ§νΌ μλ΅μ΄ λλ € (TPS λ±) μλ²λ₯Ό λλ €μΌ νλ μν©μ΄ μκΈ΄λ€κ³ κ°μ ν΄λ³΄μ.(λ¬Όλ‘ μλ²λ₯Ό λ리λ κ²λ³΄λ€ μΊμλ₯Ό μ μ©νκ±°λ λ‘μ§μ λ°κΏλ³΄λ λ
Έλ ₯μ΄ μ νλμΌ νκ² μ§λ§…) λΉμ°ν μλ²λΆν° ꡬ맀νλ©° “Scale Out"μ νλ €κ³ ν κ²μ΄λ€. λ§μ½ μλ μ΄μνλ μλ²κ° λ무 μ’μμ CPUλ λ©λͺ¨λ¦¬ μ¬μ©λ₯ μ΄ κ±°μ λ°λ₯μ΄μ¬λ μλ²λ₯Ό ꡬ맀ν΄μΌ ν κΉ? μλ²λ₯Ό ꡬ맀νκ²λλ©΄ κ²°κ΅ λκ° μ΄μμ μλ²κ° μ΄μλ ν
λ° κ·Έ μλ²λ€μ μμμ λ¬Άμ΄μ£Όλ©° νΈλν½μ λΆμ°μμΌμ£Όλ 무μΈκ°κ° νμνλ€. κ·Έλ¬ν κΈ°μ μ λ°λ‘ λ‘λλ°Έλ°μ± μ΄λΌκ³ νλ€. ν΅μ L4 μ€μμΉλ₯Ό νμ©νμ¬ μμ²μ μ¬λ¬ μλ²λ€λ‘ λΆμ°μν€λ©° μ°μ μ μΌλ‘λ μλ² λμλ§νΌ μ±λ₯μ΄ μ’μμ§λ ν¨κ³Όλ₯Ό λ³Ό μ μλ€. νμ§λ§ μμ λ§νλ― μλ²μ μμ μ¬μ©λ₯ μ΄ λ°λ₯μΌ μ λλ‘ κ±°μ μ¬μ©μ μν κ²½μ° μλ²λ₯Ό ꡬ맀νλ건 λ무λ λΉν¨μ¨μ μ΄λ€. μ΄λ² ν¬μ€ν
μμλ μλ²λ₯Ό λλ¦¬μ§ μμΌλ©΄μ μΉμλ² μ€ μνμΉλ₯Ό νμ©νμ¬ μ¬λ¬ WASλ₯Ό μ΄μνλ λ°©λ²μ λν΄ μμλ³΄κ³ μ νλ€. μλ² λλ €μΌ νλ μν©μμ μ¬μ©ν΄ λ³Ό μ μλ λλ§μ μ’μ 무기(?)κ° μκΈ΄κ² μλκΉ μκ°μ΄ λ λ€.
μνμΉλ EOLμ΄ λμκΈ° λλ¬Έμ 2.4λ²μ μΌλ‘ μ€μΉνκ³ , WASλ νΈμμ ν°μΌ μ΅μ λ²μ μΌλ‘ μ€μΉν΄μ λμΌν μλ²μ μνμΉ νλμ ν°μΌ 3λλ₯Ό μ°λνλκ²μ λͺ©μ μΌλ‘ νλ€. λ‘λλ°Έλ°μ±μ΄ μ΄λ€μμΌλ‘ μ΄λ£¨μ΄ μ§κ³ νμμ μ°κ²°λ ν°μΌμ 컨νΈλ‘€ νλ λ°©λ² λν μμλ³Ό μμ μ΄λ€.
μλ² νκ²½ λ° μ€μΉνκ² λ κ° λ²μ μ λ€μκ³Ό κ°λ€. μλ² : CentOS 7.4 64Bit apache : httpd-2.4.39 tomcat : apache-tomcat-8.5.43 tomcat-connectors(mod_jk) : 1.2.46
Apache μ Tomcat μ€μΉ νμμ ν¬μ€ν
μμ μ’
μ’
λμ€λ λΆλΆμ΄κΈ°λ νκ³ , ꡬκΈλ§ ν΄λ³΄λ©΄ λ°λ‘ μ€μΉ λ°©λ²μ μ½κ² μ°Ύμ μ μκ² μ§λ§ κ·Έλ λ€κ³ μΈκΈμ μνκ³ λμ΄κ°κΈ°μ λ무 λΆμΉμ νλ… μΉνΈν€μ²λΌ(?) λΉ λ₯΄κ² μ 리ν΄λ³΄μ.
Apache $ wget http://apache.tt.co.kr//httpd/httpd-2.4.39.tar.gz $ tar -zxvf httpd-2.4.39.tar.gz $ ./configure --prefix=/home/~~~/apache $ make && make install $ cd /home/~~~/apache/bin $ sudo chown root:κ³μ λͺ
httpd $ sudo chmod +s httpd $ vi /home/~~~/apache/conf/httpd.conf User κ³μ λͺ
Grop κ³μ λͺ
$ /home/~~~/apache/bin/apachectl start β μ€ν μ΄λ κ² μ€μΉλ₯Ό νλ€ μ€νμ μν€κ³ μλ²μ ipλ₯Ό μ μν΄λ³΄λ©΄ μλμ κ°μ νλ©΄μ λ³Ό μ μλ€.
Tomcat $ wget http://mirror.apache-kr.org/tomcat/tomcat-8/v8.5.43/bin/apache-tomcat-8.5.43.tar.gz $ tar -zxvf apache-tomcat-8.5.43.tar.gz $ /home/apache-tomcat-8.5.43/bin/start.sh β μ€ν ν°μΌμ κΈ°λ³Έ http ν¬νΈμΈ 8080μΌλ‘ μ μμ ν΄λ³΄λ©΄ κ·μ¬μ΄ κ³ μμ΄κ° μλ ν°μΌ κΈ°λ³Ένλ©΄μ λ³Ό μ μλ€.
μνμΉμ ν°μΌ μ°λνκΈ° μνμΉμ ν°μΌμ μ°λμ mod_jk μ mod_proxy λ± λ€μν λͺ¨λλ‘ μ°λμ ν μ μλλ° μ΄λ² ν¬μ€ν
μμλ mod_jk λ₯Ό νμ©νλ λ°©λ²μ λν΄ μμλ³΄κ³ μ νλ€. μ°μ mod_jk λ₯Ό μ€μΉνμ.
κ°λ¨ν mod_jk λ μ»΄νμΌ, μ€μ λ± λ³΅μ‘νμ§λ§ ν°μΌ μ μ© λ°μ΄λ리 νλ‘ν μ½μΈ AJPλ₯Ό μ¬μ©νκΈ° λλ¬Έμ λμ μ±λ₯μ κΈ°λν μκ° μλ€. mod_proxy λ λ°λ©΄ κΈ°λ³ΈμΌλ‘ μνμΉμ νμ¬λμ΄μλ λͺ¨λμ΄κΈ° λλ¬Έμ λ³λμ λͺ¨λ μ€μΉκ° νμ μκ³ μ€μ λ κ°λ¨νλ€λ μ₯μ μ΄ μλ€. κ° μ°λλ°©μμ μ₯λ¨μ μ΄ μκΈ° λλ¬Έμ λ³ΈμΈμ΄ μ΄μνλ μλ² μν©μ λ§μΆμ΄ μ μ© ν νμκ° μλ€.
mod_jk μ€μΉ $ wget http://apache.tt.co.kr/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.46-src.tar.gz $ tar -zxvf tomcat-connectors-1.2.46-src.tar.gz $ cd tomcat-connectors-1.2.46-src/native $ ./configure --with-apxs=/home/~~~/apache/bin/apxs $ make && make install $ /home/~~~/apache/modules νμμ mod_jk.soκ° μκΉ mod_jk λ₯Ό νμ©νλ©΄ AJPλΌλ ν΅μ μΌλ‘ μνμΉμ ν°μΌμ΄ μ°λλλλ° ν°μΌμ κΈ°λ³Έ AJP ν¬νΈλ 8009λ²μμ μκ³ λ€μμ²λΌ μ€μ μ ν΄μ£Όμ.
apache/conf/workers.properties worker.list=tomcat1 worker.tomcat1.port=8009 worker.tomcat1.host=localhost worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor=1 apache/conf/httpd.conf LoadModule jk_module modules/mod_jk.so <IfModule jk_module> JkWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log JkLogLevel info JkMount /* tomcat1 </IfModule> μ΄λ κ² νκ³ μ μνμΉμ ν°μΌμ μ¬μμ νμ μλ²μ ipλ‘ μ μν΄λ³΄λ©΄ (λ³λμ port μμ΄) ν°μΌ μ€μ νμ΄μ§λ‘ λλ©μ΄ λλκ²μ νμΈν μ μλ€.
κ°λ°μ νλ€λ³΄λ©΄ μ€μ λ‘ μ§μ ꡬνμ ν΄λ³Έμ μ μμ§λ§ μ¬κΈ°μ κΈ°μ λ€μ΄λ³Έ μ§μκ³Ό κ·Έ λμμ 짬λ°₯(?)μΌλ‘ μΆμΈ‘ν΄λ³Όμ μλ λΆλΆλ€μ΄ μλ€. λ¬Όλ‘ λͺ¨λ μΌμ μ λ΅μ μκ² μ§λ§ μμ¦ λλΌλ건 μ±
μμ 곡λΆλ§ ν΄λ³Έκ²κ³Ό λ€λ₯Έ λΈλ‘κ·Έλ€μμ λμΌλ‘λ§ λ³΄κ³ λμ΄κ°λκ²λ€ κ·Έλ¦¬κ³ μ§μ μκ°λ½μ μμ§μ¬κ°λ©° μ μ¬κΈ°μλ μ΄ λ°©λ²μ μ¬μ©νμ§ κ³ λ―Όνλ©΄μ ꡬνμ ν΄λ³Έλ€λ건 μ λ§ μμ²λκ² ν° μ°¨μ΄κ° μλκ² κ°λ€. μΉ μ΄ν리μΌμ΄μ
μ κ°λ°νλ€λ³΄λ©΄ νλ² μ―€ λ§λκ² λλ νμΌ μ
λ‘λ κΈ°λ₯. νμλ λͺλ² κ΅¬νμ ν΄λ΄€μ§λ§ κ·Έλ₯ λ¨μν ꡬνλ§ ν΄λ³Έ μνμλ€κ° μ΅κ·Όμ κ·Έλ₯ νμΌ μ
λ‘λκ° μλ λμ©λ νμΌ μ
λ‘λμμμ λ¬Έμ κ° λ°μνμ¬ μ¬κΈ°μ κΈ° μ½μ§μ νκ² λμκ³ μ 리λ ν΄λ³Όκ²Έ μ€νλ§μμμ λμ©λ νμΌ μ
λ‘λμ νλ²μ―€ κ³ λ €ν΄λ΄μΌ ν λΆλΆμ λν΄ μ 리λ₯Ό ν΄λ³΄λ €κ³ νλ€.
λ¬Όλ‘ κ΅¬κΈμμ κ²μμ ν΄λ³΄λ©΄ μλ§ νμκ° μ΄κ² λ³΄λ€ λ μμΈνκ³ μ’μ κΈλ€μ΄ μκ² μ§λ§ νμλ λ³΄λ€ λμ©λμ μ§μ€μμ μμ±ν΄ λ³΄κ³ μ νλ€. λͺ
μ¬νμ. “μ무리 νλ¦° μν¬λΌλ μ’μ κΈ°μ΅λ ₯λ³΄λ€ λ«λ€” λΌλ λ§μ΄ μλ―μ΄
μ€νλ§μ νμ©ν νμΌ μ
λ‘λ ꡬν μ°μ μμ μ΄κΈ°μνμμ μμνκΈ° μν΄ μ€νλ§ λΆνΈ νλ‘μ νΈλ₯Ό λ§λ€κ³ κ°λ¨νκ² νμΌ μ
λ‘λλ₯Ό ν μ μλ form νμ΄μ§μ μ
λ‘λ λ²νΌμ λλ μλ μλνκ² λλ 컨νΈλ‘€λ¬λ₯Ό λ§λ€μ΄ 보μ.
import java.io.File; import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.FileUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import lombok.extern.slf4j.Slf4j; @Slf4j @Controller public class FileUploadController { // λ무 κ°λ¨ ... @RequestMapping("/form") public String form() { return "form"; } @RequestMapping(value = "/upload", method = RequestMethod.POST) public String upload(@RequestParam("file") MultipartFile multipartFile) { log.info("### upload"); File targetFile = new File("/home1/irteam/" + multipartFile.getOriginalFilename()); try { InputStream fileStream = multipartFile.getInputStream(); FileUtils.copyInputStreamToFile(fileStream, targetFile); } catch (IOException e) { FileUtils.deleteQuietly(targetFile); e.printStackTrace(); } return "redirect:/form"; } } upload μμ²μ΄ λ€μ΄μ€λ©΄ fileμ΄λΌλ μ΄λ¦μ νλΌλ―Έν°λ‘ MultipartFileμ λ°κ³ νμΌμ μ΄λ¦μ νμΈ ν μ€νΈλ¦Όμ μ½μ΄ νΉμ κ²½λ‘μ νμΌλ‘ μ μ₯νλ λ‘μ§μ΄λ€. κ·Έλ€μ /formμ μ μνκ² λλ©΄ λμ€λ νΌ νλ©΄μ λ§λ€μ. μ΄κ²λ μμ£Ό μ¬ννκ²!
<h1>νμΌ μ
λ‘λ</h1> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" value="νμΌ μ ν" name="file"/> <input type="submit" value="μ
λ‘λ"/> </form> multipart/form-data λΌλ Content-Type μ λͺ
μν΄μ£Όκ³ νμΌμ μ ννλ©΄ /uploadλ‘ POSTμμ²μ νλλ‘ μ€μ νλ€. μ΄λ κ² λλ©΄ λ무 κ°λ¨νκ² + μ΄μμμ΄ νμΌμ΄ μ
λ‘λκ° μ λλ μ΄κ² μ΄μΌκΈ° ν 꺼리μΈκ°(?) μΆμμ λλ‘ μ¬ννλ€.
κ·Έλ°λ° νμΌ ν¬κΈ°κ° ν¬λ€λ©΄? μ€λ§ νμΌ μ
λ‘λ νλ μ©λμ΄ ν¬κ² μ΄?… μ μ§ νμΌμ μ©λμ΄ ν¬λ©΄ λ¬Έμ μμκ² κ°μλ°… μΆμ² : https://m.blog.naver.com/naibbo0407/30170815180" μ€λ§ νμΌ μ
λ‘λ νλ μ©λμ΄ ν¬κ² μ΄?… μ μ§ νμΌμ μ©λμ΄ ν¬λ©΄ λ¬Έμ μμκ² κ°μλ°… μΆμ² : https://m.blog.naver.com/naibbo0407/30170815180 κ°λ°μ νλ€λ³΄λ©΄ νμ μκ°ν΄μΌ ν λΆλΆμ€μ νλκ° λ°λ‘ νμ₯μ±μΈκ² κ°λ€. μ΄ λΆλΆμμ μμ λ¬Έμ κ° λμλ κ². νμλ³΄λ€ μ©λμ΄ ν° νμΌμ΄ μ
λ‘λκ° λλ©΄μ (νμ 3~400MB μλ€κ° 3~4GBμ λμ νμΌμ΄ μ
λ‘λκ° λλ 맀μ§) μ
λ‘λκ° μλλ μν©μ΄ λ°μνμλ€. λΉμ°ν λ¬Έμ κ° λ°μνλ©΄ λκ΅°κ° λ§νλ― λ‘κ·ΈλΆν° μ΄ν΄λ³΄μλλ° Apache - (AJP) - Tomcat μΌλ‘ ꡬμ±λ νκ²½μμ tomcat λ‘κ·Έμ ### uploadλΌλ λ‘κ·Έκ° μκ³ μνμΉ λ‘κ·Έμ 502 μλ¬κ° λ°μν κ²μ΄μλ€. μ ν°μΌ λ‘κ·Έλ μλ¨κ³ κ·Έμ μ μλ¬κ° λ°μνμμκΉ? μ΄λλΆν° (κ·Όκ±°μλ μΆμΈ‘μ νλ©°…) κ³ λκ³Ό μκ²½μ μ½μ§μ νκΈ° μμνκ² λλ€. ν°μΌ λ²μ μ΄ λ¬Έμ μΌκΉ? λ‘κ·Έκ° μμ°νλ€λ©΄ λ€λ₯Έ νν°λ μΈν°μ
ν°μμ 무μΈκ°λ₯Ό λ¨Ήκ³ (?)μλ건 μλκΉ? μ κΉ, κ·Όλ° μλ λμ©λ μ
λ‘λκ° λκΈ΄ ν΄? νμΌ μ
λ‘λ/λ€μ΄λ‘λ νλ μ¬μ΄νΈ 보면 λ³λ νλ‘κ·Έλ¨μΌλ‘ νλλ°… κΌ¬λΆκΌ¬λΆ λ―Έλ‘μμ ν€λ©λκ²λ§ κ°μλ μ½μ§μ λ¬Έμ λ κ²°κ΅ λ©λͺ¨λ¦¬μ μμλ€. νμΌμ μ
λ‘λ νκ² λλ©΄ ν΄λΉ λ΄μ©μ μ°μ λ©λͺ¨λ¦¬μ λ΄κ² λκ³ λ€ λ΄μ ν λ©λͺ¨λ¦¬μ μλ λ΄μ©μ wasμ μ λ¬ν λ€ HttpServletRequest λ‘ λμ΄μ€κ² λλ€.(Apache > Tomcat) κ·Έλ°λ° νμΌμ μ
λ‘λ νλ©΄μ λ©λͺ¨λ¦¬μ νμΌμ΄ μ¨μ§λ€κ° λ©λͺ¨λ¦¬ λΆμ‘±μΌλ‘ OOMμ΄ λ°μνκ² λλ²λ¦° κ²μ΄μλ€. λν μ€νλ§ νμΌ μ΅λν¬κΈ°λ₯Ό λ³λλ‘ μ§μ νμ§ μκ³ μμκΈ° λλ¬Έμ λ©λͺ¨λ¦¬κ° μΆ©λΆνλ€ νλλΌλ μλ¬κ° λ°μνμ μν©μ΄μλ€.
λꡬλ μ΄λ Έμ λ 빨리 μ΄λ₯Έμ΄ λκ³ μΆμ΄ νλ κ² κ°λ€. μκ°μ΄ 빨리 μ§λκ°κΈΈ λ°λΌκ³ , 빨리 μ΄λ₯Έμ΄ λκ³ μΆλ€λ κ°μ ν¨μ΄ μμ§λ§ μ΄μνκ²λ κ·Έλ μκ°μ΄ μ²μ²ν κ°λ κ²μ²λΌ λκ»΄μ‘λ€. λ°λ©΄, μκ°μ΄ μ²μ²ν κ°μΌλ©΄ νλ λκ° μλ€. λ± μ§κΈ. λ¨λ€μ μμ΄μ΄μ΄μΌνμμμμ°μ°λͺ¨μ₯κΈνΌ μ΄λΌκ³ λΆλ₯΄λ©° μκ°μ΄ λλ¦¬κ² κ°λ€κ³ 빨리 μ£Όλ§μ΄ μμΌλ©΄ μ’κ² λ€κ³ νμ§λ§ μμ¦μ νμλ μ λ°λλ€. λ°©κΈ μΆκ·Όν κ² κ°μλ° μ΄λμκ° ν΄κ·ΌμΈμ¬λ₯Ό μ£Όκ³ λ°κ³ μλ€. 무μΈκ°μ νλ¦° κ² κ°λ€. λ²μ¨ μ¬ν΄λ μ λ°μ΄ μ§λκ°κ³ λ¨κ±°μ΄ μ¬λ¦κ³Ό ν¨κ» νλ°μ μ΄ μμλμλ€.
κ·Έλμ 빨리 μ§λκ°λ…μΆμ² : https://m.blog.naver.com/kong6482/220584667861" κ·Έλμ 빨리 μ§λκ°λ…
μΆμ² : https://m.blog.naver.com/kong6482/220584667861 μ΄μ κΉμ§λ 12μ λ§ μ¦μμ ν ν΄λ₯Ό λ°λΌλ³΄κ³ 리뷰λ₯Ό νμλλ° κΈλλΌλ κΈμ°κΈ° λͺ¨μμ κ°μ
μ νκ² λμ΄ μλ°κΈ° 리뷰λ₯Ό ν΄λ³΄λ € νλ€. κΈλ λͺ¨μμ 첫 μμ κ° μλ°κΈ° 리뷰 ν¬μ€ν
μ΄λ€. μ¬μ€ 리뷰λ₯Ό μλ°κΈ°μ νλ μ° λ§μ ν ν΄ κΈ°μ€μΌλ‘ νλ μ ν΄μ§ 건 μμ§λ§ λλ₯Ό λ€μ λ°λΌλ³΄κ³ λ€μ‘λ μκ°μ΄ λ§μμλ‘ λ³΄λ€ λ μμΌλ‘ κ°λλ° νμ΄ λ κ±°λΌλ λ°μλ μ΄κ²¬μ΄ μλ€.
νμ¬ μμμμ λ νμ¬μμλ νμ¬μΌμ΄ μ΅μ°μ !μΆμ² : https://m.blog.naver.com/hwee__/221191852972" νμ¬μμλ νμ¬μΌμ΄ μ΅μ°μ !
μΆμ² : https://m.blog.naver.com/hwee__/221191852972 μ΅κ·Όμ νμ₯λκ³Ό λ©΄λ΄ μ€μ λμ¨ μ΄μΌκΈ°λ€. μ κΈ°νκ²λ κ΅° μμ μ₯κΈ°λ₯Ό κΏκΎΈλ νμλ₯Ό μ΄μ μ μνλΌκ³ κΆμ νμλ λλμ₯λκ» λ§€μΌκ°μ΄ λ€μλ μ΄μΌκΈ°μ λΉμ·νλ€.
“μ΄μ λ λ¨μ κ°λ°λ§ νκ³ κΈ°λ₯ꡬνλ§ νλ κ²μ΄ μλλΌ κ·Έ μ΄μμ ν΄μΌ ν μκΈ°κ° λ€κ°μ¨λ€.” “μ¬λλ€ κ΄λ¦¬κ° λ μλ μκ³ μ΄λ ν λΆμΌμ μ λ¬Έκ°κ° λμ΄μΌ ν μλ μκ³ , μ νμ λ³ΈμΈμ λͺ«”
μ¬μ€ κΈ°λ₯ ꡬνμ΄μΌ λꡬλ λ€ ν μ μλ€. λ¨μ§ κ²½νμ λ°λ₯Έ ꡬνμ μλλ μμ μ±μ μ°¨μ΄κ° μλκΉ μκ°ν΄λ³Έλ€. κ·Έλ λ€λ©΄ κ·Έ μ΄μμ μ΄λ»κ² ν΄μΌ ν κΉ? μ λ΅μ μκ² μ§λ§ νμλ κ·Έ μ΄μμ ν΄λ³΄λ € μ°μ νμ λμμ΄ λκΈ° μν΄ μ¬λ¬ κ°μ§ μλν ν΄ λ€μ λ§λ κ² κ°λ€. λ³΄λ€ κΈ°λ₯ κ°λ°μ μ§μ€νκ³ λ¨μ λ°λ³΅μ μΈ μ
무λ μμ€ν
μ΄ ν μ μλλ‘. κ·Έλ κ² ν΄λ€μ λ§λ€μ΄ κ°λ©° μκ°νμ§ λͺ»ν λΆλΆλ€μ λ°°μ°κ² λκ³ λμ€μ κ·Έκ±Έ λ μ¬μ©νκ² λλ, λ―Έλμ λλ₯Ό μν΄ κ°μ λ‘ λ°°μ°κ³ μλλ―ν λλμ΄λκΉ. μ, λ¬Όλ‘ νμ¬ λ³Έμ°μ μ
λ¬΄κ° μ΅μ°μ μ΄μ§λ§ λ§μ΄λ€. μ΄μ¨λ μν¨ μΌμ μ°μ μ°¨μ§ μμ΄ μ νκ³ μν€μ§λ μμ μΌμ μ°Ύμμ νλ €κ³ λ
Έλ ₯νλ κ² κ°λ€. νμ μν΄μ, 곧 λλ₯Ό μν΄μ. μ μ΄λ νμ¬μμ μλ μκ° μμμλ λ€λ₯Έ κ³³μ νλ μ νκ³ νμ¬ μ
무μ μ λ
νλ €κ³ λ
Έλ ₯νλ κ² κ°λ€.
μΈλΆ νλ λΆμ‘±ν μκ°μ μͺΌκ°λ©΄μ λ°μ
μ΄λ μΈλ―Έλμ μ°Έμ¬νκ³€ νμλ€. κ·Έλ¦¬κ³ λ§λ₯ λ£κ³ λ§ μ€μ§ μμκ³ “νμ¬μ μ°Έμ¬νλ©΄ 무쑰건 μ§λ¬Έ νλλ νμ"λΌλ λμμ μ½μμ μ§ν€λ©° μ 리ν λ΄μ©μ λΈλ‘κ·Έμ ν¬μ€ν
νκΈ°λ νμλ€.
μ¬ν΄ 첫 λ°ν!" μ¬ν΄ 첫 λ°ν! λμμ΄λμ κ°λ°μκ° ν¨κ»νλ ν¬κ²λν€μ μ§ννκΈ°λ νμλ€. ν¬κ²λν€μ μ½ ν λ¬ λμ μ§νλλ ν΄μ»€ν€μΌλ‘ ν루 λλ λ¬΄λ° 2μΌ λμ νλ κΈ°μ‘΄ ν΄μ»€ν€κ³Ό λ€λ₯΄λ€. μ΄ κΈ°κ° λμ ν λ΄μμ μμ λ‘κ² μΌμ μ μ‘°μ ν μ μλ€. μ°λ¦¬ νμ μ½ 7μ£Όμ κ±Έμ³ “λλ€ λ§νΈ ν μΈ μ 보λ₯Ό μλ €μ£Όλ μ±” μ λ§λ€κ² λμλ€. νμλ API μ λ°μ λν΄ λ΄λΉμ νμκ³ μμ λΆλΆμ΄μμ§λ§ μΉμ¬μ΄νΈλ κ°λ¨νκ² λ§λ€μ΄ 보μλ€. μ무κ²λ μλ λ°±μ§μνμμ μμνλ €λ λ§λ§νμ§λ§ νκΈ°μμλ μ μλ―μ΄ λ€μ ν΄λ³΄λΌκ³ νλ©΄ λ¨Έλ¦Ώμμ μ 체 μν€ν
μ²κ° κ·Έλ¦ΌμΌλ‘ κ·Έλ €μ§ λ§νΌ μμ κ°μ΄ μκ²Όλ€. νΉν μ λ§ μ’μ νμλ€κ³Ό ν¨κ» νμ
ν μ μμ΄μ λ무 μ’μλ€.
λ΄κ³΅ μ°λ§ ν λ¬μ 2κ° μ΄μ λΈλ‘κ·Έ κΈμ μμ±νλ λͺ©νκ° μμλ€. κ·Έλ°λ° μ§λλ¬μ μ΄μ¬λ₯Ό νλ€ λ³΄λ (νκ³…) λͺ©νλ₯Ό λ¬μ± ν μκ° μμλ€. νμ§λ§ λλ¦ ν리ν°κ° μλ κΈμ μ°λ €κ³ λ
Έλ ₯νκ³ PVλ μλ
λ³΄λ€ μ‘°κΈμ© μ€λ₯΄κ³ μλ κ² κ°μ λ΄μ¬ κΈ°λΆμ΄ μ’λ€. κ·Έλ¦¬κ³ μλ
λ§λΆν° μμν νμμ 첫 ν μ΄νλ‘μ νΈ μΈ κΈ°μ λΈλ‘κ·Έ ꡬλ
μλΉμ€ μ μ΄λ°μ λ° κΈ°λ₯μ μΆκ°νμλ€. μ€λ§ 1000λͺ
μ΄ λκ² κ΅¬λ
νκ² μ΄?