본문 바로가기

Kotlin

(6)
코틀린과 Hibernate, CGLIB, Proxy 오해와 재대로된 사용법 - (6) 5장에서 Kotlin 에서 @RequsetBody 에 기본 생성자가 필요없다라는 것에 대해 알아봤습니다. 이 과정에서 찜찜한 상태로 넘어갔었습니다. 이번에 새롭게 알게된 것으로 이를 해결했기에 기록해봅니다. 1. Jackson-Module-Kotlin https://proandroiddev.com/parsing-optional-values-with-jackson-and-kotlin-36f6f63868ef Parsing Optional Values with Jackson and Kotlin A quick introduction to Jackson Kotlin module for parsing data with missing values proandroiddev.com 이전 글에서, Json 을 @Reque..
코틀린과 Hibernate, CGLIB, Proxy 오해와 재대로된 사용법 - (5) 이번에는 전 글에서 언급했듯이, Kotlin + @RequestBody 에서 기본생성자가 필요할까? 에 대해 알아보도록 하겠습니다. 1. Converter @RequestBody 로 객체를 맵핑하는 방법은, 적절한 컨버터를 찾아 read() 하는 것입니다. AbstractMessageConverterMethodArgumentResolver 클래스를 봅시다. 그 중 readWithMessageConverters 를 봅시다. 적절한 post 요청으로 디버그를 해봤습니다. messageConverters 에 10개의 컨버터가 대기중이군요. 예상컨데, 우리는 Json 요청을 보낼 것이니 MappingJackson2HttpMessageConverter 를 쓸 것입니다. 위의 루프문을 돌면서, MappingJack..
코틀린과 Hibernate, CGLIB, Proxy 오해와 재대로된 사용법 - (4) 앞선 글에서 proxy 객체를 사용하기 위해 allOpen 플러그인을 사용하였습니다. 이 allOpen 을 조금 더 알아봅시다. 0. allOpen vs 그냥 open class 발단은 이거였습니다. 제가 이 주제로 글을 적기 전, 메모해놨던 것이 있는데 아래와 같이 적혀 있었습니다. allOpen 플러그인을 적용하면서 기존 코드의 private set 을 사용하지 못함 -> protected set 을 고려해보자. 이를 시연해보기 위해 다음과 같이 생각했죠. allOpen 이 open 클래스라고 했으니 그냥 open class 만들어서 재현해볼까? open class User( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long =..
코틀린과 Hibernate, CGLIB, Proxy 오해와 재대로된 사용법 - (3) 1. 코틀린의 생성자 코틀린을 사용하면 보통 primary constructor 를 사용합니다. 그리고 자바를 배웠다면, 다른 생성자가 정의되어 있으면 기본 생성자가 자동으로 생성되지 않음을 알고 있을 것입니다. 그러면, 기본 생성자 없이 entity 코드가 잘 돌아가는가? 가 이번 글의 주제입니다. 2. 기본 생성자가 필요할 것 같은데? 제가 의심한 상황은 두가지 였습니다. java + hibernate 사용할 때 entity 객체에 기본 생성자는 필수였다. proxy 객체를 만들 때 기본 생성자가 필요하지 않을까 ? 두번째 의심은 첫번째 글에서 봤듯이, CGLIB 에서 objenesis 라이브러리를 사용함으로서 해결. 그러면 첫번째 의심인 java + hibernate 처럼 kotlin + hiber..
코틀린과 Hibernate, CGLIB, Proxy 오해와 재대로된 사용법 - (2) 앞선 글에서, Spring boot 에서 Proxy 를 생성할 때에는 상속을 이용한다는 것을 알았습니다. 여기서 코틀린과의 문제가 발생합니다. 1. Data Class Data Class 는 코틀린에 있는 특별한 클래스입니다. 다음의 메서드들을 적절한 방법으로 구현하여 자동으로 생성해줍니다. equals() hashCode() toString() copy() 이 메서드들은 최상위클래스인 Object 클래스에 정의되어, 굳이 Data Class 가 아니더라도 사용할 수 있죠. 그럼 Data Class 가 재정의해주는 위 메서드들은 어떤 차이가 있을까요 ? 먼저 그냥 class 로 정의한 경우입니다. 두번째로는 data class 로 정의한 경우입니다. 정리해보면 다음과 같습니다. equlas() : 참조가..
코틀린과 Hibernate, CGLIB, Proxy 오해와 재대로된 사용법 - (1) 최근 입사한 회사에서는, 자바를 코틀린으로 바꾸는 작업이 한창입니다. 저도 회사에 입사하여 코틀린을 처음 써봤는데, 이전에 공부했던 Effective Java 에 나오던 내용들이 언어 자체로 내장되어 있어서 정말 좋은 언어라고 생각하고 매력을 느껴 즐거운 개발생활을 지내고 있었습니다. 이 글에서는, 코틀린과 스프링, JPA 를 사용하면서 겪었던 시행착오를 기록합니다. 1. CGLIB cglib 컴파일타임 이후 런타임에 클래스 or 인터페이스를 동적으로 상속하여 새로운 클래스를 (이걸로 proxy 객체를 만들게 된다.) 생성해주는 라이브러리 Spring 에서는 AOP 를 사용한 proxy 생성에서 공식적으로 이 라이브러리를 사용하고 있습니다. 2. CGLIB 구성 2-1. Enhancer Proxy 객체를..