java

JVM/Spring

[Toby Spring Reactive Programming] Reactive Streams 시작 (1)

서론 https://youtu.be/8fenTR3KOJo 토비의 스프링에 있는 토비님의 라이브 유튜브 강의를 보고 정리한 내용입니다. 본론 Iterable vs Observable Iterable public static void main(String[] args) { Iterable iter = () -> new Iterator() { int i = 0; final static int MAX = 10; public boolean hasNext() { return i < MAX; } public Integer next() { return ++i; } }; iter.forEach(System.out::println); } Iterable 인터페이스를 구현하면, for-each를 사용할 수 있다. 주로, C..

JVM/Java

[java] BigDecimal의 equals 와 compareTo with kotlin

😲 서론 BigDecimal 을 통해 연산자를 통해 값을 비교하다가 조심해야될 것을 발견했다. 🫡 본론 결과의 값이 1인지를 확인하려고 했는데, 내 생각과 다르게 false가 나왔다. fun main() { val result = BigDecimal("1.00") println(result == BigDecimal.ONE) // false } equals의 java doc 확인해보니 아래와 같은 설명이 적혀있었다. equals Javadoc Compares this BigDecimal with the specified Object for equality. Unlike compareTo, this method considers two BigDecimal objects equal only if they a..

Project

[Ticketing] 유저 PK 대신 유니크 ID 만들어 사용하게 된 계기 (유니크 ID 생성)

🥸 서론 현재 진행 중인 Ticketing 프로젝트는 시스템이 분리되어있다는 가정 하에 진행된 프로젝트입니다. 여기서 결제시스템에서는 어떤 유저가 결제했는지에 대한 정보가 있어야 합니다. 처음 설계 당시에는 유저 PK 값을 넣어서 사용하려 했지만, 몇 가지 문제가 있어서 대체 유니크키 생성을 결정하게 되었고, 그 내용을 정리해보려 합니다. 😎 본론 기존 ERD 구조입니다. 여기서 Payment 에서 User의 pk 값을 가지고 있죠. 고민의 시작인 API의 간단한 Sequence Diagram 입니다. 여기서 결제 목록 요청을 할 때 각 유저의 고유한 값을 Payment에서 가지고 있어야 유저의 결제 목록을 응답해줄 수 있습니다. 여기서 기존엔 User의 PK를 사용했는데, 왜 고민했는지 Email, U..

JVM/Spring

[Spring] 통합테스트 환경 분리 설정 - Gradle Kotlin DSL

🧐 서론 테스트를 돌릴 때 통합테스트는 Spring을 올리기 때문에 생각보다 긴 시간을 잡아먹습니다. 현재 프로젝트에서 통합테스트가 별로 없음에도 통합테스트와 유닛테스트 구분 없이 한 번에 돌리다보니 시간이 비효율적이라고 느꼈고, 환경을 분리해야겠다고 생각이 들어 내용을 정리해보겠습니다. 참고 참고로 gradle은 Groovy 가 아닌 Kotlin 으로 진행된 점 참고하여 봐주시길 바랍니다! 😎 본론 build.gradle.kts 설정 sourceSets { create("intTest") { compileClasspath += sourceSets.main.get().output runtimeClasspath += sourceSets.main.get().output } } val intTestImplem..

JVM/Spring

[Spring] Exception 어떻게 처리할까?

🤔 서론 Exception Handler 를 구현하다 리펙토링 한 경험을 작성합니다. 🫢 본론 기존 Exception 은 상황에 맞게 각각 Custom Exception 을 만들어서 처리를 했습니다. 문제점 Exception 마다 각각의 Handler 를 만들어주어야 했습니다. 클래스는 통합해서 작성해도 되지만, 여기서 중요한 건 만든 각각의 Custom Exception 별로 별도의 Handler를 추가로 계속 작성해주어야만 했습니다. 중복된 코드 private static final String MESSAGE = "패스워드가 일치하지 않습니다"; @ExceptionHandler(value = {PasswordMismatchException.class, BadCredentialsException.cla..

JVM/Java

[Java] GC (Garbage Collection) ??

😎서론 Java가 유명해진 큰 이유 중 하나로는 역시 다른 언어와는 다르게 GC라는 녀석이 있기 때문이다. 그렇기에 Java를 제대로 이해하고 사용하려면 GC가 무엇이고, 어떤 걸 하는지, 어떻게 무엇을 튜닝해야 할지를 알아야 Java 개발자로서 성장하는 데에 필수 조건이라 생각하기에 한번 정리를 해본다! 😏본론 GC(Garbage Collection) ? 직역하자면, 쓰레기 수거를 의미합니다. 결국 불필요한 즉, 사용되지 않는 메모리에 할당된 객체들을 직접 정리해주는 역할을 하고 있습니다. 한 줄로 정의하자면, Heap 영역에서 더이상 사용되지 않는 객체들을 메모리에서 제거합니다. GC가 왜 필요하지? GC가 없는 다양한 언어들에서는 메모리를 직접 정리해주어야 합니다. 그렇기 때문에 객체를 하나하나 연..

JVM/JPA

[QueryDSL] return 으로 Map(집합) 받기

😀서론 테이블 목록을 가져와 목록에서 ID를 통해 내부 정보를 여러 번 조회할 일이 있었다. 쿼리에서 List 로 조회해서 for문으로 돌리기에는 중복된 ID를 여러 번 조회할 수도 있고, 결국 ID를 통해 다른 값들을 얻고 싶은 게 목표 이기에 QueryDSL에서 return으로 Map도 받을 수 있는지 찾게 되었고, 찾아서 정리를 해본다. 🙄준비 위 데이터를 기준으로 결과 값 확인을 진행합니다. 🙂본론 Querydsl에서는 결과 집합(aggregation) 이라는 걸 제공해주는 걸 알았습니다. 결과 처리 방법 쿼리에서 데이터 조회 후 메모리에서 결과에 대한 집합 연산을 수행하는 집합 함수를 의미 합니다. 간단한 예시로 살펴보겠습니다. 1️⃣Map Value 하나 받기 select는 transform에..

Hyo Kim
'java' 태그의 글 목록