빌드
IntelliJ IDEA에서 빌드
우측 Maven 탭 → {Profiles} → Local를 선택합니다. (실행 환경을 선택합니다.)

우측 Maven 탭 → {project} → Lifecycle → package를 더블 클릭합니다.

빌드 결과
{project}/target/ 경로에 생성됩니다.

Build Project (Ctrl + F9)로 실행하면 .class 파일만 생성되고 WAR 파일은 패키징되지 않습니다.
빌드 결과 지우기
우측 Maven 탭 → {project} → Lifecycle → clean를 더블 클릭합니다.

Terminal에서 빌드
테스트 실행을 건너뛰고 프로젝트를 깨끗하게 다시 컴파일하여 배포 가능한 파일(JAR 또는 WAR)로 패키징합니다.
프로젝트의 루트 디렉터리에서 빌드해야 합니다.
mvnw clean package -PLocal -DskipTests
-P : 실행 환경을 설정하는 옵션입니다. 프로필의 id를 입력합니다.
-DskipTests : 빌드 과정 중 테스트 실행 단계를 건너뛰도록 설정하는 옵션입니다.

Terminal에서 빌드 결과
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.example:transmission >----------------------
[INFO] Building transmission 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- clean:3.4.0:clean (default-clean) @ transmission ---
[INFO] Deleting C:\workspaces\projects\prototype\transmission\target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ transmission ---
[INFO] Copying 5 resources from src\main\resources to target\classes
[INFO] Copying 14 resources from src\main\resources to target\classes
[INFO]
[INFO] --- compiler:3.13.0:compile (default-compile) @ transmission ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 70 source files with javac [debug parameters release 17] to target\classes
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ transmission ---
[INFO] skip non existing resourceDirectory C:\workspaces\projects\prototype\transmission\src\test\resources
[INFO]
[INFO] --- compiler:3.13.0:testCompile (default-testCompile) @ transmission ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 2 source files with javac [debug parameters release 17] to target\test-classes
[INFO]
[INFO] --- surefire:3.5.2:test (default-test) @ transmission ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- war:3.4.0:war (default-war) @ transmission ---
[INFO] Packaging webapp
[INFO] Assembling webapp [transmission] in [C:\workspaces\projects\prototype\transmission\target\transmission-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [C:\workspaces\projects\prototype\transmission\src\main\webapp]
[INFO] Building war: C:\workspaces\projects\prototype\transmission\target\transmission-0.0.1-SNAPSHOT.war
[INFO]
[INFO] --- spring-boot:3.4.0:repackage (repackage) @ transmission ---
[INFO] Replacing main artifact C:\workspaces\projects\prototype\transmission\target\transmission-0.0.1-SNAPSHOT.war with repackaged archive, adding nested dependencies in BOOT-INF/.
[INFO] The original artifact has been renamed to C:\workspaces\projects\prototype\transmission\target\transmission-0.0.1-SNAPSHOT.war.original
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.600 s
[INFO] Finished at: 2025-01-25T11:29:37+09:00
[INFO] ------------------------------------------------------------------------
만약, JAVA_HOME 환경 변수가 올바르게 정의되지 않았다면 다음과 같은 오류 메시지가 출력됩니다.

JAVA 버전 및 JAVA_HOME 확인

만약, 경로가 나오지 않는다면 JAVA_HOME이 설정되지 않았거나 Java가 설치되지 않은 경로로 잘 못 설정된 경우일 수 있습니다. JAVA_HOME을 설정하시기 바랍니다.
Docker Image 생성
Dockerfile 파일 생성
프로젝트의 루트 디렉터리에 확장자 없는 Dockerfile 파일을 생성합니다.
# Java 17
FROM eclipse-temurin:17
# 작업 디렉터리 설정
WORKDIR /app
# 업로드 임시 파일 경로
RUN mkdir -p /appdata/tempupload
# 업로드 파일 경로
RUN mkdir -p /appdata/upload
# 다운로드 임시 파일 경로
RUN mkdir -p /appdata/tempdownload
# 빌드된 WAR 파일 경로 변수 (Maven)
ARG WAR_FILE_PATH=target/*.war
# 빌드된 WAR 파일을 컨테이너로 복사
COPY ${WAR_FILE_PATH} app.war
# 컨테이너가 사용할 포트 지정
EXPOSE 8080
# 실행할 명령어
ENTRYPOINT ["java", "-jar", "app.war"]
Eclipse Temurin(이클립스 테무린) : 이클립스 재단의 Adoptium(https://adoptium.net/, 아돕티엄) 프로젝트에서 제공하는 고성능 오픈소스 자바(Java) 런타임 및 OpenJDK 배포판입니다. 누구나 무료로 법적 리스크 없이 사용할 수 있는 오픈소스 OpenJDK 배포 프로젝트입니다.
리눅스 환경에 맞게 [업로드 임시 파일 경로], [업로드 파일 경로], [다운로드 임시 파일 경로]를 생성해야 합니다.
DB 카테고리 테이블의 데이터 변경
리눅스 환경에 맞게 카테고리 테이블에 등록된 파일 경로들을 변경해야 합니다.
테스트를 위해 첫번째 카테고리인 [test1]만 파일 경로를 변경하겠습니다.
[업로드 임시 파일 경로] : C:/tempUpload/temp → /appdata/tempupload
[업로드 파일 경로] : C:/tempUpload/data → /appdata/upload
[다운로드 임시 파일 경로] : C:/tempDownload/temp → /appdata/tempdownload
Query문을 실행하여 변경합니다.
UPDATE tb_category SET DOWN_TEMP_FILE_PATH='/appdata/tempdownload',UP_FILE_PATH='/appdata/upload',UP_TEMP_FILE_PATH='/appdata/tempupload' WHERE SEQ=1;

Docker Bulid
프로젝트 디렉터리에 있는 Dockerfile과 소스 코드를 활용하여 컨테이너 이미지를 생성합니다.
프로젝트의 루트 디렉터리에서 빌드해야 합니다.
docker build -t {생성될 이미지의 이름(태그)} .(마침표, 현재 디렉터리)
docker build -t transmission-app .

생성된 Image 파일은 가상 디스크(docker_data.vhdx)에 저장됩니다.
Docker Desktop에서 빌드된 이미지 확인

Docker Image 저장 위치
C:\Users\carro\AppData\Local\Docker\wsl\disk

Docker build 캐시 삭제
도커 빌드 과정에서 생성된 빌드 캐시를 삭제합니다.
docker builder prune -f
docker builder prune -a -f
-f : 삭제 여부를 묻는 확인 절차를 생략하는 옵션입니다. (유효하지 않는 캐시만 삭제됩니다.)
-a : 모든 빌드 캐시를 삭제하는 옵션입니다.

빌드 후에 추가 빌드 계획이 없다면 디스크 용량 확보를 위해 빌드 캐시를 삭제하는 것이 좋습니다.
캐시를 사용하지 않고 빌드할 수 있습니다.
docker build --no-cache -t transmission-app .

Docker Image 저장(백업) 및 로드(복원)
Docker Image 저장(백업)
도커 이미지를 파일(.tar)로 저장(백업)합니다.
docker save -o(--output) {저장할 파일 경로와 파일 이름}.tar {이미지이름:태그}
docker save -o transmission-app.tar transmission-app:latest

Docker Image 로드(복원)
docker save로 만든 파일(.tar)을 도커 이미지로 복원됩니다.
docker load -i(--input) {docker save로 만든 파일(.tar)}
docker load -i transmission-app.tar
