Spring 심화 (EC2 배포 실습)

KimGwangmin·2026년 9월 28일
post-thumbnail

배포용 프로젝트 설정

  • 프로젝트명: camp-health-app

  • 의존성

    • Lombok
    • Spring Web
    • Spring Boot Actuator
    • AWS Parameter Store
      • implementation("io.awspring.cloud:spring-cloud-aws-starter-parameter-store:4.1.1")
  • 환경변수

    • application.properties
    spring.application.name=camp-health-app
    server.port=8080
    management.endpoints.web.exposure.include=health,info
    • application-prod.properties: ${APP_MESSAGE}는 AWS Parameter Store에서 받아올 것이다.
    spring.config.import=aws-parameterstore:/camp-health-app/prod/
    management.endpoint.health.show-details=never
    management.info.env.enabled=true
    info.app.message=${APP_MESSAGE}
    
    logging.level.root=INFO

JAR 빌드

# 프로젝트 디렉토리에서
./gradlew clean bootJar

# 빌드 결과 확인
ls -la build/libs/
  • 인텔리제이에서는 Gradle 도구 목록에서 bootJar 버튼을 사용할 수도 있다

참고: bootJar vs build

  • bootJar: JAR 생성
  • build: 테스트 실행 후 JAR 생성

EC2 세팅 및 배포

인바운드 규칙 추가

  • 스프링 애플리케이션이 돌아갈 8080 포트를 열어둬야 함

EC2 서버에 Java 설치

# EC2에 SSH 접속 후
# dnf는 패키지 관리자
sudo dnf install java-21-amazon-corretto -y

# 설치 확인 (21버전인지)
java -version

IAM Role 설정

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter",
                "ssm:GetParameters",
                "ssm:GetParametersByPath"
            ],
            "Resource": "arn:aws:ssm:ap-northeast-2:*:parameter/camp-health-app/*"
        }
    ]
}
  • 파라미터를 가져올 수 있는 권한
  • AmazonSSMReadOnlyAccess라는 이름으로 이미 정의되어 있음

  • 새 IAM 생성 후 AmazonSSMReadOnlyAccess 적용

Parameter Store 파라미터 생성

  • 이름: /camp-health-app/prod/APP_MESSAGE
  • 유형: String
  • 값: Hello from Parameter Store

JAR 업로드

# 기본 형식
scp -i {키페어경로} {로컬파일} ec2-user@{EC2-IP}:~/app.jar

scp (Secure Copy)
SSH를 통해 파일을 복사하는 명령어

포그라운드 실행

# 포그라운드 실행
java -jar ~/app.jar --spring.profiles.active=prod

  • prod 프로필로 실행된 것을 확인할 수 있음

실행 결과

/actuator/health/actuator/info

백그라운드 실행

포그라운드로 실행하면 앱을 실행하는 건 EC2 서버인데, 내 터미널이 끊어지면(SSH 연결이 끊어지면) 앱이 멈춘다.
nohup(No Hang Up)을 사용하면 백그라운드로 앱을 실행할 수 있고, 터미널 닫힘 등으로 전달되는 SIGHUP 신호를 무시하여 프로세스가 죽지 않도록 보호한다.

# (EC2에서) 백그라운드 실행
nohup java -jar ~/app.jar --spring.profiles.active=prod > ~/app.log 2>&1 &

실행 확인

# 프로세스 확인
ps aux | grep java

# 로그 확인
tail -f ~/app.log
# tail 상태는 Ctrl+C로 종료

  • 실행 후 접속을 끊었다가 돌아와도 프로세스가 계속 실행 중이다. 접속을 끊은 상태에서도 API 응답을 받을 수 있다.

그냥 뒤에 &만 붙여도 백그라운드로 실행이 되기는 한다. 다만 이 경우 로그가 남아 지저분하다. 또한, Ctrl+D를 통한 정상 종료에는 프로세스가 유지되지만, 프로세스가 열린 터미널 창 자체를 꺼버릴 경우에는 프로세스가 죽어버리는 것을 확인했다. 따라서,

0개의 댓글