본문 바로가기

spring

(29)
Spring과 kotest에서 testContainer 사용 후기 자바와 스프링을 사용해서 테스트 컨테이너를 사용할 때는 @DynamicPropertySource를 이용해서 테스트 마다 동적으로 외부 시스템 연결 설정을 초기화해주는 방식을 사용해왔었다.@SpringBootTest@Testcontainerspublic class ArticleLiveTest { @Container static PostgreSQLContainer postgres = new PostgreSQLContainer("postgres:11") .withDatabaseName("prop") .withUsername("postgres") .withPassword("pass") .withExposedPorts(5432); @DynamicPropertyS..
reseilence4j를 이용한 장애 대처 들어가면서 데이터 베이스나 외부 API 서버에서 장애가 발생하면 개발한 서버에서도 역시 장애가 발생할 수 있다. 특히 외부 API를 이용할 때는 외부의 시스템 장애를 고칠 수 있는 방법이 없는 경우도 존재할 것이다. 이런 장애 상황을 대체하기 위해서는 어떻게 해야 할까? 그런 상황에서 reseilence4j 같은 라이브러리를 이용하면 쉽게 장애에 대응하는 코드를 작성할 수 있다. reseilence4j란? Netflix Hystrix에서 영감을 받아서 개발된 가벼운 결함 관리 라이브러리이다. Circuit breaker, Retry, Bulkhead, RateLimiter, TimeLimiter 같은 솔루션을 제공하고 있다. Core Modules (핵심 모듈) 다섯 가지의 핵심 모듈을 제공하고 있는데 ..
[WireMock] WireMock을 이용하여 Mock API 서버 사용하기 들어가면서 외부 API를 사용하게 된다면 어떤 응답이 올지? API 사용 시 장애 상황에 어떻게 서버가 동작하는지에 대한 대안을 테스트하기 위해서 모킹을 하고 싶은데 그 방법을 몰라서 이것저것 검색을 해보았다. 그중에서 WireMock을 이용한 모킹 처리에 대해서 알아보자. WireMock 이란? http 기반의 API 서비스를 모킹하기 위해서 사용하는 테스트 라이브러리다. 목 서버를 만드는 방식은 JAR파일을 통해서 가동하는 방식과 wiremock 이미지를 통해서 컨테이너를 띄우는 방식이 있다. Test code 작성하기! standalone 방식 우선 컨테이너 기반으로 목서버를 사용하지 않고 standalone으로 사용하려면 다음 의존성이 필요하다. 버전은 공식문서를 참고해서 필요한 버전을 명시하면 ..
[Spring] RedisCacheManager에 대해서 들어가면서 스프링에서 캐시를 기능을 추상화하여 사용자가 쉽게 캐시를 이용할 수 있도록 @Cacheable과 같은 어노테이션을 제공하는데 캐시를 저장하는 저장소와 상호작용하는 인터페이스는 CacheManager라는 인터페이스가 담당한다. 레디스를 캐시로 사용하는 경우에는 CacheManager를 상속받은 레디스 전용 캐시매니저이다. 레디스에 어떻게 키를 저장하는지 궁금해서 간단한 테스트코드와 디버거를 이용해서 공부해보았다. Spring boot starter redis 의존성을 추가하고 로컬에서 Redis를 가동하고 연결 설정까지 하고 실습을 진행했다. 실습한 스프링 부트의 버전은 3.2.1이다. 데이터 캐시(저장) 스프링이 제공하는 추상화를 이용하려면 우선 Cache 객체를 매니저를 통해서 조회해야한다...
스프링 AOP를 적용하는 방법 Aop가 무엇인가? 관점 지향 프로그래밍을 위한 기술로 프록시를 활용하여 공통 관심사를 분리하는 기술이다. @AspectJ 지원 활성화하기 aop를 활성화하기 위해서 자바 코드를 통해서 활성화를 한다. @Configuration @EnableAspectJAutoProxy public class AppConfig { } 하지만 @EnableAspectJAutoProxy의 기본값이 enable이기 때문에 생략해도 aop가 적용된다! Aop 클래스 설정 aop과 관련된 로직을 구현할 클래스를 생성하면 @Aspect를 통해서 aop라는 메타 데이터를 작성해주어야한다. 이때 주의할 점으로는 @Aspect를 선언하더라도 오토 스캔의 대상이 되지 않기 때문에 @Component나 @Bean을 통해서 빈으로 등록하는 ..
테스트 코드에서 @Transactional 을 통한 롤백 사용시 주의점 들어가면서 테스트 코드를 작성하던 중 이해가 되지않는 신기한 오류를 만났는데 오류의 원인이 @Transcational 을 사용한 롤백이었습니다. @Transactional을 사용하면 간편하게 테스트에 사용한 데이터를 제거할 수 있고 삭제를 위한 코드를 제거할 수 있다는 장점 때문에 애용했지만 이번에 오류를 만나서 주의할 점을 알게 되었습니다. 에러 상황 에러가 발생한 테스트는 회원가입 API를 테스트할 때, 중복된 유저이름을 사용한 요청이 있다면 거부 응답을 반환하도록 하는 API를 테스트하는 테스트 코드에서 @Transactional 을 테스트 코드에 적용하면 테스트가 실패하지만 테스트 데이터를 @AfterEach 를 통해서 초기화하는 코드를 작성하는 경우에는 성공하는 상황 원인 테스트 코드에 적용된 ..
Spring 메일 전송기능 구현하기 들어가면서 회원가입 시에 이메일 인증 코드를 입력하는 요구사항을 구현하게 되었다. 메일 서비스는 오래전부터 제공하는 서비스이기 때문에 구현된 라이브러리가 있고 테스트를 위한 메일 서버 프로그램 역시 있다. 구현하는 방법을 알아보자! 구현순서 구현에 필요한 순서는 다음과 같다. 테스트를 위한 메일 서버 가동하기 라이브러리를 이용한 메일 로직 작성하기 테스트 메일 서버 가동하기 메일을 보내기 위해서는 메일 서버가 필요하지만 실제 서비스되는 메일 서버를 이용하여 개발하거나 테스트를 진행하면 불필요한 메일이 쌓여서 불편하다. 그렇다고 메일 전송 과정을 생략하고 메일 관련 로직을 테스트하기에는 전송 시에 예외가 발생하는 경우를 실행하여 테스트를 할 수 없어서 수동으로 메일이 전송되는지를 확인해야 해서 그리 탐탁지..
Spring Security Test 작성하기 들어가면서 스프링 시큐리티를 적용하면 각 EndPoint를 접근할 때, 권한 인증은 어떻게 고려해서 테스트를 작성해야 하는지 고민이라면 읽어보는 것을 추천한다. 가짜 인증 만들어 인증/인가 단계 처리하기 시큐리티 테스트를 위해서 제공하는 어노테이션을 활용하면 임시로 인증 상태로 만들 수 있다. 1.@WithMockUser 시큐리티의 UsernamePasswordAuthenticationToken을 만들어서 주입해주는 어노테이션이다. 쉽게 말해서 인증된 유저를 설정하는 기능을 제공한다. @Test @WithMockUser public void getMessageWithMockUser() { String message = messageService.getMessage(); ... } 아무런 설정없이 사용하면..