두 대 이상 서버에서 한 번만 스케쥴링 작업 호출하기
개요 특정 주기로 단 한 번만 호출되어야하는 기능이 있다고 해보자. 예를 들어 30분 마다 예약된 메시지가 있는지를 검사하고 예약된 메시지가 있다면 사용자에게 단 한번만 메시지를 전송해야한다. 이를 가볍게 표현하면 다음과 같다. @Transactional void runReservation() { ReservationTime reserv...
개요 특정 주기로 단 한 번만 호출되어야하는 기능이 있다고 해보자. 예를 들어 30분 마다 예약된 메시지가 있는지를 검사하고 예약된 메시지가 있다면 사용자에게 단 한번만 메시지를 전송해야한다. 이를 가볍게 표현하면 다음과 같다. @Transactional void runReservation() { ReservationTime reserv...
들어가며 로깅은 개발할 때 의도한 대로 동작하는지 확인할 수 있는 좋은 방법이다. 나아가 운영할 때 요청이 어떻게 왔는지 그 요청에서 데이터들이 어떤 상호작용을 했는지 확인할 수 있다. 그렇다고 로깅을 너무 많이 남기면 로그파일에서 원하는 데이터를 검색하는데 시간이 아주 오래 걸릴 수 있다. 의도하지 않은 로깅 이러한 사실을 잘 알고 있다고 하더...
들어가며 최근에 코틀린에서 간단한 배치 작업을 하다가 ItemProcessor <I,O> 에서 I 에 in 키워드를 O 에 out 키워드를 사용한 사례를 접했는데 이러한 in, out 키워드는 무엇이고 왜 사용할까? 타입 변성 in , out 키워드를 알기 위해서는 재네릭에서 타입이 다른 타입과 어떻게 관계를 맺는지 , 특히 타입 ...
들어가며 어느 날 A 관리자가 관리하고 있는 감자빵 상품의 이름을 “감자빵”에서 “가장 맛있는 감자빵”으로 수정하고 운영환경에 반영된 모습까지 확인한 뒤 업무를 마무리했다. 하지만 그날 저녁 감자빵 판매자가 요구했던 “가장 맛있는 감자빵” 으로 상품 이름이 노출되기를 바랬는데 반영되지 않고 “감자빵”으로 노출되고 있다고 문의가 들어왔다. 관리자 A ...
들어가며 컨트롤러에서 요청에 대한 validation 을 할 때는 다음과 같이 요청 객체 필드에 jakarta.validation.constraints 어노테이션을 추가해주고 메서드 파라미터 요청 객체에 @Valid 어노테이션을 사용해주는 방법을 사용한다. @Getter @AllArgsConstructor @ToString public class Pe...
들어가며 여차저차해서 Feign Client 를 도입하기로 결정했다면 어떻게 사용하고 어떤 설정들이 있는지 알아보자. Feign Client 란 Feign 은 선언적 웹 서비스 클라이언트 라이브러리로 HTTP 서비스 호출을 인터페이스와 애노테이션을 통해 정의할 수 있으며, Feign이 이를 구현하여 실제 서비스 호출을 처리하는 방식으로 동작한다. R...
들어가며 다음과 같이 Entity 를 조회만 했는데 update 쿼리를 만난 이야기를 다루고자한다. @Service @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; @Transactional ...
들어가며 정말 읽기만 하는 경우 @Transactional(readOnly=true) 로 읽기 전용 트랜잭션을 사용하여 플러쉬를 호출하지 않음으로써 어느 정도의 성능 최적화를 어느정도 이뤄낼 수 있다. 또는 읽기 전용 DB 에 쿼리를 보내기 위해 @Transactional(readOnly=true) 를 사용하여 라우팅 하기도 한다. 읽기 트랜잭션에...
들어가며 외부 모듈과 통신하는 로직 테스트는 외부 모듈이 제어할 수 없는 영역이므로 모킹 하여 외부 모듈에 대한 응답을 지정한 뒤 진행하기도 한다. 이때 외부 모듈이 실제로 기대한 응답을 내려줄 것이라는 것은 어떻게 테스트해 볼 수 있을까? 예를 들어 레디스에서 특정 키에 대해 특정 값을 응답할 것이라는 것을 모킹을 통해 응답 지정하여 로직을 테스트...
들어가며 자바에서 equals() ,hashcode() 를 재정의하는 이유는 무엇일까? 생성한 객체의 동일성 수준의 같음을 넘어 동등성 수준의 같음을 원하기 때문이다. 여기서 동일성은 실제로 참조가 같은 객체를 가르키고 있는 경우를 말하며 동등성은 도메인 규칙에 의해 같은 객체이다라고 판단하는 기준을 말한다. 그리고 equals() ,hashcod...