휴면 계정 만들기

두주·2024년 3월 12일
0

TIL

목록 보기
58/58

학습 동기

마지막 접속일로부터 6개월간 서비스 이용이 없는 유저의 정보를 분리하여 보관한다.

먼저, 분리할 대상을 선별하기 위해 Spring Scheduler를 이용하여
MemberStatus를 SLEEPER 로 변경하기로 했다. (관리자 모두 동일)

  • 내용을 작성하던 중 게시판을 발급받은 스트리머가 휴면상태로 변경될 경우를
    생각해 봐야할 것 같다.

문제 해결

먼저 SQL문을 작성해 보았다.

  • 배경
    member테이블과, loginHistory테이블이 존재함

  • SQL

select social_member.id
from social_member
left join login_history on social_member.id = login_history.member_id
and login_history.created_at >= now() - interval '1 year'
where login_history.member_id is null;
  1. member 테이블에서 모든 사용자를 대상으로 검증한다.
  2. loginHistory를 leftjoin으로 가져와 로그인 기록을 확인한다.
  3. 1년 사이 loginHistory가 있는 경우에만 로그인 기록을 가져온다.
  4. 1년 사이 loginHistory가 없는 경우에는 null이니까, 해당 값을 가져온다.

정상적으로 작동할까?

  1. 마지막 접속일이 1년 이후인 경우

  1. 마지막 접속일이 1년 이전인 경우

정상적으로 작동하는 점을 확인할 수 있다.

이걸 어떻게 QueryDSL에서 쓰지?

queryFactory
            .select(member.id)
            .from(member)
            .leftJoin(loginHistory)
            .on(member.id.eq(loginHistory.memberId.id),
            loginHistory.createdAt.goe(baseSleeperTime))
            .where(loginHistory.memberId.isNull)
            .fetch()

lt : <
loe : <=
gt : >
goe : >=

Bulk 연산하기


출처: 빈코의 개발일지

반환된 memberId의 List를 forEach로 하나씩 꺼내 정보를 바꾸고, save하기는
너무 비효율적인 코드라 생각되어 queryDSL에서 Bulk 연산을 제공하는지 찾아봤다.

위 내용을 일부 수정하여 적용시킬 수 있을 것 같다.

테스트 검증

테스트 코드를 작성해서 테스트하고 싶었는데,
먼저 임시 데이터를 넣어 정상적으로 작동하는지 테스트해 보았다.

먼저, memberId를 조회하고 조건에 해당하는 값을 찾아온다.

Bulk update가 진행된다.

성공~~

profile
야옹.

0개의 댓글