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

Sungwon Jung님의 프로필 이미지
Sungwon Jung

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

ORM

DBSynchronizer에 관한 질문입니다.

작성

·

324

0

DBSynchronizer을 이것저것 분석중에 여러가지 질문이 생겨서 올립니다.

1. Identity에 관한 질문입니다.

위처럼 gold에 identity를 추가하고 실행했더니

쿼리문에 Identity가 추가 되지 않는 것을 발견해서 

찾아보니까

이 부분에서 xmlColumn의 identity를 넣지 않아서  쿼리문을 생성할때 Identity문을 넣지 않는 것을 발견햇습니다.

그래서 우선 추가 후에 실행하니 이번에는 쿼리문을 실행하는 도중에 에러가 났는데,

쿼리문을 확인해보니,

이와 같이 작성이 되어 있어서 구글링으로 찾아보니까

이처럼 우선 gold 컬럼을 날리고 나서 

gold컬럼을 추가할때 IDENTITY 옵션을 줘야 한다고 되어 있어서 바꿔서 실행해보니 쿼리문에서는 에러가 나지 않았습니다.

이번에는 다른 에러가 낫는데,  

여러개의 Identity를 사용할 수 없다고 나오는 에러였습니다.

Identity에 관한 질문은 2가지인데요.

위와 같은 경우를 볼때, 궁금한점은 다음과 같습니다.

1) Identity를 추가할 컬럼을 DROP으로 날리고 나서 ADD를 통해 추가 하는 방법이 맞는 것일까요?

만약에 1) 과 같은 방법이 맞다면, 나중에 Identity를 옵션으로추가할 경우 해당 컬럼이 기본키 설정이 되어있으면 삭제가 되지 않을텐데, 이런 경우는 어떻게 해야할까요?

2) 애초에 1) 과 같은 고민을 할때 테이블에는 Identity를 하나만 정해서 써야하니까, 테이블을 설계할때 이미 정해져 있어야하고,

나중에 Identity 옵션을 추가하는 것은 옳지 않은 방법인건가요?

2. _dependentIndexes에 관한 질문입니다.

이 변수가 무엇을 위한 것인지 명확하게

이해가 되지 않아서 질문 올립니다.

_dependentIndexes에 관한 질문은 3가지 입니다.

1) 제가 파악한 해당 변수의 기능은

쿼리를 바로 날리지 않고,

순서대로,

그리고 모아서 쿼리를 날리는 이유와 관련된 기능 같습니다. 컬럼들이 서로 Dependency가 걸려 있으면, 

먼저 하나를 삭제하면 다른 컬럼이 오류가 날수도 있기 때문에 연관되어 있는 변수(Dependency가 걸려 잇는)들을 모아두는 것으로 우선 파악을 했는데 맞는 걸까요?

2) 1)에서 언급한 서로 Dependency가 걸려있다는 것이 명확하게 이해가 가지를 않습니다. 제가 추측하기로는 외부키를 이용해 다른테이블을 참조하는것이 Dependency가 걸려있다는 것 같은데 맞는 걸까요?

3) _dependentIndexes에 insert하는 부분을 찾아보니 CompareColumn을 이용해서 Column들을 비교할때 입니다.

이 코드 인데,

해당 컬럼의 Type이 바뀌엇거나

해당 컬럼의 문자열 길이가 바뀌었거나

해당 컬럼이 Nullable가 바뀐경우

들어와서 dbTable의 Index 목록을 돌면서 

해당 컬럼이 Index가 걸려져 있는지 판단하고, 걸려 있으면

_dependentIndexes에 넣는 것으로 해석했는데,

제 짧은생각으로는 Type이 바뀌거나, 문자열 길이가 바뀌거나, Nullable이 바뀐경우  위와 같은 검사를 해서 _dependentIndexes에 넣는 경우는 무엇이고,

넣지 않는 경우는 무엇인지 이해가 되질 않습니다 ㅠㅠ

3. 마지막으로 외부키에 관한 질문입니다.

외부키를 설정하는 것은 현재 강의에서 빠져잇는 것 같아서

구글링해서 설정하는 방법을 찾아보고,

직접 넣어봣는데 

맞는 방식인지 의구심이 들어서 질문올립니다.

우선 외부키 설정은 제약조건으로 달 수 잇는것을 확인하고,

테스트를 하기 위해서 2개의 테이블을 준비했습니다.

첫번째 방식으로는 위 그림처럼 <Table /Table> 안에

Index를 넣어서 하니 외부키로 설정해야할 Gold테이블이 

아직 생성되지 않아서 에러를 뱉는 문제가 생기는 바람에

아예 따로 빼서,

이렇게 구성했는데, 맞는 방식일까요?

답변 2

0

Sungwon Jung님의 프로필 이미지
Sungwon Jung
질문자

소스코드를 받으면 왜 이렇게 만들었는지 분석하는 성격이라서 그랬습니다 ㅎㅎ..

이해가 안되고 넘어가면 계속 생각이나서요 

감사합니다.

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

우선 기억을 재구성해서 만든 코드라 완전하지 않고
자체 ORM을 만드는 작업이다 보니 구멍이 있으면 스스로 메꾸셔야 하며,
모든 코드를 너무 상세하게 분석하실 필욘 없습니다.
실제로 자체 ORM에서 2% 부족한 부분이 있어 고치는 일이 꽤 있었습니다.

1)
Identity 경우 수정할 일이 사실상 없으므로 그 정도로 극단적인 상황은 굳이 챙길 필요 없습니다.

2)
복합키 등이 걸려 있는 상태에서 칼럼을 날린다거나, 하면 안 되기 때문에 추적하는 것이고
FK랑은 관계가 없습니다.
그리고 속성등이 바뀌면 GetUniqueName()이 바뀔 수 있습니다.

3)
MMO 쪽에서는 FK을 쓰지 않는 경우가 꽤 많습니다.
아이템 등을 삭제하기보다는 deleted 상태로만 수정해서 남겨서
로그 용도로 남기거나 복구 등을 해주거나 하는 일도 많아서
괜히 FK Constraint을 걸어서 귀찮은 일을 예방하는 것이죠.

Sungwon Jung님의 프로필 이미지
Sungwon Jung

작성한 질문수

질문하기