Backend/스프링부트
[Spring Boot] 프로필 이미지 업데이트와 캐시
Gaejirang-e
2022. 12. 25. 14:55
캐시를 거치면 프로필 이미지 갱신이 바로 되지 않는다
[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}}">
캐시를 거치지 않으면 똑같은 요청에 매번 통신을 해야한다.
(평소에는 캐시를 거치고)
[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";
}
}