2024/05 (22) 썸네일형 리스트형 MySQL에서 의도치 않게 조회시 레코드에 S락을 거는 문제 지난 번 프로젝트에서도 그렇고 이번 프로젝트에서도 동시성을 테스트하는 상황에서 데드락이 발생했다. 데드락 발생 원인을 알고자 InnoDB 로그를 살펴보니, 의도치 않게 조회시 레코드에 S락을 걸면서 데드락이 발생한 것이었다. 이에 대해 더 자세히 알아보자.MySQL이 락을 거는 방식결론부터 말하자면 MySQL은 외래키 제약이 테이블에 정의되어 있으면 레코드 삽입, 수정, 삭제시에 해당 참조 레코드에 S락을 건다. 공식 문서에서는 다음과 같이 말한다.If a FOREIGN KEY constraint is defined on a table, any insert, update, or delete that requires the constraint condition to be checked sets shared.. 99클럽 코테 스터디 1일차 TIL: [프로그래머스] 베스트앨범 https://school.programmers.co.kr/learn/courses/30/lessons/42579 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr정렬 조건에 주의해야 하며, 그 외로는 해시를 사용하여 단순히 구현만 하면 되는 문제이다. 그런데 이렇게도 생각하고 저렇게도 생각해야 해서 간단한듯 좀 지저분하게 코드를 짠 거 같다.. 좀 더 효율적으로 풀 수 있는 방법이 생각나면 수정해야겠다. 그리고 항상 동적으로 배열 길이가 정해질 때, List에 값을 먼저 채운 후 list.size() 만큼의 크기의 배열을 선언하여 리스트 값을 배열로 옮기는 작.. 멀티 스레드 환경에서 @Transactional을 사용할 때 주의할 점 이 글에서 소개하는 내용은 동시성 환경을 테스트하기 위한 테스트 코드를 작성하던 중에 만난 문제이다. 문제우선 다음과 같이 동시성 환경을 테스트하기 위한 테스트 코드를 작성했다. 게시글인 post 엔티티를 save() 한 후10개의 스레드에서 해당 엔티티를 조회해와서 좋아요를 등록한다.@Transactional@SpringBootTestclass PostServiceTest { @Autowired private PostService postService; @Autowired private PostRepository postRepository; @Test @DisplayName("좋아요 등록 성공-한 사람이 동시에 여러번 좋아요를 눌러도 중복 저장되지 않아야 한다.") void .. 테스트 코드에서 @Transactional이 적용되지 않는 문제 상황 설명ScheduleService에 대한 테스트 코드를 작성하던 중에 다음 에러가 발생했다. Exception in thread "pool-5-thread-6" org.springframework.dao.InvalidDataAccessApiUsageException: Query requires transaction be in progress, but no transaction is known to be in progressCaused by: jakarta.persistence.TransactionRequiredException: Query requires transaction be in progress, but no transaction is known to be in progress찾아보니 트랜잭션.. 캐싱을 통한 인기글 조회 API 성능 개선 인기글 선별프로젝트에서 구현한 기능 중 인기글 조회 기능이 있다. 그런데 인기글 조회 API는 자주 호출된다는 특징이 있으므로, 캐싱을 적용해봤다. 인기글에 대한 캐싱을 적용하기 전에, 우선 인기글은 어떻게 정의할까? 인기글은 한시간 동안 조회수가 가장 많은 10개의 게시글이다. 그리고 인기글을 선별하기 위해 레디스를 사용했는데, 그 방식은 다음과 같다.게시글 조회시 조회수를 레디스에 반영한다.이때 레디스에 저장되는 데이터 형식은 다음과 같다.key: 날짜와 시간이 String 형태로 저장된다.value: 한시간 동안 조회된 게시글 id들이 sortes set 형태로 저장된다. 이때 정렬 기준은 조회수이다.다음 사진을 예로 들면, key는 "2024-05-09T16:00"가 되고, 그 값은 게시글 id.. RabbitMQ 메시지 브로커가 필요한 이유RabbitMQ는 AMQP(Advanced Message Queuing Protocol)라는 표준 프로토콜을 사용하는 메시지 브로커로, 송신자로부터 전달받은 메시지를 수신자로 전달해주는 중간 역할을 한다. 즉, 메시지 큐를 관리하고 애플리케이션 간에 메시지를 송수신할 수 있게 해준다. 그런데 이러한 메시지 브로커가 필요한 이유가 뭘까? 즉, 애플리케이션 간에 직접적인 통신이 아니라, 굳이 중간에 메시지 브로커를 두는 이유가 뭘까?비동기 처리를 통해 애플리케이션 간 결합도를 낮출 수 있다. 만약 메시지 브로커를 사용하지 않고 송신 측과 수신 측이 직접적으로 통신한다면 어떻게 될까? 동기적 통신의 경우, 송신 측은 수신 측에게 작업을 요청하고 요청에 대한 응답이 돌아올 때까지 블로.. 이전 1 2 3 다음