본문 바로가기

JAVA

Java - 로컬환경 자바프로젝트 세팅 (with Docker)

※ mac os 기준이며, IDE는 Intellij 기준으로 작성했습니다.

 회사에서 로컬환경 설정하면서, 정리했던 내용입니다.

1] 자바 설치

# ------ bash를 통한 brew 설치 ------
$ bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
 
# ------ mac 계정 password 입력후 / Enter ------
Password:
......
......
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (or will be during this `install` run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Next steps:
- Run `brew help` to get started
- Further documentation:
    https://docs.brew.sh

# ------ brew가 잘 설치되었는지 확인 ------
$ brew

# ------ brew 로 Open Jdk-zulu Version Update 진행 ------
$ brew tap homebrew/cask-versions

# ------ Update 확인 ------
$ brew search zulu

==> Casks
zulu        zulu11        zulu13        zulu7        zulu8        zulufx
 
# ------ brew로 java8 Open JDK 설치 ------
$ brew install zulu8
 
$ mac 계정 password 입력
installer: Package name is Zulu 8.52.0.23
installer: Installing at base path /
installer: The install was successful.
🍺  zulu8 was successfully installed!

zulu java jdk설치가 완료되었다.

- 참고: https://firework-ham.tistory.com/65

(Oracle jdk가 유료화가 되었으므로, Zulu는 open jdk의 무료 배포판을 만들어주는 가장 공신력 있는 회사)

2] Docker 설치

마찬가지로, brew를 통해 설치할 수 있다.

(참고: https://kamang-it.tistory.com/entry/Docker-%EC%84%A4%EC%B9%98-Mac%ED%8E%B8)

3] Spring Boot 생성

- https://start.spring.io/ <- 프로젝트 생성 지원 페이지

위의 initializr 페이지를 통해 원하는 version 및 Dependencies를 선택하여 쉽게 신규 프로젝트를 생성할 수 있다.

    - Gradle Project / 2.4.11 / java 8 / Spring Web만 추가하여 샘플코드가 작성된 프로젝트를 생성하였다.

 

start.spring.io를 통한 설정값. 쉽다

    - 설정 완료후, 아래의 [GENERATE]를 클릭하면 zip파일이 다운로드되는데, 압축을 풀어서 원하는 위치에 폴더를 이동시킨다.

    - 그리고 IDE를 통해 프로젝트를 열어준다. (Intellij 같은 경우에는 자동으로 gradle 프로젝트 정보를 읽어와서 빌드 및 환경을 구성해준다. 시간이 조금 걸림)

 

- Project Metadata 설명

    - Group: 프로젝트를 식별해주는 고유아이디이다. 보통 도메인명을 적는다

    - Artifact: 빌드 결과물(jar)의 이름을 정한다.

    - Name: main method가 들어있는 기본 Application Class가 된다. (예) hello 입력시, HelloApplication.java로 생성됨)

    - Description: 프로젝트 상세설명

    - Package name: 기본으로 설정되는 package 경로를 입력한다.

    - Packaging: 배포형태 설정 (jar, war)

    - Java: 사용 Java version

4] 포트설정 및 Spring Boot 구동

1) 외부설정 파일

spring boot에서는 기본적으로 내장서버가 Tomcat - 8080포트가 default로 내장되어있고 구성되어있다. 아무런 설정값이 없는 경우, default에 따른다.

포트 변경 필요시에는 src/main/java/resources의 application.properties (외부설정 파일)에 값을 입력해주면 된다.

# application.properties
# 한줄로 나열 (프로젝트 생성시 기본)
 
server.port=8080
spring.mvc.view.suffix=/WEB-INF/jsp/
spring.mvc.view.prefix=.jsp
 
-----------------------------------------------------------------------------------------------
# application.yml 사용하는 경우
# 같은 네이밍그룹으로 묶어서 표현
 
server:
    port: 8080
spring:
    mvc:
        view:
            suffix: /WEB-INF/jsp/
            prefix: .jsp

(?) 두개를 동시에 생성해둔다면? application.properties가 우선한다. (이 두개를 동시에 사용할 일은 거의 없을듯..)

외부 설정과 관련한 spring boot 공식 Document이다. 필요할 것이 있으면 참고

참고: https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html

 

2) 컴파일할 자바버전 설정

1번에서 자바설치가 정상적으로 되었다면, IDE를 통해 자바 컴파일러로 스프링부트를 구동하기위해 설정이 필요하다.

=> Add Configuration을 눌러서 창이뜨면 왼쪽위에있는 [+]버튼을 눌러서 Spring Boot 항목을 찾아서 눌러주자.

= Runtime환경을 설정하는 부분이다.

1] Main Class 설정

2] Use classpath of module (패키지)

3] JRE (자바 런타임 환경을 선택) => [3) IDE(Intellij)에 Zulu OpenJDK설정] 참조

(나머지는 설정값을 사용해보지 않음..)

 

3) IDE(Intellij)에 Zulu OpenJDK설정

- Intellij 상단에 File > New Projects Settings > Structure for New Projects 메뉴 클릭

- 좌측메뉴에 Platform Settings > SDKs 클릭후, [+]를 눌러서 Add JDK... 클릭

- [/Library/Java/JavaVirtualMachines/zulu-8.jdk] 경로 선택

- OK 버튼 클릭 (추가완료)

zulu-8.jdk가 추가된 모습

(!) 혹시 jdk 추가를 했는데도 gradle project가 동작하지 않는다면, 아래 그림의 Gradle JVM을 설정해주자.

 

4) Spring Boot 구동

설정이 완료되었다면, 아래와 같이 main Method에 System.out.println("Hello, Java"); 를 작성해보자.

스프링부트가 내장 톰캣으로 서버를 띄우는 모습이 console에 보일 것이다.

(!) application.properties에 테스트할때, 8081로 설정했음.

=> Tomcat initialized with port(s): 8081 (http)

5] Docker로 Local Database 세팅

# mysql 버전(5.7.18 기준) / mysql image가 없으면, 자동으로 Download를 진행한다.

# mysql docker container 생성 & 실행
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name ep-mysql -v /Users/me/test/mysql:/var/lib/mysql mysql:5.7.18 --character-set-server=utf8 --collation-server=utf8_general_ci
# 이후에
$ docker stop ep-mysql (컨테이너 시작)
$ docker start ep-mysql (컨테이너 중단)
# 명령어를 통해서 제어가 가능하다.

$ docker ps -a (실행중인 컨테이너 목록)

$ docker exec -it ep-mysql bash (mysql 컨테이너에 bash shell로 접속)

- DB Tool로 접속 가능

    - HOST: localhost:3306

    - ID/PW: root / root (도커 run 생성시, 설정가능)

6] Spring Boot - mysql 연동 및 Docker 실행

1) build에 필요한 Dockerfile 생성

- 프로젝트 최상위폴더에 Dockerfile 이름으로 파일을 생성하여 아래의 docker build 코드를 입력한다.

 

Dockerfile 예제

FROM azul/zulu-openjdk:8
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} epdev-app.jar
ENTRYPOINT ["java","-jar","/epdev-app.jar"]

(마찬가지로 docker 환경에서도 zulu openjdk java8을 적용시킨다)

 

2) docker image 생성 및 실행

(!) docker로 jenkins를 생성하여, 로컬환경에서 docker를 통해 프로젝트를 자동으로 빌드&배포할 수 있는 방법은 아래 링크를 참고한다.

- 참고: https://xggames.tistory.com/20

 

# ------ Docker에 띄우기 위한 GradleBuild + image 생성 ------
 
# 1] 프로젝트를 gradle wrapper로 build
$ /Users/me/test/ep-java-exam/gradlew clean build
 
# (혹시나 위의 clean build가 안된다면, 그냥 build를 해보자)
 
# 2] docker image 빌드
# 사용법: docker build [OPTIONS] PATH | URL | -
# docker build -f [프로젝트에 생성한 Dockerfile] -t [image Alias] [프로젝트 root경로]
$ docker build -f /Users/me/test/ep-java-exam/Dockerfile --no-cache -t ep-springboot /Users/me/test/ep-java-exam/
 
# (실행이 안된다면, Docker Desktop을 실행했는지 확인해보기)
 
# 3] 새로운 image 빌드로 인한 미사용 image 정리
$ docker rmi $(docker images -f "dangling=true" -q)
 
# =========================================================================================
$ /Users/me/test/ep-java-exam/gradlew clean build && docker build -f /Users/me/test/ep-java-exam/Dockerfile --no-cache -t ep-springboot /Users/we/wemakeprice/ep-java-exam/ && docker rmi $(docker images -f "dangling=true" -q)
# =========================================================================================
 
# ------ 도커 이미지 추가내용 확인 ------
=> $ docker images
 
# ==========================================
# REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
# ep-springboot       latest    6a9ac8b4e71f   4 seconds ago   289MB
# azul/zulu-openjdk   8         7c44729920e9   4 weeks ago     249MB
# mysql               5.7.18    44a8e1a5c0b2   3 years ago     407MB
# ==========================================
 
# ------ Docker 컨테이너 추가 & 실행 (mysql container가 선행으로 실행중이여야 함) ------
# 사용법 : docker run [OPTIONS] [IMAGE]
 
$ docker run --rm -d --name ep-web -p 8080:8080 --link ep-mysql:ep-mysql ep-springboot
# Redis Container 연결 추가할 경우, 위의 실행명령어에 [--link ep-redis:ep-redis] 추가.
 
# (실행이 안된다면, mysql Docker 컨테이너가 구동중인지 확인해보기)
# [OPTIONS]
# --rm : docker 컨테이너가 중단되면, 해당 컨테이너를 삭제한다.
# -d : background 환경에서 컨테이너가 실행
# -p : 포트연결 (포트:바인드)
# -link : 다른 컨테이너 연결 (컨테이너명:외부에서의 접근 domain alias)

(!) 위의 내용중 3번의 명령어중에 dangling이라는 키워드가 있는데, 컨테이너 이미지중 <none>이라고 표시되는 이미지가 있다. 이름이 없는 이러한 이미지들을 댕글링(dangling)이라고 한다.

'JAVA' 카테고리의 다른 글

Java - Jackson  (0) 2021.09.30
Java - Enum  (0) 2021.09.15
Java - 자바 객체 지향의 원리와 이해(개념정리) - 2편  (0) 2021.02.24
Java - 자바 객체 지향의 원리와 이해(개념정리) - 1편  (0) 2021.02.08
Java - lambda와 Stream  (0) 2021.02.04