강의

멘토링

로드맵

Inflearn brand logo image

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

timesilvergold님의 프로필 이미지
timesilvergold

작성한 질문수

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

DBSynchronizer에서의 XML과 DB 동기화 문제

작성

·

45

0

안녕하세요.

DB관련 작업중에 이런 문제가 생겨서 어떻게 이런 결과가 생긴 것 인지 궁금해 질문 올려봅니다.

 

우선 모든 강의를 다 들었다는 전제하에,

다음과 같은 XML 코드는 잘 동작합니다.

image.png

이 코드를 기반으로

간단한 로그인 시스템을 만들어 보려고

Account Table과 Register Procedure을 만들었는데요

image.pngimage.png

문제는 기존에 있는 DB를 가져와서

DBSynchronizer의 Synchronize를 실행하는 부분에

Gather 시리즈에 문제가 있습니다.

Gather 시리즈를 간략하게 요약하자면, 현재 system에 있는 Table, Column, Procedures들을 모두 긁어서 While(...fetch()) 문으로

DBModel::Table, DBModel::Column등으로 매핑하는 작업입니다.

여기서 Fetch할때마다 함수 가장위에 정의해둔 여러 변수들이 갱신되는데요

bool값이나 숫자값은 값을 Fetch()가 값을 덮어씌워 별 문제가 없는데

 

tableName이나 columnName같은 특정 문자열 배열인 경우에 문제가 생겼습니다.

위의 사진의 경우 columnName을 순서대로 파싱할경우

DBModel::Column 별로 name이 accountId, email, pwHash가 되야할게

accountId, emailntId, pwHashtId가 되더라구요 그래도 운이좋게

끝에 tId가 공통됨으로, WChar 부분이 Fetch()시 완전히 초기화되지 않고 앞의 주소값만 넘어가서 len만큼 채우는것으로 결국 len뒤의 값은 남아 그대로 반영이 된것으로 확인 됬습니다.

 

각 Loop가 끝날때마다 WChar과 Vector 같은 주소값을 가지는 모든값의 초기화를 이런식으로 명시함으로써 해결할 수 있었지만,

image.png

 

예제코드는 잘 동작했던것을 보아하니 뭔가 코드를 빠뜨렸나 싶었습니다.

 

참고로 예제 코드의 Gold같은 경우

name이 id, gold, name, createDate로 작은값부터 커지기 때문에 위의 문제가 발생하지 않았나 싶기도 합니다.

 

혹시 이 문제 저만 그런가요?

원본 코드에서 spRegister의 out Parameter를 처리하기 위해 살짝 바꾸긴 했는데

그거 때문이려나요

 

 

 

 

 

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. timesilvergold님, 질문해주신 내용을 잘 이해했습니다.

DBSynchronizer에서 발생한 문제는 문자열 배열 초기화와 관련된 문제로 보입니다. Fetch() 함수가 호출될 때마다 WChar 또는 vector와 같이 주소값을 참조하는 변수가 제대로 초기화되지 않아 생기는 현상인 것 같습니다. 이로 인해 문자열 배열의 일부가 덮어씌워지지 않고 이전 값이 남아있는 상황이 발생하고 있는 것 같습니다.

이 문제를 해결하기 위해, memset을 통해 명시적으로 초기화하는 것은 합리적인 접근 방식입니다. Fetch() 함수의 호출 루프 내에서 tableName, columnName 등과 같은 문자열 배열을 항상 초기화해주는 것은 이러한 문제를 방지하는 데 효과적일 수 있습니다.

이 문제는 다른 개발자에게도 발생할 수 있는 일반적인 문제입니다. 특히, 문자열이나 가변 길이의 데이터를 다룰 때 초기화 처리가 명확하지 않을 경우에 발생할 수 있습니다. 또한, 예제 코드가 정상적으로 동작했다면 코드의 다른 부분에서 초기화가 이루어졌을 가능성이 있습니다. 만약 spRegister의 out Parameter 처리를 수정한 것이라면, 그 부분이 문제에 영향을 미쳤을 가능성도 배제할 수는 없습니다.

아래 유사한 질문과 답변을 확인해 보시길 권장합니다:
- 질문: DBSynchronizer에 관한 질문입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

timesilvergold님의 프로필 이미지
timesilvergold

작성한 질문수

질문하기