본문 바로가기
  • Code Smell

Framework43

[Spring] 스프링 Conditional 어노테이션 조건 직접 만들기 (Custom Conditional) 스프링 Conditional 어노테이션 조건 직접 만들기 (Custom Conditional) 스프링 Bean 생성 또는 Configuration 등 Proxy 작업 진행하기 전에 조건을 생성할 수 있습니다. @Conditional 어노테이션인데, 기본적으로 몇가지가 만들어져 있습니다. 이 클래스 타입으로 인스턴스 된 객체가 없다면 bean 생성을 하거나, application.yml 등의 property resource에 특정 값이 있는 경우 configuration 작업을 하거나 등의 작업을 진행 할 수 있습니다. 위에서 설명한 조건을 사용 할 수 있는 어노테이션이 @ConditionalOnMissingBean 또는, @ConditionalOnProperty 입니다. 하지만 때에 따라 스프링에서 제공.. 2022. 3. 31.
[Spring] JWT 사용 시 Spring Security Filter 흐름 분석 JWT 사용 시 Spring Security Filter 흐름 분석(?) 타 포스팅들 보면 JWT (Json Web Token) + Spring Security 이용해서 권한 인증 글들이 많은데 넘어가는 로직을 보려고 합니다. JWT 토큰을 파싱하거나 내려주어 헤더에 저장하는 JwtFilter 등을 OncePerRequestFilter 또는 GenericFilterBean을 상속받아 구현하고 있을 겁니다. (같은 클라이언트 안에서는 같은 서블릿 서빙이 되어야 이상적이나 다른 서블릿 객체가 생성되는 경우가 있습니다. 이 때 GenericFilterBean은 새 필터로직을 수행하므로 oncePerRequestFilter를 이용해서 동일 클라이언트 = 동일 서블릿 서빙 할 수 있도록 구현하는게 이상적 입니다... 2022. 1. 14.
[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] 테스트 코드 기반 Swagger 구성 테스트코드 기반 swagger 구성하기 기존의 Spring REST Docs는 문서페이지의 기본 템플릿이 되는 adoc 파일을 생성하고, 테스트코드를 기반으로 generated-snippet이 생성 된 뒤, Asciidoctor를 이용해 adoc과 generated-snippet을 이용해 html문서를 생성하게 됩니다. 문서 자체는 테스트코드가 통과한 테스트만 docs에 표현되니 신뢰도는 높지만, 테스트를 직접 해 볼수 있는 Swagger에 비해 접근성이 떨어진다고 생각하시는 분들이 있을 겁니다. 하지만 Swagger는 각종 Model, Service, Controller 등에 Annotation을 추가해서 설명하고 명세해야 하기 때문에 Annotation을 수정하지 않고 내부 비즈니스 코드만 수정한다면.. 2021. 10. 15.
[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.
[JUnit] JUnit5 사용법과 TDD (2) - REST API 테스트 JUnit5 사용법과 TDD (2) JUnit 5의 dependency 추가 방법과 실행 순서, 기본 annotation에 대한 정리 -> TDD 정리 1 Spring 관련 주요 Test Annotation JUnit5와 spring-boot-test의 모든 annotation은 아니며 자주 사용되는 Annotation만 소개 @ExtendWith(Class[] c) 필요한 Class들을 Configuration 으로 만들어 사용 할 수 있다. (기존 Configuration 클래스도 땡겨 올 수 있다.) Configuration Component이므로 내부에 있는 Bean 까지 등록이 가능하다. Import 된 클래스는 주입으로 사용 가능. @Profile 클래스와 메소드 레벨에서 지정 가능하며, 특정.. 2021. 3. 30.