diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java index b28084d8..71934c63 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java @@ -28,7 +28,6 @@ @RestController @RequestMapping("api/v1/concerts/") -@Controller @RequiredArgsConstructor @Tag(name = "Concerts", description = "공연에 대한 정보를 제공하는 API 입니다.") public class ConcertController { diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertDetailResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertDetailResponse.java index 12168aa7..8858845d 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertDetailResponse.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertDetailResponse.java @@ -4,10 +4,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import java.time.LocalDate; +import java.util.List; @Getter +@Setter public class ConcertDetailResponse { @Schema(description = "콘서트 Id입니다.") @@ -43,4 +46,6 @@ public class ConcertDetailResponse { @Schema(description = "콘서트 좋아요수입니다.") private int likeCount; + @Schema(description = "콘서트 이미지 목록입니다.") + private List concertImageUrls; } diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/ConcertImage.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/ConcertImage.java new file mode 100644 index 00000000..df2257a8 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/ConcertImage.java @@ -0,0 +1,25 @@ +package com.back.web7_9_codecrete_be.domain.concerts.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor +public class ConcertImage { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @ManyToOne(fetch = FetchType.LAZY) + private Concert concert; + + @Column(name = "image_url") + private String imageUrl; + + public ConcertImage(Concert concert, String imageUrl) { + this.concert = concert; + this.imageUrl = imageUrl; + } +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertImageRepository.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertImageRepository.java new file mode 100644 index 00000000..e4790e3f --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertImageRepository.java @@ -0,0 +1,12 @@ +package com.back.web7_9_codecrete_be.domain.concerts.repository; + +import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertImage; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ConcertImageRepository extends JpaRepository { + List getConcertImagesByConcert_ConcertId(Long concertConcertId); +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/ConcertService.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/ConcertService.java index b740f304..5a3e296d 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/ConcertService.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/ConcertService.java @@ -5,14 +5,8 @@ import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertLikeResponse; import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertUpdateRequest; import com.back.web7_9_codecrete_be.domain.concerts.dto.ticketOffice.TicketOfficeElement; -import com.back.web7_9_codecrete_be.domain.concerts.entity.Concert; -import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertLike; -import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertPlace; -import com.back.web7_9_codecrete_be.domain.concerts.entity.TicketOffice; -import com.back.web7_9_codecrete_be.domain.concerts.repository.ConcertLikeRepository; -import com.back.web7_9_codecrete_be.domain.concerts.repository.ConcertPlaceRepository; -import com.back.web7_9_codecrete_be.domain.concerts.repository.ConcertRepository; -import com.back.web7_9_codecrete_be.domain.concerts.repository.TicketOfficeRepository; +import com.back.web7_9_codecrete_be.domain.concerts.entity.*; +import com.back.web7_9_codecrete_be.domain.concerts.repository.*; import com.back.web7_9_codecrete_be.domain.users.entity.User; import com.back.web7_9_codecrete_be.domain.users.repository.UserRepository; import com.back.web7_9_codecrete_be.global.error.code.AuthErrorCode; @@ -39,7 +33,8 @@ public class ConcertService { private final TicketOfficeRepository ticketOfficeRepository; - private final JsoupApiService jsoupApiService; + private final ConcertImageRepository concertImageRepository; + public List getConcertsList(Pageable pageable) { return concertRepository.getConcertItems(pageable); @@ -54,7 +49,14 @@ public List getLikedConcertsList(Pageable pageable,User user) { } public ConcertDetailResponse getConcertDetail(long concertId) { - return concertRepository.getConcertDetailById(concertId); + ConcertDetailResponse concertDetailResponse = concertRepository.getConcertDetailById(concertId); + List concertImages = concertImageRepository.getConcertImagesByConcert_ConcertId(concertId); + List concertImageUrls = new ArrayList<>(); + for(ConcertImage concertImage : concertImages){ + concertImageUrls.add(concertImage.getImageUrl()); + } + concertDetailResponse.setConcertImageUrls(concertImageUrls); + return concertDetailResponse; } // N+1 문제 발생해서 버림 diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/KopisApiService.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/KopisApiService.java index 9f1c6115..36ecccd4 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/KopisApiService.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/KopisApiService.java @@ -6,8 +6,10 @@ import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concertPlace.ConcertPlaceListElement; import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concertPlace.ConcertPlaceListResponse; import com.back.web7_9_codecrete_be.domain.concerts.entity.Concert; +import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertImage; import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertPlace; import com.back.web7_9_codecrete_be.domain.concerts.entity.TicketOffice; +import com.back.web7_9_codecrete_be.domain.concerts.repository.ConcertImageRepository; import com.back.web7_9_codecrete_be.domain.concerts.repository.ConcertPlaceRepository; import com.back.web7_9_codecrete_be.domain.concerts.repository.ConcertRepository; import com.back.web7_9_codecrete_be.domain.concerts.repository.TicketOfficeRepository; @@ -38,6 +40,8 @@ public class KopisApiService { private final TicketOfficeRepository ticketOfficeRepository; + private final ConcertImageRepository imageRepository; + @Value("${kopis.api-key}") private String serviceKey; private LocalDate sdate = LocalDate.of(2025, 12, 1); @@ -45,10 +49,11 @@ public class KopisApiService { private final RestClient restClient; - public KopisApiService(ConcertRepository concertRepository, ConcertPlaceRepository placeRepository, TicketOfficeRepository ticketOfficeRepository) { + public KopisApiService(ConcertRepository concertRepository, ConcertPlaceRepository placeRepository, TicketOfficeRepository ticketOfficeRepository,ConcertImageRepository imageRepository) { this.concertRepository = concertRepository; this.placeRepository = placeRepository; this.ticketOfficeRepository = ticketOfficeRepository; + this.imageRepository = imageRepository; this.restClient = RestClient.builder() .baseUrl("https://kopis.or.kr/openApi/restful") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) @@ -132,6 +137,15 @@ public ConcertListResponse setConcertsList() throws InterruptedException { ); ticketOfficeRepository.save(to); } + + List concertImages = new ArrayList<>(); + for(String imageUrl : concertDetail.getConcertImageUrls()){ + ConcertImage concertImage = new ConcertImage(savedConcert, imageUrl); + concertImages.add(concertImage); + } + + imageRepository.saveAll(concertImages); + log.info("Concert saved: " + savedConcert); Thread.sleep(300); } @@ -221,6 +235,14 @@ public void updateConcertData() throws InterruptedException { // 1주일 단위 ); ticketOfficeRepository.save(to); } + + List concertImages = new ArrayList<>(); + for(String imageUrl : concertDetail.getConcertImageUrls()){ + ConcertImage concertImage = new ConcertImage(savedConcert, imageUrl); + concertImages.add(concertImage); + } + imageRepository.saveAll(concertImages); + log.info("Concert saved: " + savedConcert); Thread.sleep(300);