본문 바로가기

Programing

(403)
[Spring] AOP로 로깅 코드 덜어내기 기존에 되어 있던 코드에 보면 메서드 시작부에 인자로 받은 값들을 JSON으로 serialize해서 로그에 찍고, 결과를 반환하기 전에 결과도 JSON으로 serialize해서 로그로 찍는 식의 코드가 많았다. 사실 로깅을 하거나 DB에 이력을 쌓는 등의 코드는 핵심 비즈니스 코드와 별로 관계가 없다고 볼 수 있다. 이번에 새로운 feature를 추가하면서 기존 레거시의 방식(위의 방식)을 따르기 보다, AOP를 적용해서 관심사의 분리를 해보는 경험을 해보아서 기록으로 남긴다. 버전정보 자바: 1.8 스프링부트: 2.1.4.RELEASE -> 스프링 프레임워크: 5.1.6.RELEASE 의존성 추가 스프링부트 레퍼런스에 보면 AOP관련 스타터가 spring-boot-starter-aop 라서 추가를 했으..
[Java] 자바버전 별 주요특징 이미 많은 사람들이 잘 정리를 해서 바퀴의 재 발명을 할 필요가 없다고 생각한다. 가끔 면접을 보러 가면 버전별 특징을 물어보는 경우가 있어서 굵직한 변화와 추가 사항은 상식적으로 알아두면 좋을 것 같아서 정리해둔다. 링크들 혼란스러운 Java 버전의 진실 (와탭 블로그) 우아한 테크 세미나 - 자바, 성능, 모니터링 이야기 후기 자바 코드의 주석 Java 런타임 (rt.jar)에는 @SupportedSourceVersion 라는 이름의 애너테이션이 있다. 용도는 소스가 지원하는 버전 정도로 해석이 가능한데, 인자로 SourceVersion이라는 열거형(enum)을 넣을 수 있다. 바로 이 SourceVersion 의 주석에 주요 특징이 적혀있다. public enum SourceVersion { /* ..
[JUnit] JUnit 4 to 5 migration Unit 4에서 jupiter 라는 이름을 가지고 있는 Unit 5 로 마이그레이션을 했다. 기존에 Unit 5로 짜여 있는 코드가 에러가 발생했다. 이유는 구별을 하기 위해 애너테이션을 변경했기 때문이다. JUnit 4(vintage) JUnit 5(jupiter) setUp @Before @BeforeEach tearDown @After @AfterEach test class setUp @BeforeClass @BeforeAll test class tearDwon @AfterClass @AfterAll 테스트 무시 @Ignore @Disabled @Rule (사실상 없어졌다) @ExtendWith 이름은 동일한데 패키지만 변경된 것들이 있다. JUnit 4(vintage) JUnit 5(jupiter..
[Gradle] 3.4 부터 의존성 선언이 바뀌었다. 예전에는 Spring Initializr 에서 Gradle Project 를 만들면 다음과 같이 의존성 선언이 만들어졌다. dependencies { compile 'org.springframework.boot:spring-boot-starter' testCompile 'org.springframework.boot:spring-boot-starter-test' } 그런데 어제 해보니 다음과 같이 바뀌었음을 알 수 있다. dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' } Gradle Wrap..
[Spring Boot] 2.0.2 -> 2.1.4 업데이트 후 TC 깨짐 다행히 많은 테스트 코드가 깨지지는 않았으나 RestTemplate 로깅을 위해 추가한 인터셉터 쪽이 깨졌다. "HEADERS": "({})" => "HEADERS": "([])" org.springframework.http.HttpHeaders 의 구현 방법이 바뀐 것 같았다. 즉 맵에서 배열로 바뀐 것이다. 이전 5.0 대 스프링 버전에서는 생성자가 아래와 같았다. public HttpHeaders() { this(new LinkedCaseInsensitiveMap(8, Locale.ENGLISH), false); } 5.2.0 대 스프링 버전은 아래와 같이 바뀌었다. public static MultiValueMap toMultiValueMap(Map map) { return new MultiVal..
[JSON] LocalDateTime to JSON by Gson, Jackson2 이전 [Java] Date vs LocalDateTime 글에서 Date 클래스를 LocalDateTime으로 변경을 하게 된 배경에 대해 설명을 했다. 예고한대로 이번에는 변경을 했을 때 겪을 수 있는 것을 정리한다. 1. JPA 문제 낮은 버전의 JPA에서는 문제가 발생할 수 있다. 다행히 내가 사용한 JPA 2.0.2 와 구현체 하이버네이트(hibernate) 5.2.17에서는 Java8 의 시간/날짜에 대한 지원(JSR-310)이 추가되어서 문제가 없었다. 문제가 없었던 이유는 스프링 부트가 스프링 데이터의 org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters 를 컨버터로 자동으로 등록을 해주었기 때문이다. 하지만, 초기에 이 클래스..
[Java] Date vs LocalDateTime 얼마전에 Date 타입을 LocalDateTime로 바꾸었다. 가장 큰 이유는 Date 타입이 mutable 이라서 getter / setter 에서 값을 deep copy를 해서 반환하고 설정을 하라고 한다. 이유는 참조하는 곳에서 값을 바꾸면 필드의 값도 같이 바뀔 수 있기 때문이다. // 테스트 대상 Item.java public class Item { private Integer id; private String name; private String createBy; private Date createAt; public Item(Integer id, String name, String createBy, Date createAt) { this.id = id; this.name = name; this..
[Java] ArithmeticException 는 누가 던지는 것인가? #ifndef SHARE_VM_CLASSFILE_VMSYMBOLS_HPP #define SHARE_VM_CLASSFILE_VMSYMBOLS_HPP #include "oops/symbol.hpp" #include "memory/iterator.hpp" #include "trace/traceMacros.hpp" // ... #define VM_SYMBOLS_DO(template, do_alias) \ // ... \ /* exception klasses: at least all exceptions thrown by the VM have entries here */ \ template(java_lang_ArithmeticException, "java/lang/ArithmeticException") \ #end..