안녕하세요. 강사님 강의를 정주행중인 학생입니다.
아직 디비 관련 강의를 듣기 전인데 실제 프로젝트를 하다 궁금함이 있어 질문드립니다.
비즈니스 로직상 동일한 사용자 아이디를 등록할 수 없습니다.
테이블 상 유니크 제약 조건은 사용하지 않고 비지니스 로직에서 에러 처리를 하기위해
사용자를 등록 시 최초 동일한 아이디가 있는지 디비에서 검색합니다.
그 다음 동일한 아이디가 없을 때 먼저 다른 서버에 데이터를 등록 요청 후
디비에 사용자를 등록합니다.
성능 테스트를 위해 api를 여러번 호출했습니다.
요청당 각 별도의 쓰레드로 실행되다 보니 몇개는 동일한 아이디가 여러개 등록됩니다.
현재는 멀티 프로세스 환경을 사용할 계획이 없어서 synchronized 키워드를 사용하여 동기화 처리를 했습니다.
더 나아가 궁금한 점은
- 단일 프로세스 환경이면 동기화로 처리하는 방법은 좋은 방법일까요?
tps가 많을 경우 속도 느려진다는 단점이 있을 것 같습니다.
tps 많다면 결국 서버를 늘려야 하겠죠. 그럼 결국 멀티 프로세스 환경으로 넘어가네요..ㅎㅎ...
- 멀티 프로세스 환경(다중 서버)일 경우 어떤식으로 처리하는게 좋을까요?
- 강사님이 다른 질문에 올려주신 디비에 유니크 제약 조건을 이용하여 공통 예외 처리를 하는 내용도 봤습니다.
다른 서버에 데이터 등록 요청을 하지 않는다면 멀티 프로세스 환경에서도 좋은 방법인 것 같습니다.
다만 다른 서버에 데이터를 등록했으니 예외를 잡아 등록된 다른 서버 데이터를 삭제 요청 후 에러를 발생시키는게 좋은 방법일까요?
https://www.inflearn.com/questions/59250
- 강사님이 올려주신 디비 강의에 해당 관련 내용이 있는지도 궁금합니다. 있다면 어느 강의에서 볼 수 있을지도 궁금하네요.
- 강의에 없다면 어떤 키워드를 참고해서 검색하면 될지도 궁금하네요.
코드도 비슷하게나마 올려봅니다.
@Transactional
public synchronized void createUser(String username){
...
Optional<User> findUserOptional = repository.findByUsername(username);
if(!findUserOptional.isPresent()){
~~~ 블라블라 다른 서버에 데이터 등록(MSA 구조)
em.persist(user);
}else{
throw new RuntimeException("username already exists.");
}
...
}