콜백의 콜백을 해결할 수 있을까요?

문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족한 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 최신
  • 프로젝트명 : MiniRPG
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

안녕하세요. 뒤끝 이용중에 어려운부분이 있어 질문드립니다!

유저 정보를 담고있는 테이블이 있습니다. 유저마다 최대 하나의 row만 가질 수 있습니다.
유저가 사용을 함에따라 해당 row의 데이터를 Update하면서 사용하게 됩니다.

문제는 Update할때마다 “유저가 row을 가지고 있는지 확인하고, 가지고있지 않다면 Insert를 하는 함수” 를 매번 불러야 한다는 부분입니다. 이렇게되면, 불필요한 호출횟수도 많아지고, 코드도 콜백의 콜백(의 콜백) 을 구현해서 지저분해진다는 단점이 보입니다. 여기에다가 Transaction까지 추가된다면 스파게티가 될 것 같은데요…

  1. 원래 DB는 어떻게 바뀌어있을지 모르니까 Update하고싶을 때마다 row가 있는지 확인하여 (indate를 가져온 후 혹은 Insert한 후) Update한다.
  2. 우선 쿼리 new Where()를 통해 Update를 호출하고, 콜백 실패의 이유가 row가 없어서라면 Insert를 진행한다. (해당 사유로 실패를 리턴 하지는 않는 것 같네요…)
  3. 회원가입 할 때 유저의 정보를 Insert하고 이후로는 row가 있다고 가정하고 Update만 합니다.
    (이 경우는 운영도중 새로운 Table이 생성될 경우 문제가 있을수 있어보입니다)
  4. 로그인 할 때 유저의 정보를 불러오고, 유저의 row가 없다면 Insert하고 진행합니다.
  5. 비동기(or SendQueue)로 호출하지 말고 동기로 모든 테이블정보를 호출한다.

제가 생각한 방법은 이정도인데, 제 생각으로는 5번이 제일 깔끔하게 나올 것 같습니다…
하지만 (경우에 따라 다르겠지만) 뒤끝 권장사항이 비동기처리로 알고있습니다…

- 일반적으로 어떻게 사용하는지 궁금합니다.
- 또, Insert와 Update를 합하여 한번에 쿼리나 함수 등을 부를 수 있는 방법이 있을까요?
- 추가로, 뒤끝에서 호출받은 함수를 Async나 코루틴 등을 통해 래핑하여 사용하면 괜찮을까요?

안녕하세요 개발자님.

  1. 일반적으로는 트랜잭션을 이용하여 자신이 가지고 있는 테이블들의 rowIndate를 가져오거나 모든 테이블의 rowIndate를 가지고 있는 테이블을 사용하여 게임에 사용할 모든 rowIndate를 불러옵니다.(로그인 이후 데이터 불러오기 로딩창 부분)
    그 이후에는 inDate를 통한 Update만을 수행하고 inDate를 못 불러왔을 경우에만 Insert를 수행합니다.
    (일반적으로는 데이터가 없어 업데이트에 실패하는 경우는 게임 업데이트를 통해 새로운 테이블이 추가된 경우를 제외하고는 없을 겁니다.)

정리하자면 로그인 이후 해당 유저가 사용하는 모든 rowIndate를 불러옵니다. 이후 inDate를 이용하여 Update를 실행합니다. 만약 inDate를 불러오지 못하여 string.Empty일 경우에는 데이터를 삽입합니다.(더 안전하게 하고 싶을 경우에는 Get을 통해 정말로 존재하지 않는지 체크합니다.)
Update 시 에러가 발생하는 경우 콜백의 콜백을 호출하는 식으로 구성되지만 정상적인 유저라면 에러가 발생하지 않아 한번의 Update 함수 호출만 발생합니다.

  1. Insert와 Update는 트랜잭션 기능으로 한번에 묶는 것이 가능하지만 동일한 데이터를 접근하려 했을 경우에는 에러가 발생하므로 현재 원하시는 기능(한 rowIndate의 Update, 실패면 Insert를 한 트랜잭션에 동시처리)는 제공하지 않습니다.

  2. Async과 코루틴의 경우 가능성은 적지만 예상치 못한 로직으로 인해 동일한 함수를 동시에 호출하여 에러가 발생/비순차적으로 인한 예상치못한 결과 발생할 가능성이 있습니다.
    현재 추천하고 있는 방식은 제일 안전한 SendQueue를 이용한 비동기면서 순차적으로 처리하는 로직을 권장하고 있습니다.

좋아요 1