[Kotlin] 코틀린에서 JPA사용하기. LAZY 로딩이 의도대로 작동 하지 않는다면..

Intro 얼마전 코틀린으로 진행중인 토이프로젝트에서 응답속도가 생각만큼 나오지 않기에 쿼리 나가는걸 하나하나 확인 해 보았습니다. 그랬더니 분명 LAZY로 되어있는 여러가지 연관관계들이, 따로 사용하는 곳도 없는데 전부 다 하나씩 Eager Fetch 처럼 불러지는게 확인 되었습니다. 코틀린에서 JPA를 사용하다보면 자바와는 다른 코틀린의 설계로 인해 의도치 않은 문제가 많이 발생 할 수 있는데요. 어떤 문제가 있었는지, 그리고 LAZY 로딩이 의도대로 작동하게끔 하려면 어떻게 해야 하는지에 대해 알아보겠습니다. 필요시 모든 예제 코드는 https://github.com/Shane-Park/helloKotlin/tree/master/jpatest 에서 확인 하실 수 있습니다. 예제 코드 프로젝트 생성 ..

Programming/Kotlin 2022.12.05
[Java] 불변객체(Immutable Object)의 JSON 직렬화 및 역직렬화

Intro DTO 혹은 VO 객체를 생성 할 때, Immutable 하게 생성 한다면 여러가지 장점이 있습니다. 멀티 쓰레드 환경에서 동기화를 고려 할 필요 없이 안전하게 사용 할 수 있으며, 캐싱을 하기에도 유리합니다. 특히 mutable 객체를 잘못 코딩함으로서 생기는 사이드이펙트는 예측하기도 어려울 뿐더러 오류가 발견되는것도 쉽지 않습니다. 한참이 지나서야 도대체 알 수 없는 오류가 발생해서 이것 저것 한참을 디버깅을 하다가 객체를 잘못 다룬게 발견될때는 거의 소름이 돋을 정도입니다. 프로퍼티의 값이 변화될 일이 없고, 값이 변경되어서는 안되는 객체를 방어적 복사를 하는 거 보다는 애초에 불변객체로 생성 하는것이 성능을 비롯한 여러 가지 장점이 있습니다. 재사용도 얼마든지 할 수 있습니다. 이전의 ..

Programming/Java 2022.11.20
[H2] Database "mem:testdb" not found, either pre-create it or allow remote database creation 해결

Intro 스프링부트에서는 아래와 같은 설정으로 간단하게 인메모리 H2 데이터베이스를 사용 할 수 있습니다. application.yml spring: datasource: url: jdbc:h2:mem:testdb username: sa build.gradle.kts runtimeOnly("com.h2database:h2") 이후 h2:console 설정을 켠다면, 콘솔 페이지에서 데이터베이스를 직접 확인 해 볼 수 있는데요 spring: h2: console: enabled: true settings: web-allow-others: true 위와 같이 설정했을때에는, /h2-console 경로로 들어가면 데이터베이스를 웹 페이지에서 직접 확인 해 볼 수 있습니다. 그런데, Test Connectio..

Programming/JPA ⁄ Spring 2022.11.15
스프링 부트 java -jar 혹은 bootrun시 port 변경하기

Intro 이번글은 매우 간단한 글인데, 자꾸 까먹어서 블로그 글로 정리해두고 필요할 때 찾아보려고 작성 해 두려고 합니다. 스프링 부트 프로젝트를 IDE로 손쉽게 실행 할 수 있지만, Scale out 이나 로드밸런스 등의 테스트를 할 때는 같은 어플리케이션을 여러개 띄워두어야 하는 경우가 생깁니다. 테스트의 경우에는 인텔리제이에서 Run Configuration을 여러개 카피해서 사용하는게 가장 좋기는 하지만 이런 방법도 있다고 알고 있는 편이 좋겠고 실제로 쓸일이 제법 있었습니다. 포트 지정해 실행 아래와 같이 포트 설정을 하여 실행 할 수 있습니다. java -jar 아마 가장 흔하게 쓰이지 않을까 생각 됩니다. java -jar -Dserver.port=18080 ./target/my-app-0..

Programming/JPA ⁄ Spring 2022.11.14
[Java] Stream을 활용해 중첩 컬렉션 및 Tree 평면화하기

Intro TREE 형태로 만들어둔 메뉴 목록을 평면화해야 하는 일이 있었습니다. Stream의 flatMap을 활용하면 이중 컬렉션의 평면화를 아주 쉽게 할 수 있는데, 트리 전체를 평면화 시키는건 코드를 깔끔하게 작성하는데 고민이 많았습니다. 스트림을 활용해 트리 형태의 그래프를 평면화 시키는 작업을 한번 해 보도록 하겠습니다. 이중 컬렉션 평면화 가장 먼저 이중 컬렉션의 평면화를 몸풀기로 진행 해 보도록 하겠습니다. 이 작업은 필요한 경우가 잦아 모두 한번쯤은 작성해 해 보셨을거에요. 일단 중첩 컬렉션을 평면화시키는 메서드를 가진 인터페이스를 선언 하고 interface CollectionFlatter { Collection flatten(Collection collection); } 거기에 맞는 ..

Programming/Java 2022.11.07