여태까지 버전관리를 할 일이 없었다. 외부에 api를 제공 할 일이 없고 회사내부에서만 작업을 하다보니...그런데 이번에 외부에 api를 제공하게 되면서 api 문서도 제공하였다. 근데 여러군데에 제공하다보니 version관리가 불가피 하게 되었다. 그래서 어떻게 할까 하다 좋은 예제가 있어 글로 작성해본다. 먼저 version어노테이션을 아래와 같이 작성한다. v1, v2등 여러 버전을 맵핑할 수있게 하기 위해서 value는 배열로선언했다. @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) public @interface Version { double[] value(); } Controller와 url을..
Spring에서 이벤트를 사용하는 방법에 대해 알아보자. 이벤트는 프레임 워크에서 간과 된 기능 중 하나이지만 더 유용한 기능 중 하나입니다. 그리고 Spring의 다른 많은 것들과 마찬가지로 이벤트 퍼블리싱은 ApplicationContext가 제공하는 기능 중 하나입니다. Spring ApplicationEvent는 기본적으로 동기입니다. 먼저 간단한 이벤트 메세지 클래스를 작성합니다. public class CustomEvent extends ApplicationEvent { private String message; public CustomEvent(Object source, String message) { super(source); this.message = message; } public St..
스프링의 HandlerMethodArgumentResolver 구현하여 커스텀 데이터를 binding해보자. 데이터를 객체에 바인딩하려는 경우가 있지만 직접적이지 않은 방식 (예 : 세션, 헤더 또는 쿠키 변수) 또는 데이터 소스에 저장되는 경우가 있습니다. 이 경우 HandlerMethodArgumentResolver 이용하면 쉽게 해결할 수 있다. 먼저 커스텀 어노테이션을 작성하자. @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface Version { } 커스텀 어노테이션을 정의하고 HandlerMethodArgumentResolver에 등록하면 어노테이션만 달면 컨트롤러에서 쉽게 바인딩 할수있다. H..
IoC란 Inversion of Control의 약자로 해석하자면 제어의 역전이다. 즉 제어권이 역전되었다는 뜻인데 제어권이 뒤 바뀌었다는 뜻이다. 이말은 기존의 제어방식을 뒤집었다는 말이 된다. 그렇다면 기존의 방식은 어떠했는가 살펴보자. 자바가 등장하고 자바 기반의 어플리케이션이 개발되던 초기에는 자바 객체를 생성하고 객체간의 의존관계를 연결하는 등의 제어권을 개발자가 직접 가지고 있었다고 한다. 그러나 서블릿, EJB가 등장하면서 개발자가 독점적으로 가지고 있던 제어권이 서블릿과 EJB를 관리하는 외부의 컨테이너로 넘어갔고 객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 IoC, 제어의 역전이라 하는것이다. Spring (IoC) container 모든 작업을 사용하는 쪽에..
Spring AOP는 JDK 동적 프록시 또는 CGLIB를 사용하여 지정된 대상 객체에 대한 프록시를 만듭니다. JDK 동적 프록시 java의 리플렉션을 이용해서 객체를 만든다. CGLIB 경우에는 바이트코드를 조작해 프록시 객체를 만든다. Spring boot 는 기본적으로 transaction 대상의 aop를 동작시킬 프록시를 cglib 프록시를 사용하게 설정 해놨다. 그리고 성능 또한 jdk 프록시보다는 cglib가 빠르다. 우리가 느낄정도? 아니지만 일반적으로 cglib가 예외를 발생시킬 가능성이 낮다고 한다. 프록시 할 대상 객체가 하나 이상의 인터페이스를 구현하는 경우 JDK 동적 프록시가 사용됩니다.타겟 타입에 의해 구현 된 모든 인터페이스는 프록시 화됩니다.대상 객체가 인터페이스를 구현하지..
스프링에서 @Async로 비동기처리하기회사에서 일을하다 메일,알람등 이런 기능을 동기로 구현할 필요가 없기 때문에 @Async 어노테이션을 사용하여 비동기로 처리햐였다. 확실히 비동기로 처리하니 응답속도가 빠르다. 사용자 입장에서 굳이 메일,알람 보내는걸 기다릴 필요가 없다. 1. xml 설정을 하자. xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd" 이렇게 추가를 하고 아래와 같이 빈설정을 하자. pool-size는 각각 상황에 ..