impati

OAuth 로그인은 왜 state가 필요할까?

들어가며 OAuth 로그인은 하나의 요청으로 끝나지 않는다. 사용자는 서비스에서 로그인을 시작하고, 인증 제공자의 화면으로 이동해 인증한 뒤, 다시 서비스의 콜백 주소로 돌아온다. 서비스는 이때 전달받은 인가 코드(authorization code)를 토큰으로 교환한다. 기존 구현은 콜백에서 인가 코드만 받으면 바로 토큰 교환을 시도했다. 코드는 ...

중복을 왜 해결할까?

들어가며 어플리케이션을 개발하다 보면 꽤 자주 중복된 코드를 작성하게 되고 이미 작성된 로직에서 중복된 코드를 보는 것도 어려운 일이 아니다. 중복된 코드를 보면 클래스를 새로 정의해서 중복된 코드를 모아 새로 정의한 클래스를 사용하도록 하여 중복 로직을 해결하거나 여러 가지 디자인 패턴들을 사용하여 중복된 코드를 한곳으로 모은다. “중복 해결...

두 대 이상 서버에서 한 번만 스케쥴링 작업 호출하기

개요 특정 주기로 단 한 번만 호출되어야하는 기능이 있다고 해보자. 예를 들어 30분 마다 예약된 메시지가 있는지를 검사하고 예약된 메시지가 있다면 사용자에게 단 한번만 메시지를 전송해야한다. 이를 가볍게 표현하면 다음과 같다. @Transactional void runReservation() { ReservationTime reserv...

로그 필터링하기

들어가며 로깅은 개발할 때 의도한 대로 동작하는지 확인할 수 있는 좋은 방법이다. 나아가 운영할 때 요청이 어떻게 왔는지 그 요청에서 데이터들이 어떤 상호작용을 했는지 확인할 수 있다. 그렇다고 로깅을 너무 많이 남기면 로그파일에서 원하는 데이터를 검색하는데 시간이 아주 오래 걸릴 수 있다. 의도하지 않은 로깅 이러한 사실을 잘 알고 있다고 하더...

트랜잭션 범위를 넘어선 동시 수정 문제

들어가며 어느 날 A 관리자가 관리하고 있는 감자빵 상품의 이름을 “감자빵”에서 “가장 맛있는 감자빵”으로 수정하고 운영환경에 반영된 모습까지 확인한 뒤 업무를 마무리했다. 하지만 그날 저녁 감자빵 판매자가 요구했던 “가장 맛있는 감자빵” 으로 상품 이름이 노출되기를 바랬는데 반영되지 않고 “감자빵”으로 노출되고 있다고 문의가 들어왔다. 관리자 A ...