이 게시물은 개발을 시작하는 사람들이라면 누구나 한 번 쯤은 만들어봤을 '게시판'에 대한 내용이다. 그 중에서도 게시판이라는 하나의 서비스를 만들기 위해, 점점 살을 붙이고 붙여서 완성해가면서 한 번 쯤은 고려해봤을 조회수에 대한 내용이다.
먼저, 조회수란?
사용자가 게시물을 한 번 클릭할 때, 해당 게시물의 조회수를 1씩 증가시키는 동작이다. 비즈니스 로직에 따라 다르겠지만 간단하게 알고리즘화를 하자면 다음과 같을 것 같다.
클릭 > 해당 게시물의 조회수 칼럼에 1증가 Update > 게시물 내용 프론트로 뿌리기(제목, 저자, 날짜, 조회수 등)
- UPDATE 구문을 통한 조회수 업데이트
클릭한 게시물 번호에 해당하는 게시물의 INQUIRY_CNT(조회수)칼럼에 1을 추가해주는 로직이다. 쿼리는 다음과 같다.
UPDATE HOME_BOARD_M
SET INQUIRY_CNT = INQUIRY_CNT + 1
WHERE BOARD_NO = #{BOARD_NO}
구글링을 통해 [조회수 증가] 키워드만 쳐도 나오는 블로그들의 대략 80% 정도는 위와 같은 로직으로 코드를 짠다. 나도 마찬가지다.
그래서 이게 뭐 문제 있는가?
문제가 있을 수 있다. 그 문제를 내가 겪었다. 실제로 홈페이지 개발/운영 업무를 맡은지(인수인계를 받은지) 어느덧 5개월차에 접어들었을 때 문제가 터졌다. 문제의 요지는 [LOCK으로 인한 페이지 성능 저하] 였다.
비즈니스 특성상 단순 조회성인 홈페이지에서 무슨 Lock?
장애가 발생했던 날짜에 자사에서 이벤트를 진행하였고, 그 이벤트를 확인하기 위해 동시 세션 접속 수가 6천명 이상이 지속적으로 방문하였다. 무엇보다 이벤트 게시물을 모두가 접속하려고 하니"수강신청 서버 터진거 같은데?"와 비슷한 현상으로 이어졌다. 회사 내 DBA 분들의 도움으로 TM LOCK 혹은 로우 락이라고 부르는 문제가 발생하였고, 쓰레드 풀에서 설정한 모든 쓰레드의 락이 해소되지 않고 있었다.
락이 걸린 쿼리가 바로 위에서 작성한 UPDATE 구문이다.
그래서 이 글은 문제를 해결하기 위한 삽질 연대기고, 그 첫 삽은 다음 게시물에 계속. (결말포함)
'Programming > Tips, Fix, Anything Else' 카테고리의 다른 글
[TFAE] 게시판 조회수를 올리는 다양한 방법(Insert) (0) | 2023.05.30 |
---|---|
[TFAE] 자바 main 메서드에서 static을 왜 쓰는걸까? (0) | 2022.02.28 |
[TFAE] JAVA SE, EE, ME 차이가 뭐야? (2) | 2022.02.25 |
[TFAE] 스프링부트 프로젝트 GitHub Action CI&CD연대기 - 2 (10) | 2022.02.18 |
[TFAE] 스프링부트 프로젝트 GitHub Action CI&CD연대기 - 1 (0) | 2022.02.17 |