본문 바로가기

분류 전체보기

(887)
[Hibernate] JPA 스키마 검증은 어떻게 수행될까? 실제 DB와 엔티티가 일치하는지 애플리케이션이 동작할 때 검증을 하도록 설정이 되어 있다. 만약 일치하지 않는 경우가 발생하면 예외를 던지며 애플리케이션을 멈추어 조기에 문제가 있음을 알 수 있게 한다. DB에 무엇인가 쿼리를 날려서 일치여부를 확인할 것인데 쿼리도 보이지 않아서 파게되었다. 일부러 예외를 발생시키고 예외의 stacktrace를 찾다보니 SpringHibernateJpaPersistenceProvider 에서 createContainerEntityManagerFactory 에서 시작할 수 있었다. package org.springframework.orm.jpa.vendor; class SpringHibernateJpaPersistenceProvider extends HibernatePer..
[oos] Garmin - Looks like our laces game undone 자주는 아닌데 처음 본다. "Looks like our laces game undone" "우리의 레이스 경기들이 끝나지 않은 것 같습니다.' 피트니스를 서비스에 비해 만든 임시 페이지 같다.
[Alfred] 워크플로우 - 단축키로 파일 옮기기 Alfred를 2020년 5월 12일에 구입했다. 주 목적은 snippet이었지만 다른 기능이 많이 있었다. 그중 돋보이는 것은 여러 일련의 작업을 쉽게 하도록 해주는 워크플로우(workflow)인 것 같다. 어제부터 사용해서 아직 많이 있지는 않지만 처음 써보면 어느정도 시행착오가 있기 때문에 기록해두었다. 나중에는 나도 까먹을지 몰라. 현제 Alfred 4버전 기준으로 설명을 한다. Workflows 메뉴를 선택하면 현재 목록을 1단계에서 보여주고, 선택하면 해당 워크플로우가 어떻게 구성이 되었는지 알 수 있다. 회사에서 이모지를 많이 만들고 있는데 만들고 나면 휴지통에 버리지 않고 이모지를 모아두는 디렉토리에 이동을 한다. 액션은 크게 세 가지이다. 1. Finder를 연다. 2. 단축메뉴에서 sl..
[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..
[cafe] 무의미한 설득과 논쟁 "컵에 샤워기에 물을 받아주세요." (컵에 샤워기로 물을 받아주세요) 딸이 목욕을 하고 있었다. 불러서 가보니 컵에 물을 담아달라고 하였다. (제일 위에 인용구) 물이 흐르면 빙글빙글 돌아가는 장난감에 물을 부으려고 하는 것으로 생각해서 세면대에서 물을 받아 컵을 주었다. 그랬더니 컵에 물을 쏟아버리더니 샤워기에서 물을 받아달라고 한다. 내 관점에서 샤워기에서 받은 물이나, 세면대에서 받은 물이나 똑같다고 생각했는데 딸은 그게 아니였나보다. 하지만 놀이에서 필요한 것은 장난감에 부을 물(1차 목표)인데 그 목표를 달성하기 위해 자신이 생각한 방법(수단)과 같지 않았다고 물을 쏟아버린 것이다. (마음에 들지 않았다면 바닥이 아닌 장난감에 부을 수도 있었을 것이다.) 위의 에피소드가 있기 몇 시간 전에 자바..
Migration to Alfred 4 from TextExpander 5.1.5 macOS를 사용하면서 자주쓰는 문자를 확장해주는 유틸리트로 TextExpander를 사용하고 있었다. 소프트웨어 판매 방법 중 구독모델이 유행이 되면서 TextExpander도 6.x버전 부터는 구독 모델로 바뀌었다. 구독 모델 전에는 단일 라이센스등이 있었는데 이런 영구(perpetual)라이센스 방식이 없어졌다. 2015년에 교육할인을 받아서 31.47달러에 구입을 했다. 대략 4만원 정도에 구입했으니 1년구독이라고 치면 1년에 만원정도 안되는 금액으로 사용을 했다고 볼 수 있다. 문제는 컴퓨터를 교체해야 하는데 activation하는 기능은 있지만 deactivation하는 기능이 없어서 특정 횟수 이상 등록을 할 수 없다. 메일로 이전에 활성화된 라이센스를 해지해줄 수 있는지 문의를 했는데 답변..
[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..