본문 바로가기
  • Code Smell

Spring12

[Spring] ActiveProfiles 와 spring.profiles.active 가 일치하지 않는 현상 (ActiveProfiles & spring.profile.active does not match) @ActiveProfiles 와 spring.profiles.active 가 일치하지 않는 현상 테스트코드를 작성할 때 profile 주입을 위해서 아래와 같이 주입하고는 했습니다. 그런데 뭔가 이상한 현상을 발견했는데, 사내 프로젝트 소스에서 profile 에 따른 통합 테스트 진행 시 의도한 바와 같이 진행되지 않는 걸 발견했습니다. 테스트 1) application.yml 프로퍼티 로드 application.yml 에는 profile에 따라 프로퍼티를 override 합니다. 즉 default profile 로 작성된 프로퍼티를 가져오고, 그 뒤 세팅한 profile 값으로 덮어 씌우는 방식입니다. 그래서 아래처럼 테스트를 진행했습니다. 그리고 테스트 프로퍼티를 가져 올 bean을 작성합니다. 그리.. 2022. 8. 7.
[Spring] 동적으로 Bean 생성 또는 개입하기 (Dynamic Bean Create, BeanPostProcessor) 동적으로 Bean 생성 또는 개입하기 (Dynamic Bean Create, BeanPostProcessor) application yml 에 List 형태로 어떤 프로퍼티를 추가하거나 했을 때 추가적으로 Bean 생성 메소드를 만들지 않아도, 자동으로 만들어 놓게 할 수 있습니다. 스프링에서는 개발자가 직접 지정한 Bean을 만들기 전에, 만들어지는 중에, 만들어진 후에 개입 할 수 있도록 추상체를 제공하고 있습니다. 즉 어떤 시점에 개입해서 추가 로직 처리를 할지 (= 추가적인 bean 을 생성할지) 추상체를 구현하기만 하면 되고, 그걸 ApplicationContext 에 등록하면 ApplicationContext는 알아서 구현체를 찾아 적절한 시점에 후킹해 줍니다. BeanPostProcessor.. 2022. 6. 23.
[Spring] 파라미터 바인딩을 해주는 HandlerMethodArgumentResolver (Webflux Version) 파라미터 바인딩을 해주는 HandlerMethodArgumentResolver (Webflux Version) 예제는 mvc 포스팅과 동일합니다. 모델과 서비스는 동일하게 되어있다고 간주하고 진행합니다. webflux에서 다른부분만 따로 포스팅 합니다. MVC 포스팅 먼저 webflux 에는 HandlerInterceptor가 존재하지 않습니다. 설계 컨셉에 맞지 않아 Interceptor의 역할을 WebFilter에 등록해주어야 합니다. 또한 Webflux에서는 WebFilter 뿐만 아니라 HandlerFilterFunction 으로 RouterFunction의 endpoint 별로 부분적으로 필터 제한이 가능하게 하는 추상체가 있습니다. 하는 역할은 WebFilter와 동일하지만, WebFilter.. 2022. 6. 20.
[Spring] 스프링 Conditional 어노테이션 조건 직접 만들기 (Custom Conditional) 스프링 Conditional 어노테이션 조건 직접 만들기 (Custom Conditional) 스프링 Bean 생성 또는 Configuration 등 Proxy 작업 진행하기 전에 조건을 생성할 수 있습니다. @Conditional 어노테이션인데, 기본적으로 몇가지가 만들어져 있습니다. 이 클래스 타입으로 인스턴스 된 객체가 없다면 bean 생성을 하거나, application.yml 등의 property resource에 특정 값이 있는 경우 configuration 작업을 하거나 등의 작업을 진행 할 수 있습니다. 위에서 설명한 조건을 사용 할 수 있는 어노테이션이 @ConditionalOnMissingBean 또는, @ConditionalOnProperty 입니다. 하지만 때에 따라 스프링에서 제공.. 2022. 3. 31.
[Mybatis] mybatis 사용 시 xml, interface 경로가 일치해야 하는 문제 mybatis 사용 시 xml, interface 경로가 일치해야 하는 문제 springBoot에서 mybatis-spring-boot-starter 를 이용할 때 Data Access Object를 구현하지 않고 인터페이스 자체로 매핑되어 Data Access Object로 이용하는 방식이 있습니다. 하지만 이 방식에서 쿼리 메소드를 가지고 있는 인터페이스 파일과 실제 쿼리문이 담긴 XML 파일의 경로가 같아야 한다는 문제가 있습니다. 예를들어 인터페이스 파일의 패키지 경로가 sunghs.springexample.mapper.SampleMapper 라고 한다면, XML 파일의 경로도 sunghs.springexample.mapper.SampleMapper 이어야 한다는 문제 입니다. (프로젝트 경로로 .. 2021. 12. 2.
[Spring] IDE에서는 되고, Jar 파일에서는 안되는 파일 접근 IDE에서는 되고, jar 파일에서는 안되는 파일 접근 특정 파일을 빌드 당시 반드시 포함시켜야 할 때 보통 필요한 파일들은 static 영역에 있거나, DB에 저장하거나, 아니면 공통으로 집중시키기 마련입니다만 특수한 상황에서는 jar 안에 포함시켜 배포해야 하는 경우가 있습니다. 보통 IDE (이클립스, 인텔리제이) 등에서 개발할 때 gradle, maven 등으로 빌드하게 되면 build/resources/main/.. 클래스 파일들과 경로로 특정 파일이 떨어지면서 파일 읽기에 문제가 없는데, 이 파일을 jar 안에 포함시켜 배포해야 한다면 기존 파일 접근 코드로는 문제가 생깁니다. 그 이유가 유효하지 않은 경로가 되어버리는 것인데, 파일에 접근할 때 사용되는 프로토콜과 경로는 아래처럼 읽히게 됩니.. 2021. 9. 8.
[Spring] 스프링 의존성 주입 방법 스프링 의존성 주입 3가지 방법 소스는 여기서 볼 수 있습니다. 의존성 주입(Dependency Injection)은 많이 아실거라 생각합니다. Spring 에서 지원하는 의존성 주입은 3가지 방법으로 사용가능합니다. Field(필드) 주입 Setter(수정자) 주입 Constructor(생성자) 주입 예를들어 주입받아야 하는 Service가 아래와 같은 코드로 되어있다고 하겠습니다. @Service public class ExampleService { public String businessLogic() { return "OK"; } } 각각의 서비스에서 3가지 주입 방법으로 주입해 보겠습니다. 1. Field 주입 필드주입은 Spring 초창기부터 현재까지 계속 사용되는 방법입니다. 멤버 객체에 @A.. 2021. 7. 26.
[Spring Webflux] 대용량 List 병렬 처리 Spring webflux 대용량 List 처리 Mono와 Flux의 back-pressure를 이용한 publish, subscribe 를 이용하는 방법 외에 이미 만들어진 대용량 리스트를 병렬로 처리하고 싶은 경우가 있습니다. 이런 경우 ThreadPoolExecutor 등을 이용하여 처리 할 수 있겠습니다만, Config를 추가적으로 설정해야 하고, 실제로 사용하지 않는다 하여도 ThreadPool이 유지되어야 하기 때문에 사용하지 않는 자원이 낭비 될 수 있습니다. 예를들어 어떤 List의 사이즈가 10000개인데, 각 데이터에 대해 무엇인가 작업을 하고 싶은 경우 (예를들어 restTemplate으로 request 한다거나, DB에서 조회를 한다거나) 사용할 수 있습니다. asyncRestTem.. 2021. 6. 25.
[Spring] Spring의 @EventListener Spring의 @EventListener 쓰는 이유? 의존성이 강한 로직들의 레이어를 분리할 수 있습니다. 예를 들어 A 서비스의 a 비즈니스 로직을 실행 할 때 B 서비스의 b 추가 로직을 같이 실행해야 하는 경우 A 서비스에 B 서비스를 주입시켜 a 로직 안에 b 로직을 녹이는 경우가 많습니다. 이렇게 점점 강해지는 결합을 이벤트 핸들러라는 레이어로 분리한 뒤 다시 핸들링 하는 느슨한 결합 형태로 만들 수 있습니다. A 서비스의 a 로직 실행 -> 이벤트 발행 -> B 서비스의 b 로직 실행 이렇게 되면 A 서비스는 B 서비스의 변경사항과 관련없이 수정이 필요없게 됩니다. Spring 4 버전 이상으로 올라오며 쓰기가 많이 편해졌습니다. 기존의 이벤트 객체는 ApplicationEvent 와, 이벤트.. 2021. 4. 21.