상품 목록 조회하기에서 pageable를 key 값으로 redis에 저장하고, 상품 상세 정보 보기에서 product id를 key 값으로 redis에 저장했다. TTL은 120초로 저장했고, 상품 등록시 상품 목록 조회하기 캐시 삭제 처리, 상품 주문시 상품 상세 정보 보기 캐시 삭제 처리를 했다.
RedisConfig
@RequiredArgsConstructor
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.expire}")
private int expire;
@Bean
public CacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration conf = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(
RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(
new GenericJackson2JsonRedisSerializer()))
.entryTtl(Duration.ofSeconds(expire));
return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(conf).build();
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration conf = new RedisStandaloneConfiguration();
conf.setHostName(this.host);
conf.setPort(this.port);
return new LettuceConnectionFactory(conf);
}
}
ProductService
@Override
@CacheEvict(value = "product", allEntries = true)
public void register(String token, ProductRegisterServiceForm form) {
@Override
@Cacheable(key = "#pageable", value = "product")
public List<ProductInfo> getProducts(Pageable pageable) {
@Override
@Cacheable(key = "#id", value = "productInfo")
public ProductInfo getProductInfo(Long id, String userIp) {
OrderedService
@Override
@Transactional
@CacheEvict(value = "productInfo", allEntries = true)
public void orderItems(String token, Integer point) {
최종적으로 구현한 기능들과 수정된 ERD를 Readme에 적용시켰다.
Readme
다양한 카테고리의 상품들을 구매 및 판매하는 커머스 서비스입니다.
SwaggerConfig
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.yjjjwww.yunmarket"))
.paths(PathSelectors.any())
.build().apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("쇼핑몰 프로젝트")
.description("다양한 카테고리의 상품들을 구매 및 판매하는 커머스 서비스입니다.")
.version("1.0")
.build();
}
}
컨트롤러 기능 설명은 @ApiModelProperty, 파라미터 설명은 @Parameter, Form이나 Dto 설명은 @ApiModelProperty 어노테이션을 사용했다.
Swagger UI
좋았던점 : 처음으로 다양한 사람들로부터 코드 리뷰를 받으며 프로젝트 진행을 했는데, 평상시 내가 자주하는 실수들이나 좋았던 코드 스타일을 피드백 받을 수 있어서 좋았다. 그리고 남의 코드를 보며 배워가는 것도 많아서 얻어 가는 게 많은 프로젝트였다. 또한 깃 관리를 하며 프로젝트 진행해서 깃 관리 하는 법도 공부할 수 있어서 좋았다.
아쉬웠던 점 : 프로젝트 기간 중에 시간 관리를 잘 못해서 프로젝트 후반부에 기능 구현을 급하게 해서 끝냈다. 원래는 배포까지 하는 게 목표였는데 EC2 인스턴스에서 ElasticSearch 실행이 계속 안되서 결국 배포는 하지 못했다. 프로젝트 일정 관리를 좀 더 꼼꼼하게 해야겠다는 생각을 했다.