인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

유재선님의 프로필 이미지
유재선

작성한 질문수

실전! Querydsl

동시성 처리가 된건지 모르겠습니다.

해결된 질문

작성

·

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

감사합니다.

유재선님의 프로필 이미지
유재선
질문자

답변 정말 감사합니다. 열심히 공부해서 동시성 처리를 해결해 해보겠습니다.

유재선님의 프로필 이미지
유재선

작성한 질문수

질문하기