부트캠프

세 번째 팀 프로젝트 회고 - 쿠폰, 회원 등급 담당

달팽이포뇨 2023. 9. 22. 13:13
  • 기간: 2023.08.28 ~ 09.22
  • 개발환경: Java, Spring, AWS EC2/RDS/S3, Rabbit MQ
  • 의류 쇼핑몰
  • 백엔드 5명, 프론트엔드 5명이서 개발
  • 나의 역할: 쿠폰, 회원 등급 담당
  • 목표: 동시성 처리하기 - Lock 사용, synchronized 사용 등, Spring batch 사용해서 대용량 처리하기, JMeter로 성능 테스트하기

1. 동시성 문제 해결(쿠폰)

  •  synchronized 키워드
    •  Java에서 제공하는 키워드
    • 메소드 단위에 락이 걸리거나 서비스 인스턴스에 락이 걸리는 등 너무 큰 단위로 락이 걸려서 효과적이지 않았습니다.
    • 성능 이슈

cURL을 사용하여 동시에 쿠폰 3개 발급하는 것을 시도하였을 때는 성공하였습니다.

하지만,,

JMeter에서 100개의 리퀘스트로 테스트한 결과, 오류가 발생했습니다.
DeadLock이 발생했고,
중간에 데이터가 몇 개씩 빠져서 들어갔습니다.


다른 방법, JPA에서 Lock 걸기

  • 낙관적 락 - 기본적으로는 경합상황이 벌어지지 않는 것을 가정 - 커밋하고 충돌이 날 때, 해결하자! - 충돌나면 롤백 처리 - 버전 관리의 느낌
    • @Version, @Lock(LockModeType.OPTIMISTIC)
  • 비관적 락 - 항상 경합상황이 벌어진다고 가정 - 레코드에 락을 걸기
    • @Lock(LockModeType.PESSIMISTIC_WRITE) 등
  • 일반적으로는 낙관적 락이 성능이 좋지만, 경합이 많이 발생하고 재고 관리가 중요한 '동시에 많은 사용자가 쿠폰을 발급하는 경우' 에는 비관적 락이 더 적합하다고 판단하였습니다

비관적 락 적용 후

  • JMeter 테스트

  • mysql에 쿠폰 재고 99개로 설정
    • 100개 요청 -> 1개 실패, 99개 성공으로 예상

  • 비관적 락 적용 후에는 정상 작동하는 것을 확인하였습니다!

2. Scheduling & Spring Batch (회원 등급 조정, 유효기간 만료된 쿠폰 삭제)

 

  • 처음에는 @Schedule로 구현하였으나, 추후에 데이터가 많아진다면 @Schedule로 그때그때 한번에 대용량을 처리하는 것이 서버에 부담이 클 것 같아서 다른 방법을 찾아보았습니다.
  • Spring Batch를 활용하는 것이 트랜잭션 기능을 기본적으로 갖고 있고 대용량 처리에 적합하기에 좋다고 생각하여 해당 라이브러리를 사용하였습니다. 
  • https://mkwkw.tistory.com/103 (이번에 Spring Batch를 공부하면서 정리한 간단한 글입니다.)

출처: springjavatutorial.com

  • Spring Batch를 사용하는 2가지 방법(Tasklet, Chunk) 방식 중 Tasklet 방식을 선택해서 구현하였습니다.
  • Tasklet을 사용하는 것이 더 간단하고, 이 로직이 Chunk 지향 처리에서처럼 단계를 나누어서할만큼 복잡하다고 생각하지 않았습니다.
  • 아래는 유효기간 만료된 쿠폰 삭제하는 코드입니다.

  • Spring Batch 로직을 Scheduling 처리하였습니다.

  • 결과는 성공적이었습니다!

해당 사진은 회원 등급 조정 로직 처리한 사진이긴한데 유효기간 만료된 쿠폰 삭제도 성공하였습니다.

알게된 점

Lock의 종류가 많다는 점, Lock의 타입에도 종류가 많다는 점을 알게 되었습니다. 또한, 이번에 처음으로 JMeter로 부하 테스트를 해보았는데 새로운 세계였습니다. 조금 더 복잡한 상황을 가정하고 테스트를 더 해보고 싶어졌습니다.

 

개선해야할 점

멀티스레딩 환경에서의 테스트 코드를 잘 작성해보고 싶습니다.

 

느낀 점

동시성 처리 과정, Spring Batch 적용 과정이 쉽지는 않았지만 성공했다고 뜨는 초록색과, DB에 원하는대로 바뀌어있는 값, 스케줄링 처리로 특정 시간에 촤르륵 뜨는 로그들을 보니 굉장히 뿌듯했습니다. 그동안 경험해보고 싶었던 Lock과 Spring Batch, Scheduling을 구현해볼 수 있어서 좋았습니다.