Back-End34 [Clean Code] 1~2장. 깨끗한 코드 & 의미 있는 이름 01장. 깨끗한 코드 코드가 존재하리라 코드는 요구사항을 표현하는 언어이다. 요구사항에 더욱 가까운 언어를 만들 수 있으며, 요구사항에서 정형 구조를 뽑아낼 수 있다. 코드의 도움 없이 요구사항을 상세하게 표현하기는 불가능하다. : 코드는 정밀한 표현이다. 고도로 추상화된 언어나 특정 응용 분야ㅐ 언어로 기술하는 명세도 마찬가지로 코드이다. 프로그래밍 언어에서 추상화 수준은 점차 높아질 것 이다. 나쁜 코드 우리 모두는 좋은 코드가 중요하다는 사실을 안다. 버그가 남아있고, 프로그램이 죽는 횟수가 늘어나는 나쁜 코드 출시에 바빠 코드를 마음대로 짜고, 기능을 추가할 수 록 엉망이 되는 나쁜 코드 나중에 손보겠다고 한 코드는 돌아간다는 사실에 안도감을 느끼며 위로하게 되면서 고치지 않게 된다. 고로, 시작.. 2022. 9. 15. [재고시스템으로 알아보는 동시성이슈 해결방법] 3. Redis Distributed Lock 동시성 이슈 해결방법 이번 시간에는 Redis Distributed Lock을 활용한 해결방법을 알아보자. 해결법3. Redis Lettue setnex 명령어를 활용한 분산락 setnex 데이터베이스에 동일한 key가 없을 경우에만 저장 반환값 : 1, 0 1 : 성공 0 : 실패 spin lock 방식으로 실패시 처리로직을 구현해야한다. 다른 스레드가 lock을 소유하고 있다면 그 lock이 반환될 때까지 계속 확인하며 기다리는 것 Redission pub-sub 기반으로 Lock 구현 제공 실패에 따른 처리 로직을 구현할 필요가 없다. pub-sub인데 채널은 어떻게 정해지지? tryLock으로 락을 획득할 때 subscribe가 진행된다. 채널 이름은 Redis의 정보에서 뭔가 가져와서 하는 것 .. 2022. 8. 30. [재고시스템으로 알아보는 동시성이슈 해결방법] 3. Database Lock 동시성 이슈 해결방법 이번 시간에는 Database Lock을 활용한 해결방법을 알아보자. 해결법2. Database ( MySQL ) 데이터베이스의 락을 이용해 동시성 문제를 해결해보자 1. Pessimistic Lock (비관적 락) 자원 요청에 따른 동시성문제가 발생할 것이라고 예상하고 미리 락을 걸어버리는 방법론 트랜잭션의 충돌이 발생한다고 가정합니다. 하나의 트랜잭션이 자원에 접근시 락을 걸고, 다른 트랜잭션은 접근하지 못하도록 한다. 데이터베이스의 Shared Lock(공유, 읽기 잠금)이나 Exclusive Lock(배타, 쓰기잠금)을 사용한다. SELECT c1 FROM WHERE c1 = 10 FOR UPDATE (배타 잠금) 이는 레코드 락으로 인덱스 레코드에 락을 건다고 한다. Sha.. 2022. 8. 28. [재고시스템으로 알아보는 동시성이슈 해결방법] 2. Application Level에서의 해결법 동시성 이슈 해결방법 이번 시간에는 Application Level에서의 해결방법을 알아보자. 해결법1. Synchronized Java에서 지원하는 방법 ( 어플리케이션 단 ) 해당 키워드는 한 개의 스레드만 접근이 가능하도록 해준다. @Transactional public synchronized void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("재고가 존재하지 않습니다.")); stock.decrease(quantity); stockRepository.saveAndFlush(stock); } synchronized를 .. 2022. 8. 26. [재고시스템으로 알아보는 동시성이슈 해결방법] 1. 들어가며 재고 감소 로직 구현 재고시스템으로 동시성 이슈 해결법을 알아보자 Domain @Entity public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long productId; private Long quantity; protected Stock() { } public Stock(Long productId, Long quantity) { this.productId = productId; this.quantity = quantity; } public void decrease(Long quantity) { if (this.quantity < quantity) { throw new I.. 2022. 8. 24. JPA Fetch Join MultipleBagFetchException 이번 글에서는 프로젝트 중 발생한 MultipleBagFetchException에 대해 정리해보고자 한다. MultipleBagFetchException 프로젝트에서는 게시글이 위와 같은 모습으로 관계를 가지고 있다. 이에 게시글을 조회 시 post_image와 post_tag를 모두 fetch join하여 가져오면 한 방 쿼리가 되겠지~? 라며 fetch join을 한 후 테스트를 돌려보았는 데 MultipleBagFetchException 에러가 발생하였다. 왜 이러한 문제가 생겼나 찾아보니 fetch join하는 대상에 있었다. 먼저 여기서 말하는 Bag이란 무엇일까? A is an unordered collection, which can contain duplicated elements. That.. 2022. 8. 20. 이전 1 2 3 4 5 6 다음