POC 앱 스프링부트 배포 및 결과 테스트

Yu Seong Kim·2024년 7월 16일
0

SpringBoot

목록 보기
21/29
post-thumbnail

저번 포스팅에서 FastAPI의 AI모델과 이미지처리 모델을 배포하였습니다. 그러나 POC 앱은 저번 포스팅에서 말한 것처럼 스프링부트가 클라이언트와 통신이 되고, 스프링부트는 서버단에서 FastAPI와 통신을 진행합니다.

즉, 스프링부트를 따로 배포하고, FastAPI와 연결이 잘 되는지 테스트를 진행하였습니다.

저번과 동일한 방법으로 스프링부트를 배포했지만, 스프링부트 프로젝트가 하나이기 때문에 도커컴포즈는 사용하지 않았습니다.

도커 파일 작성

# Start with a base image containing Java runtime
FROM openjdk:17-jdk-alpine

# Add a volume pointing to /tmp
VOLUME /tmp

# Make port 8080 available to the world outside this container
EXPOSE 8080

# The application's jar file
ARG JAR_FILE=target/0.0.1-SNAPSHOT.jar

# Add the application's jar to the container
ADD ${JAR_FILE} app.jar

# Run the jar file
ENTRYPOINT ["java","-jar","/app.jar"]
  • 기본 이미지 설정: OpenJDK 17 Alpine 버전을 사용하여 가벼운 Java 런타임 환경을 제공합니다.
  • 볼륨 설정: /tmp 디렉토리를 호스트와 공유하여 임시 파일을 유지합니다.
  • 포트 설정: 8080 포트를 개방하여 외부 접근을 허용합니다.
  • 애플리케이션 JAR 파일 추가: 호스트의 JAR 파일을 컨테이너로 복사합니다.
  • 애플리케이션 실행: 컨테이너가 시작될 때 Java 애플리케이션을 실행합니다.

단계

  1. GitBash로 C드라이브의 프로젝트 폴더 복사 후 ubuntu 폴더로 이동
  2. 도커 빌드후 실행
  3. 결과 테스트
    순으로 간단하게 진행하였습니다.

GitBash를 이용한 C드라이브에서 Ubuntu로 이동

$ scp -i [ssh키 경로] -r [c드라이브의 폴더 경로]ubuntu@[AwsEc2 IP]:[복사본 저장될 폴더]

maven빌드

mvn clean package 

Maven을 사용하여 Java 프로젝트를 빌드해줍니다.

트러블 슈팅 1


첫 번째 에러가 떴습니다.
아래를 잘 읽어보면 연결된 데이터 베이스가 없다고 합니다. 즉 Test 과정에서 발생한 데이터베이스 오류입니다.

Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class

전 테스트 과정에서 설정한 데이터베이스가 없기 때문에 테스트과정을 무시하고, 바로 빌드를 진행했습니다.

mvn clean package -DskipTests


빌드 성공 하였습니다.

도커 빌드

sudo docker build -t fland .

트러블 슈팅 2


<경로문제>
JAR 파일 경로 문제: Dockerfile에서 지정한 target/0.0.1-SNAPSHOT.jar 경로에 JAR 파일이 존재하지 않기 때문에 발생하는 오류가 발생했습니다. 즉, Dockerfile이 잘못 작성되었습니다.

도커파일 수정 1


FROM openjdk:17-jdk-alpine

VOLUME /tmp

EXPOSE 8080

ARG JAR_FILE=fland-0.0.1-SNAPSHOT.jar

ADD target/${JAR_FILE} app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

이렇게 target 경로로 설정해주니 빌드가 되었습니다.

트러블 슈팅 3


이렇게 스프링부트 fland 이미지가 실행 되지 않고 꺼집니다.

 sudo docker logs fland

로그확을 해보니 데이터베이스가 연결이 안된다고 뜹니다.

즉 application.property를 인식하지 못하는 겁니다.

그래서 Dockerfile을 한번 더 수정해주었습니다.

도커파일 수정 2

FROM openjdk:17-jdk-alpine

VOLUME /tmp

EXPOSE 8080

ARG JAR_FILE=target/fland-0.0.1-SNAPSHOT.jar

ADD ${JAR_FILE} app.jar

ADD resources/application.properties /app/config/application.properties

ENTRYPOINT ["java","-Dspring.config.location=file:/app/config/application.properties","-jar","/app.ja>

기존 Dockerfile에서 application.properties 파일을 컨테이너에 추가하고, 이를 애플리케이션 실행 시 사용하도록 설정하였습니다. 이를 통해 애플리케이션이 실행될 때 필요한 설정을 외부 파일에서 로드하여 사용할 수 있습니다.

이제 실행이 잘됩니다.

스웨거도 잘나옵니다.

트러블 슈팅 4

배포 완료되었고, 구성놀이API,file-uploadTest API도 잘 됩니다. 그러나 블록쌓기는 FastAPI와 통신이 안되었습니다.

그래서 저는 Docker 컨테이너 내부에 진입하여 확인을 해보았습니다,

sudo docker exec -it fland /bin/sh


도커 컨테이너 내부에는 localhost 되있었습니다.

즉 , 스프링부트 내 코드가 문제라 생각했고, FastAPI와 통신하는 블록쌓기코드를 살펴보았습니다.

블록쌓기 모델은 localhost로 되있었습니다. 즉, 이것을 현재 IP로 바꾸었고, 다시 도커 컨테이너 내부를 확인하였습니다.


이렇게 잘 바뀐것을 확인했고, 최종 테스트를 진행하였습니다.

최종 4D블럭 POC 앱 백엔드 배포 완료 결과 테스트

<블럭쌓기>

최종적으로 스프링부트에서 이미지 5장을 FastAPI에 주고 AI모델을 인식한 결과를 스프링부트로 다시 반환합니다.

<구성놀이>

이렇게 이미지처리도 잘되는 것을 확인하였습니다.

profile
인생을 코딩하는 남자.

0개의 댓글