Skip to content

Commit 2de68b1

Browse files
perf: 내 티켓 조회 dto projection 방법으로 변경
1 parent 4164827 commit 2de68b1

7 files changed

Lines changed: 103 additions & 9 deletions

File tree

backend/src/main/java/com/back/api/ticket/controller/TicketController.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,9 @@ public class TicketController implements TicketApi {
2828
public ApiResponse<List<TicketResponse>> getMyTickets() {
2929
Long userId = httpRequestContext.getUser().getId();
3030

31-
List<Ticket> tickets = ticketService.getMyTickets(userId);
31+
List<TicketResponse> responses = ticketService.getMyTickets(userId);
3232

33-
return ApiResponse.ok(
34-
"사용자의 티켓 목록 조회 성공",
35-
tickets.stream().map(TicketResponse::from).toList()
36-
);
33+
return ApiResponse.ok("사용자의 티켓 목록 조회 성공", responses);
3734
}
3835

3936
@Override

backend/src/main/java/com/back/api/ticket/dto/response/TicketResponse.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import java.time.LocalDateTime;
44

5+
import com.back.domain.seat.entity.SeatGrade;
6+
import com.back.domain.seat.entity.SeatStatus;
57
import com.back.domain.ticket.entity.Ticket;
8+
import com.back.domain.ticket.entity.TicketStatus;
69

710
import io.swagger.v3.oas.annotations.media.Schema;
811

@@ -37,6 +40,32 @@ public record TicketResponse(
3740
@Schema(description = "사용 시간", example = "2024-01-01T18:00:00")
3841
LocalDateTime usedAt
3942
) {
43+
public TicketResponse(
44+
Long ticketId,
45+
Long eventId,
46+
String eventTitle,
47+
String seatCode,
48+
SeatGrade seatGrade,
49+
Integer seatPrice,
50+
SeatStatus seatStatus,
51+
TicketStatus ticketStatus,
52+
LocalDateTime issuedAt,
53+
LocalDateTime usedAt
54+
) {
55+
this(
56+
ticketId,
57+
eventId,
58+
eventTitle,
59+
seatCode,
60+
seatGrade != null ? seatGrade.getDisplayName() : null,
61+
seatPrice != null ? seatPrice : 0,
62+
seatStatus != null ? seatStatus.name() : null,
63+
ticketStatus.name(),
64+
issuedAt,
65+
usedAt
66+
);
67+
}
68+
4069
public static TicketResponse from(Ticket ticket) {
4170
return new TicketResponse(
4271
ticket.getId(),

backend/src/main/java/com/back/api/ticket/service/TicketService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.springframework.transaction.annotation.Transactional;
77

88
import com.back.api.seat.service.SeatService;
9+
import com.back.api.ticket.dto.response.TicketResponse;
910
import com.back.domain.event.entity.Event;
1011
import com.back.domain.event.repository.EventRepository;
1112
import com.back.domain.seat.entity.Seat;
@@ -165,8 +166,8 @@ public void failPayment(Long ticketId) {
165166
* 내 티켓 목록 조회
166167
*/
167168
@Transactional(readOnly = true)
168-
public List<Ticket> getMyTickets(Long userId) {
169-
return ticketRepository.findByOwnerId(userId);
169+
public List<TicketResponse> getMyTickets(Long userId) {
170+
return ticketRepository.findMyTicketDto(userId);
170171
}
171172

172173
/**

backend/src/main/java/com/back/domain/ticket/repository/TicketRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import com.back.domain.ticket.entity.Ticket;
1111
import com.back.domain.ticket.entity.TicketStatus;
1212

13-
public interface TicketRepository extends JpaRepository<Ticket, Long> {
13+
public interface TicketRepository extends JpaRepository<Ticket, Long>, TicketRepositoryCustom {
1414

1515
List<Ticket> findByOwnerId(Long userId);
1616

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.back.domain.ticket.repository;
2+
3+
import java.util.List;
4+
5+
import com.back.api.ticket.dto.response.TicketResponse;
6+
7+
public interface TicketRepositoryCustom {
8+
9+
List<TicketResponse> findMyTicketDto(Long userId);
10+
11+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.back.domain.ticket.repository;
2+
3+
import static com.back.domain.event.entity.QEvent.*;
4+
import static com.back.domain.seat.entity.QSeat.*;
5+
import static com.back.domain.ticket.entity.QTicket.*;
6+
7+
import java.util.List;
8+
9+
import org.springframework.stereotype.Repository;
10+
11+
import com.back.api.ticket.dto.response.TicketResponse;
12+
import com.back.domain.ticket.entity.TicketStatus;
13+
import com.querydsl.core.types.Projections;
14+
import com.querydsl.jpa.impl.JPAQueryFactory;
15+
16+
import lombok.RequiredArgsConstructor;
17+
18+
@Repository
19+
@RequiredArgsConstructor
20+
public class TicketRepositoryImpl implements TicketRepositoryCustom {
21+
22+
private final JPAQueryFactory jpaQueryFactory;
23+
24+
@Override
25+
public List<TicketResponse> findMyTicketDto(Long userId) {
26+
return jpaQueryFactory
27+
.select(Projections.constructor(
28+
TicketResponse.class,
29+
ticket.id,
30+
event.id,
31+
event.title,
32+
seat.seatCode,
33+
seat.grade,
34+
seat.price,
35+
seat.seatStatus,
36+
ticket.ticketStatus,
37+
ticket.issuedAt,
38+
ticket.usedAt
39+
))
40+
.from(ticket)
41+
.join(ticket.event, event)
42+
.leftJoin(ticket.seat, seat)
43+
.where(
44+
ticket.owner.id.eq(userId),
45+
ticket.ticketStatus.in(
46+
TicketStatus.PAID,
47+
TicketStatus.ISSUED,
48+
TicketStatus.USED
49+
)
50+
)
51+
.orderBy(ticket.createAt.desc())
52+
.fetch();
53+
54+
}
55+
}

backend/src/test/java/com/back/api/ticket/service/TicketServiceIntegrationTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.springframework.test.context.ActiveProfiles;
1414
import org.springframework.transaction.annotation.Transactional;
1515

16+
import com.back.api.ticket.dto.response.TicketResponse;
1617
import com.back.domain.event.entity.Event;
1718
import com.back.domain.event.repository.EventRepository;
1819
import com.back.domain.seat.entity.Seat;
@@ -180,7 +181,7 @@ void getMyTickets_success() {
180181
ticketHelper.createIssuedTicket(user, seat, event);
181182
ticketHelper.createIssuedTicket(user, seat2, event);
182183

183-
List<Ticket> myTickets = ticketService.getMyTickets(user.getId());
184+
List<TicketResponse> myTickets = ticketService.getMyTickets(user.getId());
184185

185186
assertThat(myTickets).hasSize(2);
186187
}

0 commit comments

Comments
 (0)