프로그래밍/Spring

[Spring] Java Application 구성 With Docker

나무늘보Programmer 2024. 4. 24. 21:21

본 게시글은 OzCoding Shool에서 진행된 멘토링 프로그램을 통해 배우고 학습한 내용입니다.

 

Docker Deskop 설치

1. Docker Desktop 페이지 방문 및 다운로드 한다.

 

Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com

2. 설치 후 구동 및 로그인을 하면 아래 화면 처럼 나오게 된다.

 

Hello World! 애플리케이션 작성하기

Spring Initializr 접속(https://start.spring.io/)

Project 설정 구성하기

  • Java 21 버전, Spring Boot 3.2.5 버전으로 구성했다.
  • 다른 구성은 아래 사진과 같다.

프로젝트 구성하기

프로젝트 생성하기

  • 아래 Generate버튼을 클릭하여 프로젝트 아카이브(zip 파일)이 생성 및 다운 받는다.

컨트롤러 생성

  • deploy-sample/src/main/java/com/example/deploysample  경로에 새로운 Java 클래스를 생성한다.
package com.example.deploysample;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}

어플리케이션 빌드 및 실행

  • Gradle을 사용하여 프로젝트를 빌드한다.
. /gradle build: 👉 프로젝트를 빌드해라, jar 파일 생성
java -jar build/libs/deploy-sample-0.0.1-SNAPSHOT.jar 👉 deploy-sample-0.0.1-SNAPSHOT.jar 실행

Docker 이미지 생성

Dockerfile 작성

#Dockerfile

FROM openjdk:21-jdk
CMD ["gradle", "clean", "build"]
VOLUME /tmp
ARG JAR_FILE=build/libs/deploy-sample-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} deploy-sample-0.0.1-SNAPSHOT.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","deploy-sample-0.0.1-SNAPSHOT.jar"]

Docker 이미지 빌드

docker build . -t joonhoseong/spring_hello:test

Docker 이미지 Docker Hub에 Push

Docker Hub에 로그인

docker login

Docker 이미지를 Docker Hub에 푸시

docker joonhoseong/spring_hello:test

작동 확인하기!

Trouble Shooting

source: no such file or directory: gradelw

gradle build 로 빌드!

Import Error

> Task :compileJava FAILED
/Users/mac/Desktop/JoonHo/Spring_Study/deploy-sample/src/main/java/com/example/deploysample/HelloController.java:3: error: package org.springframework.web.bind.annotation does not exist
import org.springframework.web.bind.annotation.GetMapping;
                                              ^
/Users/mac/Desktop/JoonHo/Spring_Study/deploy-sample/src/main/java/com/example/deploysample/HelloController.java:4: error: package org.springframework.web.bind.annotation does not exist
import org.springframework.web.bind.annotation.RestController;
                                              ^
/Users/mac/Desktop/JoonHo/Spring_Study/deploy-sample/src/main/java/com/example/deploysample/HelloController.java:6: error: cannot find symbol
@RestController
 ^
  symbol: class RestController
/Users/mac/Desktop/JoonHo/Spring_Study/deploy-sample/src/main/java/com/example/deploysample/HelloController.java:8: error: cannot find symbol
    @GetMapping("/hello")
     ^
  symbol:   class GetMapping
  location: class HelloController
4 errors

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
> Run with --info option to get more log output.
> Run with --scan to get full insights.

BUILD FAILED in 1s
1 actionable task: 1 executed
  • build.gradle을 연 후 dependencies부분을 수정
  • 변경전
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.5'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '21'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}
  • 변경 후
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.5'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '21'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

 

 

error: package org.springframework.web.bind.annotation does not exist

스프링프로젝트를 만들던중 라우팅을 하는 부분에서 이런 에러가 발생했다. Gradle을 사용하는 경우 build.gradle을 연 후 dependencies부분을 수정해주면 된다.

velog.io