스프링 쇼핑몰 프로젝트 마무리

윤장원·2023년 6월 5일
0

쇼핑몰프로젝트

목록 보기
5/5

상품 조회하기 캐싱 처리 구현(Redis)

상품 목록 조회하기에서 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) {

Readme 작성

최종적으로 구현한 기능들과 수정된 ERD를 Readme에 적용시켰다.

Readme

다양한 상품을 구매/판매하는 커머스 프로젝트

다양한 카테고리의 상품들을 구매 및 판매하는 커머스 서비스입니다.


프로젝트 기능 및 설계

  • 회원가입
    • 구매자/판매자 나누어서 회원가입한다. 구매자는 CUSTOMER 권한을, 판매자는 SELLER 권한을 지닌다.
    • 회원가입시 이메일과 패스워드를 입력받으며, 아이디는 unique 해야한다.
  • 로그인
    • 로그인시 JWT 토큰을 발급한다.
    • 로그인시 회원가입 때 사용한 이메일과 비밀번호가 일치해야 한다.
  • 상품 등록하기
    • SELLER 권한을 가진 판매자는 판매할 상품을 등록할 수 있다.
    • 상품 이름, 카테고리, 가격, 설명, 수량을 등록해야 한다.
  • 상품 조회하기
    • 로그인하지 않은 사용자를 포함한 모든 사용자는 상품을 최신순, 가격순으로 조회할 수 있다.
    • 페이징 처리를 해서 20개씩 상품을 조회한다.
  • 상품 검색하기
    • 로그인하지 않은 사용자를 포함한 모든 사용자는 상품 키워드로 검색하면 관련 상품들을 조회할 수 있다.
    • 페이징 처리를 해서 20개씩 상품을 조회한다.
  • 상품 상세 정보 불러오기
    • 로그인하지 않은 사용자를 포함한 모든 사용자는 특정 상품의 상세 정보를 볼 수 있다.
    • 해당 상품의 이름, 카테고리, 가격, 설명, 남은 수량을 볼 수 있다.
  • 장바구니 담기/수정/삭제하기
    • CUSTOMER 권한을 가진 구매자는 장바구니에 사고 싶은 상품을 담을 수 있다. 장바구니는 상품 정보와 수량 정보를 갖는다.
    • 장바구니에 담긴 상품의 수량 변경 및 상품 삭제를 할 수 있다.
  • 주문하기
    • 장바구니 내용을 가져와서 transaction 정보를 저장한다.(구매 일자, 결제 금액, 고객 정보, 판매자 정보, 상품 정보)
    • 장바구니를 초기화한다.
  • 주문 정보 보기
    • 구매자는 자신의 주문 정보를 조회할 수 있다.
  • 리뷰쓰기
    • 구매자는 자신이 주문 완료한 상품에 한해서 상품 리뷰 작성 가능하다.
    • 평점과 리뷰 내용을 등록할 수 있다.
  • 리뷰 최신순 조회하기
    • 상품에 대한 구매자들의 리뷰들을 최신순으로 조회할 수 있다.
    • 페이징 처리를 해서 20개씩 리뷰를 조회한다.
  • 판매자가 리뷰에 댓글 달기
    • 판매자는 자신의 상품에 구매자가 리뷰를 작성하면 해당 리뷰에 댓글을 작성할 수 있다.
  • 적립금 시스템
    • 적립금은 구매자가 상품 구매시 함께 사용할 수 있으며 구매 금액에서 차감할 수 있다.
    • 구매자는 상품 구매시 구매 금액의 1%를 적립할 수 있다.
  • 최근 본 상품과 관련 인기 상품 불러오기
    • 접속한 IP에서 최근 본 상품과 해당 상품 카테고리의 인기 상품들을 조회할 수 있다.
  • 상품 문의
    • 구매자는 상품에 대한 문의를 작성할 수 있다.
    • 판매자는 구매자가 작성한 문의에 답변을 할 수 있다.

ERD

스크린샷 2023-06-01 오전 12 21 30

Tech Stack

Swagger 적용

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 실행이 계속 안되서 결국 배포는 하지 못했다. 프로젝트 일정 관리를 좀 더 꼼꼼하게 해야겠다는 생각을 했다.

0개의 댓글