728x90
0. 환경구성
1. Window용 Redis
1) https://github.com/tporadowski/redis 에서 Redis 설치
2) Redis 기본포트 (6379) 설정
3) 간편한 접속을 위한 Redis 경로 환경변수 Path 등록
4) Cmd에서 redis-cli 입력으로 localhost로 설정된 Redis 접속
2. Ubuntu용 Redis
1) sudo apt-get redis-server 로 Redis 설치
2) sudo vi/etc/redis/redis.conf 에서 최대 메모리 설정
maxmemory 1g // 최대 사용 메모리 1G 로 설정
maxmemory-policy allkeys-lru // 최대 메모리 초과 시 가장 오래된 데이터 삭제
3) redis-cli로 접속
1. Spring Boot 설정
1. Gradle 설치
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
2. application.properties(.yml) 설정
#redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
3. 코드 작성
1) CacheConfig.java
@Configuration
@RequiredArgsConstructor
public class CacheConfig {
private final RedisConnectionFactory redisConnectionFactory;
private final ObjectMapper objectMapper;
private final RedisConnectionFactory connectionFactory;
@Bean
public CacheManager redisCacheManager() {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory).cacheDefaults(redisCacheConfiguration).build();
}
}
2) RedisConfig.java
@Configuration
@RequiredArgsConstructor
public class RedisConfig {
@Value("${spring.redis.port}")
public int port;
@Value("${spring.redis.host}")
public String host;
private final ObjectMapper objectMapper;
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
return new LettuceConnectionFactory(redisStandaloneConfiguration);
}
}
3) MainApplication.java
- @EnableCaching 추가
@EnableJpaAuditing
@SpringBootApplication
@EnableCaching // 캐싱 활성화
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
4) TestService.java
- @Cachable 으로 필요 메서드에 캐싱 적용
- 호출될 때 마다 dbCount 인스턴스 값 증가로 구성
@Service
@RequiredArgsConstructor
public class EventService {
private static int dbCount = 0;
private final TestRepository testRepository;
@Transactional(readOnly = true)
@Cacheable(key = "#userId", value = "userId")
public List<TestResponse> findAllByUserId(String userId) {
List<Test> allByUserId = testrepository.findAllByUserId(userId);
dbCount++;
List<TestResponse> testResponses = new ArrayList<>();
allByUserId.forEach(test -> {
TestResponse testResponse = TestResponse.builder()
.id(test.getId())
.build();
testResponses.add(testResponse);
});
return testResponses;
}
public int getDbCount() {
return dbCount;
}
}
5) TestRestController.java
- 매핑하여 dbCount, dbRead 값 확인
@RestController
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/test")
public class TestRestController {
private static int dbRead = 0; // 실제 호출 값
private final TestService testService;
@GetMapping
public List<TestResponse> findByUserId(@RequestParam String userId) {
log.info("DB 호출");
dbRead++; // 실제 호출 값 증가
return testService.findAllByUserId(userId);
}
@GetMapping("/count")
public String dbCount() {
int dbCount = testService.getDbCount();
return "사용자 호출 횟수 : " + dbRead + " 실제 호출 횟수 : " + dbCount;
}
}
2. 적용 확인
1. 초기상태 dbCount 값은 당연 0 이다.
2. 처음 호출 시 증가한다.
3. 동일하게 다시 호출 시, 사용자는 호출됐지만 캐싱된 데이터를 사용했기때문에 실제 호출 횟수는 그대로이다.
3. Flow
'Spring' 카테고리의 다른 글
DBMS의 트랜잭션과 @Transactional (1) | 2022.09.23 |
---|---|
JPA와 Spring Data JPA (0) | 2022.04.24 |
[JPA] 더티 체킹 (Dirty Checking) (0) | 2022.04.08 |
[JPA] Bulk Insert 적용기 (0) | 2022.01.06 |