안녕하세요, 하마연구소 입니다.spring-data-jpa에서 entity의 CUD 이력을 남기기 위한 audit 기능을 제공해줍니다.몇몇 설정한하면 아주 편리하죠.https://docs.spring.io/spring-data/jpa/reference/auditing.html Auditing :: Spring Data JPASpring Data provides sophisticated support to transparently keep track of who created or changed an entity and when the change happened.To benefit from that functionality, you have to equip your entity classes with a..
JSONP 처리를 기본 기능으로 제공하였지만, 스프링부트 2.1(스프링프레임워크 5.1)부터 없어졌다. 이미 Deprecated 처리되어 언제가는 없어질 것을 예상했지만, 담당하고 있는 시스템에서는 아직 JSONP가 필요하였다. 없어진 AbstractJsonpResponseBodyAdvice.java 소스: https://github.com/spring-projects/spring-framework/blob/5.0.x/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractJsonpResponseBodyAdvice.java spring-projects/spring-framework Spring Fra..
스프링 기반의 어플리케이션을 개발할 때, 환경설정으로 보안정보를 다루기 위하여 Vault를 이용하게 된다. 일반적으로 가장 간단하게 Vault를 이용하는 방법은 @VaultPropertySource 또는 @VaultPropertySources 어노테이션을 사용하는 것이다. import org.springframework.context.annotation.Configuration; import org.springframework.vault.annotation.VaultPropertySource; @Configuration @VaultPropertySource(value = { "secret/hippolab/wallet1", "secret/hippolab/wallet2", "secret/hippolab/wa..
spring-boot 버전 1.4.2에서 현재 1.X 버전 최고인 1.5.19로 업데이트하였다. 한 프로젝트에 Maven 모듈로 여러 어플리케이션이 존재하는 구성이다. 2개 어플리케이션만 제외하고 나머지 어플리케이션은 잘 수행된다. 이 2개 어플리케이션에서는 처음 로딩 중 아래와 같은 예외가 발생한다. 더 특이한 것은 IDE에서 바로 실행시키면(로컬환경) 잘 된다. 서버환경에서만 안된다. 환장하겠다.Exception in thread "main" java.lang.ExceptionInInitializerErrorat com.hippolab.MyTopologyRunner.getApplicationContext(MyTopologyRunner.java:39)at com.hippolab.AbstractTopol..
스프링에서 @KafkaListener 어노테이션을 사용해서 간단하게 카프카 토픽을 바로보는 consumer를 작성하려면 spring-kafka 라이브러리가 필요하다. spring-boot를 적용한 환경에서 Maven pom.xml에 아래와 같이 dependency를 걸어주면 된다. org.springframework.kafka spring-kafka그런데 라이브러리가 추가가 안되서 확인해보니, spring-boot 1.5.X 이후부터 spring-kafka를 사용할 수 있었다. 직접 필요한 라이브러리들을 모두 추가하는 방법으로 spring-boot 1.4.X에서도 사용할 수 있는 것으로 보이지만, 그러고 싶지는 않았다. 어쩔수 없이 그냥 스프링부트 버전을 올렸다. 현재 최신버전인 spring-boot 2..
최신 spring-boot 릴리즈 버전은 2.1.3 이다. 특별한 사유가 없는한 새로운 프로젝트를 시작한다면 이 버전으로 셋팅할 것이다. 하지만 2~3년전에 만들어진 프로젝트는 spring-boot 버전 1.X를 사용했을 것이다.필자도 수년전에 개발하고 운영중인 시스템은 spring-boot 1.4.X가 적용되어 있으며, spring-data의 JPA로 DB에서 Pageable을 이용한 페이징과 정렬 처리를 하는 기능이 많다. 이 기능의 반환타입은 Page이며 실제 구현체는 PageImpl로 되어있다. 이 Page 객체를 @RestController의 응답값으로 곧바로 넘기고, ObjectMapper(Jackson)를 통하여 JSON 문자열로 변환된다.최근 spring-boot 1.4.X를 2.X로 버전..
스프링으로 웹어플리케이션을 작성하면 기본적인 오류화면은 아래와 같이 "Whitelabel Error Page"가 보일것이다. 이 오류화면을 없애고 싶다면 아래와 같이 application.properties 파일에 설정을 추가하면 된다. server.error.whitelabel.enabled=false 위 설정은 ErrorProperties.Whitelabel로 바인딩되는데, 기본값은 true 이다.package org.springframework.boot.autoconfigure.web; . . . public class ErrorProperties { ... public static class Whitelabel { /** * Whether to enable the default error page..
스프링 프레임워크를 이용하여 컨트롤러에 패턴을 등록하면 다양한 URI로 매핑시킬 수 있다.이때 와일드카드(wildcard)를 자주 사용하게 되는데 기본적으로 ?, *, ** 가 있다.아래는 스프링 문서 설명이다. ※ 출처: Spring Web MVC - Web on Servlet Stack (https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html) 또한, {XXXXX}과 @PathVariable 어노테이션을 이용하여 URI의 특정부분을 변수에 할당할 수도 있다. 그리고 정규표현식(regular expression)도 지원한다. 가끔 매핑 패턴을 /path1/path2/** 처럼 여러개의 경로를 지원할 필요가 있는데, 단..
import org.springframework.beans.factory.BeanNameAware;import org.springframework.beans.factory.NamedBean; public class MyBean implements NamedBean, BeanNameAware {/** * 빈 이름 */private String beanName; @Overridepublic String getBeanName() {return this.beanName;} @Overridepublic void setBeanName(String name) {this.beanName = name;}}
public class MyBean implements BeanNameAware, BeanFactoryAware {/** * 빈 이름 */protected String beanName; @Overridepublic void setBeanName(String name) {this.beanName = name;} @Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {// scope가 prototype만 허용if (beanFactory.isPrototype(this.beanName) == false) {throw new BeanCreationException(this.beanName, "Scope of bean m..