[Spring Boot] Spring Batch란 무엇인가
·
Web/Spring Boot
이커머스 프로젝트중 상점에서 판매량 통계를 볼 수 있으면 좋겠다는 생각이들어 Spring Batch를 이용해 보기로하였다하지만 Spring Batch는 대량의 데이터를 일괄적으로 처리하기위한 라이브러리라는 것만 알고 있어 먼저 학습을 해보려고한다Spring Batch 란?Spring Batch는 대량의 데이터를 일괄적으로 처리하고 반복적인 배치 작업을 효과적으로 수행할 수 있도록 설계된 프레임워크이다스케줄러와 달리 배치 작업을 관리하는데 초점을 맞추고 있어 보통 스케줄러와 함께 사용해 일정한 주기마다 배치 작업을 수행한다Spring Batch와 스케줄러는 다르다Spring Batch의 구성Spring Batch는 크게 Job과 Step으로 구성된다JobJob은 배치 작업의 단위이며 하나 이상의 Step으..
[MySQL] 데드락(DeadLock)이 발생하는 원인
·
Database
프로젝트를 진행하면서 동시성 문제를 해결하고자 낙관적 락을 설정하고 여러 사용자가 동시에 요청하는 상황을 만들어보았는데데드락이 발생하여 왜 그런가에 대해 알아보았다데드락이 발생한 글 [이커머스 프로젝트] DB 동시성 문제 해결하기 - 2 (낙관적 락 적용)이번엔 실제 프로젝트에 락을 적용해보려고한다비관적 락을 적용해야할지 낙관적 락을 적용해야할지 판단이 잘 서질않는다과연 이 프로젝트가 실제로 서비스된다면 충돌이 잦을지 적을지 잘mrxx.tistory.com 데드락이란?데드락이란 여러개의 트랜잭션이 교착 놓여 서로 락을 취득하고자 무한정 대기하는 상황이다다음 4가지 조건이 모두 성립할때 발생한다 1. 상호 배제- 자원은 한번에 한 프로세스만 사용 할 수 있어야한다2. 점유 대기- 최소 하나의 자원을 사용중..
[Java] instanceof과 isAssignableFrom()의 차이점
·
Coding/Java
프로젝트 리팩토링을 진행하며 isAssignableFrom() 이란 메서드를 처음 보고 궁금해 찾아보니instanceof와의 차이점이있는 메서드다class A {}class B extands A {}A 클래스가 있고 A를 상속한 B 클래스가 있을때instanceofclass Main { public static void main(String[] args) { A a = new A(); B b = new B(); b instanceof A // true a instanceof B // false b instanceof B // true a instanceof A // true }}instanceof는 해당 객체가 해당 타..
[이커머스 프로젝트] 주문 로직 - 리팩토링 5 (오류발생)
·
Web/Spring Boot
이전에 주문 로직을 리팩토링하며 추상클래스를 추가하였는데 프로젝트 실행이 되지않는다리플렉션을 사용해서 전략들을 매핑하는 OrderStrategyProvider에서 out of bounds 예외가 터졌다오류 발생@Componentpublic class OrderStrategyProvider { private final Map, OrderStrategy> strategyMap = new HashMap(); public OrderStrategyProvider(List> orderStrategies) { for (OrderStrategy strategy : orderStrategies) { Class targetClass = AopUtils.getTargetClass(..
[이커머스 프로젝트] 주문 로직 - 리팩토링 4 (공통 부분 통합)
·
Web/Spring Boot
먼저 기존의 전략 패턴을 사용한 주문 로직을 살펴보겠다기존 코드public interface OrderStrategy { Order createOrder(T orderRequest, Member member, Address address) throws CustomException;}@Component@RequiredArgsConstructorpublic class CartOrderStrategy implements OrderStrategy{ private final CartItemRepository cartItemRepository; private final OrderItemFactory orderItemFactory; private final ProductVariantService..
[이커머스 프로젝트] DB 동시성 문제 해결하기 - 3 전체 로직 수정
·
Web/Spring Boot
동시성 문제 해결을 위해 낙관적 락을 적용하던 중 한가지 문제가 생겼다지금은 상품을 주문할때만 락을 적용하였지만 이 뿐만이아닌 주문취소, 재고변경 등 재고를 수정하는 경우에 충돌이 발생할 수 있기 때문에이 경우도 재시도를 진행하도록 설정해야한다문제점재고 변경public ProductVariant updateProductStock(Long productVariantId, UpdateProductStockRequest request, Member member) throws CustomException { ProductVariant productVariant = getProductVariantWithMember(productVariantId); productVariant.getProduct().ge..
[이커머스 프로젝트] DB 동시성 문제 해결하기 - 2 (낙관적 락 적용)
·
Web/Spring Boot
이번엔 실제 프로젝트에 락을 적용해보려고한다비관적 락을 적용해야할지 낙관적 락을 적용해야할지 판단이 잘 서질않는다과연 이 프로젝트가 실제로 서비스된다면 충돌이 잦을지 적을지 잘 모르겠다일반적인 상황이라면 충돌이 비교적 적다고 생각되고특수한 상황 예를들어 선착순 이벤트, 대형 세일 기간 등등.. 이라면 충돌이 많아질것같은데 어떻게 해야할지 모르겠다일단 비관적 락을 적용하는것은 비교적 간단하니 낙관적 락을 적용하기로 하였다낙관적 락 적용@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@AllArgsConstructorpublic class ProductVariant { @Id @GeneratedValue(strategy = Gene..
[이커머스 프로젝트] DB 동시성 문제 해결하기 - 1
·
Web/Spring Boot
이번엔 동시성 문제를 해결해보자 한다동시성 문제란여러 사용자가 동일한 데이터를 처리하려할때 발생하는 문제이다 재고가 10개 남아있는 상황에서 사용자 두명이 동시에 주문을 진행하는 상황일때사용자 1 -> 재고 조회 10개사용자 2 -> 재고 조회 10개사용자 1 -> 상품 1개 주문 (재고 1 감소)사용자 2 -> 상품 1개 주문 (재고 1 감소)총 재고 9 이렇게 원래대로라면 재고가 8개 남아있어야 정상이지만 덮어씌여져서 재고가 9개가 남게된다왜 이런 문제가 발생하냐DB 트랜잭션 격리수준이 낮을경우 그렇다 DB 격리 수준READ UNCOMMITTED: 다른 트랜잭션이 아직 완료되지 않은 데이터를 읽음READ COMMITTED: 다른 트랜잭션의 완료된 데이터만 읽음.REPEATABLE READ: 같은 데이..
[이커머스 프로젝트] 주문 로직 - 리팩토링 3 (문제 발생)
·
Web/Spring Boot
이전글에서 이어지는 내용[이커머스 프로젝트] 주문 로직 - 리팩토링 2 (제네릭과 리플렉션) [이커머스 프로젝트] 주문 로직 - 리팩토링 2 (제네릭과 리플렉션)이전글에서 이어지는 내용[이커머스 프로젝트] 주문 로직 - 전략 패턴 적용(리팩토링) [이커머스 프로젝트] 주문 로직 - 전략 패턴 적용(리팩토링)초기 코드현재 주문로직은 상품을 직접 주문하mrxx.tistory.com 문제 발생Caused by: java.lang.ClassCastException: class java.lang.Class cannot be cast to class java.lang.reflect.ParameterizedType (java.lang.Class and java.lang.reflect.ParameterizedType ..
[이커머스 프로젝트] 주문 로직 - 리팩토링 2 (제네릭과 리플렉션)
·
Web/Spring Boot
이전글에서 이어지는 내용[이커머스 프로젝트] 주문 로직 - 전략 패턴 적용(리팩토링) [이커머스 프로젝트] 주문 로직 - 전략 패턴 적용(리팩토링)초기 코드현재 주문로직은 상품을 직접 주문하는경우와 장바구니의 상품을 주문하는 경우로 나뉘어있다.상품을 직접 주문할때는 수량을 선택하여 주문하지만장바구니에 담긴 상품을 주문할때mrxx.tistory.com  문제점 발견이전에 전략패턴을 적용해보았는데 뭔가 잘못됨을 느꼇다public Order createOrderByProduct(OrderByProductRequest request, Member member) throws CustomException { Address address = addressQueryService.getAddress(request...
Junyoung.dev