DB와 2개의 WPF창 연동에 관련한 질문입니다.

안녕하세요.
먼저 너무 잦은 간단한 질문을 드려 죄송합니다 ㅜ
이번에 저는 DB와 2개의 WPF창 연동에 관련해서 질문을 드립니다.

구현하고자 하는 것은
DB의 테이블에 쌓인 값들은 조회용UI로 전체 다 보여줍니다.
그 중 TagName별로 가장 최신 시간의 행들만을 모으고, 그 행의 해당 값에 따라 버튼의 스타일을 적용합니다. 버튼을 눌러 특정 값을 매칭하여 DB 테이블에 Insert합니다.
입니다.

먼저 그림에서 1번에 해당하는 과정을 봐주시면 감사하겠습니다( 초기 출발 모델입니다)

  1. 저의 1차 로직은 DB >> 창1의 조회용UI(DB해당테이블의 정보를 다 담음) >> 특정 조건의 행만을 담은 OC(ObservableCollection) >> 창2의 Button(Method: DB에 행을 insert합니다.) >> DB 로 하여 꾸준히 순환하며 데이터의 일관성을 갖추고자 생각했습니다.

  2. 그러나 필수적인 과정으로 DB에 새로운 값이 들어온다면 조회용 UI에 실시간에 근접하게 바로 표현을 해줘야 합니다.

  3. 그러다보니 Insert문을 실행하는 메서드를 실행하게 되면, 그 기반이 되는 특정 조건의 행만을 담은 OC의 배열이 달라져서 오류가 뜨게 되었습니다.


그러므로 제가 생각한 게 2가지가 있습니다.
1.’ B1,B2등 메서드 실행 중엔 값이 올라오면 UI까지만 보여주고, unique한 칼럼을 뽑는 건 나중에 하는 것’이라고 생각했는데 글 쓰는 와중에
버튼에도 TagName별로 실시간의 값을 보여줘야 하기에 안될 것 같습니다.

  1. 그림에서의 2번 과정에 해당하는 각각 창마다 DB를 각각 접속하여 해결하는 것입니다.

2번으로 하면 문제는 해결이 될 것 같으나, 창2의 메서드 실행 전(select),후(insert)와 창1의 조회(select)로 하여 잦은 DB접속이 생기게 되어 맘에 들지 않습니다…

혹시나 다른 방법이 있는지 궁금하여 질문드립니다.

도와주십시요 고수님들!!

1번 방법은 아무래도 ‘타이밍으로 조지는(?)’ 방법인데, 추천드리고 싶지 않습니다.
어찌해서든 가운데 Collection을 두고 있는 이상, 갱신해야될 대상이 하나 더 늘어날 뿐, 해결이 되지 못할 것 같아요.

2번 방법을 추천드리는데, insert 빈도나 테이블이 크기가 아주 크지 않은 이상은 아무런 문제가 없을 것 같습니다.

다른 좋은 아이디어 있으신 분들의 답변을 저도 기다려보겠습니다… :thinking:

작성하신 내용을 정확히 이해하지 못했는데,

b1, b2 이외의 다른 루트로 DB 업데이트가 이루어지고, UI 에서는 항상 DB 전체를 보여준다…

인가요?
요약하면
DB 내용을 긁어와서 표시하는 것과 DB 업데이트의 싱크를 맞추고 싶다
요거죠?

DB 싱크는 사실 trigger 에 의존하지 않는 이상 실시간으로 맞출 수 있는 방법은 polling밖에 없다고 봐야하지 않을까요?
그 실시간이라는 것도 어느 정도 딜레이를 허용하느냐에 따라 polling 의 부하를 조절할 수는 있어요.
실시간이라는 시간 간격에 어느 정도 정의(라고 쓰고 타협이라고 읽음…=ㅁ=;)가 필요할 수 있슴다.
(심지어 실시간의 기준이 ms 정도 단위이면 trigger 로 반응하는 사이 변경 사항이 발생 했을 때 내용을 놓치는 것으로 보일 수도 있어요. 결국 시간 간격이 관건!)

transaction 을 신경쓸 필요가 없는 상황이라면 trigger 통해서 UI 갱신만 처리하도록 호출하는 게 그나마 나아 보이긴 하는데
혹, 뭔가 transaction 을 맞춰야 하는 경우라면 이 방법도 사실상 나가리…(;ㅁ;)

아니면 좀 오바스럽지만 eventually consistency 를 우겨보시는 것도…

1 Like

다만 조회 UI 에서 일정 간격으로 최신 데이터를 갱신하고 있다면,
굳이 버튼 창에서 직접 버튼들의 view 갱신을 위해 DB 에 접근할 필요는 없어 보여요.

대략 요런 방식을 한 번 고민해 보시는 게 어떨까 싶네요.
https://blog.naver.com/vactorman/222574058746

1 Like

내용이해가 쉽지가 않은데요
DB 의 잦은 접속은 큰문제가 없을것니다.
하지만 UI 병목형상이 있겠죠

짐작한것데 Grid 에 List 를 Binding 형식으로
변화가 있을때마다 조회한다면 오버헤드가 심할것니다.
특정 Row 만 갱신하는 로직으로 변경하시고

그리고 다양한 모듈의 DB 접속 Crud 는 일관성을 위해서

Singleton 방식의 패턴을 써보시면 괜찮을것 같습니다.

추천하는것은 내부에 Que를 둬서 특정 inser,delete,update
que가 들어오면 이벤트 형식으로 Select 하게 구현해보시면 어떨까요?
그리고 상태 변화 동기화를 위해서 굳이 db에 수시로 들락 거릭 필요는 없습니다

1 Like

답변 감사합니다!
요약내용을 잘 간추려서 말씀해주셔서…질문이 쫌 이상했지만 전달이 되어서 다행입니다.
polling에 대해서 처음 들어보는 단어인지라 공부해보고 질문드리겠습니다 ㅜ

1 Like

답변 감사합니다. eventually consistency 공부해보도록 하겠습니다!

1 Like

답변 감사드립니다
답변해주신 내용에 대해서 추가적으로 질문드립니다. 특정 Row만 갱신하는 로직이라고 하는 게, 어떤 의미인지 알 수 있을까요 ?
제가 시간 기준으로 하는 거라면, 마지막에 불러왔던 시간을 저장한 후 데이터 변동이 있을 시 그 시간 이후에 들어오는 것만 가져오는 식으로 하는 식의 접근 방법을 의미하는 걸까요 ?
저는 DB로는 postgresql을 쓰고 있습니다.

1 Like

답변 감사합니닷!

1 Like

맞는 내용인지 몰라도

 public partial class MainWindow : Window
 {
     public List<TempData> lst = new List<TempData>();
     public MainWindow()
     {
         InitializeComponent();            
         lst.Add(new TempData() { idx=1,name="kim"});
         lst.Add(new TempData() { idx = 2, name = "aa" });
         lst.Add(new TempData() { idx =3, name = "dd" });
         lst.Add(new TempData() { idx = 4, name = "fff" });
         fff.ItemsSource = lst; 
     }

     private void Button_Click(object sender, RoutedEventArgs e)
     {
         lst[1].idx = 21;
         fff.Items.Refresh();
     }
 }

 public class TempData
 {
     public int idx { get; set; }
     public string name { get; set; }
 }

뭐이런식으로 binding 된 datasource 에 특정 row만 업데이트 하면 오버헤드가 줄어들것니다
근데 확실한 업무 를 모르는 상태에서 괜한 조언은 독이 될것 같아서 부담이되긴하네요

설명하신 내용대로라면 MVVM 으로 Biding 된 데이타를 조작하시면 일괄적으로 움직일것 같긴 합니다.

2 Likes

질문 내용을 정확히 이해하기가 힘드네요 :sweat_smile:

파란매님 말씀처럼, 정확한 업무를 모르는 상태에서는 조언을 해드려도 고유값님이 해결하시려는 문제를 해결하지 못할 수도 있어요.

저도 의견을 드리자면…

지금 WPF 프로그램을 PC하나에서만 사용하는게 아니라 여러 PC가 동시에 사용한다고하면, 구현이 복잡해질 수 있어요.
SELECT로만으로 각 PC에서 이뤄지는 행위를 실시간으로 못맞출거에요.
해당 부분에 대해 언급은 없으시니 아니라고 생각하겠습니다.

창2의 버튼들을 클릭했을 때 insert하는 데이터가 창1의 조회용 UI에 표시되는 데이터 + 해당 데이터들이 창1에서만 생성되는 조건을 가지는 경우라면
이벤트 방식으로 구현하시면 DB 조회하실 필요는 없을거 같아요.
아마 창1의 데이터는 히스토리성 데이터 같은데 해당 뷰모델의 데이터를 추가만 해도 될 듯싶어요. + 창2의 버튼에 대한 뷰모델을 다르게 가져가서 이때 갱신하면 될 거 같아요.

창2에서 생성되는 데이터 창1의 데이터가 아니고, 별도의 프로그램에서 생성되는 데이터라고 한다면 실시간으로 보여주기위해서는 프로세스간 통신(IPC)을 사용해야 할거 같아요(파이프라인, 메시지 브로커 등…)

1.’ B1,B2등 메서드 실행 중엔 값이 올라오면 UI까지만 보여주고, unique한 칼럼을 뽑는 건 나중에 하는 것’이라고 생각했는데 글 쓰는 와중에
버튼에도 TagName별로 실시간의 값을 보여줘야 하기에 안될 것 같습니다.

이 내용은 이해가 안되네요.
B1메서드가 실행 중에 값이 올라온다는 것은 다른 Bn 버튼들이 실행되고나서 올라오는 값인가요?

1 Like