chap 19 - JAVA-JIKIMI/SPRING-IN-ACTION-5 GitHub Wiki
μ€νλ§ λΆνΈ μ ν리μΌμ΄μ μ λ€μ λͺ κ°μ§ λ°©λ²μΌλ‘ λΉλνκ³ μ€νν μ μλ€.
- STS λ IntelliJ IDEA λ±μ IDE μμ μ ν리μΌμ΄μ μ λΉλνκ³ μ€ννλ€.
- λ©μ΄λΈ spring:runμ΄λ κ·Έλλ€ bootRun νμ€ν¬λ₯Ό μ¬μ©νμ¬ λͺ λ Ήνμμ μ ν리μΌμ΄μ μ λΉλνκ³ μ€ννλ€.
- λ©μ΄λΈμ΄λ κ·Έλλ€μ μ¬μ©ν΄μ μ€ν κ°λ₯ν JAR νμΌ(λͺ λ Ήνμμ μ€νλκ±°λ ν΄λΌμ°λμ λ°°ν¬λ μ μμ)μ μμ±νλ€.
IDEλ λ©μ΄λΈ λ° κ·Έλλ€μ μ¬μ©ν μ ν리μΌμ΄μ μ€νμ νλ‘λμ νκ²½μλ κ³ λ €ν μ μμ μ€ν κ°λ₯ JAR νμΌμ΄λ μλ° WAR νμΌμ νλ‘λμ νκ²½μμ μ ν리μΌμ΄μ μ λ°°ν¬νλ νμ€ν λ°©λ²
[νμΌ νμ ]
ex) ν°μΊ£, μΉμ€νΌμ΄, μΉλ‘μ§ λ±μ μΉμλ² λλ μλ° μ ν리μΌμ΄μ μλ²μ μ ν리μΌμ΄μ μ λΉλ (μ€νμ WAS, μΉμλ²κ° νμν¨) [μ°Έκ³ μλ£ - Springbootμμ jarμμ war νμΌμ λ§λ€κ² μ€μ λ³κ²½νκΈ°]
μ¬λ¬ ν΄λΌμ°λ νλ«νΌμΌλ‘ μ ν리μΌμ΄μ μ λ°°ν¬νλ€λ©΄ μ€ν κ°λ₯ν JAR νμΌ λ°°ν¬κ° μ΅μμ μ ν
- ν΄λΌμ°λ μ ν리μΌμ΄μ μ λ°°ν¬νλ κ²μ΄ μ체μ μΈ λ°μ΄ν° μΌν°λ₯Ό μ΄μνλ κ²μ λΉν΄ μ€λλ ₯μ΄ μκ³ λΉμ© ν¨μ¨μ μΈ λμ
- PaaS - platform as a service (μΈν°λ·μΌλ‘ μ ν리μΌμ΄μ μ€κ³/κ°λ°/λ°°ν¬λ₯Ό ν λ νμν νλμμ΄μ μννΈμ¨μ΄λ₯Ό μ 곡νλ νλ«νΌ)λ₯Ό μ 곡νλ ν΄λΌμ°λκ° λμΈλ€.
- λͺ κ°μ§ λΆκ° μλΉμ€(μλ₯Ό λ€μ΄ λ°μ΄ν°λ² μ΄μ€λ λ©μΈμ§ λΈλ‘컀)μ ν¨κ» 미리 ꡬμΆλ μ ν리μΌμ΄μ λ°°ν¬ νλ«νΌμ μ 곡νμ¬ μ°λ¦¬ μ ν리μΌμ΄μ κ³Ό κ²°ν©νλ€.
- λν μ°λ¦¬ μ ν리μΌμ΄μ μ μ€ν μΈμ€ν΄μ€λ₯Ό μΆκ° λλ μ κ±°νμ¬ κ·λͺ¨ νμ₯(λλ μΆμ)μ μ½κ³ λΉ λ₯΄κ² ν΄μ€λ€.
ν΄λΌμ°λ νμ΄λ리λ μ ν리μΌμ΄μ μ κ°λ°, λ°°ν¬, νμ₯μ μν μ€νμμ€/λ©ν° ν΄λΌμ°λ PaaS νλ«νΌμ΄λ©°, ν΄λΌμ°λ νμ΄λ리 μ¬λ¨μ μν΄ μ΅μ΄ κ°λ°λμλ€.
μμ© λ²μ μ μ€νλ§ νλ«νΌμ νλ μμν¬μ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ£Όκ΄νλ νΌλ³΄νμ¬μμ μ 곡νλ€. μμμ¬ μλΉμ€ μ ν리μΌμ΄μ μ λΉλνκ³ PWS(pivotal Web Services)μ λ°°ν¬
- PWSλ₯Ό μ¬μ©νλ €λ©΄ κ³μ μ λ±λ‘ν΄μΌ νλ©° κ³μ μ΄ λ±λ‘λλ©΄ μλμμ cf λͺ λ Ήν λꡬλ₯Ό λ€μ΄λ‘λνμ¬ μ€μΉ
- cf λͺ λ Ήν λꡬλ₯Ό μ¬μ©νμ¬ ν΄λΌμ°λ νμ΄λ리μ μ ν리μΌμ΄μ μ νΈμνλ€. [λͺ λ Ήν λꡬ download]
- https://console.run.pivotal.io/tools
$ mvn package
$ gradlew build
$ cf push ibngredient-service -p target/ingredient-service-0.0.19-SNAPSHOT.jar
- λ컀λ ν΄λΌμ°λμμ λͺ¨λ μ’ λ₯μ μ ν리μΌμ΄μ μ λ°°ν¬νλ μ¬μ€μμ νμ€μ΄ λμλ€.
- λμ»€λ‘ μμ±λλ κ²κ³Ό κ°μ 컨ν μ΄λ μ ν리μΌμ΄μ μ μμ΄λμ΄λ μ€μΈκ³μ 컨ν μ΄λμμ λΉλ‘―λμλ€.
- μ μ λ¬Όνμ λ΄λ λͺ¨λ 컨ν μ΄λλ λ΄μ©λ¬Όκ³Ό 무κ΄νκ² νμ€νλ ν¬κΈ°μ ννλ₯Ό κ°λλ€. λ°λΌμ 컨ν μ΄λλ μ½κ² λ°°μ μμ μ¬λ¦¬κ±°λ κΈ°μ°¨λ νΈλμΌλ‘ μ΄λ°ν μ μλ€.
- μ΄μ μ μ¬ν λ°©λ²μΌλ‘ 컨ν μ΄λ μ ν리μΌμ΄μ μ 곡ν΅λ 컨ν μ΄λ νμμ 곡μ νλ―λ‘ μ»¨ν μ΄λμ ν¬ν¨λ μ ν리μΌμ΄μ κ³Ό 무κ΄νκ² μ΄λμλ λ°°ν¬ λ° μ€νν μ μλ€.
[λ컀 κΈ°λ³Έ]
[λ컀 get started]
λ€μ΄λ‘λ ν hub λ‘κ·ΈμΈ
- Spotify(μ€ν¬ν°νμ΄)μ λ©μ΄λΈ νλ¬κ·ΈμΈμ μ¬μ©νλ©΄ μ€νλ§ λΆνΈ λΉλμ κ²°κ³Όλ₯Ό λ μ½κ² λ컀 컨ν μ΄λλ‘ μμ±ν μ μλ€.
<build>
<plugins>
...
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-file-maven-plugin</artifactId>
<version>1.4.3</version>
<configuration>
<repository>
${docker.image.prefix}/${project.artifactId}
</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugin>
</build>
- λΈλ‘ μλμλ λ컀 μ΄λ―Έμ§ μμ±μ νμν μμ±λ€μ μ€μ νλ€.
- μμμλ λ컀 리νΌμ§ν°λ¦¬μ λνλλ λ컀 μ΄λ―Έμ§μ μ΄λ¦μ μ§μ νλ€.
- μ¬κΈ°μ μ§μ νλ―μ΄ μ΄λ¦μ μ μΌ μμλ docker.image.prefix λΌλ μ΄λ¦μ λ©μ΄λΈ μμ± κ°μ΄ μ§μ λκ³ κ·Έ λ€μμλ λ©μ΄λΈ νλ‘μ νΈμ artifact IDκ° λΆλλ€.
- νλ‘μ νΈμ artifact IDλ λ°λ‘ μμ artifactId μμμ μ§μ λμ΄ μμΌλ©° docker.image.prefix μμ±μ λ€μκ³Ό κ°μ΄ properties μμμ μ§μ ν΄μΌ νλ€.
- μμ μλμλ λ©μ΄λΈ λΉλκ° μμ±λλ JAR νμΌμ μ§μ νλ€. (λ컀 μ΄λ―Έμ§μ ν¬ν¨μν€κΈ° μν΄)
- μ΄λ target λλ ν°λ¦¬μ μλ JAR νμΌμ μ΄λ¦μ κ²°μ νκΈ° μν΄ λ©μ΄λΈ μμ±μΈ project.build.finalName μ μ¬μ©νλ€.
<properties>
...
<docker.image.prefix>tacocloud</docker.image.prefix>
</properties>
μ΄κ²μ΄ νμ½ ν΄λΌμ°λ μμμ¬ μλΉμ€μ pom.xml νμΌμ΄μλ€λ©΄ κ²°κ³Όλ‘ μμ±λλ λ컀 μ΄λ―Έμ§λ λ컀 리νΌμ§ν°λ¦¬μ tacocloud/ingredient-serviceμ μ μ₯λμμ κ²μ΄λ€.
μ΄μ²λΌ λ©μ΄λΈ λΉλ λͺ μΈμ μ 곡ν μ 보 μΈμ λ€λ₯Έ λͺ¨λ λ컀 μ΄λ―Έμ§ μ 보λ Dockerfileμ΄λΌλ μ΄λ¦μ νμΌμ μ μλλ€.
FROM openjdk:8-jdk-alpine
ENV SPRING_PROFILES_ACTIVE docker
VOLUMN /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", `
"-Djava.security.egd=file:/dev/.urandom", `
"-jar", `
"/app.jar"]
- FROMμλ μ μ΄λ―Έμ§μ κΈ°λ°μ΄ λλ μ΄λ―Έμ§λ₯Ό μ§μ νλ€. μ μ΄λ―Έμ§λ κΈ°λ³Έ μ΄λ―Έμ§λ₯Ό νμ₯νλ€. μ¬κΈ°μλ κΈ°λ³Έ μ΄λ―Έμ§κ° OpenJDK λ²μ 8μ κΈ°λ°μΌλ‘ νλ 컨ν μ΄λ μ΄λ―Έμ§μΈ openjdk:8-jdkalpineμ΄λ€.
- ENVμλ νκ²½ λ³μλ₯Ό μ€μ νλ€. μ¬κΈ°μλ νμ± νλ‘νμΌμ κΈ°λ°μΌλ‘ μ€νλ§ λΆνΈ μ ν리μΌμ΄μ μ κ΅¬μ± μμ±μ λ³κ²½ν κ²μ΄λ―λ‘ νκ²½ λ³μμΈ SPRING_PROFILES_ACTIVE dockerλ‘ μ€μ νμλ€.
μ€νλ§ λΆνΈ μ ν리μΌμ΄μ μ΄ docker νμ± νλ‘νμΌλ‘ μμνλλ‘ νκΈ° μν΄μλ€.
- VOLUMEμ 컨ν μ΄λμ λ§μ΄νΈ μ§μ μ μμ±νλ€. μ¬κΈ°μλ νμ μμ 컨ν μ΄λκ° /tmp λλ ν°λ¦¬μ λ°μ΄ν°λ₯Ό μΈ μ μλλ‘ /tmpμ λ§μ΄νΈ μ§μ μ μμ±νλ€.
- ARGμλ λΉλ μμ μ λ¬ν μ μλ μΈμλ₯Ό μ μΈνλ€. μ¬κΈ°μλ λ©μ΄λΈ νλ¬κ·ΈμΈμ λΈλ‘μ μ§μ λ μΈμμ λμΌν JAR_FILEμ΄λΌλ μ΄λ¦μ μΈμλ₯Ό μ μΈνλ€.
- COPYλ μ§μ λ κ²½λ‘μ νμΌμ λ€λ₯Έ κ²½λ‘λ‘ λ³΅μ¬νλ€. μ¬κΈ°μλ λ©μ΄λΈ νλ¬κ·ΈμΈμ μ§μ λ JAR νμΌμ app.jarλΌλ μ΄λ¦μ νμΌλ‘ λ컀 μ΄λ―Έμ§μ 볡μ¬νλ€.
- ENTRYPOINTμλ 컨ν μ΄λκ° μμλ λ μ€ννκΈ° μν λͺ λ Ήν μ½λλ₯Ό λ°°μ΄λ‘ μ§μ νλ€. μ¬κΈ°μλ μ€ν κ°λ₯ν app.jar νμΌμ μ€νμν€μ§ μν΄ λͺ λ Ήνμμ javaλ₯Ό μ¬μ©νλλ‘ μ§μ νλ€.
μΌλ°μ μΌλ‘ μ€νλ§ λΆνΈ μ ν리μΌμ΄μ μ ν¬ν¨νλ 컨ν μ΄λ μ΄λ―Έμ§μλ SPRING_PROFILES_ACTIVE νκ²½ λ³μλ₯Ό ENVμ μ€μ νλ κ²μ΄ μ’λ€.
μ΄λ κ² νλ©΄ λ컀μμ μ€νλλ μ ν리μΌμ΄μ μ κ³ μ ν λΉκ³Ό κ΅¬μ± μμ±μ ꡬμ±ν μ μκΈ° λλ¬Έμ΄λ€.
- μμμ¬ μλΉμ€μ κ²½μ°λ λ³κ°μ 컨ν μ΄λμμ μ€νλλ λͺ½κ³ λ°μ΄ν° λ² μ΄μ€μ μ°λ¦¬ μ ν리μΌμ΄μ μ μ°κ²°ν λ°©λ²μ΄ νμνλ€.
- κΈ°λ³Έμ μΌλ‘ μ€νλ§ λ°μ΄ν°λ localhostμ 27017 ν¬νΈλ₯Ό 리μ€λνλ λͺ½κ³ λ°μ΄ν°λ² μ΄μ€μμ μ°κ²°μ μλνλ€.
- κ·Έλ¬λ μ΄κ²μ λ‘μ»¬λ‘ μ€νλ λλ§ κ°λ₯νκ³ μ»¨ν μ΄λμΌ λλ λ€λ₯΄λ€. λ°λΌμ spring.data.mongodb.host μμ±μ ꡬμ±νμ¬ λͺ½κ³ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©ν μ μλ νΈμ€νΈ μ΄λ¦μ μ€νλ§ λ°μ΄ν°μ μλ €μ£Όμ΄μΌ νλ€.
- λ€μμ λ컀μ νΉμ λ ꡬμ±μ application.yml νμΌμ μΆκ°νμ¬ docker νλ‘νμΌμ΄ νμ±νλ λ μ€νλ§ λ°μ΄ν°κ° mongoλΌλ νΈμ€νΈμ λͺ½κ³ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ°κ²°νλλ‘ κ΅¬μ±ν μ μλ€.
spring:
profiles: docker
data:
mongodb:
host: mongo
μ΄λ κ² νλ©΄ λ컀 컨ν μ΄λκ° μμλλ μ¦μ mongo νΈμ€νΈκ° λ€λ₯Έ 컨ν μ΄λμμ μ€ν μ€μΈ λͺ½κ³ λ°μ΄ν°λ² μ΄μ€λ‘ μ°κ²°λλ€. μ΄μ λ λ컀 μ΄λ―Έμ§λ₯Ό λΉλν μ€λΉκ° λμμΌλ―λ‘ λ©μ΄λΈ λνΌλ₯Ό μ¬μ©ν΄μ packageμ dockerfile:buildλ₯Ό μ€νμμΌ JAR νμΌμ λΉλνλ©΄ λ컀 μ΄λ―Έμ§κ° μμ±λλ€.
mvnw package dockerfile:build
- μμμ¬ μλΉμ€ 컨ν μ΄λλ₯Ό μμνκΈ°μ μμ λͺ½κ³ λ°μ΄ν°λ² μ΄μ€μ 컨ν μ΄λλ₯Ό λ¨Όμ μμν΄μΌνλ€.
$ docker run --name tacocloud-mongo -d mongo:3.7.9-xenial
- λ§μ§λ§μΌλ‘ μμμ¬ μλΉμ€ 컨ν μ΄λλ₯Ό μ€ννλ©΄ λλ€. μ΄λ λ°©κΈ μμλ λͺ½κ³ 컨ν μ΄λμ μ°κ²°νλ€.
$ docker run -p 8080:8081 \
--link tacocloud-mongo:mongo
tacocloud/ingredient-service
컨ν μ΄λμ μ€νλ§ λΆνΈ μ ν리μΌμ΄μ μ΄ 8081 ν¬νΈλ‘ μ€νλλλ‘ κ΅¬μ±νμΌλ―λ‘ -p λ§€κ°λ³μμμλ λ΄λΆ ν¬νΈλ₯Ό νΈμ€νΈμ 8080 ν¬νΈλ‘ μ°κ²°μν¨λ€.
--link λ§€κ°λ³μλ μ΄ μ»¨ν μ΄λλ₯Ό tacocloud-mongo 컨ν μ΄λμ μ°κ²°μν¨λ€. κ·Έλ¦¬κ³ μ΄λ tacocloud-mongo 컨ν μ΄λμ νΈμ€νΈ μ΄λ¦μ mongoλ‘ μ§μ νλ€. μ€νλ§ λ°μ΄ν°κ° μ΄ νΈμ€νΈ μ΄λ¦μ μ¬μ©ν΄μ μ°κ²°ν μ μλλ‘ νκΈ° μν΄μλ€.
λ§μ§λ§μΌλ‘ μ 컨ν μ΄λμμ μ€νλλ μ΄λ―Έμ§μ μ΄λ¦ (tacocloud/ingredient-service)μ μ§μ νλ€.