본문 바로가기
  • Code Smell

Framework45

[Spring] 파라미터 바인딩을 해주는 HandlerMethodArgumentResolver (MVC Version) 파라미터 바인딩을 해주는 HandlerMethodArgumentResolver (MVC Version) Controller의 Endpoint 메소드에서 파라미터만 추가하면 자동으로 객체 주입이 되는 기능입니다. 자주 쓰던 방식으로는 HttpServletRequest, HttpServletResponse가 있습니다. 예를 들어 아래처럼 파라미터만 추가해도 값이 들어오는걸 확인 할 수 있습니다. @GetMapping("/test") public String test() { return "OK"; } // 이랬던 메소드를 @GetMapping("/test") public String test(HttpServletRequest request) { return "OK"; } 이렇게 넣어도, 실제 HttpServl.. 2022. 5. 30.
[Spring] Spring Configuration 의 Cannot resolve configuration property 문제 Spring Configuration 의 Cannot resolve configuration property 문제 spring에서 제공하는 configuration 말고도 따로 properties/yml의 configuration을 추가해서 쓸때가 많습니다. Configuration Property 내부의 Nested Property, 즉 중첩된 Property가 있는 경우에는 Spring 에서 그 데이터 타입에 대한 정의를 하라고 하는데요. 아래 사진을 보면 밝게 표시된 property 입니다. 특히 개발 IDE 중 인텔리제이를 쓰시는분들중 저처럼 이게 거슬리는 분들이 많을 것 같습니다. 일단 이걸 재현하기 위해 예제를 보시게 되면 property model 만들기 yml에서 설정이 바인딩 될 모델입니.. 2022. 4. 22.
[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.