
저번 포스팅에서 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"]
$ scp -i [ssh키 경로] -r [c드라이브의 폴더 경로]ubuntu@[AwsEc2 IP]:[복사본 저장될 폴더]


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

첫 번째 에러가 떴습니다.
아래를 잘 읽어보면 연결된 데이터 베이스가 없다고 합니다. 즉 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 .

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


이렇게 스프링부트 fland 이미지가 실행 되지 않고 꺼집니다.
sudo docker logs fland
로그확을 해보니 데이터베이스가 연결이 안된다고 뜹니다.

즉 application.property를 인식하지 못하는 겁니다.
그래서 Dockerfile을 한번 더 수정해주었습니다.
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 파일을 컨테이너에 추가하고, 이를 애플리케이션 실행 시 사용하도록 설정하였습니다. 이를 통해 애플리케이션이 실행될 때 필요한 설정을 외부 파일에서 로드하여 사용할 수 있습니다.

이제 실행이 잘됩니다.

스웨거도 잘나옵니다.
배포 완료되었고, 구성놀이API,file-uploadTest API도 잘 됩니다. 그러나 블록쌓기는 FastAPI와 통신이 안되었습니다.
그래서 저는 Docker 컨테이너 내부에 진입하여 확인을 해보았습니다,
sudo docker exec -it fland /bin/sh

도커 컨테이너 내부에는 localhost 되있었습니다.
즉 , 스프링부트 내 코드가 문제라 생각했고, FastAPI와 통신하는 블록쌓기코드를 살펴보았습니다.

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

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

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





<구성놀이>

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