hye-log

Nginx-SpringBoot 무중단 배포 도입기 - (1) profiles 사용하기 본문

Infra/Nginx

Nginx-SpringBoot 무중단 배포 도입기 - (1) profiles 사용하기

iihye_ 2024. 4. 4. 17:46

프로젝트를 진행하면서

"백엔드 서버 내려갔어. 이따가 올라가"

"서버 지금 동작하고 있어?"

라는 말을 정말 많이 했다.

프론트엔드도 현재 서버가 정상적으로 작동 중인지 알기 어렵고,

백엔드도 서버가 잘 작동되는지 지속적으로 체크해야했다.

 

Jenkins로 백엔드 서버 구축만 하면 

자동으로 배포되니 신경쓸 일이 없다고 생각했는데,

기존 서버 내리고 새로운 서버를 올리면서

서비스가 중단되는 "다운타임"을 발생했다.

 

이번 프로젝트에서는

"중단 없이 서비스를 배포해보자!" 라는 목표를 세웠고,

새로운 서버를 배포할 때 다운타임을 최소화하고자 무중단 배포를 도입하게 되었다.

 

무중단 배포의 첫 번째 단계로 profile을 이용하여 SpringBoot의 원하는 설정들을 적용해보았다.

SpringBoot에서는 properties(application.properties)나 yaml 파일(application.yaml) 두 가지로 설정 파일을 만들 수 있다.

평소에 yaml 파일을 이용하여 설정하는 것을 선호하기 때문에 yaml 파일 기준으로 SpringBoot의 yaml 파일을 바꿔보자!

 

1. application.yml

---
spring:
  config:
    activate:
      on-profile: set1
server:
  port: 8081
---
spring:
  config:
    activate:
      on-profile: set2
server:
  port: 8082

yaml 파일에 spring.config.activate.on-profile을 통해 profile 이름을 정해준다.

set1, set2를 활성화 했으니 profile 이름으로 사용한다는 뜻이다.

server port는 set1과 set2에 각각 8081, 8082로 지정한다.

set1을 실행하게 되면 8081로 연결되고, set2를 실행하면 8082로 연결된다.

중간에 --- 은 yml 파일을 여러 개 만들지 않고도 하나의 yml 파일에서 여러 설정을 정보를 입력할 수 있다.

 

2. WebRestController.java

@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class WebRestController {

    private final Environment env;

    @GetMapping("/profile")
    public String getProfile () {
        return Arrays.stream(env.getActiveProfiles())
                .findFirst()
                .orElse("");
    }
}

간단한 REST API를 통해서 Environment로부터 활성화 된 profile 정보를 불러올 수 있다.

set1로 실행했을 때 /api/profile을 실행하면 "set1",

set2로 실행했을 때 /api/profile을 실행하면 "set2"가 출력된다.

 

3. YoyakApplication.java

@SpringBootApplication
@EnableJpaAuditing
public class YoyakApplication {

    public static final String APPLICATION_LOCATIONS = "spring.config.location="
        + "classpath:application.yml";

    public static void main(String[] args) {
        new SpringApplicationBuilder(YoyakApplication.class)
            .properties(APPLICATION_LOCATIONS)
            .run(args);
    }

}

가장 메인이 되는 Application.java 파일에 다음과 같이 입력한다.

APPLICATION_LOCATION은 classpath 기준으로 yml 파일을 찾아준다.

현재는 설정 파일을 하나만 사용하기 때문에 굳이 작성하지 않아도 되지만,

설정 파일을 여러 개 사용한다면 반드시 작성해야 하는 부분이다.

SpringApplicationBuilder를 통해 properties를 설정한다.

 

4. Edit Configurations

오른쪽 위에 ... 을 클릭하고 Edit Configurations로 들어간다.

(단축키가 있지만 윈도우라 잘 모른다)

왼쪽 위에 복제 버튼으로 기존에 만들었던 YoyakApplication을 복제하여,

[set1]YoyakApplication, [set2]YoyakApplication을 생성한다.

이때, Active profiles는 앞에서 설정했던 profile 이름으로 각각 생성해준다.

 

[set1]YoyakApplication으로 실행했을 때 실행된 profile이 set1, 포트 번호가 8081이다.

 

[set2]YoyakApplication으로 실행했을 때 실행된 profile이 set2, 포트 번호가 8082이다.

 

이렇게 profile을 이용하여 SpringBoot를 실행하는 환경을 만들어보았다.

무중단 배포의 첫 걸음이다.

728x90
Comments