From dbceb1c2dd1de3954f576992044a3ad112c168e4 Mon Sep 17 00:00:00 2001 From: Creamcheesepie Date: Fri, 12 Dec 2025 10:16:28 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20kopis=20api=20key=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/concerts/service/KopisApiService.java | 4 +++- src/main/resources/application.yml | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) 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 db9aef34..ada5ecdf 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 @@ -12,6 +12,7 @@ import com.back.web7_9_codecrete_be.domain.concerts.repository.ConcertRepository; import com.back.web7_9_codecrete_be.domain.concerts.repository.TicketOfficeRepository; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.scheduling.annotation.EnableScheduling; @@ -38,7 +39,8 @@ public class KopisApiService { private final TicketOfficeRepository ticketOfficeRepository; //TODO : API key 환경변수로 가져오기 - private String serviceKey = ""; + @Value("${kopis.api-key}") + private String serviceKey; private LocalDate sdate = LocalDate.of(2025, 12, 1); private LocalDate edate = LocalDate.now().plusMonths(6); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 040ef3bf..831d33b9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -35,3 +35,6 @@ jwt: secret: ${SECRET_KEY} access-token-expiration: 3600 # 1시간 refresh-token-expiration: 1209600 # 14일 + +kopis: + api-key: ${KOPIST_API_KEY} \ No newline at end of file From edd2bfbd2e683706c5ba3f655302954b42e21544 Mon Sep 17 00:00:00 2001 From: Creamcheesepie Date: Fri, 12 Dec 2025 17:22:14 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=EA=B3=B5=EC=97=B0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C,=20=EA=B3=B5=EC=97=B0=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C,=20=EA=B3=B5=EC=97=B0=20=EC=98=88=EB=A7=A4?= =?UTF-8?q?=EC=B2=98=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcertController.java | 59 ++++++++++++++ .../dto/concert/ConcertDetailResponse.java | 46 +++++++++++ .../concerts/dto/concert/ConcertItem.java | 69 ++++++++++++++++ .../dto/ticketOffice/TicketOfficeElement.java | 20 +++++ .../domain/concerts/entity/Concert.java | 27 ++++++- .../domain/concerts/entity/TicketOffice.java | 10 ++- .../repository/ConcertRepository.java | 79 +++++++++++++++++++ .../repository/TicketOfficeRepository.java | 5 +- .../concerts/service/ConcertService.java | 52 ++++++++++++ .../concerts/service/KopisApiService.java | 17 +++- .../global/security/SecurityConfig.java | 3 +- 11 files changed, 382 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertDetailResponse.java create mode 100644 src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertItem.java create mode 100644 src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/ticketOffice/TicketOfficeElement.java 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 757b2e6d..5459d2f6 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 @@ -2,18 +2,35 @@ import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concert.ConcertListResponse; import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concertPlace.ConcertPlaceListResponse; +import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertDetailResponse; +import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertItem; +import com.back.web7_9_codecrete_be.domain.concerts.dto.ticketOffice.TicketOfficeElement; +import com.back.web7_9_codecrete_be.domain.concerts.entity.TicketOffice; import com.back.web7_9_codecrete_be.domain.concerts.service.ConcertService; import com.back.web7_9_codecrete_be.domain.concerts.service.KopisApiService; +import com.back.web7_9_codecrete_be.global.rsData.RsData; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springdoc.core.converters.models.PageableAsQueryParam; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("api/v1/concerts/") @Controller @RequiredArgsConstructor +@Tag(name = "Concerts", description = "공연에 대한 정보를 제공하는 API 입니다.") public class ConcertController { private final ConcertService concertService; private final KopisApiService kopisApiService; @@ -33,4 +50,46 @@ public ConcertPlaceListResponse setConcertPlace() throws InterruptedException { return kopisApiService.setConcertPlace(); } + @Operation(summary = "공연목록", description = "공연 전체 목록을 조회합니다. 시작일자를 기준으로 오름차순 조회합니다.") + @GetMapping("list") + public RsData> getList ( + @RequestParam + @Schema(description = "page입니다. 일단은 ?page={page} 로 넘기시면 됩니다.", example = "1") + int page + ) { + Pageable pageable = PageRequest.of(page, 10, Sort.by("startDate").ascending()); + return RsData.success(concertService.getConcertsList(pageable)); + } + + @Operation(summary = "다가오는 공연 목록", description = "오늘을 기준으로 다가오는 공연 목록을 조회합니다.") + @GetMapping("upComingList") + public RsData> getUpComingList ( + @RequestParam + @Schema(description = "page입니다. 일단은 ?page={page} 로 넘기시면 됩니다.", example = "1") + int page + ) { + Pageable pageable = PageRequest.of(page, 10); + return RsData.success(concertService.getUpcomingConcertsList(pageable)); + } + + @Operation(summary = "공연 상세 조회", description = "공연에 대한 상세 목록을 조회합니다.") + @GetMapping("concertDetail") + public ConcertDetailResponse getConcertDetail( + @RequestParam + @Schema(description = "조회 기준이 되는 concertId입니다. ?concertId={concertId} 로 값을 넘기시면 됩니다.") + long concertId + ) { + return concertService.getConcertDetail(concertId); + } + + @Operation(summary = "공연 예매처 조회", description = "공연에 대한 예매처들을 조회합니다.") + @GetMapping("ticketOffices") + public RsData> getTicketOffices ( + @RequestParam + @Schema(description = "조회 기준이 되는 concertId입니다. ?concertId={concertId} 로 값을 넘기시면 됩니다.") + long concertId + ){ + return RsData.success(concertService.getTicketOfficesList(concertId)); + } + } 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 new file mode 100644 index 00000000..12168aa7 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertDetailResponse.java @@ -0,0 +1,46 @@ +package com.back.web7_9_codecrete_be.domain.concerts.dto.concert; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDate; + +@Getter +public class ConcertDetailResponse { + + @Schema(description = "콘서트 Id입니다.") + private Long concertId; + + @Schema(description = "콘서트 이름입니다.") + private String name; + + @Schema(description = "콘서트에 대한 설명입니다.") + private String description; + + @Schema(description = "콘서트 장소 이름입니다.") + private String placeName; + + @Schema(description = "콘서트 시작 날짜입니다.",format = "yyyy-MM-dd") + private LocalDate startDate; + + @Schema(description = "콘서트 종료 날짜입니다.",format = "yyyy-MM-dd") + private LocalDate endDate; + + @Schema(description = "콘서트 포스터URL입니다. 썸네일로 사용해주세요.") + private String posterUrl; + + @Schema(description = "콘서트 티켓 최고가입니다.") + private int maxPrice; + + @Schema(description = "콘서트 티켓 최저가입니다.") + private int minPrice; + + @Schema(description = "콘서트 조회수입니다.") + private int viewCount; + + @Schema(description = "콘서트 좋아요수입니다.") + private int likeCount; + +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertItem.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertItem.java new file mode 100644 index 00000000..446ffab3 --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertItem.java @@ -0,0 +1,69 @@ +package com.back.web7_9_codecrete_be.domain.concerts.dto.concert; + +import com.back.web7_9_codecrete_be.domain.concerts.entity.Concert; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; + +@Getter +@Setter +public class ConcertItem { + + @Schema(description = "콘서트 Id입니다.") + private long id; + + @Schema(description = "콘서트 이름입니다.") + private String name; + + @Schema(description = "콘서트 장소 이름입니다.") + private String placeName; + + @Schema(description = "콘서트 시작 날짜입니다.",format = "yyyy-MM-dd") + private LocalDate startDate ; + + @Schema(description = "콘서트 종료 날짜입니다.",format = "yyyy-MM-dd") + private LocalDate endDate ; + + @Schema(description = "콘서트 포스터URL입니다. 썸네일로 사용해주세요.") + private String posterUrl; + + @Schema(description = "콘서트 티켓 최고가입니다.") + private int maxPrice; + + @Schema(description = "콘서트 티켓 최저가입니다.") + private int minPrice; + + @Schema(description = "콘서트 조회수입니다.") + private int viewCount; + + @Schema(description = "콘서트 좋아요수입니다.") + private int likeCount; + + public ConcertItem(Concert concert) { + this.id = concert.getConcertId(); + this.name = concert.getName(); + this.placeName = concert.getConcertPlace().getPlaceName(); + this.startDate = concert.getStartDate(); + this.endDate =concert.getEndDate(); + this.posterUrl = concert.getPosterUrl(); + this.maxPrice = concert.getMaxPrice(); + this.minPrice = concert.getMinPrice(); + this.viewCount = concert.getViewCount(); + this.likeCount = concert.getLikeCount(); + } + + public ConcertItem(long id, String name, String placeName, LocalDate startDate, LocalDate endDate, String posterUrl, int maxPrice, int minPrice, int viewCount, int likeCount) { + this.id = id; + this.name = name; + this.placeName = placeName; + this.startDate = startDate; + this.endDate = endDate; + this.posterUrl = posterUrl; + this.maxPrice = maxPrice; + this.minPrice = minPrice; + this.viewCount = viewCount; + this.likeCount = likeCount; + } +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/ticketOffice/TicketOfficeElement.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/ticketOffice/TicketOfficeElement.java new file mode 100644 index 00000000..9be67f7f --- /dev/null +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/ticketOffice/TicketOfficeElement.java @@ -0,0 +1,20 @@ +package com.back.web7_9_codecrete_be.domain.concerts.dto.ticketOffice; + +import com.back.web7_9_codecrete_be.domain.concerts.entity.TicketOffice; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +@Getter +public class TicketOfficeElement { + + @Schema(description = "예매처 이름입니다.") + String ticketOfficeName; + + @Schema(description = "예매처 주소입니다.") + String ticketOfficeUrl; + + public TicketOfficeElement(TicketOffice ticketOffice) { + this.ticketOfficeName = ticketOffice.getTicketOfficeName(); + this.ticketOfficeUrl = ticketOffice.getTicketOfficeUrl(); + } +} diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/Concert.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/Concert.java index 16861a50..b3e6ecde 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/Concert.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/Concert.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import java.time.LocalDate; import java.time.LocalDateTime; @Entity @@ -25,6 +26,12 @@ public class Concert { @Column(nullable = false,columnDefinition = "TEXT") private String content; + @Column(name = "start_date",nullable = false) + private LocalDate startDate; + + @Column(name = "end_date",nullable = false) + private LocalDate endDate; + @Column(name = "ticket_time", nullable = false) private String ticketTime; @@ -43,18 +50,36 @@ public class Concert { @Column(name = "api_concert_id", nullable = false) private String apiConcertId; - public Concert(ConcertPlace concertPlace, String name, String content, String ticketTime, int maxPrice, int minPrice, String apiConcertId) { + @Column(name = "poster_url",nullable = false,columnDefinition = "TEXT") + private String posterUrl; + + private int viewCount; + + private int likeCount; + + + + public Concert(ConcertPlace concertPlace, String name, String content, LocalDate startDate, LocalDate endDate, String ticketTime, int maxPrice, int minPrice, String posterUrl,String apiConcertId) { this.concertPlace = concertPlace; this.name = name; this.content = content; this.ticketTime = ticketTime; + this.startDate = startDate; + this.endDate = endDate; this.createdDate = LocalDateTime.now(); this.modifiedDate = LocalDateTime.now(); this.maxPrice = maxPrice; this.minPrice = minPrice; + this.posterUrl = posterUrl; + this.likeCount = 0; + this.viewCount = 0; this.apiConcertId = apiConcertId; } + public Concert(Long concertId) { + this.concertId = concertId; + } + public Concert update(ConcertPlace concertPlace, String content, String ticketTime, int maxPrice, int minPrice){ this.concertPlace = concertPlace; this.content = content; diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/TicketOffice.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/TicketOffice.java index 5efb2d4c..9cfba5df 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/TicketOffice.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/TicketOffice.java @@ -1,14 +1,21 @@ package com.back.web7_9_codecrete_be.domain.concerts.entity; import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Entity +@NoArgsConstructor +@AllArgsConstructor +@Getter public class TicketOffice { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) Concert concert; //예매처 명 @@ -23,4 +30,5 @@ public TicketOffice(Concert concert, String ticketOfficeName, String ticketOffic this.ticketOfficeName = ticketOfficeName; this.ticketOfficeUrl = ticketOfficeUrl; } + } diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertRepository.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertRepository.java index 5863867a..74454d26 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertRepository.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertRepository.java @@ -1,10 +1,89 @@ package com.back.web7_9_codecrete_be.domain.concerts.repository; +import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertDetailResponse; +import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertItem; import com.back.web7_9_codecrete_be.domain.concerts.entity.Concert; +import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertPlace; +import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertTime; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDate; +import java.util.List; + @Repository public interface ConcertRepository extends JpaRepository { Concert getConcertByApiConcertId(String apiConcertId); + + @Query(""" + SELECT + new com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertItem( + c.concertId as id, + c.name as name, + c.concertPlace.placeName as placeName, + c.startDate as startDate, + c.endDate as endDate, + c.posterUrl as posterUrl, + c.maxPrice as maxPrice, + c.minPrice as minPrice, + c.viewCount as viewCount, + c.likeCount as likeCount + ) + FROM + Concert c +""") + List getConcertItems(Pageable pageable); + + @Query(""" + SELECT + new com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertItem( + c.concertId as id, + c.name as name, + c.concertPlace.placeName as placeName, + c.startDate as startDate, + c.endDate as endDate, + c.posterUrl as posterUrl, + c.maxPrice as maxPrice, + c.minPrice as minPrice, + c.viewCount as viewCount, + c.likeCount as likeCount + ) + FROM + Concert c + WHERE + c.startDate >= :fromDate + ORDER BY + c.startDate + asc +""") + List getUpComingConcertItems( + Pageable pageable, + @Param("fromDate") LocalDate fromDate + ); + + @Query(""" + SELECT + new com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertDetailResponse( + c.concertId as concertId, + c.name as name, + c.content as description, + c.concertPlace.placeName as placeName, + c.startDate as startDate, + c.endDate as endDate, + c.posterUrl as posterUrl, + c.maxPrice as maxPrice, + c.minPrice as minPrice, + c.viewCount as viewCount, + c.likeCount as likeCount + ) + FROM + Concert c + WHERE + c.concertId = :concertId +""") + ConcertDetailResponse getConcertDetailById(@Param("concertId")long concertId); } diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/TicketOfficeRepository.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/TicketOfficeRepository.java index 5ed4f8ac..1283506c 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/TicketOfficeRepository.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/TicketOfficeRepository.java @@ -1,10 +1,13 @@ package com.back.web7_9_codecrete_be.domain.concerts.repository; +import com.back.web7_9_codecrete_be.domain.concerts.entity.Concert; import com.back.web7_9_codecrete_be.domain.concerts.entity.TicketOffice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface TicketOfficeRepository extends JpaRepository { - + List getTicketOfficesByConcert(Concert concert); } 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 a46d9f3c..80b0c172 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 @@ -1,12 +1,64 @@ package com.back.web7_9_codecrete_be.domain.concerts.service; +import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertDetailResponse; +import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertItem; +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.TicketOffice; +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 lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + @Service @RequiredArgsConstructor public class ConcertService { private final ConcertRepository concertRepository; + private final ConcertPlaceRepository concertPlaceRepository; + + private final TicketOfficeRepository ticketOfficeRepository; + + public List getConcertsList(Pageable pageable) { + return concertRepository.getConcertItems(pageable); + } + + public List getUpcomingConcertsList(Pageable pageable) { + LocalDate today = LocalDate.now(); + return concertRepository.getUpComingConcertItems(pageable, today); + } + + public ConcertDetailResponse getConcertDetail(long concertId) { + return concertRepository.getConcertDetailById(concertId); + } + + // N+1 문제 발생해서 버림 + /* + public List getConcertsList2(Pageable pageable) { + List concerts = concertRepository.findAll(pageable).getContent(); + List concertItems = new ArrayList<>(); + for (Concert concert : concerts) { + concertItems.add(new ConcertItem(concert)); + } + return concertItems; + } + */ + public List getTicketOfficesList(long concertId) { + Concert concert = new Concert(concertId); + List ticketOffices = ticketOfficeRepository.getTicketOfficesByConcert(concert); + List ticketOfficeList = new ArrayList<>(); + for (TicketOffice ticketOffice : ticketOffices) { + ticketOfficeList.add(new TicketOfficeElement(ticketOffice)); + } + + return ticketOfficeList; + } + + } 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 ada5ecdf..95edcc8d 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 @@ -38,7 +38,6 @@ public class KopisApiService { private final TicketOfficeRepository ticketOfficeRepository; - //TODO : API key 환경변수로 가져오기 @Value("${kopis.api-key}") private String serviceKey; private LocalDate sdate = LocalDate.of(2025, 12, 1); @@ -79,6 +78,7 @@ public ConcertListResponse setConcertsList() throws InterruptedException { for (ConcertListElement p : plr.getConcertList()) { totalConcertsList.add(p); } + log.info("Total Concert List: {}", totalConcertsList.size() + "개의 데이터 가져오는중..."); Thread.sleep(200); } @@ -121,14 +121,18 @@ public ConcertListResponse setConcertsList() throws InterruptedException { } } + // 콘서트 저장 Concert concert = new Concert( concertPlace, concertDetail.getConcertName(), concertDetail.getConcertDescription(), + dateStringToDateTime(concertDetail.getStartDate()), + dateStringToDateTime(concertDetail.getEndDate()), "", maxPrice, minPrice, + concertDetail.getPosterUrl(), concertDetail.getApiConcertId() ); @@ -218,9 +222,12 @@ public void updateConcertData() throws InterruptedException { // 1주일 단위 concertPlace, concertDetail.getConcertName(), concertDetail.getConcertDescription(), + dateStringToDateTime(concertDetail.getStartDate()), + dateStringToDateTime(concertDetail.getEndDate()), "", maxPrice, minPrice, + concertDetail.getPosterUrl(), concertDetail.getApiConcertId() ); } else { @@ -357,4 +364,12 @@ private ConcertPlaceDetailResponse getConcertPlaceDetailResponse(String serviceK .build() ).retrieve().body(ConcertPlaceDetailResponse.class); } + + private LocalDate dateStringToDateTime(String dateString) { + String [] split = dateString.split("\\."); + int year = Integer.parseInt(split[0]); + int month = Integer.parseInt(split[1]); + int day = Integer.parseInt(split[2]); + return LocalDate.of(year, month, day); + } } diff --git a/src/main/java/com/back/web7_9_codecrete_be/global/security/SecurityConfig.java b/src/main/java/com/back/web7_9_codecrete_be/global/security/SecurityConfig.java index 90de313b..cb7a0b9d 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/global/security/SecurityConfig.java +++ b/src/main/java/com/back/web7_9_codecrete_be/global/security/SecurityConfig.java @@ -42,7 +42,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti "/api/v1/auth/**", // 로그인/회원가입은 허용 "/v3/api-docs/**", // Swagger "/swagger-ui/**", // Swagger UI - "/h2-console/**" // H2 Console + "/h2-console/**", // H2 Console + "/api/v1/concerts/**" // concert 정보 조회 도메인 ).permitAll() .anyRequest().authenticated() )