작성
·
364
0
안녕하세요? 강의의 기본 값 매핑 부분에서 GeneratedValue에 대해 수강 중에 질문이 생겼습니다.
1. sequence 전략을 사용하게 되면 미리 값을 증가 값 만큼 땡겨서 사용한다고 배웠는데요, 동시성 문제가 일어나지 않을 수 있는 이유는 여러 웹서버가 동시에 호출 하면 증가 값 만큼 가져올때 서로 다른 범위가 할당 되기 때문이라고 이해했습니다.
예로 두 대의 서버가 동시에 요청하고 증가값이 50이라면 A는 1~50 B는 51~100 범위를 할당 받는 거죠. 마치 pk 버퍼라고 할까요?
그리고 웹 서버가 중단 될 경우. 즉, A를 중간에 내려버리면 25까지 썻다고 하면 26~50은 사용 불가라고 이해했습니다..
이때 db 관련 값은 WAS에서 처리하니깐 WAS에 값을 저장하는게 더 좋아 보이는데요. WS에 저장하는 이유가 있을까요?
그러니깐 코드는 하나고 하나의 코드를 여러대의 서버에서 사용하는데 서버 당 WAS가 하나씩 연결 되어 있고 디비에서 sequnce 땡겨오는 건 WAS가 하고 값 저장은 WS가 하는 식으로 둘이 같이 협력하는 방식인건가요?
2. 뿐만 아니라, sequnce 값을 맨 처음이거나 시작 값+allocationSize을 넘어서면 두 번의 조회 쿼리를 통해 시작값과 상한값을 알게 되는데 이때 동시성 문제가 생길 수 있지 않나요? 예를 들자면! allocationSize가 50이라고 할때
A가 들가서 첫 조회 쿼리로 1받고 다음 조회 쿼리로 상한인 50을 받기 직전에
B가 들가서 첫 조회 쿼리로 51을 받고 두 번째 조회 쿼리로 상한인 100을 받았는데
이때 A의 두번째 조회 쿼리가 날라가서 100을 받아버리면 A는 1~100을 사용하게 되는 문제가 생길 거 같은데, 차라리 두 번의 조회 쿼리보다 한번의 조회 쿼리 이후에 db에서 설정한 allocationSize를 보고 자신의 상한을 아는 것이 더 좋을 거 같지 않나요?
3. 추가적으로 WS와 WAS는 1대1 관계인가요? N:M 관계는 될 수 없는 걸까요?
좋은 하루 보내세요!
답변 1
0
안녕하세요. 유승혁님
1. WAS에 저장해두는 이유는 애플리케이션이 WAS의 메모리 상에서 동작하기 때문입니다. DB를 계속 왔다갔다하면 비용이 비싼 네트워크 통신이 발생하겠지요? 반면에 WAS안에 있으면 메모리에 있는 데이터를 사용하기 때문에 성능이 아주 빠릅니다.
2. 겹치지 않습니다. DB가 동시성을 관리해서 겹치지 않는 값을 전달해줍니다.
3. N:M 관계가 될 수 있습니다. WS에서 로드벨런싱이 가능합니다.
감사합니다.