
@ContextConfiguration은 스프링 테스트 컨텍스트 프레임워크에서 사용되는 어노테이션으로,
테스트가 실행될 때 필요한 스프링 애플리케이션 컨텍스트를 로드하여 테스트 환경을 설정합니다.
이 어노테이션을 사용하면, 테스트 클래스가 애플리케이션 컨텍스트와 함께 실행되며,
@Autowired와 같은 스프링 의존성 주입 기능을 테스트 중에도 활용할 수 있습니다.
예를 들어, @ContextConfiguration(classes = ObjectFactory.class)는 ObjectFactory 클래스를 기반으로 스프링 컨테이너를 구성하여, 테스트 중에 필요한 빈을 주입받을 수 있게 해줍니다.
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = ObjectFactory.class)
class PaymentServiceTest {
@Autowired
private BeanFactory beanFactory;
@Test
void convertedAmount() throws IOException {
final PaymentService paymentService = this.beanFactory.getBean(PaymentService.class);
final Payment payment = paymentService.prepare(100L, "USD", BigDecimal.valueOf(50.7));
System.out.println(payment);
}
}
LiveTemplate은 자주 사용하는 코드 조각을 자동으로 생성해주는 IntelliJ IDEA의 기능으로, 개발 속도를 크게 향상시킬 수 있습니다.
예를 들어, asj와 같은 템플릿을 설정하면 Assertions.assertThat 코드가 자동으로 입력되며, 필요한 import문도 자동으로 추가됩니다.
이러한 설정은 코드 작성의 효율성을 높이고, 일관된 코드 스타일을 유지하는 데 도움을 줍니다.
LiveTemplate의 활용은 초기 설정이 필요하지만, 일단 설정해두면 반복적인 코딩 작업을 크게 줄일 수 있습니다.

LiveTemplate 에 Template text 를 이렇게 작성해주고, 아래 Shorten FQ names 가 체크되어있는지 확인하고,

change 에서 Java > Statement 가 체크되어있는지 확인!
Clock.fixed는 테스트에서 시간 관련 기능을 고정하여 일관된 결과를 보장하는 데
유용한 방법입니다.
예를 들어, Clock.fixed(Instant.now(), ZoneId.systemDefault())를 사용하면, 지정된 순간의 시간으로 고정된 Clock 인스턴스를 생성할 수 있으며, 이를 통해 LocalDateTime.now(clock)을 호출할 때마다 동일한 시간 값을 반환합니다.
이 기능은 시간에 의존하는 테스트를 작성할 때, 결과의 예측 가능성과 테스트의 신뢰성을 높이는 데 도움이 됩니다.
비즈니스 코드에서 Clock을 주입받아 사용하는 방식은 테스트 환경을 설정할 때 유용하며, 실제 비즈니스 로직에서 시간 기반의 테스트를 수행할 수 있도록 해줍니다.
@Test
void fixedClock() {
Clock fixed = Clock.fixed(Instant.now(), ZoneId.systemDefault());
final LocalDateTime dt1 = LocalDateTime.now(fixed);
final LocalDateTime dt2 = LocalDateTime.now(fixed);
Assertions.assertThat(dt1).isEqualTo(dt2);
}
위 코드를 모를 때, Clock 인스턴스를 모킹해서 이래저래 시간낭비를 했었는데,
fixed 를 쓰면 고정된 시간 반환을 할 수 있겠다 느꼈습니다.
실제 비즈니스에도 당연히 clock 이 사용되어야,
테스트 코드에서도 시간 테스트를 활용할 수 있다 생각합니다.
@RequiredArgsConstructor
public class PaymentService {
private final ExchangeRateProvider exchangeRateProvider;
private final Clock clock;
public Payment prepare(final Long orderId, final String currency, final BigDecimal foreignCurrencyAmount) throws IOException {
...
final LocalDateTime validUntil = LocalDateTime.now(this.clock).plusMinutes(30);
return new Payment(orderId, currency, foreignCurrencyAmount, exchangeRate, convertedAmount, validUntil);
}
}
이번 블로그 포스트를 작성하면서 자바 테스트 및 개발 도구에 대한 이해가 깊어졌습니다.
특히, @ContextConfiguration을 활용하여 스프링 테스트 환경을 설정하는 방법을 배운 것은 스프링 기반의 테스트 작성에 큰 도움이 되었습니다.
이 어노테이션 덕분에 스프링 애플리케이션 컨텍스트를 효과적으로 설정하고, 실제 애플리케이션에서와 동일한 환경에서 테스트를 진행할 수 있게 되었습니다.
또한, LiveTemplate의 설정과 활용은 개발 생산성을 크게 향상시킬 수 있음을 알게 되었습니다.
코드 작성의 반복적인 작업을 줄이고, 자동으로 필요한 코드 조각을 생성해주는 기능은 매우 유용하며, 이를 적극적으로 활용할 필요성을 느꼈습니다.
마지막으로, Clock.fixed를 사용한 시간 고정 테스트는 시간에 의존하는 로직을 테스트하는 데 있어 중요한 기술적 접근 방법임을 깨달았습니다.
이를 통해 테스트의 신뢰성을 높이고, 시간 기반의 비즈니스 로직을 보다 효과적으로 검증할 수 있게 되었습니다.
전체적으로 이러한 도구와 기법들을 통해 개발 과정에서의 효율성을 높이고,
더욱 견고하고 신뢰할 수 있는 코드를 작성하는 데 많은 도움이 되었던 것 같습니다.
앞으로도 이러한 기술적 접근 방식을 실무에 적용하여, 개발 역량을 한층 더 강화해 나갈 계획입니다.