Skip to content

Commit

Permalink
✨ [Feature] 음료의 간편 정보를 Redis에서 가져오는 API 구현했어요 (#58)
Browse files Browse the repository at this point in the history
  • Loading branch information
LeeJejune authored Jul 10, 2023
1 parent 3baef52 commit 9636279
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import com.depromeet.oversweet.drink.dto.request.DrinkWeeklySugarDateRequest;
import com.depromeet.oversweet.drink.dto.response.DrinkDailySugarStatisticsResponse;
import com.depromeet.oversweet.drink.dto.response.DrinkDetailInfoResponse;
import com.depromeet.oversweet.drink.dto.response.DrinkRedisInfo;
import com.depromeet.oversweet.drink.dto.response.DrinkWeeklySugarStatisticsResponse;
import com.depromeet.oversweet.drink.service.DrinkDailyStatisticsService;
import com.depromeet.oversweet.drink.service.DrinkDetailSearchService;
import com.depromeet.oversweet.drink.service.DrinkRedisService;
import com.depromeet.oversweet.drink.service.DrinkWeeklyStatisticsService;
import com.depromeet.oversweet.response.DataResponse;
import com.depromeet.oversweet.security.service.CustomUserDetails;
Expand All @@ -26,6 +28,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

import static org.springframework.http.HttpStatus.OK;

@Tag(name = "음료", description = "음료 관련 API")
@RestController
@RequestMapping("/api/v1/drinks")
Expand All @@ -36,6 +42,7 @@ public class DrinkController {
private final DrinkDailyStatisticsService drinkDailyStatisticsService;
private final DrinkWeeklyStatisticsService drinkWeeklyStatisticsService;
private final DrinkDetailSearchService drinkDetailSearchService;
private final DrinkRedisService drinkRedisService;

/**
* 유저 하루(데일리) 먹은 당 통계 및 음료 목록 조회.
Expand Down Expand Up @@ -77,4 +84,13 @@ public ResponseEntity<DataResponse<DrinkDetailInfoResponse>> retrieveDrinkDetail
DrinkDetailInfoResponse response = drinkDetailSearchService.retrieveDrinkDetail(100L, request);
return ResponseEntity.ok().body(DataResponse.of(HttpStatus.OK, "음료 상세 조회 성공", response));
}

@Operation(summary = "레디스에 저장된 음료 목록 조회하거나 없다면 생성합니다.", description = "레디스에 저장된 음료 목록 조회 API")
@ApiResponses(@ApiResponse(responseCode = "200", description = "레디스에 저장된 음료 목록 조회 성공"))
@GetMapping("/redis")
public ResponseEntity<DataResponse<List<DrinkRedisInfo>>> getOrCreateDrinkAtRedis() {
final List<DrinkRedisInfo> drinks = drinkRedisService.getDrinks();
return ResponseEntity.ok()
.body(DataResponse.of(OK, "레디스에 저장된 음료 목록 조회 성공", drinks));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.depromeet.oversweet.drink.dto.response;

import com.depromeet.oversweet.domain.drink.dto.DrinkSimpleInfo;
import io.swagger.v3.oas.annotations.media.Schema;

/**
* 레디스에 저장될 음료 간편 정보 DTO
*/
public record DrinkRedisInfo(
@Schema(description = "음료 ID", example = "1") Long id,

@Schema(description = "음료 이름", example = "아메리카노") String name
) {
public static DrinkRedisInfo of(final DrinkSimpleInfo drinkSimpleInfo){
return new DrinkRedisInfo(drinkSimpleInfo.getId(), drinkSimpleInfo.getName());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.depromeet.oversweet.drink.service;

import com.depromeet.oversweet.domain.drink.dto.DrinkSimpleInfo;
import com.depromeet.oversweet.domain.drink.repository.FindAllDrinkRepository;
import com.depromeet.oversweet.drink.dto.response.DrinkRedisInfo;
import com.depromeet.oversweet.redis.RedisRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

/**
* 음료 정보를 레디스에 저장하거나 가져오는 서비스
*/
@Service
@RequiredArgsConstructor
public class DrinkRedisService {

private static final String DRINK = "drink";
private final RedisRepository redisRepository;

private final FindAllDrinkRepository findAllDrinkRepository;

public List<DrinkRedisInfo> getDrinks() {
List<DrinkRedisInfo> drinkInfos = redisRepository.getData(DRINK, DrinkRedisInfo.class);
if (drinkInfos == null || drinkInfos.isEmpty()) {
final List<DrinkSimpleInfo> findDrinks = findAllDrinkRepository.findAll();
drinkInfos = findDrinks.stream()
.map(DrinkRedisInfo::of)
.toList();
redisRepository.saveData(DRINK, drinkInfos);
}
return drinkInfos;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public ResponseEntity<DataResponse<List<FranchiseInfo>>> getFranchiseByKeyword(@

@Operation(summary = "레디스에 저장된 프랜차이즈 목록 조회하거나 없다면 생성합니다.", description = "레디스에 저장된 프랜차이즈 목록 조회 API")
@ApiResponses(@ApiResponse(responseCode = "200", description = "레디스에 저장된 프랜차이즈 목록 조회 성공"))
@GetMapping("redis")
@GetMapping("/redis")
public ResponseEntity<DataResponse<List<FranchiseInfo>>> getOrCreateFranchiseAtRedis() {
final List<FranchiseInfo> franchise = franchiseRedisService.getFranchises();
return ResponseEntity.ok()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.depromeet.oversweet.domain.drink.dto;

public interface DrinkSimpleInfo {
Long getId();
String getName();
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ public enum DrinkCategory {
ADE,
TEA,
SMOOTHIE,
JUICE
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.depromeet.oversweet.domain.drink.repository;

import com.depromeet.oversweet.domain.drink.dto.DrinkInfoWithScrapStatus;
import com.depromeet.oversweet.domain.drink.dto.DrinkSimpleInfo;
import com.depromeet.oversweet.domain.drink.entity.DrinkEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
Expand All @@ -19,4 +20,6 @@ public interface DrinkJpaRepository extends JpaRepository<DrinkEntity, Long> {
"WHERE d.franchise.id = :franchiseId AND d.name = :drinkName ORDER BY d.size ASC")
List<DrinkInfoWithScrapStatus> findDrinkWithBookmarkStatus(@Param("memberId") Long memberId, @Param("franchiseId") Long franchiseId, @Param("drinkName") String drinkName);

@Query(value = "select d.id, d.name from drink d", nativeQuery = true)
List<DrinkSimpleInfo> findAllDrinkSimpleInfo();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.depromeet.oversweet.domain.drink.repository;

import com.depromeet.oversweet.domain.drink.dto.DrinkSimpleInfo;

import java.util.List;

/**
* 필요한 음료의 정보를 토대로 모든 음료를 가져오는 Repository 인터페이스
*/
public interface FindAllDrinkRepository {
List<DrinkSimpleInfo> findAll();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.depromeet.oversweet.domain.drink.repository;

import com.depromeet.oversweet.domain.drink.dto.DrinkSimpleInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
* 필요한 음료의 정보를 토대로 모든 음료를 가져오는 Repository 구현체
*/
@Repository
@RequiredArgsConstructor
public class FindAllDrinkRepositoryImpl implements FindAllDrinkRepository{

private final DrinkJpaRepository drinkJpaRepository;

@Override
public List<DrinkSimpleInfo> findAll() {
return drinkJpaRepository.findAllDrinkSimpleInfo();
}
}

0 comments on commit 9636279

Please sign in to comment.