2주 챌린지 - 7. 서버 연결하니 예매가 안된다.

yy·2023년 11월 25일

개발일지

목록 보기
47/122

동시성 문제가 해결되지 않았으나 우선은 서버를 연결해서 서버 부하테스트를 준비하기로 했다. 팀원분들이 준비해주신 로드밸런서로 배포를 진행했다.
로드밸런서...어렵게만 느꼈는데 알고보니 그냥 EC2 서버 여러개를 하나로 묶어주는 역할을 해주고 있었다. 마치 관리자가 작업자에게 일을 분배해주는 분배자였던 것이었다...그래서 로드밸런서라는 이름을 가졌다.

우선 EC2 인스턴스를 생성 -> 로드 밸런서를 생성하면된다.

  • 인스턴스 생성: 기본 인스턴스 생성(필요한 만큼 생성) + nginx 생성 코드 넣기
  • 로드밸런서 생성 : 인바운드 규칙 (http는 80, https는 443, ssh는 22포트)

1. 예매하기 누르니 에러 발생 => 해결

암튼...그렇게 만들고나서 기능을 하나씩 확인해보는데 아래와 같은 에러메시지가 떴다.
예매 API였는데 로컬에서 작동시키면 예매가 완료되었다거나 기타 메시지가 떴어야했는데..

아뿔사! 쿼리최적화를 한답시고 만들어둔 rawquery에서 문제가 생겼다.

await tx.$queryRaw`SELECT * FROM shows FOR UPDATE;`;
await tx.$executeRaw`UPDATE users SET credit = credit - ${updatedShow.price} WHERE userId=${userId};`;await tx.$executeRaw`UPDATE shows SET quantity = quantity-1 WHERE showId=${showId};`;
await tx.$executeRaw`INSERT INTO reservation(UserId, ShowId) VALUES (${user.userId}, ${showId});`;



에러를 발생시킨 범인들. 문제는 테이블이름을 소문자로 사용했기때문이었다.
로컬에서 작동시키면됐던 이유는 로컬 mysql을 사용했기때문에(mysql은 좀 형평성이 있는 편)문제가 생기지 않았는데 RDS-mysql을 이용해서 하려다보니 규칙이 빡빡해져서 에러가 발생한듯했다.
사실 SQL은 좀 규칙에 빡빡해서 대소문자구별에 문자는 반드시 ''로 감싸고, ;를 마지막에 꼭 넣어줘야한다. 안그러면 에러가 생김



await tx.$queryRaw`SELECT * FROM Shows FOR UPDATE;`;
await tx.$executeRaw`UPDATE Users SET credit = credit - ${updatedShow.price} WHERE userId=${userId};`;await tx.$executeRaw`UPDATE Shows SET quantity = quantity-1 WHERE showId=${showId};`;
await tx.$executeRaw`INSERT INTO Reservation(UserId, ShowId) VALUES (${user.userId}, ${showId});`;

profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글