Spring(5)
-
@Conditonal 학습 테스트 만들어보기
가독성 좀 나은 Git 링크 업무를 하다보면 조건에 따라 빈의 생명주기를 관리해야 할 때가 있다. B2B 솔루션이라고 가정하면 애플리케이션이 설치되는 시점에 특정 제품의 구매 여부 같은 옵션을 세팅하는 경우가 이에 해당된다. 이 때, @Conditional 애노테이션을 주로 사용되는데 이 글에서는 @Conidtional 애노테이션이 어떻게 동작하는지 보다는 Property에 설정한 키값에 따라 빈이 등록되는지 + @Value에 SpEL이 등록되지 않는 경우 기본 값을 등록하는 것을 학습 테스트로 만들어 보겠다. 예제는 제품을 구매했을 때 프리미엄의 구매 여부를 조건으로 설정하는 간단한 예제를 사용하겠다. @TestConfiguration @ConditionalOnProperty(value = "produ..
2023.11.14 -
자동 구성 Bean을 커스텀 정의하면 기존 Bean은 어떻게 될까?
스프링 부트를 사용하면서 궁금했던 점이 있다. 스프링 부트는 내가 사용하는 의존성과 관련된 구성 정보를 따로 설정하지 않아도 디폴트 자동 구성Bean을 제공해준다. 따라서 내가 복잡한 DB, DB 접근 기술(MyBatis, JPA) 같은 의존성 Bean을 관리하지 않아도 되었다. 하지만 기본 값이 아닌 추가 설정이 필요하다면 Bean으로 등록해 커스텀 할 수 있는데 예를 들어, MyBatis에 대한 설정을 커스텀할 때, 다음과 같이 우리는 SqlSessionFactory Bean을 정의한다. 자동 구성이 제공하는 Bean 처리 방법에 대한 어떠한 내용도 정의하지 않는다. @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) thr..
2023.02.08 -
Request가 컨트롤러에 오지 않는다
클라우드 마이그레이션을 진행하던 중, Request를 아무리 보내도 컨트롤러에 전달이 되지 않는 상황이 발생했다. 아무래도 필터나 인터셉터에서 요청을 처리하고 있는 것 같다는 생각이 들었고 내가 설정한 필터를 거치는지 확인을 했다. 역시나 내가 설정해둔 @Order(1) Filter에도 전달이 되지 않았다. 아무 로그도 남지 않아 막막했었는데 다행히 도움을 받아 디버깅 레벨을 TRACE로 바꿔 Request가 어떻게 처리되는지 보는 방법을 알게 되었다. 로그를 살펴보니 필터 체인 중 6번째에서 걸러지고 있어 내 필터에 도착하지 못하는 것이었다. 저 필터에서 수행되는 검증로직이 수행되어야 하는 순서가 내가 설정한 필터의 뒤에 수행되어야 하는데 그렇지 않아 발생하는 문제였다. @Order(1) 보다 더 우선..
2023.01.20 -
@RequestBody는 기본 생성자가 필요없다.
나는 지금까지 @RequestBody를 통해 JSON 요청이나 응답할 때, 기본 생성자가 꼭 필요하다고 알고 있었다. 아래 코드는 위 조건을 반영한 코드이다. @Getter public class HelloDto { private String name; private boolean use; private String nullable; public HelloDto() {} } @RequestBody 에서 @Setter가 없어도 되는 이유, 기본 생성자가 필요한 이유에 대한 블로그 글이 엄청 많기 때문에 이미 아는 내용일 수도 있다. Spring Boot가 JSON을 매핑하는 구현체로 Jackson 라이브러리를 사용하기 때문이다. 정확히는 Jackson의 ObjectMapper. getter setter 의..
2022.08.11 -
SpringBoot 테스트 DB가 초기화되지 않는다.
문제 BDD의 Describe-Context-It 패턴을 이용해 테스트 코드를 작성하는 중이었다. 하지만 로직과 관련되지 않은 문제가 발생했다. 아래 사진은 문제를 발생시키는 테스트 코드이다. 이 코드가 통과되는 지 알아보자. 위 테스트 코드와 함께 보면 난 테스트 결과로 id가 1인 경우를 기대하고 있었으나 실제로 생성된 id는 6이라서 테스트가 실패했다는 것이다. 현재 deleteAll 메서드로 매 테스트마다 초기화를 해주고 있지만 auto_increment 는 초기화 되지 않는 것을 확인할 수 있다. 해결 이 문제를 해결하기 위해 다음 블로그를 참고했다. 참고 블로그 블로그의 내용을 보면 두 가지 방법이 있었다. @Sql을 사용하는 방법과 auto_increment를 신경쓰지 않도록 테스트 코드를 ..
2022.07.31