• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

벌크? 배치? update 쿼리 관련 질문입니다

22.07.30 23:03 작성 조회수 198

1

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

안녕하세요.
jpa 강의를 듣고 혼자서 게시판 만들면서 뚝딱거리고 있는 말하는 감자입니다.
 
만들고 있는 기능 중에, 게시글을 단건 조회하면 조회수 하나를 올리는 기능이 있습니다.
어차피 조회하면 DTO로 나가니까 엔티티 클래스에 수정메서드를 하나 만들어놓고 더티체킹으로 업데이트 쿼리를 날리는 식으로 만들었다가, 요청마다 업데이트 쿼리가 나가니까 성능상에서 좋지 않다고 판단했습니다.
게시판은 조회수가 돈과 직결되는 서비스가 아니라고 판단되어 즉각 반영이 아니라 지연 반영? 으로 i/o를 줄이려고 하고 있었습니다.
그래서 레디스에 모아뒀다가 10초마다 한 번씩 한꺼번에 업데이트하려고 구현하고 있는데요.
jpa 업데이트 쿼리 작성을 하는 방법을 잘 모르겠어서 질문 드립니다.
 
@Transactional
@Modifying
@Query("update Post p set p.hitCount = p.hitCount + :hitCounts where p.postId in :postIds")
void updatePostsHitCounts(@Param("postIds") List<Long> postIds, @Param("hitCounts") List<Long> hitCounts);
짜본 쿼리는 이렇습니다.
파라미터로 postIds (게시글 PK를 담은 목록리스트), hitCounts(게시글 각각의 올려줄 조회수 목록리스트) 를 받습니다.
postIds는 where... in 문법으로 하면 될 것 같은데,
set 다음의 구문에서 어떻게 쿼리를 짜야 제가 의도한대로 작동이 될 지 모르겠습니다.
 
그래서, 지금은 메모리에 적재해두었다가 10초마다 일괄 업데이트를 하긴 하는데 PK마다 하나씩 업데이트 해주는 방식을 사용하고 있습니다. 여전히 업데이트 쿼리가 너무 많이 나가는 것은 동일해서 고민하다가 질문 남깁니다.
 
jpa bulk update관련해서 검색해보니 insert 하는 내용만 많이 나와서 쓰기가 힘들더라구요
 
제가 질문을 잘 한지 모르겠네요. 부연설명이 필요하시면 말씀해주세요. 감사합니다!
 

답변 1

답변을 작성해보세요.

2

안녕하세요. 이창민님

각각의 게시글마다 데이터 숫자가 다르기 때문에 update 쿼리를 각각의 게시글 마다 별도로 수행해야 합니다.

감사합니다.