해결된 질문
작성
·
202
0
@Transactional
public boolean enrollCourse(String studentId, Long courseId){
Course findCourse = courseRepository.findById(courseId).get();
if(findCourse.getCurrentNumStudent() == findCourse.getMaxNumStudent())
return false;
Student findStudent = studentRepository.findById(studentId).get();
StudentCourse studentCourse = new StudentCourse();
studentCourse.enrollCourse(findStudent, findCourse);
findCourse.addCurStudentNum();
studentCourseRepository.save(studentCourse);
return true;
}
service의 메소드 입니다.
위의 동시성 처리 시나리오는
수강신청 최대 인원(findCourse.maxNumStudent)이 50명이고
현재 신청인원(findCourse.currentNumStudnet)이 49명일 때 동시에 여러 학생이 수강신청을 할 경우의 동시성 처리입니다.
false를 반환 받으면 controller에서 클라이언트로 신청할 수 없다는 메세지를 전달합니다.
JPAQueryFactory는 Repository마다 생성하고
JPAQueryFactory에 초기화하는 EntityManager는 주입받아서 전체 Repository에 공통으로 사용하고 있습니다.
@Transactional 에너테이션을 추가했고, JPAQeuryFactory를 사용했으므로 동시성 처리가 되고 있는 건지 궁금합니다.
더 생각 해 본것이 메소드에 synchronized 를 사용하는 것도 괜찮을 까요?
클라이언트의 요청마다 스레드가 생기는 것이니까 가능할 것 같다고 생각합니다.
또, 혼자서 개발할 때 동시성 처리를 테스트 할 수 있는 좋은 방법이 있는지 궁금합니다.
답변 1
1
안녕하세요. 재선님
트랜잭션을 사용한다고 해도 원하시는 동시성 처리를 하기는 어렵습니다.
서버가 딱 1대라면 synchronized를 사용해도 되겠지만, 보통 서버를 2대 이상 사용하기 때문에 이것도 해결방안이 되지 않습니다.
결국 데이터베이스가 제공하는 동시성 처리가 필요한데요. 이 부분은 깊이있는 공부가 필요합니다.
관련해서 다음 링크를 참고해주세요^^
https://www.inflearn.com/questions/17498
감사합니다.
답변 정말 감사합니다. 열심히 공부해서 동시성 처리를 해결해 해보겠습니다.