마지막 접속일로부터 6개월간 서비스 이용이 없는 유저의 정보를 분리하여 보관한다.
먼저, 분리할 대상을 선별하기 위해 Spring Scheduler를 이용하여
MemberStatus를 SLEEPER 로 변경하기로 했다. (관리자 모두 동일)
배경
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년 이후인 경우
- 마지막 접속일이 1년 이전인 경우
정상적으로 작동하는 점을 확인할 수 있다.
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 : >=
출처: 빈코의 개발일지
반환된 memberId의 List를 forEach로 하나씩 꺼내 정보를 바꾸고, save하기는
너무 비효율적인 코드라 생각되어 queryDSL에서 Bulk 연산을 제공하는지 찾아봤다.
위 내용을 일부 수정하여 적용시킬 수 있을 것 같다.
테스트 코드를 작성해서 테스트하고 싶었는데,
먼저 임시 데이터를 넣어 정상적으로 작동하는지 테스트해 보았다.
먼저, memberId를 조회하고 조건에 해당하는 값을 찾아온다.
Bulk update가 진행된다.
성공~~