전체 글(9)
-
@Conditonal 학습 테스트 만들어보기
가독성 좀 나은 Git 링크 업무를 하다보면 조건에 따라 빈의 생명주기를 관리해야 할 때가 있다. B2B 솔루션이라고 가정하면 애플리케이션이 설치되는 시점에 특정 제품의 구매 여부 같은 옵션을 세팅하는 경우가 이에 해당된다. 이 때, @Conditional 애노테이션을 주로 사용되는데 이 글에서는 @Conidtional 애노테이션이 어떻게 동작하는지 보다는 Property에 설정한 키값에 따라 빈이 등록되는지 + @Value에 SpEL이 등록되지 않는 경우 기본 값을 등록하는 것을 학습 테스트로 만들어 보겠다. 예제는 제품을 구매했을 때 프리미엄의 구매 여부를 조건으로 설정하는 간단한 예제를 사용하겠다. @TestConfiguration @ConditionalOnProperty(value = "produ..
2023.11.14 -
CSV 데이터로 Json 형식 출력하기
CSV 내보내기를 구현하는 도중에 컬럼값으로 Json 데이터를 처리해야 하는 상황이 생겼다. 기존 콤마(,)를 포함한 대부분의 특수 문자들은 ""로 감싸주면 해결할 수 있다. 그런데 아래와 같은 Json 데이터는 내부에 ""를 포함한 데이터로 인해 제대로 출력되지 않는다. {"id":"BJP1234", "name":"BJP", "type":"user"} 위처럼 ,를 기준으로 다 분리되는 것을 알 수 있다. 이 경우 해결책은 간단하다. 내부에 포함된 "을 ""으로 바꾸어주면 된다. 아래는 replace로 변환한 결과이다. value.replace("\"", "\"\"") 정상적으로 출력되는 것을 확인할 수 있다.
2023.07.31 -
자동 구성 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 -
H2를 사용할 수 없거나, 테이블이 만들어지지 않는다면
이번에 프로젝트를 시작하면서 아직 어떤 DB를 사용할 지 정해지지 않아 우선 H2를 사용하기로 했습니다. 이 과정에서 발생한 두 가지 문제를 어떻게 해결했는지 적어보겠습니다. 첫 번째 문제는 Spring Boot가 H2를 사용할 수 없는 문제입니다. 이 문제가 발생하는 원인은 H2를 실행하지 않았거나, H2가 이미 사용 중일 때 발생했습니다. (혹은 설치되어 있는 H2의 버전과 Spring Boot에서 설치한 의존성의 버전이 다를 경우 발생될 수 있습니다.) 전자라면 H2를 키면 됩니다. 반면 후자의 경우 두 가지 방법이 있습니다. 첫 번째 방법은 실행 중인 DB를 끄는 것입니다. 우측 하단의 이 아이콘을 끄고 다시 H2를 실행시킨 후 콘솔에 로그인하지 않으면 됩니다. 두 번째 방법은 H2의 연결 방식에..
2022.08.30 -
@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