Spring Boot로 개발하기(feat. Actuator /info는 디폴트 아니었어..?)

Jeong Hyeon Lee
Togather View
Published in
7 min readAug 9, 2021

지난 포스팅에서 다른 프레임워크와 비교하며 Spring Boot의 특징을 간략하게 이야기했었는데, 이번 포스팅에서 조금 더 자세히 다뤄보도록 하겠다. 또, Spring Actuator의 default 엔드포인트였던 /info가 디폴트로 동작하지 않는 이유에 대해 파헤쳐 보자!😁

Spring Boot

Spring Boot는 다음 4가지로 Spring으로 개발을 더 쉽게 시작할 수 있도록 만든 프레임워크이다.

1. Auto configuration

Spring 기반 애플리케이션은 다음과 같이 설정해야 할 것들이 많았다.

  • web.xml에서의 Dispatcher servlet 설정
  • servlet-context.xml에서 Component scan, View resolver 그리고 resource들 설정
  • Hibernate/JPA를 사용한다면 dao-context.xml에서 Data source, Session factory 그리고 Transaction manager 등

이러한 많은 설정 작업들을 프로젝트를 생성할 때마다 반복적으로 수행해야 하므로, 빨리 시작해서 실행시켜 보기에는 해야 할 작업이 너무 많다. 유사한 기술 스택을 가진 또 다른 애플리케이션을 개발하려면 설정을 복사해 붙여넣기 한다.

💡 같은 일을 반복해서 수행해야 한다면.. 자동화할 수 있는 방법을 찾아보자!

그래서 생각해 낸 것이 props 파일과 JAR classpath를 기반으로 기본적인 설정을 자동으로 수행함으로써 수동으로 설정할 양을 최소화하는 것이다. 이로써 pom.xml에 의존성을 추가하고 application.properties에 필요한 속성과 속성 값만 세팅하면 간단하게 세팅을 완료할 수 있다!

다양한 컴포넌트를 등록하는 다양한 auto-configuration 클래스들을 제공한다. @EnableAutoConfiguration으로 Spring Application Context의 auto-configuration을 활성화할 수 있다.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
...
}

이때, @Conditional 어노테이션을 사용하여 어떤 bean을 등록할지 조건부로 체크한다.

Conditional annotation을 사용하여 주어진 조건에 일치하는 bean만 조건부로 체크하여 등록한다.

2. 의존성 충돌 해결

기존의 Spring은 아래와 같이 pom.xml에 사용하기를 원하는 프레임워크와 버전을 명시해야 한다. 이때 빠뜨린 라이브러리가 없어야 하며, 버전은 Spring과 third-party 라이브러리가 호환이 되는 버전인지 신경 써서 설정해야 한다. 그렇지 않을 경우 애플리케이션이 정상적으로 동작하지 않는 문제가 발생한다.

이러한 불편함을 해소하기 위해 Spring Boot는 호환 가능한 버전의 Maven dependency들의 컬렉션인 spring-boot-starter-*를 제공하여 자주 사용되는 라이브러리 의존성을 미리 설정해 둠으로써 호환이 되는 라이브러리 버전을 찾아 수동으로 설정할 필요가 없다. 30개가 넘는 다양한 starter들이 존재하니 필요에 따라 골라 의존성만 추가하면 이들 간의 버전 호환성은 걱정할 필요가 없다 :)

3. 내장된 서버 제공

JAR 파일이 애플리케이션 코드와 서버를 포함하기 때문에 별도의 서버를 설치할 필요 없이 main() 메서드를 실행하면 WAR 파일로 배포할 필요 없이 JAR로 패키징 하여 내장된 서버(Tomcat, Jetty 또는 Undertow)를 이용해 빠르게 시작할 수 있다.

4. Spring Actuator

Spring Boot는 production 준비 기능을 제공하는 Spring Actuator를 포함함으로써 고급 애플리케이션 모니터링 및 관리를 할 수 있다. REST 엔드포인트들은 자동으로 애플리케이션에 추가된다.

엔드포인트application.properties에서 활성화/비활성화할 수 있다. 아래와 같이 작성하면 env, beans를 제외한 모든 엔드포인트를 활성화함을 의미한다.

management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=env,beans

다양한 엔드포인트가 있지만 이것들은 공식 문서를 참조하도록 하고, 두 가지 정도만 살펴보자.

  • /health : 애플리케이션의 상태 체크
  • /info : 애플리케이션의 정보. application.properties에서 info로 시작하는 속성들을 나타냄

접두사는 /actuator로, 예를 들어 health endpoint는 /actuator/health가 된다.

Spring 2.5.x 기준으로 기본적으로 노출되는 엔드포인트는 오직 /health이다. 불과 두 달 전까지만 해도 분명 /health/info가 기본적으로 노출된다고 배웠고 당시 실습했을 때도 그러하였으며 다시 구글링해도 같은 내용을 담은 글이 많은데.. 막상 복습하면서 실습을 진행해보니 /health는 정상적으로 뜨지만 /info는 다음과 같은 에러 페이지가 뜨는 것이었다.😥

그래서 /actuator로 현재 활성화된 리스트를 출력해보니 /health만 나오는 것이었다.🤔

그래서 공식 문서를 찾아보니 /health에 대해서만 기본적으로 보이도록 변경된 것을 알게 되었다! Wiki에도 이 내용이 명시되어 있다.

Secure Info Endpoint

The /info actuator endpoint is no longer exposed over the web by default.

엔드포인트에 민감한 정보가 포함된 채로 의도치 않게 보이는 것을 방지하고자 디폴트 노출을 최소화한 것으로 보인다.

개인 프로젝트 하기 전에 복습 차원에서 다시 실습을 진행하다가 발견한 문제를 기능 구현에는 상관없으니 그냥 지나칠까.. 하다가 역시 그래도 이유를 알고 넘어가는 게 좋을 것 같아서 찾아보았고, 이유를 알고 나니 속이 시원하다.😆

해당 파트 강의가 진행된 게 4월 말~5월 초였고 당시에는 2.4였는데 5월 20일에 2.5.0으로 업데이트되면서 변경된 사항이었다니..😂 역시 책이나 강의자료보다는 공식 문서가 가장 최신의 내용을 담은 정확한 자료임을 다시 한번 깨닫는다.

혹시나 비슷한 부분에서 오잉..? 하고 계셨던 분들께 도움이 되기를 바란다!😊

--

--

Jeong Hyeon Lee
Togather View

I'm interested in solving everyday inconveniences or creating services that users feel comfortable with.