본문 바로가기

개발기술/빌드, 배포, 운영

빌드 파일 서버 배포

 

로컬배포

  • mavenLocal  배포
    • 자체 library를 쓰는 프로젝트에서 local 배포를 진행할때 mavenLocal 저장소에 자체 library 빌드를 진행한다.
clean build publishToMavenLocal -x test
  • mavenLocal  배포 저장위치
    • gradle 에서 아래의 두가지 변수에 따라서 배포파일의 위치가 결정된다.
group = 'some.platform'
version = '1.0.0'
~/.m2/repository/{groupId}/{artifactId}/{version}/

 

 

 

 

 

 

 

 

 

 

 

전체 빌드와 배포 프로세스

  1. 개발 단계 : 개발자가 Java 코드를 작성합니다.
  2. 빌드  : Gradle을 사용하여 전체 빌드 과정을 처리합니다.
  3. 서버 배포
    • .jar 파일( .class 파일의 묶음)을 실행시키기 위해서 JDK가 설치된 서버 환경에서 실행됩니다.
      • 서버환경구축
        • 소스코드로 전달 : 서버에서 빌드, 서버 내 jdk 설치 
        • jar 파일로 전달 : 로컬에서 빌드, 서버 내 jre 설치
        • war 파일로 전달 : 로컬에서 빌드, 서버 내 was, jre설치
  4.  Docker 컨테이너화:
    • 수많은 인스턴스에 실행환경을 조성하는 것을 생략하기 위해서  .jar 파일과 실행 환경(Java 및 의존성)을 Docker 이미지로 묶습니다.
    • 데이터베이스(MySQL, PostgreSQL)나 캐싱 시스템(Redis) 같은 추가 서비스도 Docker 컨테이너로 실행합니다.
    • 복수의 컨테이너들을 compose 파일로 오케스트레이션 합니다
    • Docker 이미지를 클라우드 서버에 배포하여 실행합니다.
  5.  Jenkins를 활용한 자동화:
    • Jenkins를 통해 Gradle 빌드, Docker 컨테이너화, 클라우드 배포 과정을 자동화합니다.

 

지금처럼 IDE로 실행하면 안돼는가?

  • 확장성 부족 : 대규모 환경에서는 애플리케이션 실행에만 집중하는 가볍고 효율적인 시스템이 필요합니다. 
  • 환경 일관성과 자동화 :  빌드 도구가 자동화 및 일관성을 유지하면서 대규모 배포 환경에서 안정적으로 작동
  • 의존성 및 설정 관리 :  빌드 도구는 필요한 의존성과 설정을 자동으로 패키징하여 어느 환경에서도 일관되게 실행될 수 있게 합니다.

 

배포/운영

  1. 로컬에서 실행: Gradle로 .jar 파일 빌드 후 로컬에서 실행, 테스트가 통과하고 애플리케이션이 정상 동작하는지 확인. 
./gradlew clean build -Pprofile=dev

 

실제사용

  • java -jar -Dserver.port=9090 your-application-name.jar : 서버포트를 설정
  • java -jar : 서버를 실행
  • java -jar api.jar --spring.profile.active=dev : jar파일을 실행하면서 spring boot의 설정을 입력하는 

명령어설명

  • java : Java Virtual Machine(JVM)을 실행하는 명령어입니다.
    • -jar: JVM에 전달되는 옵션으로, 실행할 파일이 JAR 형식임을 지정합니다.  일반적으로 .class 파일이나 main() 메서드를 실행할 클래스를 지정해야 합니다.
    • -Dserver.port=9090: JVM의 시스템 속성을 설정하는 옵션입니다.
    • -Xms / -Xmx :  JVM의 메모리 초기값 및 최대값을 설정합니다.

2. 클라우드에서 실행환경조성: 클라우드 서버에 java와 mysql을 설치하여 환경을 구성하고 .jar 파일을 배포하고 실행하여 동작 검증.

 

실제사용

  • sudo apt install mysql-server
  • sudo apt install openjdk-17-jdk -y

명령어설명

  • sudo : 관리자 권한으로 명령어를 실행합니다. 소프트웨어를 설치하려면 루트 권한이 필요합니다.
  • apt : Ubuntu/Debian 계열에서 사용하는 패키지 관리 도구입니다.

 

3. Docker 컨테이너화: Docker로 컨테이너를 생성하고 로컬 및 클라우드에서 실행하여 검증.

  • Docker의 역할: 실행 시점에 Spring Boot가 어떤 환경 설정을 사용할지 결정.
  • 왜 필요한가? : 동일한 JAR 파일로 여러 환경(개발, 로컬, 운영)에서 실행할 수 있어야 함. 실행 환경에 따라 프로파일을 동적으로 선택해야 함
FROM openjdk:17
COPY build/libs/app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar", "--spring.profiles.active=dev"]

 

로컬/서버/운영 프로파일 구분

  프로파일 구분 관리를 위해서는 빌드 시점과 실행 시점에서 각각 다른 설정 값을 지정해야 하며, 이 작업은 Gradle의 Task 설정과 Docker의 ENTRYPOINT 설정으로 처리됩니다

 

도커 이미지 생성단계

docker build -f Dockerfile.dev -t zerobase-heritage:dev .

 

도커 실행

docker-compose up

 

4. Jenkins로 자동화: Jenkins를 사용해 빌드, 테스트, 배포 과정을 자동화.

 

 

 

운영 환경 만들기

  1. 서버 준비:
    • AWS EC2 인스턴스 생성.
    • 필요한 스토리지 연결(EBS 등).
  2. 네트워크 설정:
    • VPC, 서브넷, 보안 그룹으로 네트워크를 설계.
    • 외부 접근 허용(IP 화이트리스트 설정).
  3. 소프트웨어 설치:
    • OS 패키지 설치(예: Linux).
    • 애플리케이션 런타임(Java, Python, Node.js 등).
  4. 데이터베이스 설정:
    • RDS 생성 및 연결 정보 구성.
  5. 운영 도구 설치:
    • 모니터링 툴(CloudWatch, Grafana 등).
    • 로깅 시스템(ElasticSearch, Kibana 등).

배포

  1. 코드 빌드:
    • ./gradlew build 또는 npm run build로 애플리케이션 빌드.
  2. 결과물 배포:
    • EC2 서버로 전송(SCP, Rsync 등).
    • Docker 이미지 빌드 후 레지스트리에 푸시.
  3. 애플리케이션 실행:
    • 빌드된 결과물을 서버에서 실행(java -jar, node app.js 등).
    • Docker 컨테이너 실행(docker run).
  4. 테스트:
    • 애플리케이션이 정상적으로 동작하는지 확인.

 

배포 확인용 체크리스트

많은 개발자들이 배포 확인용 체크리스트를 갖고 있어요.

1. 프로세스 확인

 
ps aux | grep java

 

→ 내 서버(Spring Boot, Node 등)가 실제로 실행 중인지 확인

 2. 포트 열렸는지 확인

netstat -tuln | grep 8080
# 또는
ss -tuln | grep 8080
 

→ 서버가 지정된 포트로 리스닝 중인지 확인

 3. 로그 확인 (가장 중요!)

tail -f ./logs/app.log
 
  • 에러는 없는지
  • 정상적으로 "서버 시작" 로그가 찍혔는지
  • 요청 들어올 때 응답 로그가 나오는지

🔹 4. 헬스 체크 or 엔드포인트 호출

curl http://localhost:8080/health
curl http://localhost:8080/api/test
  • 프론트 없는 백엔드 프로젝트라면 Postman, curl로 직접 API 호출
  • 200 OK, 응답 내용 정상인지 확인

 

 

🔹 5. 브라우저로 직접 접속해보기

  • 웹페이지 띄워지면 기본 OK
  • 콘솔(F12) 열어서 네트워크 에러 없는지도 확인
  • 특히 404, 500 응답 유무

'개발기술 > 빌드, 배포, 운영' 카테고리의 다른 글

Jenkins CI/CD 자동화  (0) 2025.01.26
Gradle 빌드 사용법  (0) 2025.01.02
빌드와 Gradle 개념  (0) 2024.11.12
Docker 개념 및 커맨드  (0) 2024.11.09
리눅스  (0) 2024.01.24