개발 무지렁이

[Spring Boot] 프로필 이미지 업데이트와 캐시 본문

Backend/스프링부트

[Spring Boot] 프로필 이미지 업데이트와 캐시

Gaejirang-e 2022. 12. 25. 14:55

캐시를 거치면 프로필 이미지 갱신이 바로 되지 않는다


URL의 쿼리스트링에 난수값을 주어 캐시를 거치지 않게 만든다.

[MemberContext.java]

@Getter
public class MemberContext extends User implements OAuth2User {
    private final Long id;
    public MemberContext(Member member, List<GrantedAuthority> authorities) {
        super(member.getUsername(), member.getPassword(), authorities);
        this.id = member.getId();
    }
    public String getProfileImgRedirectUrl() {
        return "/member/profile/img/" + getId() + "?random=" + UUID.randomUUID();
    }
}
<img th:src="@{${#authentication.principal.profileImgRedirectUrl}}">

캐시를 거치지 않으면 똑같은 요청에 매번 통신을 해야한다.


회원정보 수정날짜를 캐시키로 사용하여 회원정보가 바뀔때만 URL이 바껴 캐시를 거치지 않도록 만든다.
(평소에는 캐시를 거치고)

[MemberContext.java]

@Getter
public class MemberContext extends User implements OAuth2User {
    private final Long id;
    @Setter
    private LocalDateTime modifyDate;

    public MemberContext(Member member, List<GrantedAuthority> authorities) {
        super(member.getUsername(), member.getPassword(), authorities);
        this.id = member.getId();
        this.modifyDate = member.getModifyDate();
    }

    public String getProfileImgRedirectUrl() {
        return "/member/profile/img/" + getId() + "?cacheKey=" + getModifyDate().toString();
    }
}

[MemberController.java]

@Controller
@RequestMapping("/member")
@RequiredArgsConstructor
public class MemberController {
    private final MemberService memberService;

    @PreAuthorize("isAuthenticated()")
    @PostMapping("/modify")
    public String modify(@AuthenticationPrincipal MemberContext context, String email, MultipartFile profileImg, String profileImg__delete) {
        Member member = memberService.getMemberById(context.getId());
        if ( profileImg__delete != null && profileImg__delete.equals("Y") ) {
            memberService.removeProfileImg(member);
        }

        memberService.modify(member, email, profileImg);

        // 기존에 세션에 저장된 MemberContext 객체의 내용을 수정하는 코드 시작
        context.setModifyDate(member.getModifyDate());
        Authentication authentication = new UsernamePasswordAuthenticationToken(context, member.getPassword(), context.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
        // 기존에 세션에 저장된 MemberContext 객체의 내용을 수정하는 코드 끝

        return "redirect:/member/profile";
    }
}
Comments