Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat#11] 공연 좌석 정보 조회, 공연 좌석 예약 (동시성 해결 X) #15

Merged
merged 10 commits into from
Oct 2, 2021

Conversation

hyejungg
Copy link
Collaborator

@hyejungg hyejungg commented Oct 1, 2021

진행상황보고

  1. 공연 좌석 정보를 공연명과 날짜를 이용하여 조회 가능
    1
  2. 공연 예약 가능
    2
  • DB에 존재하지 않는 유저는 예약 불가(401)
    401
  • DB에 존재하지 않는 공연 정보는 에러 반환(404)
    404

해결해야 할 문제

  • 공연 좌석 정보 예약 시 이미 예약된 좌석은 예약이 불가하도록 만들어야 합니다. (레디스를 이용하려고 생각중입니다.)
    캡처
  • 동시성 문제를 해결하고, 예약 시 성공, 실패 상관 없이 예약 정보를 저장하는 BookingHistory를 완성시켜야 합니다.
  • 나의 예약 정보를 조회하는 코드를 완성시켜야 합니다.

질문

  1. Mock 객체를 이용하여 유닛테스트를 진행하려고 하는데, 성공해야 하는 테스트 코드에도 NotFoundDataException을 발생시킵니다.
  2. MockSeatServiceTest의 경우, list.size()값이 0이지만, 실제로 테스트를 돌려보면 제대로 동작합니다 ........
  3. BookingService에서 saveBookging 메소드로 예약 여부를 저장합니다. 이런 흐름이 맞는지 .... 잘 모르겠습니다.

devlop 브랜치를 pull 받은 후에 push 했더니 이전 커밋들도 함께 올라가게 되었습니다 ... 죄송합니다.

hyejungg and others added 8 commits September 20, 2021 23:34
이메일 등록 후 중복, 타입 일치하지 않은 경우 모두 확인 완료
피드백을 바탕으로 크게 다음과 같이 수정하였습니다.

1. `@Vaildated` 의존성 라이브러리를 추가하여 유효성 검증하도록 수정하면서 관련 메소드 삭제, UserDto에 `@Email` 어노테이션 추가
2. `GlobalExceptionHandler`에서 ~Exception 이라는 사용자 정의 예외를 받아서 처리되도록 수정
3. 예외 혹은 성공 return 시 postman에서 Status 부분이 모두 200 OK로 지정되는 문제가 있어서 각각 ResponseEntity로 return하도록 수정하였음...
빠른 피드백 감사합니다 !!!!!

1. `UserService` 불필요한 if-else문 삭제
2. `UserController` 불필요한 null 확인 처리 삭제
3. /test 테스트 코드를 기능 별로 메소드를 생성하여 테스트하도록 수정(UserServiceTest의 타입오류로 인한 테스트는 추후에 수정 필요해 보임..)
1. 날짜로 공연 정보를 조회하는 코드
2. 날짜&이름으로 공연 정보를 조회하는 코드
피드백을 바탕으로 다음과 같이 수정하였습니다.
1. Controller에서 검사하던 내용을 -> Service 계층으로 옮김
2. PerformanceResponse를 추가하면서 관련 코드 수정
3. PerformanceService 계층 유닛테스트 추가(수정 필요)
---
[질문] 
`PerformanceServiceTest2.java` 에서 //@todo 주석으로 적어두었지만... 테스트 결과가 성공해야하는데 실패하는 이상한 문제가 있습니다 ........ 뭐가 문제인지 정확히 모르겠지만 given().willReturn()과 관련이 있는걸까요?! 성공해야하는데 NotFoundDataException이 발생한다고 합니다. (Service 에서 getListPerformance에서 if문에 해당되어..)
[feat:#10] 공연 정보 조회 코드 구현
1. 공연 좌석 정보를 조회하는 코드 구현
2. 공연 좌석을 예약하는 코드 구현
  2-1. 같은 좌석에 여러 명이 예약되는 문제가 있음. (해결하지 못함)
@hyejungg hyejungg added question 멘토님께 질문! feature 기능 구현 labels Oct 1, 2021
@hyejungg hyejungg added this to the 예약 관련 기능 구현 milestone Oct 1, 2021
@hyejungg hyejungg requested a review from comento-yun October 1, 2021 03:15
@hyejungg hyejungg self-assigned this Oct 1, 2021
@comento-yun
Copy link

@hyejungg 혜정님 3번질문을 이제 확인했습니다.

Q1. Mock 객체를 이용하여 유닛테스트를 진행하려고 하는데, 성공해야 하는 테스트 코드에도 NotFoundDataException을 발생시킵니다.

#15 (comment)

Q2. MockSeatServiceTest의 경우, list.size()값이 0이지만, 실제로 테스트를 돌려보면 제대로 동작합니다 ........

#15 (comment)

Q3. BookingService에서 saveBookging 메소드로 예약 여부를 저장합니다. 이런 흐름이 맞는지 .... 잘 모르겠습니다.

3번 질문을 이제 확인했네요, saveBooking메서드 내부에서 이루어지는 절차가 맞는지에 대한 질문 일까요? 정확하게 질문을 파악하지 못해서 메서드 내부에서 이루어지는 절차에 대해서 답변 드릴게요.

1.좌석을 예약처리한다.
2.booking 테이블에 예약현황을 추가시킨다.

일단 절차로는 문제가 없습니다. 다만 아래에서 설명드린것처럼 트랜잭션으로 묶어야합니다.
#15 (comment)

추가적으로 Redis를 활용해서 동시성 문제를 해결한다면 Redis를 통해 distributed lock을 획득해오고 lock을 이미 다른 프로세스에서 점유하고 있는지 확인해서 다른 프로세스가 lock을 가지고 있다면 좌석예약을 진행하지 못하게 막는로직이 추가될필요가 있을것 같구요.

1. 모든 서비스 계층에서 받는 매개변수는 final 변수로 수정하였음
- 서비스 계층에서 가져오는 해당 값은 DB에 접근하기 위함으로 사용되는 것이니까 변경할 이유는 없다고 생각되고, 기존 코드 중에서도 변경되는 부분이 없음.
- final로 선언하여 변경 불가 하도록 상수화
2. 나의 공연 좌석 예약 정보를 조회하는 코드 추가
3. 예약 성공/실패 여부 저장 코드 추가
- 예약 성공 시에는 저장되지만, 실패 시 저장되지 않는 문제가 있음. (해결해야 함)
@hyejungg hyejungg requested a review from comento-yun October 2, 2021 11:19
Copy link

@comento-yun comento-yun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

큰 문제는 없지만 주의해야할 부분에 대한 추가 코멘트 남겼습니다. 반영하셔도 좋고 참고만하고 일단 merge하셔도 좋습니다. 고생하셨습니다

- 피드백을 반영하여 getIsBooking()메소드에서 seat 정보를 2번 read 하는 작업을 -> 1개로 수정하였습니다. 
- history에 저장되는 메소드 이름을 saveBookingXXXlog(fail,success)통일 시켰습니다.
- insert, update 등이 수행되는 부분에는 @Transcational을 추가하고, 조회하는 경우에는 readOnly를 추가하였습니다.
@hyejungg hyejungg merged commit efeb847 into main Oct 2, 2021
@hyejungg hyejungg linked an issue Jan 8, 2022 that may be closed by this pull request
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature 기능 구현 question 멘토님께 질문!
Projects
None yet
Development

Successfully merging this pull request may close these issues.

좌석 정보 예약 기능 구현
2 participants