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; } 이 코드를 롬복 버..
자바로 개발하는 프로젝트라면 Lombok을 많이 사용할것이다. 이런저런 규약에 따라 거의 필수적으로 만들어줘야하는 코드를 자동생성해주는 고마운 라이브러리이다. 객체 생성 패턴중 한가지인 빌더 클래스도 롬복의 @Builder 애노테이션을 이용하면 쉽게 만들 수 있다. @Builder public class Person { private int age; private String name; } 빌더 패턴에 대한 설명은 여기서 하지 않겠다(이전 포스팅). 롬복을 이용해 빌더 클래스를 만들면 이런식으로 Person 객체를 생성할 수 있다. Person person = Person.builder() .age(30) .name("LichKing") .build(); 이번에 포스팅할 내용은 이부분에 관한것이다. Pe..
현재 프로젝트 로그라이브러리로 log4j2를 사용하고있다. 그러다가 사용하게된 라이브러리가 있는데 이 라이브러리는 log4j 를 사용하고있었다. 의존성 전이에 따라 큰 문제없이 프로젝트 구동은 되지만 워닝 로그가 뜨게된다. log4j:WARN No appenders could be found for logger (org.apache.activemq.util.ThreadPoolUtils). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 이런로그가 뜨게되는데 무시해도 돌아가는덴 지장없지만... 없애보자. 1..
음..아마 2~3년전에 DI에 관한 포스팅을 하나 했던걸로 기억하는데 그때는 DI가 무엇인지에 대해 적었다면 이번엔 Spring이 어떤방식으로 DI를 해주는지 적어보려한다. 이 글을 적게된 계기는 가장 마지막에 소개할 생성자 주입 방식을 요근래에 알게됐기때문이다. 1. Field Injection가장 간단하고 코드량이 적고, 그때문에 가장 많은 분들이 이용하는 방식이 아닐까싶다. 3개 회사를 다녀봤지만 전부 필드 주입방식을 사용하고있었다. @Service class PersonService{ @Autowired private PersonRepository personRepository; } 이 방식은 가장 간단하고 편리하지만 스프링에 종속적이게된다는 단점이 있다. 뭐 사실 코드의 변경없이 기반 프레임워크..
바로 앞선 포스팅에서 Jackson 2.9 버전에 대해 알아봤다. 이 이슈를 해결하다가 알게된 버그인데 포스팅하고자한다. 1. 이슈 일단 앞선 이슈를 해결하기위해 Jackson 버전을 올렸는데 CI 서버가 테스트를 실행하면서 다른 곳의 테스트가 실패하는 이슈가 발생했다. json 문자열을 자바 객체로 역직렬화(deserialization)하는 테스트였는데 이런 코드였다. public class DeserializeTest { private ObjectMapper objectMapper; @Before public void setUp() { this.objectMapper = new ObjectMapper(); } @Test public void test() throws IOException { Strin..
json 문자열을 자바 객체로 역직렬화(deserialization)하거나 반대로 자바 객체를 json 문자열로 직렬화(serialization)을 할때 자바 라이브러리로는 대표적으로 jackson을 많이 사용한다. 직렬-역직렬시 json key를 결정하는건 @JsonProperty 라는 애노테이션을 이용한다. public class TestClass{ @JsonProperty("name") private String name; } TestClass 객체를 직렬화하거나 혹은 json 문자열을 TestClass 객체로 역직렬화시 name key는 @JsonProperty 애노테이션에 name으로 지정된 곳에 매핑이 되게된다. 참고로 해당 애노테이션이 없을때는 기본적으로 필드명끼리 매핑시키므로 예제와같이 필..
- Total
- Today
- Yesterday
- java
- JavaScript Core
- programming
- http
- frontcode
- spring cloud
- Design Pattern
- javascript
- TEST
- MySQL
- generics
- EffectiveJava
- java8
- 정규표현식
- db
- servlet
- Git
- clean code
- Jackson
- DesignPattern
- Kotlin
- backend개발환경
- Spring
- toby
- OOP
- JPA
- go-core
- frontend개발환경
- mariadb
- code
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |