본문 바로가기

Programing

(391)
[Spring JPA] 멀티컬럼 - 쿼리메소드 vs @Query 도비님이 코드리뷰 PR을 주셨다. 기존에 query method로만 사용을 했는데 @Query 를 사용하여 왜 그랬는지 궁금했다. 알고보니 특정 컬럼에 대하여 or 조건으로 결합이 되었던 것이 이유였다. 예를 들어 (t.a = 'abc' or t.a = 'bcd') and ... 같이 우선적으로 적용해야 하는 or가 있는 경우였다. 물론 결합법칙으로 (A OR B) AND C 를 A AND C OR B AND C 로 풀 수는 있지만 trade-off 비용이 더 안좋았을 거라 생각이든다. 다른 생각 하지만 JPA 객체지향이 아닌 쿼리지향으로 사용하고 있지 않는가 하는 생각을 하게 되었다. query method가 점점 길어지고 복잡해지고 있다면 쿼리지향을 하고 있는가 생각해 보는 점검의 시간(냄새)으로 생..
[JPA] 엔티티의 연관관계 시행착오 회사에서 JPA를 사용하고 있었지만 테이블이 비정규화되어 있어서 테이블간에 join이 불필요했다. 엔티티 역시 연관관계를 가지지 않았기에 단순하게 CRUD 정도만 하면 되서 복잡도는 낮았다. N+1 문제가 발생할 일이 없다. 대신 불필요한 데이터를 중복적으로 저장을 하기 위한 오버헤드가 존재했다. 이번에 현금영수증 관련 개발을 하면서 약간의 정규화를 해서 테이블의 연관관계를 갖도록 설계를 진행했다. 그런데 데이터를 저장하면서 부터 난관에 봉착했다. 예를 들면 아래와 같은 특정 필드가 값을 기본값을 가지지 않는다는 등의 알 수 없는 메시지를 만났다. Caused by: java.sql.SQLException: (conn=2575762) Field 'CASH_RECEIPT_REQUEST_ID' doesn't..
[node] 코드리뷰를 통한 코드의 발전(falsy) 2020-04-28일에 작성한 http 모듈과 express에서 헤더과 관련된 글이다. 코드리뷰와 1차 피드백 외부에서 넘겨 받은 헤더를 이용한 request 객체에 프로퍼티 추가에 대한 작업은 아래와 같은 형태였다. Java를 주로 해서 그런지 타입에 대한 엄격한(strict)검사의 코드로 구성했다. const uuid = require('node-uuid'); const injectTransactionId = (req, res, next) => { const xTraceId = req.header('X-Trace-Id'); if (typeof xTraceId === 'string' && xTraceId.length > 0) { req.id = xTraceId; next(); } else { req.i..
[node] http 모듈과 express에서 헤더 RFC 스펙에서 HTTP 헤더의 이름은 대소문자를 구별하지 않는 것으로 되어 있다. 따라서 특정 헤더의 값을 가져올 때 구현체에 따라 주의를 기울여야 한다. 에를 들어 node.js의 http 모듈에서는 내부적으로 소문자로 바꾸어서 저장을 한다. 심지어 클라이언트가 대문자를 넣어서 보낸 경우에도 소문자로 저장을 한다. 만약 시스템간 Correlation ID의 연동을 위해 헤더에 X-Trace-Id 라는 값을 넣기도 한다. 만약 headers['X-Trace-Id']으로 조회를 했다면 undefined 를 얻을 가능성이 있다. express에서 내부적으로 node의 http 모듈을 사용하고 있기에 동일하다. 만약 request 객체의 headers를 이용한다면 아래와 같이 모든 소문자로 조회를 해야 한다..
[Java] Scope shadowing과 DCL51-J 가끔 sonarqube 돌려보면 DCL51-J 에 대한 코드 냄새가 잡힌다. 예를 들면 아래와 같다. 5번째 라인에서 지역변수 value를 사용하면 멤버변수인 value와 이름이 동일한데 사용했다고 경고를 한다. public class Foo { private String valueType; public void foo(SomeParameter someParameter) { ValueType valueType = someParameter.getValueType(); if (valueType != null) { this.valueType = valueType.name(); } } } 이럴 경우 어떠한 방법이 좋을까? 방법1. 지역 이름을 바꾼다. - 쉬우면서 명시적인 방법이다. public class Fo..
[Spring] spring-retry 재시도 및 백오프 정책 정리 재시도에 대한 생각을 할 때 일반적으로 참고를 할 수 있을 것 같아서 정리했다. 현재 사용하고 있는 spring-retry 1.2.5 기준이다. RetryPolicy (재시도 정책) SimpleRetryPolicy 주어진 횟수만큼만 반복 수행 AlwaysRetryPolicy 항상 재시도를 수행 - 테스트 용도나 수동 설정시 이용 NeverRetryPolicy 1회만 수행(재시도를 안함) - 테스트 용도나 수동 설정시 이용 CircuitBreakerRetryPolicy 서킷 브레이커 방식의 재시도 - 시스템 장애시 유용 ExceptionClassifierRetryPolicy 최종 예외 클래스에 기반한 재수행 TimeoutRetryPolicy 제한을 시간을 가지고 반복을 수행 ExpressionRetryPo..
[Java] 내가 사용하는 GC 알고리즘은 무엇일까? 자바에서는 보통 아래 다섯가지를 주요 GC 타입을 기술한다. Serial Garbage Collector- S GC Parallel Garbage Collector- P GC CMS Garbage Collector- CMS GC G1 Garbage Collector- G1 GC The Z Garbage Collector- ZGC 웹에서 기본 CG를 찾아보면 자바 버전에 따라 달라졌음을 알 수 있다. stackoverflow: Default garbage collector for Java 8 Java 7 - P GC Java 8 - P GC Java 9 - G1 GC Java 10- G1 G 시간대에 따라 힙의 증감 톱니바뀌는 다름을 알 수 있다. 트래픽이 적은 새벽 3시~8시에는 주기가 길고, 많은 주간..
[라이선스] Wunderlist 3.19.41 Wunderlist가 2020년 5월 6일부로 사용이 중단된다고 해서 라이선스 스냅샷을 찍어둔다. 목록 Wunderlist 3.19.41 Copyright © 2015 6 Wunderkinder GmbH All Rights Reserved 개인정보처리방침 - 임프린트 - 사용 약관 Imprint 6 Wunderkinder GmbH Karl-Liebknecht-Straße 32 10178 Berlin Contact Mail: hello@6wunderkinder.com Handelsregister AG Charlottenburg HRB 128663 B UstID DE815214657 Geschäftsführer Christian Reber Privacy Policy We, 6Wunderkinder GmbH ..