@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class MemberService {
private final MemberCacheService memberCacheService;
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
private final JWTUtil jwtUtil;
...
@Transactional(readOnly = true)
public String attemptLogIn(RequestLogInDto member) {
// DB에서 사용장 정보 가져 오기
ResponseMemberInfoDto db_member = getMemberInfo(member.getEmail());
// 비번 비교 로직, 토큰 생성
String token = null;
if(passwordEncoder.matches(member.getPassword(), db_member.getPassword())){
token = jwtUtil.createToken(db_member.getId(),db_member.getEmail(),db_member.getRole());
}else{
throw new LoginFailException("이메일이나 비밀번호가 틀렸습니다.");
}
return token;
}
@Transactional(readOnly = true)
@Cacheable(cacheNames = "memberCache", key = "args[0]")
public ResponseMemberInfoDto getMemberInfo(String email) {
Member member = memberRepository.findByEmail(email).orElseThrow(() -> new LoginFailException("사용자가 없습니다."));
ResponseMemberInfoDto m_info = new ResponseMemberInfoDto(member);
return m_info;
}
}
이렇게 코드를 작성했다.
하지만 attemptLogIn메서드를 실행하면 getMemberInfo를 실행하면서 캐싱을 줄거라 생각했다. 하지만 예상과 다르게 케싱은 안되었다.
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class MemberService {
private final MemberCacheService memberCacheService;
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
private final JWTUtil jwtUtil;
@Transactional
public Member createMember(RequestSignUpDto member){
UserRole role = UserRole.fromString(member.getRoleCode());
Member user;
if(memberRepository.existsByEmail(member.getEmail())){
throw new DuplicateKeyException("이미 가입한 이메일 입니다.");
}
user = Member.builder()
.email(member.getEmail())
.password(passwordEncoder.encode(member.getPassword()))
.username(member.getUsername())
.nickname(member.getNickname())
.role(role)
.build();
return memberRepository.save(user);
}
@Transactional(readOnly = true)
public String attemptLogIn(RequestLogInDto member) {
// DB에서 사용장 정보 가져 오기
ResponseMemberInfoDto db_member = memberCacheService.getMemberInfo(member.getEmail());
// 비번 비교 로직, 토큰 생성
String token = null;
if(passwordEncoder.matches(member.getPassword(), db_member.getPassword())){
token = jwtUtil.createToken(db_member.getId(),db_member.getEmail(),db_member.getRole());
}else{
throw new LoginFailException("이메일이나 비밀번호가 틀렸습니다.");
}
return token;
}
}
MemberCacheService.class
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class MemberCacheService {
private final MemberRepository memberRepository;
@Transactional(readOnly = true)
@Cacheable(cacheNames = "memberCache", key = "args[0]")
public ResponseMemberInfoDto getMemberInfo(String email) {
Member member = memberRepository.findByEmail(email).orElseThrow(() -> new LoginFailException("사용자가 없습니다."));
ResponseMemberInfoDto m_info = new ResponseMemberInfoDto(member);
return m_info;
}
}