Spring Boot로 개발하기(feat. Actuator /info는 디폴트 아니었어..?)
지난 포스팅에서 다른 프레임워크와 비교하며 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을 등록할지 조건부로 체크한다.
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
는 다음과 같은 에러 페이지가 뜨는 것이었다.😥
개인 프로젝트 하기 전에 복습 차원에서 다시 실습을 진행하다가 발견한 문제를 기능 구현에는 상관없으니 그냥 지나칠까.. 하다가 역시 그래도 이유를 알고 넘어가는 게 좋을 것 같아서 찾아보았고, 이유를 알고 나니 속이 시원하다.😆
해당 파트 강의가 진행된 게 4월 말~5월 초였고 당시에는 2.4였는데 5월 20일에 2.5.0으로 업데이트되면서 변경된 사항이었다니..😂 역시 책이나 강의자료보다는 공식 문서가 가장 최신의 내용을 담은 정확한 자료임을 다시 한번 깨닫는다.
혹시나 비슷한 부분에서 오잉..? 하고 계셨던 분들께 도움이 되기를 바란다!😊