Java의 final은 불변성을 보장하지 않는다.
·
Backend/Java
Java의 final은 무엇인가?`final`은 '최종적' 이라는 의미를 가지는데, 자바에서 이는 초기값이 한번 정해지면 프로그램 실행 도중에 수정할 수 없음을 의미한다. 또한 이 `final` 은 변수, 메소드, 클래스에 붙을 수 있는데 각각 의미하는바가 달라진다.1. 클래스`final`이 붙은 클래스는 상속할 수 없다.public final class Car { } // final 클래스는 상속할 수 없다!public class Bus extends Car { }2. 메소드`final` 이 붙은 메소드는 오버라이딩 할 수 없다.public class Animal { public final void bark() { System.out.println("짖다."); }}public ..
자바와 스프링의 비동기 처리 - 2편: CompletableFuture의 예외 처리와 타임 아웃
·
Backend/Spring Boot
Introduce 자바와 스프링의 비동기 처리 - 1편: CompletableFuture 톺아보기Introduce 스프링에서 비동기 처리를 위해 흔히 `@Async` 를 사용하곤 한다.나 역시 프로젝트에서 `@Async` 를 적용하여 일부 후속 로직들을 메인 로직과 분리하여 실행하고 있었다. 그런데 얼마 전 면woojjam.tistory.com먼저 해당 글을 읽기 전에 이전 글을 읽고 오는것을 추천한다. `CompletableFuture` 는 비동기 작업을 간결하게 표현할 수 있게 도와주지만, 비동기 환경에서는 예외가 어디서, 어떻게 발생했는지 추적하거나 디버깅 하기도 어렵기에 이를 처리하는것이 쉽지 않다. 그렇다고 예외처리를 해놓지 않으면 다음과 같은 상황이 발생할 수 있다.비동기 로직 중 하나가 실패..
자바와 스프링의 비동기 처리 - 1편: CompletableFuture 톺아보기
·
Backend/Spring Boot
Introduce 스프링에서 비동기 처리를 위해 흔히 `@Async` 를 사용하곤 한다.나 역시 프로젝트에서 `@Async` 를 적용하여 일부 후속 로직들을 메인 로직과 분리하여 실행하고 있었다. 그런데 얼마 전 면접장에서 다음과 같은 질문을 받았다.@Async 로 실행된 메서드에서 예외가 발생하면 어떻게 처리하나요?혹시 CompletableFuture 를 사용해본 경험이 있으신가요? 나는 이 질문에 대해 명확하게 답변하지 못하였다. 제대로 답변하지 못하는 모습을 보니 스스로 내가 비동기에 대해서 잘 모르고 사용하는 구나라는 생각이 들었고, `CompletableFuture` 이 무엇인지 이해해보는 시간을 가지게 되었다. 이번 글에서는 java의 기본 비동기 처리 도구인 Future 를 알아보고, 이를 ..
스프링 이벤트를 발행하여 트랜잭션과 관심사 분리하기
·
Backend/Spring Boot
Introduce 내가 개발중인 서비스에서 특정 상품을 결제하면 FCM을 통해 결제한 유저에게 알림을 전송하는 비즈니스 로직이 있다.결제 내역을 바탕으로 사용자에게 알림을 전송해야 함으로 결제 처리와 알림 전송이 같은 트랜잭션에 묶이게 된다. 현재 비즈니스 로직의 흐름을 살펴보면 1. 사용자가 상품을 주문한다.2. 상품을 조회하고, 결제를 진행한다.3. 재고를 차감하고, 결제 내역을 저장한다.4. 결제가 완료되면 사용자에게 FCM을 전송하고, 알림내역을 저장한다. 다음과 같은 순서로 동작한다. 그리고 다음 로직들은 같은 트랜잭션으로 묶여있다. 결제는 외부 API를 통해 이루어진다. 그러므로 우리 서비스의 트랜잭션과는 무관하다.그런데 만약 FCM 알림 저장 과정에서 예외가 발생하면, 전체 트랜잭션이 롤백..
동시성 문제에 대한 고찰, 점진적으로 접근하기
·
Backend/Spring Boot
🔎 본 글을 읽기 앞서 해당 게시글을 먼저 참고 해주시길 바랍니다.해당 게시글은 추후 내용이 변경될 수 있습니다. 해당 게시글에서 설명하지 않는 사전 지식들은 이미 알고있다고 가정하고 작성된 글입니다. [DB] 트랜잭션과 동시성 제어Introduce결제 시스템을 구축하면서 동시성 문제를 경험한 적이 있다. 여러 사용자가 동시에 결제를 시도할 때, 예상하지 못한 데이터 불일치와 정합성 문제가 발생했으며, 이를 해결하기 위해 다woojjam.tistory.com일시설명25.03.08- 게시글 작성25.03.09- Synchronized 분산 테스트 추가25.03.16- Pesimistic Lock 내용 추가25.03.28- Optimistic Lock 내용 추가 및 데드락 추가 Introduce 회사에서 ..
공간 인덱스로 조회 속도 58배 향상시키기
·
Backend/MySQL
1. 들어가기전현재 좌표를 기준으로 주변 데이터들을 조회하는 기능을 개발하고자 한다.다음 그림처럼 원의 중간점을 현재 좌표로 설정하였다면 줌 레벨에 따라 반경 (X) Km의 원 내에 존재하는 데이터들을 조회하는 기능을 구현하고자 한다. 어렴풋이 공간 데이터, 공간 함수에 대해서 들어본적이 있었기에 현재 사용중인 데이터베이스인 MySQL의 공간 데이터, 공간 함수, 그리고 공간 인덱스를 통한 성능 개선을 해보고자 한다.2. 공간 데이터공간 데이터란 말 그대로 공간 정보를 저장할 수 있는 데이터베이스를 의미한다.다음 그림은 MySQL에서 제공하는 공간 데이터 타입이다.Point좌표 공간의 한 지점POINT(10 10)LineString다수의 Point를 연결해주는 선분LINESTRING(10 10, 20 2..