반응형

MySQL 8

[Spring] @Transactional(readOnly=true)에서 write 시 예외 좀 더 살펴보기

개발하던 도중 아래 에러를 만났다. The MySQL server is running with the --read-only option so it cannot execute this statement 에러 발생 원인은 @Transactional(readOnly=true) 어노테이션이 붙어진 메서드에서 save 로직을 했기 때문이다. 근데 이 readOnly 옵션에 대해 의견이 분분했다. 그래서 이번 기회에 조금 더 살펴보려 한다. 코드 쪽을 쭉 살펴보면서 분석해봤으며, 혼자서 분석해본 것이라 틀린 내용이 포함될 수 있다. 결론부터 말하자면 아래와 같다. H2 DB는 readOnly 무시됨. (정말 유명한 사실이다.) MySQL, MariaDB는 readOnly 시 락 걸고, 여기에 위배되는 로직 작성 시..

[DB] index_merge 비활성화를 통한 Using Intersect 쿼리 효율 개선 일지

MySQL을 사용하고 있는 사이드프로젝트 모카콩에서 아래 Slow Query를 발견했다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 select comment0_.comment_id as comment_1_2_, comment0_.created_time as created_2_2_, comment0_.modified_time as modified3_2_, comment0_.cafe_id as cafe_id6_2_, comment0_.content as content4_2_, comment0_.is_masked as is_maske5_2_, comment0_.member_id as member_i7_2_ from comment comment0_ left outer..

CS/Database 2023.07.28

[JPA] unique 동시성 이슈 해결 및 CountDownLatch 테스트 작성 (Feat. Unique Index)

사이드 프로젝트를 하면서 동시성 이슈를 만났다. 모바일 프론트 측에서 api 테스트를 하다가, 즐겨찾기 엔티티가 연달아 두 번 등록되는 이슈가 있었던 것이다. 그리고 즐겨찾기 엔티티는 repository에서 Optional과 같은 꼴로 반환되게 했기 때문에, 두 개 이상의 결과가 반환되면 NonUniqueResultException 가 발생한다. 이러한 동시성 이슈가 발생하는 데에는, 두 스레드가 거의 동시에 진행됐기 때문이다. 사실 트래픽이 조금이라도 많으면 이러한 동시성 이슈는 흔히 만날 수 있다. nGrinder로 save 관련 메서드에 수십개의 스레드로 테스트를 돌려보자. 아래 사진은 nGrinder로 회원가입 메서드를 수십개의 스레드로 5초동안 실행시킨 결과이다. 원래대로라면 같은 이메일, 같은..

[JPA] 프로젝트 동시성 이슈 해결을 위해 낙관적 락을 걸어보았다

롤링페이퍼 기반 서비스 플랫폼을 개발하던 중 아래 버그를 발견했다. ??? 대체 어떤 일이 일어난다는 거야... 하는 마음으로 같은 메시지를 막 광클했을 때 위와 같이 `에러가 발생했어요` 페이지가 뜨는 것을 발견했다. 해당 메시지에 좋아요를 광클하거나, 같은 계정으로 PC/모바일 등 다중 환경 접속 후 좋아요를 여러번 동시에 누르면 발생하는 버그였다. 즉, 동시성 이슈로 발생한 문제였다! 우리 서비스에서는 한 명의 회원이 같은 메시지에 좋아요를 2개 이상 누를 수 없다. 인스타나 페이스북처럼 좋아요가 눌러진 상태에서 좋아요를 또 누르면 좋아요 취소가 작동돼야 한다. 하지만 위와 같이 광클하는 경우에는 그 찰나에 같은 회원의 메시지 좋아요가 2개 들어가버린 것을 확인할 수 있었다. 상황을 그림으로 정리해..

[AWS] Mysql + 웹 애플리케이션 AWS에 자동 배포하기

스프링 웹 애플리케이션을 aws 인스턴스에 배포하는 방법은 지난 포스팅(329번 포스팅)에 작성했었다. 또, 자동 배포 스크립트를 생성하여 배포하는 방법도 334번 포스팅에 작성했다. https://kth990303.tistory.com/329 [AWS] AWS EC2를 이용하여 스프링 웹 애플리케이션 배포해보기 AWS는 아마존에서 개발한 클라우드 서비스 플랫폼이다. 여기서 클라우드 서비스란, IT 리소스(CPU, 메모리 등의 자원)를 인터넷으로 빌려주고 사용한 만큼의 비용을 받는 것을 의미한다. EC2는 Elasti kth990303.tistory.com https://kth990303.tistory.com/334 [AWS][Spring] Aws 우분투 인스턴스 웹 애플리케이션 자동 배포 스크립트 만들..

Infra/Aws 2022.06.08

[ERROR] Communications link failure (Docker + MySQL + Spring JdbcTemplate 연동 실패) 에러 해결

문제 상황 스프링 환경에서 도커를 이용한 mysql + JdbcTemplate으로 db 연동을 하는 과정에서 아래 에러가 발생했다. Spring 애플리케이션을 실행하는 도중에 히카리풀에서 에러를 뱉으면서 jdbc 연결이 안되는 현상이었다. 에러 메시지는 아래와 같다. com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure ... The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. ... Caused by: java.net.ConnectExcep..

Infra/Docker 2022.04.24

[Docker] 도커와 MySQL을 연동하여 사용하는 방법 (feat. IntelliJ)

우아한테크코스에서 웹과 db를 연동해야 하는 웹 체스 미션이 주어져서 도커를 사용하게 되었다. 도커(docker)는 애플리케이션을 편리하게 구축하고 배포할 수 있도록 기술들을 컨테이너로 관리하는 오픈 소스 플랫폼이다. 도커를 이용하면 사용자들의 로컬에 mysql이 깔려있지 않더라도 도커의 mysql을 이용하여 애플리케이션을 실행시킬 수 있으므로 환경에 구애받지 않고 편리하게 작동할 수 있게 해준다. 미션을 진행하면서 알게 된 도커 사용법을 간단하게 기록하려 한다. docker desktop을 설치하자 아래 홈페이지에서 도커를 설치하자. https://www.docker.com/get-started/ 나는 맥북 m1을 이용중이었기 때문에 빨간 박스로 칠한 부분을 클릭해주었다. docker 환경설정 프로젝트..

Infra/Docker 2022.04.23

[node.js] MySQL과 nodejs 연동을 위해 sequelize를 사용해보았다

오늘 또 오랜만에 node.js 공부를 하면서 먼가 새로운거를 배웠다. (아직 나 또한 배우는 단계로 일기처럼 쓴 포스팅이니, 무언가 정보를 얻어가기엔 좋지 않은 포스팅일 수도 있다...) 바로 sequelize라는 것인데 이게 무엇이냐? 바로 Spring에서의 Mybatis, JPA와 같은 ORM 중 하나이다! ???: Mybatis, JPA? ORM? 뭔소리냐..? 필자도 잘 모르는데 자바 스프링 먼저 공부했다고 깝죽댄다고 생각할 수 있는데, 혹시나 스프링 공부 먼저 한 사람들이 이 포스팅을 볼 때, 비유를 함으로써 더 이해하기 쉽게 설명하기 위함이었다. Sequelize가 뭐냐면, 일종의 ORM으로 ORM 뜻을 먼저 설명하자면, 객체(Object)와 관계형 데이터베이스(관계)(Relation)를 연..

JS/Node.js 2021.04.12
반응형