본문 바로가기

SPRING

(8)
[Spring] HandlerMethodArgumentResolver 사용하여 Custom Annotation 구현 및 테스트하기 HandlerMethodArgumentResolver 를 이용하여 Custom Annotion 을 만들어 User 정보를 쉽게 가져오기 회원을 관리하는 API 를 만들게 되면 꼭 필요로 하게 되는 것이 HandlerInterceptorAdapter 를 이용하여 HttpServletRequest 에 정보를 저장하여 사용자 정보 필요로 하는 Controller 에서 꺼내여 사용하는 방식입니다. 만약, HttpServletRequest 을 사용하지 않고 static 변수나 공유 가능한 변수 형태로 사용하게 된다면 Thread safe 하지 않기 때문에 Multi-thread 환경에서는 다른 사용자의 정보를 노출하게 되는 위험한 상황을 만들 수 있습니다. 하지만, 매번 API 에서 HttpServletReque..
[Spring] Optional 의 3가지 생성 방법 Java 를 기반으로 개발을 진행하다보면 NullPointException 을 자주 만나게 됩니다. 주로 Runtime 에 발생하기 때문에 찾기도 쉽지가 않고 이러한 예외를 미리 방지하기 위해서는 복잡한 방어로직이 필요하게 됩니다 . 이러한 문제를 해결하기 위해 Java 8 에서 나온 것이 Optional 입니다. Optional 인스턴스는 다음과 같은 특징을 가지고 있습니다. 불변 인스턴스 입니다. hashCode, equals, toString 메서드는 인스턴스 상태에 따라 달라집니다. Optional 의 3가지 정적 팩토리 Optional 의 객체 생성 메서드는 3가지의 정적 팩토리 메서드가 존재합니다. 특정 객체가 Optional 객체 생성이 필요할 때 다음과 같이 3가지 방법으로 감싸 생성할 수..
[Spring] Meta Annotation 이란?(@Target, @Retention) Spring 에서는 Anntotation 사용에 대한 기능을 상당히 많이 제공하고 있습니다. 주로 사용하는 @Controller, @Service, @Repostiroy 등 많은 Annotation 이 존재합니다. 해당 Annotion 은 각 기능에 필요한 만큼 많은 기능을 내포하고 있으며, 이러한 내용을 잘 알지 못해도 필요한 기능만 쉽게 사용할 수 있도록 제공되어지고 있습니다. 하지만, 이러한 Annotion 에 대해 불필요한 내용이 포함되거나 필요한 내용이 있는 경우 Cusotom 을 할 경우가 존재합니다. 그 중 로깅 등 AOP 설정할 때 주로 사용되는 @Target 과 @Retention 에 대해 알아보도록 하겠습니다. meta-annotaiton ? meta-annotation 은 다른 ann..
[Spring Boot] @NotNull, @NotEmpty, @NotBlank 의 차이점 및 사용법 개발하시는 API 의 request parameter 의 null 체크를 어떻게 하고 계신가요? 대부분 별도의 null 체크 util 을 사용하거나, Controller 에서 조건문을 사용하여 null 을 체크하기도 합니다. 이러한 조건문과 메서드 들은 변수별 특징과 조건에 관련하여 공통화하기가 쉽지 않습니다. 또한 별도의 API 에 따라서 같은 값이여도 필수인 경우가 있고, 아닌 경우가 있을 수 있습니다. 따라서, 해당 API 의 parameter 에 따라 별도의 오류 메시지와 조건 이 필요합니다. 이런 경우 쉽게 사용할 수 있는 것이 @NotNull & @NotEmpty & @NotBlank 입니다. 이 3가지 Annotiation 은 Bean Validation (Hibernate Validatio..
[Spring] Maven Wrapper 설명 및 실행방법 spring 이나 spring boot 로 개발을 진행하신다면 Maven 과 Gradle 과 같은 build tool 을 사용해보신 적이 있으실 겁니다. Maven 이나 Gradle 이 무엇인지는 잘 알고 있지만, Wrapper 는 무엇인지 잘 모르는 경우가 많습니다. 사실 저 같은 경우도 IDE 가 아닌 별도의 서버에서 CLI 로 빌드를 하여 MAVEN 을 띄우려 했을 때 mvnw 가 어떠한 동작을 하는지 몰랐었습니다. 단순 maven 을 이용하여 빌드하고 배포할 수 있지만, 좋은 환경을 구성하기 위해 wrapper 는 필수적입니다. Maven Warpper 란 무엇인가 ? Maven wrapper 란 개발자들이 Maven 을 별도의 환경에서 개발할 때 local machine 에 따로 설치를 원하지 ..
[Spring boot] java 파일을 특정 패키지로 이동 시 발생하는 ConflictingBeanDefinitionException 문제 해결 ControllerAdvice 를 이용하여 예외처리를 작업하던 중 패키지 이름에 대한 수정사항이 생겨 2개의 파일을 새로 만든 패키지로 이동시켰습니다. IntelliJ 에서는 워낙 Refactoring 기능을 다양하게 재공하기 때문에 파일을 옮기는데는 큰 문제는 발생하지 않았습니다. 하지만, Gradle 을 빌드하면서 다음과 같은 오류가 발생하였습니다. 10:05:20.310 [restartedMain] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext - (AbstractApplicationContext.java:557) Exception encountered during context initialization - cancelli..
[Mybatis] Spring boot 에서 mybatis 로 2개의 DB connection 하기 새로운 매니저 사이트를 작업하면서 한 서비스에 다른 여러개의 DB 를 접속시켜야되는 이슈가 발생하였습니다. 예를 들어, DB 접속정보가 따로 관리되는 채소과게와 과일가게의 매출 통계를 구하는 화면이 동일한 화면에 공존할 수 있어야 하는겁니다. 물론, 별도의 서버를 가지고 채소과게 서버와 과일가게 서버를 연달아 호출하는 방법도 있지만 기능이 동일하고 단순 DB 만 다른 경우라면 관리적인 측면에서는 같은 서버에 DB 를 2개 관리하는 것이 훨씬 유리합니다. 한 Spring boot 서버에서 2개의 Mysql DB Connection 을 가지도록 설정해보도록 하겠습니다. 1. application.yml 의존성 주입 설정 spring FruitShop: datasource: jdbc-url: connectio..
[Spring boot] TestRestTemplate 401(authentication) 오류 발생해결 TestRestTemplate 를 사용하여 서버와 클라이언트의 인증값을 받아서 사용하는 프로젝트를 진행 중 인증되지 않은 사용자에 대한 API 접근에 대해서 unAuthentication 을 정상적으로 발생시키는지에 대한 테스트코드를 작성하여 실행하는데 문제가 발생하였습니다. org.springframework.web.client.ResourceAccessException: I/O error on PUT request for "http://경로": cannot retry due to server authentication, in streaming mode; nested exception is java.net.HttpRetryException: cannot retry due to server authent..