본문 바로가기

분류 전체보기

(816)
[spring] health check endpoint 내가 회사에서 본 애플리케이션에는 관례적으로 /health 라는 경로의 endpoint를 노출하고 있었다. 저마다 반환하는 값은 "success"나 "OK" 나 다 달랐지만 200 응답을 돌려주는 것은 동일했다. 보통은 아래와 같이 Controller를 만들어서 어떤 응답값을 반환한다. @RestController @RequestMapping("/health2") class HealthCheckEndpoint { @GetMapping fun health(): ResponseEntity { return ResponseEntity.ok().body("OK") } } ResponseEntity.ok().body("OK") 부분은 BodyBulder 에 의해 매번 DefaultBuilder 라는 객체를 생성한다..
MySQL - ON UPDATE CURRENT_TIMESTAMP 운영중인 데이터가 잘못 들어가 있는 것이 있어서 보정을 필요로 했다. 개발 환경에서 테스트를 하는데 업데이트 시간을 담고있는 컬럼이 업데이트가 되고 있음을 알았다. 테이블의 스키마를 확인해보니 아래와 같이 on update 문이 붙어있었다. updatedAt timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, 11.2.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME 문서에 설명하고 있다. 이전 회사의 경우 default 나 on update 같은 DB 지향적인 것을 지양했다. 목적은 데이터 일관성적인 측면이었다. 왜냐하면 분산 DB 시스템을 사용해서 애플..
[jdbc] mariadb - AbstractQueryProtocol 쿼리를 보내는 프로토콜에 대한 구현 부분 executeQuery 의 부분은 거의 항상 수행되었다. package org.mariadb.jdbc.internal.protocol; public class AbstractQueryProtocol extends AbstractConnectProtocol implements Protocol { // L.219 public void executeQuery( boolean mustExecuteOnMaster, Results results, final ClientPrepareResult clientPrepareResult, ParameterHolder[] parameters) throws SQLException { cmdPrologue(); try { if (clien..
Kotlin DSL Gradle: 멀티 모듈로 변경하기 spring initializr 에서 프로젝트를 만들면 단일 모듈 기반의 프로젝트를 생성한다. 처음에는 이 구조가 편하지만 단점도 있다. 바로 도메인과 구현 기술의 코드가 섞이게 된다는 것이다. 물론 언어에서는 패키지나 네임스페이스 등의 모듈을 분리할 수 있는 구조를 제공한다. 하지만 이것은 구조화적인 것으로 의존성에 대해 직접적인 통제를 할 수 없다. 헥사고날 아키텍처라고 불리는 '포트와 어댑터'라는 구조가 있기는 하지만 나는 페리페리크 안티 패턴(Périphérique anti-pattern)을 더 선호한다. 파리의 Boulevard Périphérique 에서 따온 메타포이다. 사실 A86이나 La Francilienne 와 같은 더 많은 외곽순환 도로가 경계(boundary)를 나누고 있다. 왜냐..
DataIntegrityViolationException Sentry 로 알림이 오면 팀에서는 습관적으로 ignore 처리를 하는 것을 발견했다. 특히 배포 직후에는 이런 ignore가 빈번했는데 새로운 버전이 배포가 되면 기존의 custom ignore가 무효화가 되는 것 같았다. 백로그의 티켓 중 내부 개선 에픽이 붙어있는 묵혀놓은 티켓을 발견했다. 바로 "정상적인 케이스의 알람을 받지 않는다."이다. 위의 알람의 경우 사용자가 입력을 짧은 시간에 여러번 하여 save 명령이 두 번이 된 경우에 주로 발생했다. DB에는 UC(Unique Constraint) 조건이 달려있었기에 나중에 요청이 온 쿼리가 수행이 되지 않는다. 버튼을 클릭 후 disable로 변경시켜 입력을 두 번하는 것을 막는 것이 근본적인 방향이겠지만 해당 UI는 다른 팀이 담당하고 있어서..
추가 단계로 검색어의 문맥 파악하기 사례 : 쿠팡 사내 블로그에 "검색어로 지리적 특성 이해하기"라는 글이 올라왔다. private 블로그라 자세한 내용을 공개할 수는 없지만, 요약하면 "사용자의 검색어마다 지리적 특성이 달라질 수 있다."라는 결론을 담고 있었다. 마침 주말에 딸이 풍선을 타고 놀길래 원인을 탐색해보다 보니 애니메이션의 여자 아이가 풍선말을 타는 장면이 나왔던 것임을 알게 되었다. 나도 어렸을 때 풍선말을 타본 적이 있어서 전자 상거래 사이트에서 해당 상품이 있는지 검색을 해보았다. 5살 무렵이었는데 다행히 그 상품의 이름을 기억하고 있었다. 키워드는 "호피티" C사에서 검색을 해보니 내가 원하던 유아 장난감이 아닌 성인 여성을 위한 아이템이 나왔다. 검색어 제안 목록에서도 유추해 볼 수 있지만, 호피티가 아닌 호피 티셔츠의 부분 일치..
DDD와 JPA의 Entity DDD와 JPA에는 엔티티(Entity)라는 같은 이름이 나온다. 그 엔티티라는 이름이 동일하다 보니 그 역할과 개념이 섞이게 된다. 웹에서 검색해보면 아와 같이 설명하는 경우가 있는데 언듯보면 비슷하다. DDD에서의 Entity: 비즈니스 도메인 관점에서 문제를 해결하기 위한 객체입니다. 엔티티의 정체성(identity)는 ID로 표현됩니다. JPA에서의 Entity: javax.persistence 패키지의 @Entity라는 애너테이션이 붙어있다. Persistence, 즉 데이터베이스와 매핑이 되는 객체이다. 식별이 가능한 키, 즉 @Id 필드가 필요하다. 실전에서는? ID라는 비슷한 개념을 가지고 있기에 JPA의 엔티티가 비즈니스 로직에 침범하는 것을 자주 봤다. 심지어 Repository를 넘어..
구글 설문지 벤치마킹 2021-05-26 현재 시점을 기준으로 구글 드라이브 내의 공식 지원 컨텐츠는 4가지 유형이 있다. Google Forms (설문지) Google Sheets (스프레드 시트) Google Slides (프레젠테이션) Google Docs (문서) 하지만 Drive for Developers 문서를 보면 위의 서비스는 Google Drive와 같은 계층으로 있음을 알 수 있다. UI 빈 설문지를 만들면 아래와 같다. 문서라는 개념을 담고 있어서 문서, 스프레드 시트, 프레젠테이션, 설문지 공통적으로 제목이 있다. 제목을 바꾸면 설문지의 제목도 같이 바뀐다. 설문지 구조 (ref) 구글 설문지는 제목, 설명, 질문들의 폼 목록으로 구성되어 있다. title description a list of form..