본문 바로가기
  • Code Smell

!99

[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 Boot] 메일 테스트용 수신 서버 (mail dummy server) mail dummy server 프로젝트 소스는 여기 메일 전송 로직 등을 만들고 제대로 발송이 되는지 확인해야 하는데, 이럴 때 naver, google, nate 등으로 마구 쏘다가는 발송 IP 차단 당할 수 있습니다. 또한 google 같은 경우에는 메일 전문을 비대칭키로 암호화해서 메일서버의 키로 복호화 해서 메일의 변조나 위장을 방지하는 DKIM 설정이 필요합니다. 그래서 테스트 해 보기가 여간 까다로운게 아닙니다. 이럴 때 메일을 수신해서 버려줄 수 있는 더미 서버가 있으면 좋겠다는 생각이 들어 하나 만들었습니다. SMTP (Simple Mail Transfer Protocol)는 RFC 2821 규약으로 정의 되어 있는데 이것도 무조건 OK 구문이면 금방 만들겠지만 규칙에 맞춰 만드려면 굉장.. 2022. 2. 11.
[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.
[Java] URL 리소스 다운로드 URL 리소스 다운로드 Github 소스 URL 경로를 입력하면 다운로드 받는 스트림을 제공합니다. 대표적으로 이미지, 파일 같은 것을 다운로드 가능합니다. 코드 package sunghs.java.utils.file; import lombok.extern.slf4j.Slf4j; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; /** * URL 리소스 다운로더 * * @author https://sunghs.tistory.com * @see source */ @Sl.. 2021. 9. 8.
[LeetCode] 2. Add Two Numbers Add Two Number 문제 You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list. You may assume the two numbers do not contain any leading zero, except the number 0 itself. Input: l1 = [2,4,3], l2 = [5,6,4] Output: [7,0,8] Explanation.. 2021. 8. 26.