inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

비전공자도 이해할 수 있는 Docker 입문/실전

[실습] Docker Compose로 백엔드(Nest.js) 실행시키기

jar 파일 생성과 컨테이너 생성 순서

98

김태환

작성한 질문수 2

1

이번 강의에서 NestJS는 컨테이너를 생성하면서 npm install + npm run build로 컨테이너 내에서 애플리케이션을 빌드하는 것을 배웠습니다.

하지만 왜 Spring Boot는 컨테이너를 생성하기 전에 먼저 빌드를 하고 이 jar 파일을 컨테이너로 복사하는 것인가요?

Spring Boot도 NestJS처럼 컨테이너 내에서 빌드하면 docker compose up -d --build 전에 ./gradlew clean build도 생략할 수 있으니 더 편리하지 않을까 싶어 혹시 이유가 있는지 질문 드립니다.

 

감사합니다.

docker docker-compose docker-volume docker-image container ecr

답변 2

1

JSCODE 박재성

안녕하세요 태환님! 예리하게 잘 질문해주셨네요:D

 

NestJS와 Spring Boot가 Docker 컨테이너 빌드 방식에서 차이를 두는 이유 중

가장 큰 이유는 빌드 속도 최적화 (Gradle 캐시 활용) 측면 때문입니다.

Spring Boot는 빌드가 무겁고 캐시 활용이 중요하기 때문에

외부에서 .jar로 빌드한 후 복사하는 방식이 일반적이며, 더 효율적이라고 판단하는 편입니다.

하지만 NestJS는 비교적 빌드가 가볍고 빠르기 때문에

Docker 내부에서 바로 빌드하는 것이 더 낫다고 판단하는 편입니다.

 

하지만 빌드 과정을 어떻게 구성할 지에 대한 건 정답이라는 건 없습니다.

태환님 말씀대로 빌드의 효율성보다 관리의 편리성이 더 낫다고 생각하신다면

Spring Boot도 NestJS처럼 컨테이너 내에서 빌드하는 식으로 코드를 짜는 것도

괜찮은 방법입니다!

 

따라서 어떻게 빌드하느냐에 따라 생기는 장단점을 고려하셔서

빌드 방법을 고려하시면 좋을 것 같습니다:D

 

이 외로 또 궁금한 점 있으시면 질문 남겨주세요ㅎㅎ

2

김태환

이 이유가 맞나 저 이유가 맞나 고민하다가 해결 못하고 잠들었는데, 빠른 답변 감사합니다!!

강의 잘 보고 있습니다 강사님!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 김태환님.

질문해주신 내용은 Docker와 관련하여 각 언어와 프레임워크의 특성 차이 때문에 발생하는 부분입니다.

NestJS와 Spring Boot의 차이점

  1. NestJS (Node.js 기반):

    • Node.js 환경에서는 Docker 컨테이너 내에서 직접 npm installnpm run build를 수행하는 관행이 흔합니다. 이는 Node.js 생태계에서 개발과 실행 환경을 동일하게 유지하기 용이하기 때문입니다.
    • 이 방식을 사용하면 프로젝트 의존성 설치 및 빌드가 Docker 이미지 생성 과정에 포함되므로, 개발자 입장에서 더 간편하게 느껴질 수 있습니다.
  2. Spring Boot (Java 기반):

    • Java 생태계에서는 종종 애플리케이션 배포와 실행을 독립적으로 관리합니다. 이 때문에 비로컬에서 개발된 빌드 결과물(JAR 파일)을 먼저 생성하고 이를 컨테이너에 복사하여 사용하는 방식이 전통적으로 사용됩니다.
    • 이는 개발, 테스트, 배포 사이클을 명확히 관리하고, 필요 시 동일한 JAR 파일을 다양한 환경에서 재사용할 수 있게 하여 관리 및 배포의 일관성을 제공합니다.

이유와 장점

  • 일관성 유지: 빌드와 실행을 분리하면, 특정 환경에서의 빌드가 다른 환경에 종속되지 않으므로 안정적입니다.
  • 서로 다른 환경 관리: 다양한 자바 바이트 코드를 생성하는 빌드 도구가 사용되므로, 빌드와 실행 사이에 명확한 경계를 두는 것이 필요합니다.

이러한 특성 때문에, Spring Boot는 종종 코드 수정 후 로컬 환경에서 빌드하고, 그 결과물을 Docker 이미지에 포함시켜 배포하는 방식으로 진행됩니다.

참고 자료

Spring Boot와 Docker에 관한 더 자세한 이유와 비교를 아래 URL에서 확인하실 수 있습니다:
- 도커 이미지 생성 및 소스 빌드에 관한 질문입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

EC2 터미널에서 docker pull

0

62

2

AWS ECR

0

57

2

FROM openjdk:17-jdk 현재 기준 dockerhub에 없습니다

1

98

2

Redis 볼륨 설정?

0

114

2

컨테이너의 IP

0

79

2

도커 이미지를 만들 때 application.yml

0

101

2

compose.yml 관리

0

86

2

ECR 리포지토리에 이미지가 3개가 보입니다.

0

76

2

액세스 키 등록하는 시점 관련 질문이 있습니다.

0

82

1

depends_on에 따른 컨테이너 실행 순서

0

75

2

실제 웹 서비스 배포 시 질문

0

80

2

도커 volume 질문

0

66

3

HTTPS로도 받고 싶으면 docker compose에 443도 쓰면 될까요?

0

71

2

sql 볼륨 폴더 지우면 데이터베이스 데이터 날라가는거 아닌가요?

0

71

2

39강 도커파일 빌드 경로 질문이 있습니다.

0

67

2

도커파일 copy

0

69

2

실무에서 docker compose up --build를 할 때

0

183

2

mysql_data 폴더 내부에 다른 파일이 있는데도 잘 되는 경우

0

83

2

도커 허브에서 postgres 버전 확인하는 법

0

127

2

보충 자료와도 관련된 추가 내용

1

81

1

현업에서 MySQL은 RDS와 도커 볼륨 중 어떤 걸 사용하나요?

0

108

2

노션 자료에 안 보이는 이미지가 있습니다

0

99

1

도커 허브에서의 latest가 가장 최신인 게 맞나요?

0

117

2

docker image ls 실행 시 나오는 내용이 다릅니다

0

86

2