diff --git a/src/main/java/com/seeat/server/domain/best/application/dto/response/BestAuditoriumListResponse.java b/src/main/java/com/seeat/server/domain/best/application/dto/response/BestAuditoriumListResponse.java index 7223baf4..79a445ec 100644 --- a/src/main/java/com/seeat/server/domain/best/application/dto/response/BestAuditoriumListResponse.java +++ b/src/main/java/com/seeat/server/domain/best/application/dto/response/BestAuditoriumListResponse.java @@ -15,6 +15,7 @@ * 베스트 상영관 리스트 응답 DTO * @param auditoriumId 상영관 ID * @param auditoriumName 상영관 이름 + * @param image 상영관 이미지 * @param avgRating 평균 평점 * @param reviewCount 총 리뷰 수 * @param score 점수 @@ -29,6 +30,9 @@ public record BestAuditoriumListResponse( @Schema(description = "상영관 이름", example = "IMAX관") String auditoriumName, + @Schema(description = "상영관 이미지", example = "https://seeat-dev.s3.ap-northeast-2.amazonaws.com/official/%E1%84%8B%E1%85%A7%E1%86%BC%E1%84%92%E1%85%AA%E1%84%80%E1%85%AA%E1%86%AB+%E1%84%80%E1%85%A9%E1%86%BC%E1%84%89%E1%85%B5%E1%86%A8+%E1%84%8B%E1%85%B5%E1%84%86%E1%85%B5%E1%84%8C%E1%85%B5/sample.png") + String image, + @Schema(description = "평균 평점", example = "4.7") Double avgRating, @@ -47,6 +51,7 @@ public static BestAuditoriumListResponse from(AuditoriumWithScore withScore) { return BestAuditoriumListResponse.builder() .auditoriumId(auditorium.getId()) .auditoriumName(theater.getName() + "-" + auditorium.getName()) + .image(auditorium.getThumbnailUrl()) .avgRating(withScore.getAvgRating()) .reviewCount(withScore.getReviewCount()) .score(withScore.getScore()) @@ -70,6 +75,7 @@ public static BestAuditoriumListResponse from(BestAuditoriumSnapshot snapshot) { return BestAuditoriumListResponse.builder() .auditoriumId(snapshot.getAuditoriumId()) .auditoriumName(snapshot.getAuditoriumName()) + .image(snapshot.getImage()) .avgRating(snapshot.getAvgRating()) .reviewCount(snapshot.getReviewCount()) .score(snapshot.getScore()) diff --git a/src/main/java/com/seeat/server/domain/best/application/util/SnapShotConverter.java b/src/main/java/com/seeat/server/domain/best/application/util/SnapShotConverter.java index afe7c14a..c680a3f5 100644 --- a/src/main/java/com/seeat/server/domain/best/application/util/SnapShotConverter.java +++ b/src/main/java/com/seeat/server/domain/best/application/util/SnapShotConverter.java @@ -52,7 +52,8 @@ public static BestAuditoriumSnapshot toAuditoriumSnapshot(BestAuditoriumListResp response.auditoriumName(), response.avgRating(), response.reviewCount(), - response.score() + response.score(), + response.image() ); } diff --git a/src/main/java/com/seeat/server/domain/best/domain/entity/BestAuditoriumSnapshot.java b/src/main/java/com/seeat/server/domain/best/domain/entity/BestAuditoriumSnapshot.java index 15f5c332..d3ea3372 100644 --- a/src/main/java/com/seeat/server/domain/best/domain/entity/BestAuditoriumSnapshot.java +++ b/src/main/java/com/seeat/server/domain/best/domain/entity/BestAuditoriumSnapshot.java @@ -1,6 +1,7 @@ package com.seeat.server.domain.best.domain.entity; import com.seeat.server.domain.BaseEntity; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; @@ -20,15 +21,18 @@ public class BestAuditoriumSnapshot extends BaseEntity { private String auditoriumId; private String auditoriumName; + @Column(length = 512) + private String image; private Double avgRating; private Long reviewCount; private Double score; /// 정적 팩토리 메서드 생성 - public static BestAuditoriumSnapshot of(String auditoriumId, String auditoriumName, Double avgRating, Long reviewCount, Double score) { + public static BestAuditoriumSnapshot of(String auditoriumId, String auditoriumName, Double avgRating, Long reviewCount, Double score, String image) { return BestAuditoriumSnapshot.builder() .auditoriumId(auditoriumId) .auditoriumName(auditoriumName) + .image(image) .avgRating(avgRating) .reviewCount(reviewCount) .score(score) diff --git a/src/main/java/com/seeat/server/domain/hashtag/application/dto/response/AuditoriumHashTagResponse.java b/src/main/java/com/seeat/server/domain/hashtag/application/dto/response/AuditoriumHashTagResponse.java index 5adfabfe..6d183c94 100644 --- a/src/main/java/com/seeat/server/domain/hashtag/application/dto/response/AuditoriumHashTagResponse.java +++ b/src/main/java/com/seeat/server/domain/hashtag/application/dto/response/AuditoriumHashTagResponse.java @@ -9,6 +9,7 @@ * 상영관 리뷰들 중에서 많이 사용된 해시태그를 파악하기 위한 DTO 입니다. * @param hashTagId 해시태그 ID * @param hashTagName 해시태그 이름 + * @param hashType 해시태그 타입 * @param count 개수 */ @Builder @@ -16,14 +17,16 @@ public record AuditoriumHashTagResponse( Long hashTagId, String hashTagName, + String hashType, Long count ) { /// 정적 팩토리 메서드 public static AuditoriumHashTagResponse from(ReviewHashTagWithCount withCount) { return AuditoriumHashTagResponse.builder() - .hashTagId(withCount.getHashTagId()) - .hashTagName(withCount.getHashTagName()) + .hashTagId(withCount.getHashTag().getId()) + .hashTagName(withCount.getHashTag().getName()) + .hashType(withCount.getHashTag().getType().getLabel()) .count(withCount.getCount()) .build(); diff --git a/src/main/java/com/seeat/server/domain/hashtag/domain/repository/ReviewHashTagRepository.java b/src/main/java/com/seeat/server/domain/hashtag/domain/repository/ReviewHashTagRepository.java index c5d5f7ac..1df2889a 100644 --- a/src/main/java/com/seeat/server/domain/hashtag/domain/repository/ReviewHashTagRepository.java +++ b/src/main/java/com/seeat/server/domain/hashtag/domain/repository/ReviewHashTagRepository.java @@ -34,8 +34,7 @@ public interface ReviewHashTagRepository extends JpaRepository */ @Query(""" - SELECT rh.hashTag.id as hashTagId, - rh.hashTag.name as hashTagName, + SELECT rh.hashTag as hashTag, COUNT(DISTINCT r.id) AS count FROM Auditorium a LEFT JOIN Seat s ON s.auditorium = a diff --git a/src/main/java/com/seeat/server/domain/hashtag/domain/repository/ReviewHashTagWithCount.java b/src/main/java/com/seeat/server/domain/hashtag/domain/repository/ReviewHashTagWithCount.java index 03ad8f51..67c9b7e9 100644 --- a/src/main/java/com/seeat/server/domain/hashtag/domain/repository/ReviewHashTagWithCount.java +++ b/src/main/java/com/seeat/server/domain/hashtag/domain/repository/ReviewHashTagWithCount.java @@ -1,10 +1,10 @@ package com.seeat.server.domain.hashtag.domain.repository; -public interface ReviewHashTagWithCount { +import com.seeat.server.domain.hashtag.domain.entity.HashTag; - Long getHashTagId(); +public interface ReviewHashTagWithCount { - String getHashTagName(); + HashTag getHashTag(); Long getCount(); } diff --git a/src/main/java/com/seeat/server/domain/theater/domain/entity/Auditorium.java b/src/main/java/com/seeat/server/domain/theater/domain/entity/Auditorium.java index d25040c6..d2181814 100644 --- a/src/main/java/com/seeat/server/domain/theater/domain/entity/Auditorium.java +++ b/src/main/java/com/seeat/server/domain/theater/domain/entity/Auditorium.java @@ -36,6 +36,9 @@ public class Auditorium { @Column(name = "image_url", length = 512) private String imageUrl; + @Column(name = "thumbnail_url", length = 512) + private String thumbnailUrl; + private String screenSize; private String soundType; diff --git a/src/main/java/com/seeat/server/domain/theater/domain/repository/AuditoriumRepository.java b/src/main/java/com/seeat/server/domain/theater/domain/repository/AuditoriumRepository.java index b939debc..f3be2094 100644 --- a/src/main/java/com/seeat/server/domain/theater/domain/repository/AuditoriumRepository.java +++ b/src/main/java/com/seeat/server/domain/theater/domain/repository/AuditoriumRepository.java @@ -20,14 +20,17 @@ public interface AuditoriumRepository extends JpaRepository /// 리뷰 개수 및 평점 같이 가져오기 @Query(""" - select a as auditorium, - SUM(sr.totalReviews) as totalReviews, - AVG(sr.averageGrade) as averageRating - from Auditorium a - left join SeatRatingSummary sr on sr.seat.auditorium.id = a.id - where a.id = :auditoriumId - group by a -""") + SELECT + a AS auditorium, + COUNT(DISTINCT r.id) AS totalReviews, + AVG(DISTINCT r.rating) AS averageRating + FROM Auditorium a + LEFT JOIN Seat s ON s.auditorium = a + LEFT JOIN ReviewSeat rs ON rs.seat = s + LEFT JOIN Review r ON rs.review = r + WHERE a.id = :auditoriumId + GROUP BY a + """) Optional findAuditoriumWithRating(@Param("auditoriumId") String auditoriumId); diff --git a/src/main/java/com/seeat/server/global/logging/LogFilter.java b/src/main/java/com/seeat/server/global/logging/LogFilter.java index 6e86db69..988a04bf 100644 --- a/src/main/java/com/seeat/server/global/logging/LogFilter.java +++ b/src/main/java/com/seeat/server/global/logging/LogFilter.java @@ -27,15 +27,15 @@ public class LogFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - /// 요청 로그 남기기 String username = request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : "anonymous"; String httpMethod = request.getMethod(); String uri = URLDecoder.decode(request.getRequestURI(), StandardCharsets.UTF_8); - log.info("[HTTP 요청 로깅]: [{}] {} - 사용자: {}", httpMethod, uri, username); + // Origin 헤더 가져오기 + String origin = request.getHeader("Origin"); - /// 로그 남기고 넘기기 - filterChain.doFilter(request, response); + log.info("[HTTP 요청 로깅]: [{}] {} - 사용자: {} - Origin: {}", httpMethod, uri, username, origin); + filterChain.doFilter(request, response); } }