본문 바로가기

JAVA15

나만의 클린 코드 이야기 - Enum의 description 변수를 사용하자 해당 글은 클린 코드의 대한 자유로운 의견을 공유하고 작성된 것으로 다양한 의견이나 잘못된 내용이 있으시면 댓글 남겨주시면 감사하겠습니다.상수를 정의하는 방법으로 interface, 자체 클래스 상수, 내부 final 상수로 만드는 방법이 많지만 Java에서 상수를 정의하라고 만든 Enum 클래스 타입이 존재합니다.  Enum 클래스에서 정의한 상수의 네이밍으로 한 눈에 알아볼 수 있지만, 상세적인 내용을 1개의 네이밍으로 설정하는 것은 쉽지 않은 일입니다. public enum Type{ TYPE_NAME1(...), TYPE_NAME2(...), TYPE_NAME3(...), TYPE_NAME4(...); ...}  해당 Enum 클래스의 유지보수성을 높이기 위해서 description 변수.. 2025. 4. 3.
Koltin Gradle, Groovy Gradle 비교 주요 차이점 비교  장단점 장점단점 Groovy DSL - 간결한 문법- 더 나은 빌드 성능- 낮은 학습 곡선- 효율적인 증분 빌드 · 동적 타이핑으로 인한 타입 안전성 부족· IDE 지원이 상대적으로 약함 Kotlin DSL · 강력한 타입 안전성 · 우수한 IDE 지원 (자동완성, 오류 감지)· 리팩토링 용이성 · 상대적으로 장황한 문법 · 학습 곡선이 더 가파름  성능 비교[Gradle 개발자가 남긴 벤치마킹 정보] The Kotlin and Groovy DSLs should have similar performance characteristics · Issue #15886 · gradle/gradleExpected Behavior The Kotlin and Groovy DSLs have as .. 2025. 1. 21.
R2DBC-Proxy(DB Connection Proxy) 적용하기 적용 목적.  현재 WebFlux + R2DBC 환경에서 Join이 필요할 때 DatabaseClient을 이용한 Native Query으로 작성해서 DB에서 데이터를 가져오고 있습니다. Query를 작성할 때의 Human Issue가 발생하거나, ParameterBinding이 올바르게 진행되어 DB에 요청이 가는지 확인하기가 어렵습니다. public Flux findTableT1(String id) { return databaseClient.sql(queryStore.queryJoinTable2ByT1Id()) .bind("id", id) .map((row, rowMetadata) -> findTableT1Response.ofFindTableT1.. 2024. 7. 22.
Jackson Library 이해하기(Feat. Jackson NullPointerException) [상황]기존 코드 유지 보수 중, 수정 API 1개가 500 Error가 뜨고 있었습니다.  PostMan으로 API 호출을 진행하였을 때, NullpointException이 발생하였지만, DB에는 데이터가 변경된 것을 확인하였습니다.  API 구조 ※ 참고, Hexagonal Architecture으로 구성되어 있습니다. DB에 데이터가 변경되었다?→ Business Layer가 아닌 InBound Layer에서는 잘못되었다는 것이라고 생각하고 접근하기 시작하였습니다. InBound Layer을 생각하고, 코드 분석 및 디버깅을 돌렸을 때 Domain 객체를 그대로 응답으로 출력하고 있는 것을 확인되었습니다. get(Ex. getSearch)으로 시작하는 비즈니스 로직 함수가 존재하였으며, 해당 함수.. 2024. 5. 4.
Spring에서 Notification을 구현해보자(WebFlux, Reactor Sinks, SSE) 주의!! → 알림을 구현하기 위해서 경험을 정리한 글이며 대규모 트래픽은 환경은 아니지만, 알림(포탈, SMS, Email, Kakao Alim Talk)이 발생하는 서비스를 제공한 내용을 정리한 글입니다. → 잘못된 부분이 있을 수 있으며, 해당 부분에서는 바로바로 지적해주시면 정말 감사하겠습니다. [상황] 알림 서비스를 구현해야 하는 상황에 맞닥뜨렸다. 나는… 알림을 구현해본적이 없는데 먼저 구현하는 방법에 대해서 먼저 찾아보자!! 알림을 구현하는 방법에는 크게 4가지가 존재하며, 저는 SSE(Server-Sent Event)을 사용하였습니다. [알림을 구현하는 방법 4가지] 1) Short-Polling 클라이언트는 설정한 주기(예:2초)로 서버에 대한 요청을 반복한다. 장점 Client와 Serv.. 2024. 2. 27.
Spring Cache를 파헤쳐 보자!(WebMvc, WebFlux) 상황 여러 로직에서 간단한 정보를 조회가 반복되어 DB I/O 지속적으로 생기는 상황 자주 변하지도 않는 정보를 계속 I/O 생기도록 유지하는 것이 맞는가?? 프로젝트 시연 중, 갑자기 조회하는 로직에서 시간을 무지막지하게 잡아먹는 상황 원인 파악하기에는 시간이 부족하고…. Redis와 같은 외부 캐시 서버를 사용할 상황이 아닐 때…. Redis는 너무 Over-Spec이야 어떻게 해야 하지??? ► Spring Cache!!! 원인을 파악할 시간이 없어… 일단 조회 관련 급한 불은 꺼야 하는데 ► Spring Cache!!! Caching? 오랜시간이 걸리는 작업의 결과를 저장해서 시간과 비용을 필요로 회피하는 기법 캐시가 있을 때 1 → 2 → 3 → 6 캐시가 없을 때 1 → 2 → 4 → 5 → .. 2023. 12. 13.