전체 글
-
클린코드와 관심사의 분리프로젝트/법잘알 2024. 2. 4. 14:30
이번 프로젝트를 할 때 이전의 3개의 프로젝트를 보며 느낀점이 있다. 코드가 복잡하고 내가 다시 봐도 이해가 잘 안되는 것이었다. 코드의 중복이 굉장히 많았으며 관심사의 분리도 잘 이루어지지 않아서 service 계층에서 있어야 하는 비즈니스 로직이 컨트롤러에 있는 등 코드도 알아보기 힘들었으며 관심사의 분리도 잘 이루어지지 않았다. 나날이 코드 @GetMapping public GarmentResponseDto Garment(@RequestParam Double temp, @RequestParam Double uv, @RequestParam Double rain, @RequestParam Sex sex) { List outers = garmentService.findOuters(temp, uv, rai..
-
redis를 활용한 동시성 문제 해결 - 2. Redisson백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 4. 14:29
Redisson은 pub-sub 기반의 Lock으로 구현된다. pub-sub은 채널을 하나 만들고 lock을 가지고 있는 Thread가 lock을 해제할 때 lock을 획득하려고 하는 Thread에게 message를 보내주는 방식이다. 이번에도 터미널에서 도커환경으로 들어가는데, redis-cli를 2개 킨 사진이다. 왼쪽에서 subscribe ch1로 채널을 만든 다음에 오른쪽에서 ch1에게 hello라고 message를 보내는 방식을 코드로 구현해서 동시성 문제를 해결하겠다. 이전 포스팅에서의 Lettuce는 계속해서 획득을 시도하는 반면에 Redisson은 message가 오는 한 시점에만 획득을 시도하기 때문에 redis의 부하를 줄여준다는 장점이 있다. RedissonLockStockFacade..
-
redis를 활용한 동시성 문제 해결 - 1. Lettuce백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 4. 14:11
Lettuce 라이브러리는 setnx 명령어를 활용하여 분산락을 구현하는 방식이다. setnx 명령어는 key와 value를 set할 때 기존의 값이 없을 때에만 set을 하는 명령어이다. setnx를 이용하는 방식은 spin lock 방식이므로 retry 로직을 개발자가 직접 작성해야 한다. setnx에 대해 설명하기 위해 터미널에서 도커로 docker exec -it redis-cli를 통해 레디스에 접속해서 명령어를 입력했다. setnx 형태로 입력을 했는데, 처음의 setnx 1 lock은 key가 1인 값이 없기 때문에 1을 반환해준다. 그 이후에는 key가 1인 값이 존재하기 때문에 0을 반환해주고, del 1로 삭제한 다음에 setnx 1 lock을 하면 다시 1을 반환해준다. 위의 방식을 ..
-
mysql을 활용한 동시성 문제 해결 - 3. Named Lock백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 3. 16:55
3. Named Lock 이름을 가진 meta data lock이다. 이름을 가진 lock을 획득하고 해제할 때까지 다른 session은 이 lock을 획득할 수 없다. 트랜잭션이 종료될 때 자동으로 lock이 해제되지 않기 때문에 별도의 명령어로 해제해야만 한다. public interface LockRepository extends JpaRepository { // 편의를 위해서 Stock 엔티티를 사용하는데, 실무에서는 data source를 분리해서 사용해야 한다. // 같은 data source를 사용하면 connection pool이 부족해진다. @Query(value = "select get_lock(:key, 3000)", nativeQuery = true) void getLock(Stri..
-
mysql을 활용한 동시성 문제 해결 - 2. Optimistic Lock백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 3. 16:39
2. Optimistic Lock 실제로 lock을 이용하지 않고 버전을 사용해서 정확성을 맞추는 방법 위의 사진처럼 mysql에 version이 존재한다. 만약에 서버1과 서버2가 version이 1인 데이터를 가져간다고 가정하자. 이후에 서버1이 update를 하면서 version도 하나 올려준다. 다음에 서버 2가 version1인 데이터를 가지고 update를 시도하는데, 이 때의 version은 2이기 때문에 update가 실패하게 된다. 수정사항이 실패했기 때문에 application에서 다시 읽은 다음에 로직을 다시 수행한다. @Entity @Getter public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) ..
-
mysql을 활용한 동시성 문제 해결 - 1. Pessimistic Lock백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 3. 16:19
mysql을 활용한 동시성 문제 해결 1. Pessimistic Lock - 실제로 데이터에 Lock을 걸어서 정합성을 맞추는 방법이다. exclusive lock을 걸게되면 다른 트랜잭션에서는 lock이 해제되기 때문에 데이터를 가져갈 수 없게 되지만 데드락이 걸릴 수 있으므로 조심해야 한다. (데드락 : 두 개 이상의 프로세스나 스레드가 서로 상대방의 자원을 기다리면서 무한히 대기하는 상태) 2. Optimistic Lock - 실제로 Lock을 이용하지는 않지만 버전을 이용함으로써 정합성을 맞추는 방법이다. 데이터를 읽고 update를 하기 전에 내가 읽은 버전이 맞는지 확인하며 업데이트 한다. 내가 읽은 버전에서 수정 사항이 생겼을 때에는 application에서 다시 읽은 후에 작업을 수행한다...
-
재고 시스템에서 동시성 문제백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 3. 15:42
Stock 엔티티 @Entity @Getter public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long productId; private Long quantity; public Stock() { } public Stock(Long productId, Long quantity) { this.productId = productId; this.quantity = quantity; } public void decrease(Long quantity) { if (this.quantity - quantity < 0) { throw new RuntimeException("재고는 0개 미..
-
ai 활용 - 텍스트 분석 라이브러리와 생성형 ai의 사용프로젝트/법잘알 2024. 2. 2. 22:29
국회 공공데이터 활용 공모전 공고를 보고 프론트엔드 개발자인 과 동기와 바로 해보자는 얘기가 나왔다.하지만 공고를 늦게 확인해서 시간이 한 달밖에 남지 않았었고, 짧은 시간안에 ai 개발자를 구하기 힘들어서 백엔드 개발자인 내가 동시에 ai까지 구현해보게 되었다. 내가 ai 개발자가 아니기 때문에 유튜브와 구글링, 공식 문서등을 참고하며 개발을 해서 어려운 라이브러리의 코드를 한 줄 한 줄 이해하고 코딩한 것은 아니지만 최대한 원리를 이해하고 사용했다. 요즘은 많은 서비스에 ai 기술을 도입하는데, 백엔드와 ai 간의 호출이 어떻게 이루어지는지도 궁금했었는데 이번 기회에 직접 구현해보면서 백엔드 개발자로서 조금이나마 ai 기술을 이해하게 되었다. chanhee01/LawSearch_AI: 국회 공공데이..