Programing (403) 썸네일형 리스트형 [slf4j] MDC에 put만 계속한다면 MDC를 이용해서 Correlation ID 추적에 사용을 하고 있다. 스프링을 사용한다면 AsyncHandlerInterceptor 인터페이스를 구현한 HandlerInterceptorAdapter 를 상속받으면 preHandle 과 afterCompletion 메서드에 MDC에 값을 넣고 지우도록 할 수 있다. import java.util.UUID; import org.slf4j.MDC; public class MDCInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { M.. [JPA] Hibernate + MariaDB : count(*)의 매핑이 BigInteger로 되는 이유는? 회사의 수지님이 퇴근 전 물어보아 찾아보게 된 MaraiDB의 JDBC 드라이버. EntityManager 를 통해 NativeQuery를 수행하는데 반환되는 타입이 Long으로 생각했는데 BigInteger 타입으로 반환되어 ClassCastException 가 발생했다고 한다. 간략하게 코드로 보면 아래와 같다. @Service public class CountService { private final EntityManager entityManager; @Autowired public CountService(EntityManager entityManager) { this.entityManager = entityManager; } public Long countIssue() { Query query =.. [JPA] N+1 문제 면접 때 자주 나오는 단골 문제 N+1 Ploblem이다. 내가 맡고 있는 팀은 그동안 테이블을 비정규화 해서 사용을 하고 있었기에 엔티티가 관계를 맺고 있지 않아서 이 문제를 만날 일이 없었다. 이번에 현금영수증 관련 기능을 개발하면서 그동안 중복저장하던 데이터를 좀 효율적으로 사용하기 위해 정규화를 해서 테이블을 쪼갰다. 드디어 N+1 문제를 만났다. EntityA, EntityB 가 있는데 EntityB 안에 EntityA를 포함하고 있다고 치자. FetchType이 EAGER 라면 EntityB를 조회하면 자동으로 EntityA 를 조회하는 쿼리까지 수행이된다. 조회하는 EntityB의 개수가 10개라면 각각 관련된 EntityA까지 추가로 +10회 조회가 되어 총 11회의 조회가 발생한다. 그렇.. [Hibernate] JPA 스키마 검증은 어떻게 수행될까? 실제 DB와 엔티티가 일치하는지 애플리케이션이 동작할 때 검증을 하도록 설정이 되어 있다. 만약 일치하지 않는 경우가 발생하면 예외를 던지며 애플리케이션을 멈추어 조기에 문제가 있음을 알 수 있게 한다. DB에 무엇인가 쿼리를 날려서 일치여부를 확인할 것인데 쿼리도 보이지 않아서 파게되었다. 일부러 예외를 발생시키고 예외의 stacktrace를 찾다보니 SpringHibernateJpaPersistenceProvider 에서 createContainerEntityManagerFactory 에서 시작할 수 있었다. package org.springframework.orm.jpa.vendor; class SpringHibernateJpaPersistenceProvider extends HibernatePer.. [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를 이용한다면 아래와 같이 모든 소문자로 조회를 해야 한다.. 이전 1 ··· 7 8 9 10 11 12 13 ··· 51 다음