Spring Boot는 간편한 설정과 자동 구성으로 인해 빠르게 개발을 시작할 수 있다는 장점이 있습니다. 하지만 Spring Boot는 이러한 기본 기능 외에도 다양한 고급 기능을 제공하고 있습니다. 이번 글에서는 Spring Boot의 덜 알려졌거나 고급 기능들을 살펴보도록 하겠습니다.
1. 외부 설정(Externalized Configuration)
Spring Boot는 다양한 외부 설정 소스를 지원하여 유연한 설정 관리를 할 수 있습니다. application.properties
나 application.yml
파일뿐만 아니라 환경 변수, 커맨드 라인 인수, 외부 설정 서버 등을 통해 설정 값을 주입받을 수 있습니다.
프로파일(Profile)
프로파일을 사용하면 환경별로 다른 설정 값을 적용할 수 있습니다. application-{profile}.properties
형식으로 프로파일 관련 설정 파일을 작성하고, spring.profiles.active
속성을 통해 활성화할 프로파일을 지정합니다.
타입-세이프 프로퍼티(Type-safe Properties)
@ConfigurationProperties
어노테이션을 사용하여 설정 값을 타입-세이프하게 바인딩할 수 있습니다. 설정 값이 변경되면 자동으로 재바인딩되며, IDE의 자동 완성 및 유효성 검사 기능을 활용할 수 있습니다.
1
2
3
4
5
6
|
@ConfigurationProperties(prefix = “myapp”)
public class MyAppProperties {
private String apiUrl;
private int maxConnections;
// getters and setters
}
|
cs |
2. 독립 실행형 JAR와 도커라이징
Spring Boot는 독립 실행형 JAR(Executable JAR)를 생성하여 쉽게 배포할 수 있습니다. spring-boot-maven-plugin
이나 spring-boot-gradle-plugin
을 사용하면 실행 가능한 JAR 파일을 빌드할 수 있습니다.
도커(Docker)를 사용하여 Spring Boot 애플리케이션을 컨테이너화할 수도 있습니다. Dockerfile
을 작성하고 docker build
명령어로 도커 이미지를 생성할 수 있습니다.
1
2
3
|
FROM openjdk:11–jre–slim
COPY target/myapp.jar app.jar
ENTRYPOINT [“java”,“-jar”,“/app.jar”]
|
cs |
3. 액추에이터(Actuator)
Spring Boot Actuator는 애플리케이션의 모니터링과 관리를 위한 기능을 제공합니다. Actuator 엔드포인트를 통해 애플리케이션의 상태를 확인하고, 메트릭을 수집하며, 로그 레벨을 변경하는 등의 작업을 할 수 있습니다.
/health
엔드포인트를 통해 애플리케이션의 상태를 확인할 수 있고, /metrics
엔드포인트를 통해 다양한 메트릭 정보를 얻을 수 있습니다. 또한 /loggers
엔드포인트로 로그 레벨을 실시간으로 변경할 수 있습니다. Actuator는 Micrometer와 통합되어 다양한 모니터링 시스템(Prometheus, Datadog 등)과 연동될 수 있습니다.
4. 테스트 유틸리티
Spring Boot는 애플리케이션 테스트를 위한 다양한 유틸리티를 제공합니다.
@SpringBootTest
@SpringBootTest
어노테이션을 사용하여 통합 테스트를 작성할 수 있습니다. 이 어노테이션은 전체 애플리케이션 컨텍스트를 로드하여 테스트 환경을 구성합니다.
1
2
3
4
5
6
7
8
9
10
|
@SpringBootTest
class MyApplicationTest {
@Autowired
private MyService myService;
@Test
void testMyService() {
// test code
}
}
|
cs |
@WebMvcTest
@WebMvcTest
어노테이션을 사용하면 MVC 컨트롤러 계층만 테스트할 수 있습니다. MockMvc
를 자동으로 설정해주므로 컨트롤러 테스트를 쉽게 작성할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
@WebMvcTest(MyController.class)
class MyControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void testMyEndpoint() throws Exception {
mockMvc.perform(get(“/myendpoint”))
.andExpect(status().isOk())
.andExpect(content().string(“Hello, World!”));
}
}
|
cs |
@DataJpaTest
@DataJpaTest
어노테이션은 JPA 관련 테스트를 위한 어노테이션입니다. 내장 데이터베이스를 설정하고 테스트에 필요한 JPA 관련 빈들만 로드합니다.
1
2
3
4
5
6
7
8
9
10
|
@DataJpaTest
class MyRepositoryTest {
@Autowired
private MyRepository myRepository;
@Test
void testMyRepository() {
// test code
}
}
|
cs |
5. 개발자 도구
Spring Boot는 개발 생산성을 높이기 위한 개발자 도구를 제공합니다.
spring-boot-devtools
spring-boot-devtools
모듈은 코드 변경 시 자동으로 애플리케이션을 재시작해주는 기능을 제공합니다. 클래스패스에 있는 파일이 변경되면 자동으로 감지하여 애플리케이션을 다시 시작합니다.
라이브 릴로드(Live Reload)
라이브 릴로드 기능을 사용하면 정적 리소스(HTML, CSS, JS)가 변경되었을 때 자동으로 브라우저를 리프레시합니다. 브라우저 확장 플러그인과 함께 사용하면 변경 사항을 즉시 확인할 수 있어 개발 효율성을 높일 수 있습니다.
글로벌 설정(Global Settings)
spring-boot-devtools
모듈은 캐시 비활성화, 템플릿 캐시 비활성화 등 개발 시 유용한 글로벌 설정을 자동으로 적용해줍니다. 개발 단계에서는 이러한 설정들이 자동으로 활성화되어 편리하게 개발할 수 있습니다.
6. 그레이들 플러그인
Spring Boot는 메이븐뿐만 아니라 그레이들도 잘 지원합니다. org.springframework.boot
그레이들 플러그인을 사용하면 다음과 같은 기능을 사용할 수 있습니다.
bootRun
태스크를 통한 Spring Boot 애플리케이션 실행bootJar
태스크를 통한 실행 가능한 JAR 파일 생성bootBuildInfo
태스크를 통한 빌드 정보 생성- 의존성 관리와 버전 관리 자동화
1
2
3
4
5
6
7
|
plugins {
id ‘org.springframework.boot’ version ‘2.5.0’
}
bootJar {
archiveFileName = ‘myapp.jar’
}
|
cs |
7. 보안
Spring Boot는 Spring Security와 잘 통합되어 있어 간편하게 보안 설정을 할 수 있습니다.
자동 구성
Spring Security 의존성을 추가하면 기본적인 보안 설정이 자동으로 이루어집니다. 이를 통해 모든 엔드포인트에 인증이 필요하도록 설정되며, 기본 로그인 폼이 제공됩니다.
OAuth2와 JWT
Spring Boot는 OAuth2와 JWT를 사용한 인증 및 인가를 간편하게 구현할 수 있습니다. spring-boot-starter-oauth2-client
를 사용하여 OAuth2 로그인을 구현할 수 있고, spring-boot-starter-oauth2-resource-server
를 사용하여 JWT 기반의 리소스 서버를 구현할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
|
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login();
}
}
|
cs |
8. 배치 처리
Spring Boot는 Spring Batch와 통합되어 배치 처리를 쉽게 구현할 수 있습니다. @EnableBatchProcessing
어노테이션을 사용하여 배치 기능을 활성화하고, Job
과 Step
을 정의하여 배치 작업을 구성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Bean
public Job myJob(JobBuilderFactory jobBuilderFactory, Step myStep) {
return jobBuilderFactory.get(“myJob”)
.start(myStep)
.build();
}
@Bean
public Step myStep(StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get(“myStep”)
.<Input, Output>chunk(10)
.reader(myReader())
.processor(myProcessor())
.writer(myWriter())
.build();
}
}
|
cs |
9. 트랜잭션 관리
Spring Boot는 선언적 트랜잭션 관리를 지원하여 트랜잭션 처리를 간편하게 할 수 있습니다. @Transactional
어노테이션을 사용하여 메서드나 클래스에 트랜잭션 경계를 지정할 수 있습니다.
1
2
3
4
5
6
7
|
@Service
public class MyService {
@Transactional
public void doSomething() {
// 트랜잭션 경계 내에서 실행되는 코드
}
}
|
cs |
10. 캐시
Spring Boot는 캐시 추상화를 제공하여 다양한 캐시 구현체를 쉽게 사용할 수 있습니다. @EnableCaching
어노테이션을 사용하여 캐시 기능을 활성화하고, @Cacheable
, @CachePut
, @CacheEvict
등의 어노테이션을 사용하여 캐시 동작을 제어할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager(“myCache”);
}
}
@Service
public class MyService {
@Cacheable(“myCache”)
public String getData(String key) {
// 캐시에서 데이터를 조회하거나 생성하는 로직
}
}
|
cs |
지금까지 Spring Boot의 덜 알려졌거나 고급 기능들에 대해 살펴보았습니다. 외부 설정, 독립 실행형 JAR와 도커라이징, Actuator, 테스트 유틸리티, 개발자 도구, 그레이들 플러그인, 보안, 배치 처리, 트랜잭션 관리, 캐시 등 다양한 기능들을 활용하여 더욱 강력하고 효율적인 Spring Boot 애플리케이션을 개발할 수 있습니다.
이러한 기능들을 잘 활용한다면 개발 생산성을 높이고, 애플리케이션의 안정성과 확장성을 향상시킬 수 있을 것입니다. 프로젝트의 요구사항과 특성에 맞게 적절한 기능들을 선택하여 적용해보시기 바랍니다.
Spring Boot는 계속해서 발전하고 있으며, 새로운 기능들이 지속적으로 추가되고 있습니다. 공식 문서와 레퍼런스를 참고하여 최신 트렌드와 베스트 프랙티스를 학습하는 것도 중요합니다.