테스트
@Test
public void mFindAllByShowtimeId_test(){
//given
Long showtimeId = 8L;
// 열과 행의 최댓값 (초기화)
int maxCols = 0;
int maxRows = 0;
//when
List<Seat> seats = seatRepository.mFindAllByShowtimeId(showtimeId);
System.out.println(seats.size()); // 9
// 좌석 정보에서 최대 열과 행을 찾아야 하므로 먼저 탐색
for(Seat seat : seats){
Character colNum = seat.getColNum();
//System.out.println(colNum); // 2 3 4 5 1 2 3 4 5
Character rowNum = seat.getRowNum(); // A B
//System.out.println(rowNum);
// colNum이 문자여서 숫자로 변환
int colIndex = Character.getNumericValue(colNum);
//System.out.println("colIndex: " + colIndex); // 2 3 4 5 1 2 3 4 5
int rowIndex = rowNum - 'A' + 1; // A = 1, B = 2 // 1 1 1 2 2 2 2 2
//System.out.println("rowIndex: " + rowIndex);
// 최대 열과 행을 업데이트
if(colIndex > maxCols){
maxCols = colIndex;
}
if(rowIndex > maxRows){
maxRows = rowIndex;
}
}
System.out.println(maxCols); // 5
System.out.println(maxRows); // 2
// 계산된 최대 열과 행을 사용하여 배열 생성
Seat[][] seatArray = new Seat[maxRows][maxCols]; // seat[2][5]
// 다시 좌석 정보를 배열에 넣는 작업
for(Seat seat : seats){
Character colNum = seat.getColNum(); // 1, 2, 3, 4, 5
Character rowNum = seat.getRowNum(); // A, B
int colIndex = Character.getNumericValue(colNum) - 1; // 배열 인덱스는 0부터 시작하므로 -1
int rowIndex = rowNum - 'A'; // 배열 인덱스는 0부터 시작하므로 'A'는 0, 'B'는 1
seatArray[rowIndex][colIndex] = seat;
}
//eye
//System.out.println(seatNumbers);
System.out.println("이차원배열 길이 : " + seatArray.length);
// 좌석 배열 확인용 출력
for (int i = 0; i < seatArray.length; i++) {
for (int j = 0; j < seatArray[i].length; j++) {
Seat seat = seatArray[i][j];
if (seat != null) {
System.out.print("[" + seat.getRowNum() + seat.getColNum() + "] ");
} else {
System.out.print("[ ] "); // 중간에 빈 좌석
}
}
System.out.println(); // 행이 끝나면 줄 바꿈
}
// 확인용 출력
System.out.println("Max Columns: " + maxCols);
System.out.println("Max Rows: " + maxRows);
}
SeatRepository
@Query("select s from Seat s join fetch s.showtime st where st.id = :showtimeId")
List<Seat> mFindAllByShowtimeId(@Param("showtimeId") Long showtimeId);
실행 시키면

쿼리가 실행되면서

2차원 배열 안에 좌석 정보가 담기게 된다.
아쉬운 점 : 테스트 코드랑 서비스 레이어의 비즈니스 로직 부분에서는 이렇게 2차원 배열을 활용하였는데, ResponseDTO 에 담을 때 이차원 배열로 넘어온 걸 다시
행과 열을 따로 분리시켜서 담았다. ( 왜 그랬을까 ..? )
이차원 배열 형태로 DTO에 담아서 return 한 뒤 자바스크립트 코드를 사용해
그대로 렌더링 했으면 코드가 더 깔끔했을 것 같다.
Share article