Skip to content

Commit

Permalink
[FIX] 랭킹 서비스 리팩토링 (#44)
Browse files Browse the repository at this point in the history
* Query DSL 적용

* 수정사항 업로드

* 수정사항 업로드2

* 수정사항 업로드3

* 수정사항 업로드3

* 수정사항 업로드3

* 수정사항 업로드3

* 수정사항 업로드3

* 수정사항 업로드3
  • Loading branch information
BellaChooi authored Jul 26, 2024
1 parent a622abd commit 0bd8e38
Show file tree
Hide file tree
Showing 28 changed files with 599 additions and 123 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.nerd.favorite18.core.api._common.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down Expand Up @@ -46,4 +50,15 @@ public RedisTemplate<String, Object> redisTemplate() {
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}

/**
* 역직렬화 및 Date type을 사용하기 위해.
* @return
*/
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
return objectMapper;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public enum ErrorCode {
E400,
E403,
E404,
E500
E500,
E5404

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ public enum ErrorType {

QNA_NOT_FOUND(HttpStatus.BAD_REQUEST, ErrorCode.E3404, "Qna is not fonded.", LogLevel.ERROR),

RANK_REDIS_NOT_FOUND(HttpStatus.BAD_REQUEST, ErrorCode.E5404, "Rank Redis is not fonded.", LogLevel.ERROR),

SONG_DUPLICATE(HttpStatus.BAD_REQUEST, ErrorCode.E400, "Song is duplicated", LogLevel.WARN),

INVALID_TOKEN(HttpStatus.BAD_REQUEST, ErrorCode.E2000, "Token is invalided.", LogLevel.ERROR),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
package com.nerd.favorite18.core.api.ranking.business;

import com.nerd.favorite18.core.api._common.annotation.Business;
import com.nerd.favorite18.core.api.ranking.dto.RankDto;
import com.nerd.favorite18.core.api.ranking.dto.response.RankResponse;
import com.nerd.favorite18.core.api.ranking.service.RankService;
import com.nerd.favorite18.core.enums.song.MachineType;
import com.nerd.favorite18.storage.db.core.ranking.entity.Rank;
import com.nerd.favorite18.storage.db.core.ranking.projection.RankListResponse;
import com.nerd.favorite18.storage.db.core.ranking.dto.RankQueryDto;
import com.nerd.favorite18.storage.db.core.ranking.projection.RankListProjection;
import lombok.RequiredArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@RequiredArgsConstructor
@Business
public class RankBusiness {
private final RankService rankService;

public List<RankListResponse> getRankAll(LocalDate rankDate, MachineType machineType) {
public List<RankResponse> getRankAll(LocalDate rankDate, MachineType machineType) {

return rankService.getRankAll(rankDate, machineType);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.nerd.favorite18.core.api.ranking.business;

import com.nerd.favorite18.core.api._common.annotation.Business;
import com.nerd.favorite18.core.api.ranking.dto.RankRedisDto;
import com.nerd.favorite18.core.api.ranking.dto.request.RankAddRequest;
import com.nerd.favorite18.core.api.ranking.service.RankRedisService;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@RequiredArgsConstructor
@Business
public class RankRedisBusiness {

private final RankRedisService rankRedisService;

@Transactional(readOnly = true)
public List<RankRedisDto> getTop100Songs() {
return rankRedisService.getTop100Songs();
}

@Transactional
public void clickSong(Long songId, RankAddRequest rankAddRequest) {
rankRedisService.clickSong(songId, rankAddRequest);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,26 @@

import com.nerd.favorite18.core.api._common.support.response.ApiResponse;
import com.nerd.favorite18.core.api.ranking.business.RankBusiness;
import com.nerd.favorite18.core.api.ranking.dto.RankDto;
import com.nerd.favorite18.core.api.ranking.dto.response.RankResponse;
import com.nerd.favorite18.core.enums.song.MachineType;
import com.nerd.favorite18.storage.db.core.ranking.projection.RankListResponse;
import com.nerd.favorite18.storage.db.core.ranking.projection.RankListProjection;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@RequiredArgsConstructor
@RequestMapping("/api/v1/songs/rank")
@RequestMapping("/api/v1/rank")
@RestController
public class RankController {
private final RankBusiness rankBusiness;

@GetMapping
public ApiResponse<List<RankListResponse>> getRankAll(@RequestParam LocalDate today, @RequestParam MachineType machineType) {
List<RankListResponse> response = rankBusiness.getRankAll(today, machineType);
public ApiResponse<List<RankResponse>> getRankAll(@RequestParam LocalDate today, @RequestParam MachineType machineType) {
List<RankResponse> response = rankBusiness.getRankAll(today, machineType);

return ApiResponse.success(response);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,37 +1,35 @@
package com.nerd.favorite18.core.api.ranking.controller;

import com.nerd.favorite18.core.api.ranking.service.RedisRankService;
import com.nerd.favorite18.core.api._common.support.response.ApiResponse;
import com.nerd.favorite18.core.api.ranking.business.RankRedisBusiness;
import com.nerd.favorite18.core.api.ranking.dto.RankRedisDto;
import com.nerd.favorite18.core.api.ranking.dto.request.RankAddRequest;
import com.nerd.favorite18.core.api.song.business.SongBusiness;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;

@Slf4j
@RequiredArgsConstructor
@RequestMapping("/api/v1/songs/rank")
@RequestMapping("/api/v1/rank/redis")
@RestController
public class RankRadisController {

private final RedisRankService redisRankService;
private final RankRedisBusiness rankRedisBusiness;
private final SongBusiness songBusiness;

@GetMapping("/redis/rank/{songId}")
public String getSongCount(@PathVariable Long songId) {
return redisRankService.getSongCounts(songId);
/** 1~100위 노래ID 조회 */
@GetMapping()
public List<RankRedisDto> getTop100Songs() {
return rankRedisBusiness.getTop100Songs();
}

@PostMapping("/redis/rank")
public void setSongCount(@RequestBody HashMap<String, String> body) {
Long songId = Long.valueOf(body.get("songId").toString());
String searchCnt = body.get("searchCount").toString();
redisRankService.setSongCounts(songId, searchCnt);
}

@PostMapping("/redis/rank/increment/{songId}")
public ResponseEntity<String> incrementSongCount(@PathVariable Long songId) {
// 여기서는 간단히 조회수를 1 증가시킨다고 가정
redisRankService.incrementSongCount(songId);
return ResponseEntity.ok("Song count incremented for songId: " + songId);
/** 노래 상세정보 클릭 시 */
@PostMapping("/{songId}")
public ApiResponse<Void> clickSong(@PathVariable Long songId, @RequestBody RankAddRequest rankAddRequest){
rankRedisBusiness.clickSong(songId, rankAddRequest);
return ApiResponse.success();
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,33 @@
package com.nerd.favorite18.core.api.ranking.converter;

import com.nerd.favorite18.core.api._common.annotation.Converter;
import com.nerd.favorite18.core.api.ranking.dto.RankDto;
import com.nerd.favorite18.core.api.ranking.dto.request.RankAddRequest;
import com.nerd.favorite18.core.api.ranking.dto.response.RankResponse;
import com.nerd.favorite18.core.api.song.dto.response.SongCodeResponse;
import com.nerd.favorite18.storage.db.core.ranking.dto.RankQueryDto;
import com.nerd.favorite18.storage.db.core.ranking.entity.Rank;
import com.nerd.favorite18.storage.db.core.ranking.projection.RankListProjection;
import com.nerd.favorite18.storage.db.core.song.dto.SongCodeQueryDto;
import com.nerd.favorite18.storage.db.core.song.dto.SongQueryDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Converter
@RequiredArgsConstructor
public class RankConverter {
public RankDto toDto(Rank entity) {
return RankDto.of(
entity.getId(),
entity.getRankSong(),
entity.getRankDate(),
entity.getRank(),
entity.getSearchCnt(),
entity.getCreatedAt(),
entity.getUpdatedAt()
);
}
public List<RankDto> toDto(List<Rank> entities) {
return entities.stream()
.map(this::toDto)
.collect(Collectors.toList());
public RankResponse toRankResponse(RankQueryDto rankQueryDto) {
return RankResponse.builder()
.rankId(rankQueryDto.getId())
.title(rankQueryDto.getTitle())
.artist(rankQueryDto.getArtist())
.albumUrl(rankQueryDto.getAlbumUrl())
.rankDate(rankQueryDto.getRankDate())
.ranking(rankQueryDto.getRanking())
.searchCnt(rankQueryDto.getSearchCnt())
.songCode(rankQueryDto.getSongCode())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.nerd.favorite18.core.api.ranking.converter;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.nerd.favorite18.core.api._common.annotation.Converter;
import com.nerd.favorite18.core.api._common.support.error.CoreApiException;
import com.nerd.favorite18.core.api._common.support.error.ErrorType;
import com.nerd.favorite18.core.api.ranking.dto.RankRedisDto;
import com.nerd.favorite18.core.api.ranking.dto.request.RankAddRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;

import java.io.IOException;

@Slf4j
@Converter
@RequiredArgsConstructor
public class RankRedisConverter {
private final ObjectMapper objectMapper;

public RankRedisDto toDto(RankAddRequest request) {
if (ObjectUtils.isEmpty(request)) {
throw new CoreApiException(ErrorType.BAD_REQUEST);
}

return RankRedisDto.of(
request.getSongId(),
request.getAlbumUrl(),
request.getTitle(),
request.getArtist(),
request.getRankDate(),
request.getRanking(),
request.getSearchCnt()
);
}

public RankAddRequest toRequest(String json) {
try {
return objectMapper.readValue(json, RankAddRequest.class);
} catch (IOException e) {
throw new CoreApiException(ErrorType.BAD_REQUEST, e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.sql.Date;
import java.time.LocalDate;
import java.time.LocalDateTime;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.nerd.favorite18.core.api.ranking.dto;

import com.nerd.favorite18.storage.db.core.song.entity.SongCode;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.util.List;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class RankRedisDto {
private Long songId;
private String albumUrl;
private String title;
private String artist;
private LocalDate rankDate;
private String ranking;
private Long searchCnt;

public static RankRedisDto of(
Long songId,
String albumUrl,
String title,
String artist,
LocalDate rankDate,
String ranking,
Long searchCnt
) {
return new RankRedisDto(
songId,
albumUrl,
title,
artist,
rankDate,
ranking,
searchCnt
);
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
package com.nerd.favorite18.core.api.ranking.dto.request;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.nerd.favorite18.storage.db.core.song.entity.SongCode;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true)
public class RankAddRequest {
private Long songId;
private String albumUrl;
private String title;
private String artist;
private LocalDate rankDate;
private String ranking;
private Long searchCnt;
private String machineType;

}
Loading

0 comments on commit 0bd8e38

Please sign in to comment.