Spring Cloud Config Client지난 포스팅에서 config server를 띄우는것 까지 진행했다. 이제 config server가 구동되고있는 상태에서 그 정보들을 받아올 client 를 구현해보자. config 를 제대로 받아오는지 확인하는 용도의 스프링 부트 웹 애플리케이션을 만들면된다. 아래 의존성을 넣어주면 된다. implementation('org.springframework.boot:spring-boot-starter-web') implementation('org.springframework.cloud:spring-cloud-starter-config') 그리고 아무것도 하지않고 서버를 띄워보자. 8080으로는 이미 config server가 사용되고있으니 아래설정을 넣어주고 ..
보통 스프링 부트 애플리케이션을 만들다보면 설정파일은 properties나 yml 파일로 추출해서 관리하게된다. profile 별로 파일을 분리까지하게되면 그 자체로 훌륭하게 설정을 분리해냈다고 할 수 있다. 하지만 여전히 존재하는 문제중 하나는 설정만 바뀌었음에도 빌드를 다시하고, 배포를 다시해야한다는 점이다. 나같은 경우는 AB 테스트를 진행하게됐고, AB의 비율을 자주 변경해야하는 이슈가 있었는데, 이를 기존대로 설정파일 분리만 해놓을 경우 비율을 바꿀때마다 릴리즈 배포를 해야했다. Spring Cloud Config 는 별도 config 서버를 두고 애플리케이션이 해당 서버에서 설정을 받아오는 방식이다. 중간에 설정이 바뀌는 일이 발생하면 config 서버만 변경해주고 애플리케이션은 설정을 갱신하..
spring cloud config client를 사용하여 갱신된 config 정보를 받아오기위해선 /actuator/refresh 를 호출해야한다. 그런데 이때 전혀 신경도 쓰지않았던 Hikari 에서 예외가 발생하는 경우가 있다. java.lang.IllegalStateException: The configuration of the pool is sealed once started. Use HikariConfigMXBean for runtime changes. 이런 에러메세지가 나오는데 정확히 파본건 아니지만 refresh 를 하면서 config들을 갱신할때 Hikari 쪽을 호출하는듯 하다. 이것도 확인해본건 아니지만 아래처럼 @ConfigurationProperties 애노테이션을 사용해서 생성할..
소스 레벨 애노테이션을 정의하고 컴파일을 할때 아래와 같은 에러가 발생했다.. javac -processor processor compileJava 명령어를 치니까.. error: Could not instantiate an instance of processor 'com.yong.java10.AnnotationProcessor' 1 error 왜 안되는건지 정말 오랜시간 탐구했는데....내가 processor 클래스의 접근제어자를 default 로 해놨었다 ㅡㅡ;;IDE가 만들어주는대로 썼으면 public이 붙어있었을텐데 다른데서 작성하고 복붙하다가.... 이것때문에 주말 몇시간 날렸다.
스프링에서 AOP를 구현하는 방법중 하나가 dynamic proxy 를 이용하는 방법이다. 특별한 내용은 아니고, dynamic proxy 를 직접 구현해보는 포스팅을 하나 하고자한다. public interface Inter { String toMessage(); } 먼저 인터페이스를 하나 정의해준다. 예제를 위한 인터페이스라 대충 만들었다. 이제 proxy 를 구현해주자. Proxy 클래스에있는 팩토리메서드를 호출하면 된다. public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)(호출해야할 메서드) 파라미터들을 확인해보자. 클래스로더와 구현해야할 인터페이스, 그리고 호출핸들러를 필..
API 문서화 도구로 swagger 를 세팅하는데 objectMapperConfigurer bean을 생성하다가 예외가 발생하는 경우가 있다. 그러면서 java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper 이런 에러메세지가 나올수있는데 당황하지말고 jackson 의존성이 있는지 확인해보자. 레거시 프로젝트에 swagger 를 설정하고있는데, jackson이 없을거라는 생각은 전혀 못하고있어서 삽질을 좀 했다.
java를 이용하여 개발하다보면 단순 테스트 차원의 짧은 코드를 확인해보고싶을때가 있다. 가령 String#substring 메서드가 첫번째인자를 0부터 받는지.. 두번째인자에 들어가는 인덱스를 포함하는지 제외한는지... 등등 같은 상황이다.나같은 경우는 이럴때 사용하기위한 테스트 프로젝트를 하나 만들어놓고 필요할때마다 main 메서드에 코드를 작성해 돌려보곤한다. 아마 다 비슷하지않을까 생각하는데 java9부터는 jshell 이라는 java shell을 제공해주게됐다. jshell 은 REPL(Read Evaluate Print Loop)을 제공해주기때문에 즉석으로 테스트코드를 터미널에서 작성해보고, 코드결과를 바로 확인할 수 있는 편리함이 있다. java9 이상을 설치하고 환경변수를 잡아주면 bin/..
JDK6로 돌아가고있는 서버를 JDK8로 업그레이드를 해야했다. 자세히말하면 JDK 뿐만아니라 Spring3을 Spring5로, Tomcat6를 Tomcat8로 함께 업그레이드를 진행했다. Spring 버전이 변경되면서 인터페이스자체가 변경된 몇가지 부분외엔 크게 수정이 필요하지않았다. 수정해야할 부분을 모두 수정하고 서비스에 투입하자 갑자기 예외로그가 쭉쭉 올라오기 시작했다. 기존 JDK6에서는 발생하지않았던 문제이며, 발생한 예외는 ConcurrentModificationException 이었다. 예외로그가 쭉쭉 쌓이다보니 일단 서비스에서 제외하고 원인을 찾기시작했다. 보통 ConcurrentModificationException은 Iterator가 반복하고있을때 내부에서 remove등으로 Colle..
아직 Java9을 사용해본적은 없지만 Java9이 나오고 초창기에 롬복을 사용할 수 없다는 이슈를 들은적이 있다. Java9을 할일이 없어서 크게 신경은 쓰지않고 있었는데 얼마전 롬복의 버전업을 할일이 있었다. 기존사용버전은 1.16.14였고, 1.16.20까지 나와있길래 최신버전으로 업데이트를 했다. 그리고나서 테스트를 실행하니 여기저기서 테스트가 깨지는 문제가 발생했다. 주로(전부다) jackson을 이용해 json을 deserialize 하는 코드에서 테스트를 실패했는데 롬복이 만들어주는 생성자가 기존코드와는 다르게 변경됐다. @AllArgsConstructor public class Person { private int age = 30; private String name; } 이 코드를 롬복 버..
- Total
- Today
- Yesterday
- 정규표현식
- Design Pattern
- Spring
- DesignPattern
- code
- go-core
- db
- http
- OOP
- JPA
- spring cloud
- MySQL
- java
- JavaScript Core
- frontend개발환경
- toby
- Kotlin
- EffectiveJava
- Git
- javascript
- Jackson
- TEST
- frontcode
- backend개발환경
- mariadb
- servlet
- programming
- clean code
- generics
- java8
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |