로컬배포
- mavenLocal 배포
- 자체 library를 쓰는 프로젝트에서 local 배포를 진행할때 mavenLocal 저장소에 자체 library 빌드를 진행한다.
clean build publishToMavenLocal -x test
- mavenLocal 배포 저장위치
- gradle 에서 아래의 두가지 변수에 따라서 배포파일의 위치가 결정된다.
group = 'some.platform'
version = '1.0.0'
~/.m2/repository/{groupId}/{artifactId}/{version}/
전체 빌드와 배포 프로세스
- 개발 단계 : 개발자가 Java 코드를 작성합니다.
- 빌드 : Gradle을 사용하여 전체 빌드 과정을 처리합니다.
- 서버 배포
- .jar 파일( .class 파일의 묶음)을 실행시키기 위해서 JDK가 설치된 서버 환경에서 실행됩니다.
- 서버환경구축
- 소스코드로 전달 : 서버에서 빌드, 서버 내 jdk 설치
- jar 파일로 전달 : 로컬에서 빌드, 서버 내 jre 설치
- war 파일로 전달 : 로컬에서 빌드, 서버 내 was, jre설치
- 서버환경구축
- .jar 파일( .class 파일의 묶음)을 실행시키기 위해서 JDK가 설치된 서버 환경에서 실행됩니다.
- Docker 컨테이너화:
- 수많은 인스턴스에 실행환경을 조성하는 것을 생략하기 위해서 .jar 파일과 실행 환경(Java 및 의존성)을 Docker 이미지로 묶습니다.
- 데이터베이스(MySQL, PostgreSQL)나 캐싱 시스템(Redis) 같은 추가 서비스도 Docker 컨테이너로 실행합니다.
- 복수의 컨테이너들을 compose 파일로 오케스트레이션 합니다
- Docker 이미지를 클라우드 서버에 배포하여 실행합니다.
- Jenkins를 활용한 자동화:
- Jenkins를 통해 Gradle 빌드, Docker 컨테이너화, 클라우드 배포 과정을 자동화합니다.
지금처럼 IDE로 실행하면 안돼는가?
- 확장성 부족 : 대규모 환경에서는 애플리케이션 실행에만 집중하는 가볍고 효율적인 시스템이 필요합니다.
- 환경 일관성과 자동화 : 빌드 도구가 자동화 및 일관성을 유지하면서 대규모 배포 환경에서 안정적으로 작동
- 의존성 및 설정 관리 : 빌드 도구는 필요한 의존성과 설정을 자동으로 패키징하여 어느 환경에서도 일관되게 실행될 수 있게 합니다.
배포/운영
- 로컬에서 실행: 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를 사용해 빌드, 테스트, 배포 과정을 자동화.
운영 환경 만들기
- 서버 준비:
- AWS EC2 인스턴스 생성.
- 필요한 스토리지 연결(EBS 등).
- 네트워크 설정:
- VPC, 서브넷, 보안 그룹으로 네트워크를 설계.
- 외부 접근 허용(IP 화이트리스트 설정).
- 소프트웨어 설치:
- OS 패키지 설치(예: Linux).
- 애플리케이션 런타임(Java, Python, Node.js 등).
- 데이터베이스 설정:
- RDS 생성 및 연결 정보 구성.
- 운영 도구 설치:
- 모니터링 툴(CloudWatch, Grafana 등).
- 로깅 시스템(ElasticSearch, Kibana 등).
배포
- 코드 빌드:
- ./gradlew build 또는 npm run build로 애플리케이션 빌드.
- 결과물 배포:
- EC2 서버로 전송(SCP, Rsync 등).
- Docker 이미지 빌드 후 레지스트리에 푸시.
- 애플리케이션 실행:
- 빌드된 결과물을 서버에서 실행(java -jar, node app.js 등).
- Docker 컨테이너 실행(docker run).
- 테스트:
- 애플리케이션이 정상적으로 동작하는지 확인.
배포 확인용 체크리스트
많은 개발자들이 배포 확인용 체크리스트를 갖고 있어요.
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 |