0. Docker 설치
Windows subsystem for Linux인가 뭐시긴가 이게 없어서 자꾸 docker 실행에서 에러가 났다. Ctrl + Shift + Esc - 성능 - CPU - 가상화 : 사용 으로 나와있어야 한다. 나는 분명 Windows 기능 켜기/끄기에서 WSL, 가상환경 다 체크해놨는데 에러 나서, 찾아봤더니 Bios 화면에서 설정을 해주니까 되더라. 그리고 WSL 에러나길래 2로 업그레이드 해주니까 잘 되었다. 이 컴퓨터에서 개발환경 아무것도 안 만들어둬서, 아마 다음 번 초기 설정에도 이렇게 하면 될 것이다.
1. vs code + spring 설정
https://sambalim.tistory.com/67
위 블로그 보면서 VS code + spring local 환경을 구축했다.
1) jdk 설치
먼저 jdk를 설치한다. 원래는 가벼운 8 버전을 사용하려 했는데, spring을 이용하면 필요한 VS code extension 중 하나가 8버전을 지원하지 않아서 11버전을 이용했다.
설치보다는 .zip파일을 받아서 내가 원하는 폴더에 넣고, 환경변수 설정을 하는 걸 선호해서 그렇게 했다.
윈도우 검색 - 시스템 환경 변수 편집 - 환경 변수 - 시스템 변수
새로 만들기 - {"변수" : "JAVA_HOME", "값" : ".zip파일 경로"}
Path - 새로 만들기 - %JAVA_HOME%\bin
이렇게 2개를 만들어 주었다.
그 다음에 cmd에 javac -version을 쳐서 내가 설치한 java 버전이 나오면 된다.
2) VS code
extension에서 아래 5개를 설치한다.
- spring boot tools
- spring initializr java support
- spring boot dashboard
- spring boot extension pack
- java extension pack
- Lombok Annotations Support for VS Code
설치하고, Ctrl + Shift + P - initializr : start with gradle project 해서 java version, 프로젝트 이름, 등등 설정하고 배포 방식은 Jar, dependency는 Spring Boot DevTools, Spring Web 2개를 하고 적당히 폴더 하나에다가 넣는다.
3) Hello, VS Spring!
spring은 처음이다. 그래서 아무것도 모른다. 일단 src/main/java/com/example/demo에 새 controller 하나를 만든다. 나는 HelloController.java를 만들었다.
package com.example.demo;
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.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping("/")
@ResponseBody
public String index() {
return "Hello, VS CODE SPRING!";
}
}
대충 이렇게 짜넣었고, VS Code에서 F5를 누르거나 아래 2줄을 입력하는 것으로 실행 가능하다. spring build하는 방법이다.
.\gradlew.bat
.\gradlew bootRun
localhost:8080으로 접속했을 때, (default가 8080)내가 작성한 코드가 나온다. 성공적이다. 굿.
2. Docker에 spring image, container 생성
https://spring.io/guides/gs/spring-boot-docker/
공식 사이트 참고했다. Docker에 대한 "내가 이해한 내용"은 따로 정리할 내용이니, Docker를 아무것도 모르는 사람이라면 해당 글을 참고했으면 좋겠다.
1) 빌드하기
우리는 VS Code 내의 Spring initailizr를 이용했기 때문에, start.spring.io를 이용할 필요가 없다.
./gradlew build && java -jar build/libs/gs-spring-boot-docker-0.1.0.jar
공식 홈페이지에는 gradle이면 이렇게 쓰면 된다고 하는데, 나는 && WSL에서 사용할 수 없다고 해서 그냥 한줄한줄 입력했다. 그리고 위 코드를 복붙하면 아마 안될 것이, ./gradlew build를 하면 build/libs 안에 .jar 파일이 있을 건데, 그 .jar 파일의 이름이 다르기 때문이다. 각자 가지고 있는 파일 명을 넣으면 된다.
2) Docker file 작성하기
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
예시 1번이다. jdk 11로 구성했지만, 컨테이너는 8이 가벼우니까 일단 이렇게 해보자. 추후에 문제가 생기면 from 절의 그것을 11로 업그레이드 해주면 되겠지 뭐. Docker file은 제일 상위 폴더에다(gradlew있는) 집어넣으면 된다.
3) image build 및 container 실행
docker build --build-arg JAR_FILE=build/libs/*.jar -t springio/gs-spring-boot-docker .
docker build --build-arg JAR_FILE=build/libs/*.jar -t springmyvs .
image를 build하는 명령어이다. -t는 tag, 이미지 태그를 springio/gs-spring-boot-docker 이렇게 만들겠다는 거다. 나는 마음에 안드니까 springmyvs로 하겠다.
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springmyvs latest a646860131f4 39 minutes ago 122MB
잘 나온다.
docker image를 만들었으니, 이제 이 image 실행시켜서 container로 만들어야 할 것이다.
docker run -p 8080:8080 springio/gs-spring-boot-docker
docker run -p 8080:8080 springmyvs
공식 홈페이지에는 springio/gs-.... 이렇게 있는데, 나는 springmyvs로 만들었으니까 이 image를 실행하겠다는 의미로, 이렇게 한다. -p는 포트 번호. 8080으로 실행시킬거다 라는 말이다. 이러고 Docker for Window 들어가보면 내가 만든 컨테이너가 있다. localhost:8080으로 접속해 보면, 내가 작성한 코드가 나와 있는 걸 볼 수 있다.
*** 좀 간단하게, build와 image를 한 줄로 할 수 있다.
이 내용도 공식 홈페이지에 있던 거다.
./gradlew bootBuildImage --imageName=springio/gs-spring-boot-docker
./gradlew bootBuildImage --imageName=springmyvs
이름 내맘대로 바꾸고, docker images 쳐보면 해당 이미지가 있는 걸 볼 수 있다.
- docker 기본 명령어
기본적인 거는 아래에 있고, 더 자세한 옵션 등은 구글링 해보는 게 정확할 거다.
docker build
: image 생성
docker ps
: container 확인
docker images
: image 목록 출력
docker run [image ID]
: image ID에 해당하는 container 실행
docker stop [container ID]
: container ID에 해당하는 container stop
docker rm [container ID]
: container ID에 해당하는 container 삭제
https://brunch.co.kr/@hopeless/10
그러면, 애초에 계획했던 7단계 중 2단계가 끝났다. 1) 스프링 개발환경 구축하고 hello world 띄우기2) 도커 이미지 파일로 실행시켜보기
3) docker volume 이용해서 도커에서 local 참조하게 해보기 - https://devlog-wjdrbs96.tistory.com/311
4) docker compose 사용해서 mysql 연동해서 docker 상에서 돌려보기
5) AWS EC2 받아서 로컬, 서버 도커 각각 실행하고 소스 연동하는 거 해보기
6) 테스트 서버, 배포 서버 만들어서 각각 돌아가게 해보기
7) 이렇게 만든 local에서 spring CRUD 게시판 예제 만들고, 서버에 올리고, Docker로 실행해 보기.
지금까지, VS Code에 Spring 개발환경 형성, Docker로 Spring image 생성 및 container 생성, build까지 해 보았다. 그러나 jar 파일로 만든 것은 내가 수정한 소스코드가 반영되어 있지 않다. build한 그 시점의 소스 내용만 가지고 있기 때문인데, 이를 docker의 volume이라는 기능을 이용해서 해결할 수 있다고 한다.
그리고, 지금까지는 spring 하나만 실행했다. 그러나 BE 서버를 만드려면 DB도 있어야 하고, 다른 툴들이 기타등등 필요할거다. 그때마다 docker image 생성, container 생성하는 과정을 거쳐야 하는데, 귀찮다고 느낀 사람들이 docker-compose라는 것을 만들었다. spring이 mysql에 의존성을 가지고 켜지게 해 볼 예정이고 나중에 내 팀원이 사용하는 flutter, react 또한 docker compose 위에 올릴 예정이다.
다음으로, docker를 local에서 다 구성하면 실제 개발하는 거처럼 프리서버 받아서 연동시키고, 테섭/본섭 나눠보고, spring CRUD 예제를 만들어 보려 한다. 이르면 내일인 토요일, 늦으면 일요일까지.
파이팅.