구현하고자 하는 것은
DB의 테이블에 쌓인 값들은 조회용UI로 전체 다 보여줍니다.
그 중 TagName별로 가장 최신 시간의 행들만을 모으고, 그 행의 해당 값에 따라 버튼의 스타일을 적용합니다. 버튼을 눌러 특정 값을 매칭하여 DB 테이블에 Insert합니다.
입니다.
먼저 그림에서 1번에 해당하는 과정을 봐주시면 감사하겠습니다( 초기 출발 모델입니다)
저의 1차 로직은 DB >> 창1의 조회용UI(DB해당테이블의 정보를 다 담음) >> 특정 조건의 행만을 담은 OC(ObservableCollection) >> 창2의 Button(Method: DB에 행을 insert합니다.) >> DB 로 하여 꾸준히 순환하며 데이터의 일관성을 갖추고자 생각했습니다.
그러나 필수적인 과정으로 DB에 새로운 값이 들어온다면 조회용 UI에 실시간에 근접하게 바로 표현을 해줘야 합니다.
그러다보니 Insert문을 실행하는 메서드를 실행하게 되면, 그 기반이 되는 특정 조건의 행만을 담은 OC의 배열이 달라져서 오류가 뜨게 되었습니다.
그러므로 제가 생각한 게 2가지가 있습니다.
1.’ B1,B2등 메서드 실행 중엔 값이 올라오면 UI까지만 보여주고, unique한 칼럼을 뽑는 건 나중에 하는 것’이라고 생각했는데 글 쓰는 와중에
버튼에도 TagName별로 실시간의 값을 보여줘야 하기에 안될 것 같습니다.
그림에서의 2번 과정에 해당하는 각각 창마다 DB를 각각 접속하여 해결하는 것입니다.
2번으로 하면 문제는 해결이 될 것 같으나, 창2의 메서드 실행 전(select),후(insert)와 창1의 조회(select)로 하여 잦은 DB접속이 생기게 되어 맘에 들지 않습니다…
b1, b2 이외의 다른 루트로 DB 업데이트가 이루어지고, UI 에서는 항상 DB 전체를 보여준다…
인가요?
요약하면 DB 내용을 긁어와서 표시하는 것과 DB 업데이트의 싱크를 맞추고 싶다
요거죠?
DB 싱크는 사실 trigger 에 의존하지 않는 이상 실시간으로 맞출 수 있는 방법은 polling밖에 없다고 봐야하지 않을까요?
그 실시간이라는 것도 어느 정도 딜레이를 허용하느냐에 따라 polling 의 부하를 조절할 수는 있어요.
실시간이라는 시간 간격에 어느 정도 정의(라고 쓰고 타협이라고 읽음…=ㅁ=;)가 필요할 수 있슴다.
(심지어 실시간의 기준이 ms 정도 단위이면 trigger 로 반응하는 사이 변경 사항이 발생 했을 때 내용을 놓치는 것으로 보일 수도 있어요. 결국 시간 간격이 관건!)
transaction 을 신경쓸 필요가 없는 상황이라면 trigger 통해서 UI 갱신만 처리하도록 호출하는 게 그나마 나아 보이긴 하는데
혹, 뭔가 transaction 을 맞춰야 하는 경우라면 이 방법도 사실상 나가리…(;ㅁ;)
답변 감사드립니다
답변해주신 내용에 대해서 추가적으로 질문드립니다. 특정 Row만 갱신하는 로직이라고 하는 게, 어떤 의미인지 알 수 있을까요 ?
제가 시간 기준으로 하는 거라면, 마지막에 불러왔던 시간을 저장한 후 데이터 변동이 있을 시 그 시간 이후에 들어오는 것만 가져오는 식으로 하는 식의 접근 방법을 의미하는 걸까요 ?
저는 DB로는 postgresql을 쓰고 있습니다.
파란매님 말씀처럼, 정확한 업무를 모르는 상태에서는 조언을 해드려도 고유값님이 해결하시려는 문제를 해결하지 못할 수도 있어요.
저도 의견을 드리자면…
지금 WPF 프로그램을 PC하나에서만 사용하는게 아니라 여러 PC가 동시에 사용한다고하면, 구현이 복잡해질 수 있어요.
SELECT로만으로 각 PC에서 이뤄지는 행위를 실시간으로 못맞출거에요.
해당 부분에 대해 언급은 없으시니 아니라고 생각하겠습니다.
창2의 버튼들을 클릭했을 때 insert하는 데이터가 창1의 조회용 UI에 표시되는 데이터 + 해당 데이터들이 창1에서만 생성되는 조건을 가지는 경우라면
이벤트 방식으로 구현하시면 DB 조회하실 필요는 없을거 같아요.
아마 창1의 데이터는 히스토리성 데이터 같은데 해당 뷰모델의 데이터를 추가만 해도 될 듯싶어요. + 창2의 버튼에 대한 뷰모델을 다르게 가져가서 이때 갱신하면 될 거 같아요.
창2에서 생성되는 데이터 창1의 데이터가 아니고, 별도의 프로그램에서 생성되는 데이터라고 한다면 실시간으로 보여주기위해서는 프로세스간 통신(IPC)을 사용해야 할거 같아요(파이프라인, 메시지 브로커 등…)
1.’ B1,B2등 메서드 실행 중엔 값이 올라오면 UI까지만 보여주고, unique한 칼럼을 뽑는 건 나중에 하는 것’이라고 생각했는데 글 쓰는 와중에
버튼에도 TagName별로 실시간의 값을 보여줘야 하기에 안될 것 같습니다.
이 내용은 이해가 안되네요.
B1메서드가 실행 중에 값이 올라온다는 것은 다른 Bn 버튼들이 실행되고나서 올라오는 값인가요?