Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

공지, 일기 가이드에 캐시 적용 #60

Merged
merged 3 commits into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ dependencies {
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
runtimeOnly 'com.h2database:h2'

// cache
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'com.github.ben-manes.caffeine:caffeine'

// S3
implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.1000')
implementation 'com.amazonaws:aws-java-sdk-s3'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,36 +45,23 @@ public TokenResponse signIn(SignInRequest request) {
String accessToken = jwtTokenProvider.createAccessToken(kindergarten.getId());
String refreshToken = jwtTokenProvider.createRefreshToken(kindergarten.getId());
Long expiration = jwtTokenProvider.getExpiration(refreshToken);

refreshTokenRepository.save(kindergarten.getId(), refreshToken, expiration);

return TokenResponse.from(accessToken, refreshToken);
}

@Override
@Transactional
public TokenResponse reissue(AuthInfo authInfo, ReissueRequest request) {
// 1. Refresh Token 검증
jwtTokenProvider.validateRefreshToken(request.getRefreshToken());

// 2. 인증정보
Long id = authInfo.getId();

// 3. Redis RefreshToken 조회
String refreshToken = refreshTokenRepository.findByUserId(id);
if (!refreshToken.equals(request.getRefreshToken())) {
throw new JwtException(MALFORMED_JWT);
}

// 3. 새로운 토큰 발급
String newAccessToken = jwtTokenProvider.createAccessToken(id);
String newRefreshToken = jwtTokenProvider.createRefreshToken(id);

// 4. Redis RefreshToken 업데이트
Long expiration = jwtTokenProvider.getExpiration(refreshToken);
refreshTokenRepository.save(id, newRefreshToken, expiration);

// 5. 토큰 반환
return TokenResponse.from(newAccessToken, newRefreshToken);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import java.util.List;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -33,18 +35,21 @@ public GuideServiceImpl(
}

@Override
@Cacheable(cacheNames = "gpt_guide")
public GuideResponses findGuides() {
return GuideResponses.from(guideRepository.findAll());
}

@Override
@Cacheable(cacheNames = "gpt_guide_detail")
public GuideDetailResponses findGuideDetails(Long guideId) {
List<GuideDetail> guideDetails = guideDetailRepository.findAllByGuideId(guideId);
return GuideDetailResponses.from(guideDetails);
}

@Override
@Transactional
@CacheEvict(cacheNames = "gpt_guide_detail")
public GuideDetailSaveResponse createGuideDetail(
Long guideId,
GuideDetailSaveRequest guideDetailSaveRequest
Expand All @@ -57,6 +62,7 @@ public GuideDetailSaveResponse createGuideDetail(

@Override
@Transactional
@CacheEvict(cacheNames = "gpt_guide_detail")
public void deleteGuideDetail(Long guideId, Long detailId) {
Guide guide = getGuideById(guideId);
GuideDetail guideDetail = getGuideDetailById(detailId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.List;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -20,7 +21,9 @@ public NoticeServiceImpl(NoticeRepository noticeRepository) {
}

@Override
// @Cacheable(cacheNames = "notice")
public NoticeResponses findNotices() {
System.out.println("캐시 이용 전");
List<Notice> notices = noticeRepository.findAllByOrderByCreatedAtDesc();
return NoticeResponses.from(notices);
}
Expand Down
37 changes: 37 additions & 0 deletions src/main/java/com/meommu/meommuapi/global/cache/CacheConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.meommu.meommuapi.global.cache;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.github.benmanes.caffeine.cache.Caffeine;

@Configuration
@EnableCaching
public class CacheConfig {

@Bean
public List<CaffeineCache> caffeineCaches() {
return Arrays.stream(CacheType.values())
.map(cache -> new CaffeineCache(cache.getCacheName(),
Caffeine.newBuilder().recordStats()
.expireAfterWrite(cache.getExpiredAfterWrite(), TimeUnit.SECONDS)
.maximumSize(cache.getMaximumSize())
.build()))
.toList();
}

@Bean
public CacheManager cacheManager(List<CaffeineCache> caffeineCaches) {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(caffeineCaches);
return cacheManager;
}
}
32 changes: 32 additions & 0 deletions src/main/java/com/meommu/meommuapi/global/cache/CacheType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.meommu.meommuapi.global.cache;

public enum CacheType {

NOTICE("notice", 60 * 60, 10000),

GPT_GUIDE("gpt_guide", 60 * 60, 10000),

GPT_GUIDE_DETAIL("gpt_guide_detail", 60 * 60, 10000);

private final String cacheName;
private final int expiredAfterWrite;
private final int maximumSize;

CacheType(String cacheName, int expiredAfterWrite, int maximumSize) {
this.cacheName = cacheName;
this.expiredAfterWrite = expiredAfterWrite;
this.maximumSize = maximumSize;
}

public String getCacheName() {
return cacheName;
}

public int getExpiredAfterWrite() {
return expiredAfterWrite;
}

public int getMaximumSize() {
return maximumSize;
}
}
Loading