본문 바로가기

Spring boot: HttpMessageConverters 는 누가 만들어줄까? RestTemplate 에 대해 통합 테스트를 만드는 과정에서 HttpMessageConverters 빈이 없다고 에러가 났다. 그러면 이 HttpMessageConverters 빈은 누가 만들어주고 있었을까? 스프링 부트에는 여러 Auto Configuration 이 있는데 HttpMessageConvertersAutoConfiguration 가 해주고 있었다. package org.springframework.boot.autoconfigure.http; @Configuration @ConditionalOnClass(HttpMessageConverter.class) @AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.c..
Google: 북마크 서비스 중단 공지 공지가 나온 것은 아직 못보았지만 서비스 위에 배너가 떴다. 2021년 9월 30일 이후에는 Google 북마크가 더 이상 지원되지 않습니다.
아마존 vs 쿠팡 - 밀어서 주문하기 쿠팡에 입사하고 나서 쿠팡이 아마존을 따라하는 게 많다고 듣고 들었다. 지금은 쿠팡에 다니지 않지만 고객의 입장으로 서비스를 사용하다 보면 카피캣이라 할 정도로 비슷한 게 많다. 밀어서 주문하기 쿠팡 아마존 쿠팡의 내부 보도자료에 따르면 따라했다고 순순히 인정하는 내용이 들어가 있다. 원터치 또는 원클릭결제는 아마존이나 애플 등 실리콘밸리 기업들이 보편적으로 사용하는 결제 방식이다. 하지만 국내에서는 그 사례를 찾아 보기가 힘들었다. 쿠팡은 발상을 전환해 국내에서 처음으로 원터치 결제를 도입할 수 있었다.
[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는 다른 팀이 담당하고 있어서..