Skip to content

Commit

Permalink
REFACTOR : 홈 화면 조회 API 리팩토링 및 ErrorCode 리팩토링 (#74)
Browse files Browse the repository at this point in the history
  • Loading branch information
choidongkuen committed Nov 13, 2023
1 parent b8e35f4 commit 424784e
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.example.betteriter.fo_domain.review.domain.Review;
import com.example.betteriter.fo_domain.user.domain.User;
import com.example.betteriter.global.constant.Category;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

Expand All @@ -16,6 +18,10 @@ public interface ReviewRepository extends JpaRepository<Review, Long> {
List<Review> findFirst7ByWriterInOrderByCreatedAtDesc(List<User> writers);

// sum(count (r.reviewLiked),count(r.reviewScraped))
@Query("select r from REVIEW r")
List<Review> findReviewHavingMostScrapedAndLiked();
@EntityGraph(attributePaths = {"reviewScraped", "reviewLiked"})
@Query("select r from REVIEW r " +
"left join r.reviewScraped rs " +
"left join r.reviewLiked rl group by r " +
"ORDER BY COALESCE(SUM(rs.id), 0) + COALESCE(SUM(rl.id), 0) DESC")
List<Review> findTop7ReviewHavingMostScrapedAndLiked(Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import com.example.betteriter.global.constant.Category;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -44,8 +45,7 @@ public Long createReview(CreateReviewRequestDto request) {

/* 유저가 관심 등록한 카테고리 리뷰 리스트 조회 메소드 */
public Map<String, List<ReviewResponseDto>> getUserCategoryReviews() {
User user = this.getCurrentUser();
List<Category> categories = user.getCategories(); // 유저가 등록한 관심 카테고리
List<Category> categories = this.getCurrentUser().getCategories(); // 유저가 등록한 관심 카테고리
Map<String, List<ReviewResponseDto>> result = new LinkedHashMap<>();
// 카테고리에 해당하는 최신 순 리뷰
for (Category category : categories) {
Expand All @@ -71,7 +71,8 @@ public List<ReviewResponseDto> getFollowingReviews() {

/* 가장 많은 스크랩 + 좋아요 수를 가지는 리뷰 가져오는 리스트 */
public List<ReviewResponseDto> getMostScrapedAndLikedReviews() {
return this.reviewRepository.findReviewHavingMostScrapedAndLiked().stream()
return this.reviewRepository.findTop7ReviewHavingMostScrapedAndLiked(PageRequest.of(0, 7))
.stream()
.map(review -> review.of(this.getFirstImageWithReview(review)))
.collect(Collectors.toList());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ public ResponseDto<Boolean> checkNickname(
private void checkRequestValidation(BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
FieldError fieldError = bindingResult.getFieldErrors().get(0);
log.debug("fieldError occurs : {}", fieldError.getDefaultMessage());
log.error("fieldError occurs : {}", fieldError.getDefaultMessage());
throw new UserHandler(_METHOD_ARGUMENT_ERROR);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,10 @@ public class User extends BaseEntity implements UserDetails {
@Enumerated(EnumType.STRING)
private List<Category> categories;

@OneToMany(mappedBy = "followee")
@OneToMany(mappedBy = "follower")
private List<Follow> following; // 회원이 팔로잉 하는 유저 리스트

@OneToMany(mappedBy = "follower")
@OneToMany(mappedBy = "followee")
private List<Follow> follower; // 회원을 팔로잉 하는 유저 리스트

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ private Long processJoin(JoinDto joinDto, String encryptPassword) {
@Transactional
public UserServiceTokenResponseDto login(LoginDto loginRequestDto) {
User user = this.loadUserByUsername(loginRequestDto.getEmail());
this.checkUserLoginType(user);
this.checkPassword(loginRequestDto, user);
return this.saveAuthenticationAndReturnServiceToken(user);
}
Expand Down Expand Up @@ -188,4 +189,12 @@ private UserServiceTokenResponseDto saveAuthenticationAndReturnServiceToken(User
serviceToken.getRefreshToken(), jwtProperties.getRefreshExpiration()); // 토큰 발급 후 Redis 에 Refresh token 저장
return serviceToken;
}

// 로그인 시도 회원이 카카오 로그인 회원인지 여부 판단
private void checkUserLoginType(User user) {
if (user.getOauthId() != null) {
throw new UserHandler(_AUTH_SHOULD_BE_KAKAO);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,25 +33,26 @@ public enum ErrorCode {
// Success
_OK(HttpStatus.OK, "SUCCESS_200", "OK"),

// Common Error
// Common Error & Global Error
_BAD_REQUEST(HttpStatus.BAD_REQUEST, "COMMON_400", "잘못된 요청입니다."),
_UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "COMMON_401", "인증 과정에서 오류가 발생했습니다."),
_UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "AUTH_401", "인증 과정에서 오류가 발생했습니다."),
_FORBIDDEN(HttpStatus.FORBIDDEN, "COMMON_403", "금지된 요청입니다."),
_METHOD_NOT_ALLOWED(HttpStatus.METHOD_NOT_ALLOWED, "COMMON_405", "지원하지 않는 Http Method 입니다."),
_INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "COMMON_500", "서버 에러가 발생했습니다."),
_METHOD_ARGUMENT_ERROR(HttpStatus.BAD_REQUEST, "COMMON_400", "올바르지 않은 클라이언트 요청값입니다."), // controller 에서 받은 요청 DTO 유효성 검증

_METHOD_ARGUMENT_ERROR(HttpStatus.BAD_REQUEST, "METHOD_ARGUMENT_ERROR", "올바르지 않은 클라이언트 요청값입니다."), // controller 에서 받은 요청 DTO 유효성 검증

// Example (For Test)
TEST_BAD_REQUEST(HttpStatus.BAD_REQUEST, "TEST_400", "잘못된 요청입니다. (For Test)"),

// User Error
_USER_NOT_FOUND(HttpStatus.BAD_REQUEST, "USER_400", "일치하는 회원 정보를 찾을 수 없습니다."),
_PASSWORD_NOT_MATCH(HttpStatus.UNAUTHORIZED, "USER_401", "비밀번호가 일치하지 않습니다."),
_EMAIL_DUPLICATION(HttpStatus.BAD_REQUEST, "USER_400", "이미 존재하는 이메일입니다."),
_AUTH_CODE_ALREADY_EXIT(HttpStatus.BAD_REQUEST, "USER_400", "이미 인증 코드가 존재합니다."),
_AUTH_CODE_NOT_EXIST(HttpStatus.BAD_REQUEST, "USER_400", "인증 코드가 존재하지 않습니다."),
_AUTH_CODE_NOT_MATCH(HttpStatus.BAD_REQUEST, "USER_400", "인증 코드가 일치하지 않습니다."),
_AUTH_SHOULD_BE_KAKAO(HttpStatus.BAD_REQUEST, "USER_400", "해당 회원은 카카오 로그인 회원입니다."),
TEST_BAD_REQUEST(HttpStatus.BAD_REQUEST, "TEST_400", "잘못된 요청 입니다. (For Test)"),

// User & Auth Error
_USER_NOT_FOUND(HttpStatus.BAD_REQUEST, "USER_NOT_FOUND_400", "일치하는 회원 정보를 찾을 수 없습니다."),
_PASSWORD_NOT_MATCH(HttpStatus.UNAUTHORIZED, "AUTH_PASSWORD_NOT_MATCH_401", "비밀번호가 일치하지 않습니다."),
_EMAIL_DUPLICATION(HttpStatus.BAD_REQUEST, "AUTH_EMAIL_DUPLICATION_401", "이미 존재하는 이메일입니다."),
_AUTH_CODE_ALREADY_EXIT(HttpStatus.BAD_REQUEST, "AUTH_CODE_ALREADY_EXIST_401", "이미 인증 코드가 존재합니다."),
_AUTH_CODE_NOT_EXIST(HttpStatus.BAD_REQUEST, "AUTH_CODE_NOT_EXIST_401", "인증 코드가 존재하지 않습니다."),
_AUTH_CODE_NOT_MATCH(HttpStatus.BAD_REQUEST, "AUTH_CODE_NOT_MATCH_401", "인증 코드가 일치하지 않습니다."),
_AUTH_SHOULD_BE_KAKAO(HttpStatus.BAD_REQUEST, "AUTH_SHOULD_BE_KAKAO_401", "해당 회원은 카카오 로그인 회원입니다."),


// News
Expand Down

0 comments on commit 424784e

Please sign in to comment.