본문 바로가기

분류 전체보기38

[Clean Code] 3~4장. 함수 & 주석 03장. 함수 프로그램의 가장 기본적인 단위가 함수다. 이 장은 의도를 분명히 표현하는 함수를 어떻게 구현할 지, 함수에 어떤 속성을 부여해야 처음 읽은 사람이 프로글매 내부를 직관적으로 파악할 수 있는 지 등 읽기 쉽고 이해하기 쉬운 함수를 만드는 법에 대해 소개한다. 작게 만들어라! 첫번째 규칙은 함수를 작게 만드는 것이다. 그렇다면 얼마나 작게 만들어야 할까? if/else 문, while문 등에 들어가는 블록은 한 줄이어야 한다. 그러면 바깥을 감싸는 함수가 작아질 뿐 아니라, 블록 안에서 호출하는 함수 이름을 적절히 짓는다면 코드를 이해하기도 쉬워진다. 즉, 중첩 구조가 생길만큼 함수가 커져서는 안된다. 그러므로 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다. 한 가지만 해라! 함수.. 2022. 9. 17.
[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.