본문 바로가기

C#/WinForm

[C# WinForm] 타이머를 이용해 실시간으로 DB에 데이터 넣기 (SERVER) - 짱우의 코딩일기 - 티스토리

반응형

  우선 이 글은 제목 그대로 타이머를 이용해 실시간으로 DB에 데이터 넣기에 대한 글이다. 하지만 간단한 예제를 이용해서 타이머를 사용하는게 아니라 개인 프로젝트를 진행했던 코드를 바탕으로 사용했기 때문에 밑의 링크에서 어떤 프로젝트인지 확인하고 글을 읽는 것을 추천한다.


2020/01/09 - [개인 프로젝트] C# WinForm을 이용한 실시간 편의점 물품 가격변동에 따른 그래프 그리기 - 짱우의 코딩일기 - 티스토리

 

[개인 프로젝트] C# WinForm을 이용한 실시간 편의점 물품 가격변동에 따른 그래프 그리기 - 짱우의 코딩일기 - 티스토리

물론 지금도 인턴이지만 회사에서 인턴기간동안 만든 과제중 하나에 대한 글을 써보려 한다. 우선 제목대로 프로젝트에서 사용한 데이터는 실제 편의점 물품의 가격 변동 데이터를 사용하지는 않았다. 서버에서..

zzangwoo.tistory.com


SERVER에서 사용한 타이머

  제일먼저 SERVER에서 타이머를 이용하여 자동으로 넣을 데이터는 내 임의대로 정한 물품 9가지의 변동 가격값이다. 

a. 배열선언

// 물품 ID 배열
string[,] prodIDArr = new string [3, 3] { { "A1", "B1", "C1" },
                                          { "A2", "B2", "C2" },
                                          { "A3", "B3", "C3" } };

  위의 코드는 DB에서 PK로 설정하고 LogTable과의 FK관계를 맺기위해 만들어놓은 물품ID다.

// 물품 이름 배열
string[,] prodNameArr = new string [3, 3] { { "카스", "초코송이", "참깨라면" },
                                            { "필라이트", "새우깡", "신라면" },
                                            { "아사히", "썬칩", "짜파게티" } };

  편의점 물품 이름을 DB에 넣기 편하게 하기 위해 물품ID와 마찬가지로 2차원 배열로 만들어놓았다.

// 물품 타입 배열
string[] prodTypeArr = new string [3] { "맥주", "과자", "라면" };

  현재 물품들을 타입별로 나눠주는 쿼리문을 연습하기 위해 물품 타입 배열을 추가해주었다.

 

b. 타이머 사용

< SERVER FORM >

private void startButton_Click(object sender, EventArgs e)
{
  startButton.Enabled = false;

  Timer timer = new Timer();
  timer.Interval = 5000; // 5초간격으로 타이머 실행
  timer.Tick += new EventHandler(UpdatePrice);
  timer.Start();
}

  위의 <SERVER FORM>에서 시작버튼을 누르면 실행되는 이벤트다. 시작버튼을 누르게되면 시작버튼은 비활성화가 되며 타이머가 시작된다. 타이머 사용은 간단하다.

- Timer 클래스를 생성한다.

- [Timer변수명].Interval = [시간초] 를 이용하여 타이머 실행 주기를 설정해준다. 시간은 ms 단위이기 때문에 5초에 한    번씩 실행되게 만들기위해 5000을 입력해주었다.

- [Timer변수명].Tick += new EventHandler(메서드명) 을 이용하여 타이머가 실행되면 어떤 이벤트가 발생할 것인지에      대한 메서드 이름을 집어넣어주면 된다.

- [Timer변수명].Start()는 말 그대로 타이머를 실행시켜주는 메서드다.

 

c. 타이머에서 실행되는 메서드

< 타이머 실행 이후 화면 >

private void UpdatePrice(object sender, EventArgs e)
{
  DAO dao = new DAO();
  currentTime = currentTime.AddDays(1); // x초에 한 번씩 updatedDate는 하루 증가

  // 물품 타입 배열 인덱스에 사용할 변수
  int prodTypeCount = 0;

  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      // prodID | prodName | prodType | prodChange(랜덤값 -100~100) | updatedDate
      dao.UpdatePrice(prodIDArr[j, i], prodNameArr[j, i], prodTypeArr[prodTypeCount],
      randomPriceChange.Next(-100, 100), currentTime);
    }
    prodTypeCount++;
  }

  logListBox.Items.Add(string.Format("[ {0} ] : 가격변동 업데이트", currentTime));
}

  MVC 패턴을 연습해보기 위해서 DB와 연동하는 부분은 따로 DAO 클래스에 빼두고 만들어놓았다. 아직 익숙하지가 않아서 정확한 방법대로 MVC 패턴을 적용하지는 못했다...

  DB에는 'randomPriceChange' 변수 (전역변수로 랜덤변수를 선언해두었다.)를 이용하여 가격 변동 값이 -100원부터 100원까지 랜덤으로 입력된다. 그리고 DB에서는 그 값을 이용하여 물품 테이블에 적용을 시키는 형태로 코드를 구현했다. 그리고 통계쿼리를 작성하기 위해 가격 갱신날짜가 필요했는데 이는 타이머가 작동할때마다 하루씩 증가시킨 값을 입력시켰다.

public void UpdatePrice (string prodID, string prodName, string prodType, int prodChange, DateTime currentTime)
{
  // DB와 연결시키기 위한 문자열
  string connectionString =
  ConfigurationManager.ConnectionStrings["StatisticsDB"].ConnectionString;

  using (SqlConnection sqlCon = new SqlConnection())
  {
    sqlCon.ConnectionString = connectionString;
    sqlCon.Open();

    // 가격 변동 값을 적용시켜주는 프로시저와 연결
    SqlCommand cmd = new SqlCommand("usp_updatePrice", sqlCon);
    cmd.CommandType = CommandType.StoredProcedure;

    SqlParameter param = cmd.Parameters.Add("@prodID", SqlDbType.NVarChar, 2);
    param.Value = prodID;

    param = cmd.Parameters.Add("@prodName", SqlDbType.NVarChar, 10);
    param.Value = prodName;

    param = cmd.Parameters.Add("@prodType", SqlDbType.NVarChar, 5);
    param.Value = prodType;

    param = cmd.Parameters.Add("@prodChange", SqlDbType.Int);
    param.Value = prodChange;

    param = cmd.Parameters.Add("@updatedDate", SqlDbType.DateTime);
    param.Value = currentTime;

    // 프로시저 호출
    cmd.ExecuteNonQuery();
  }
}

  DB와 연동시키기 위해 만들어놓은 DAO 클래스에서 가격 변동값을 넣어주는 메서드다. 직접 쿼리문을 DB로 날리는 일은 없다고 하기 때문에 프로시저를 호출해서 원하는 작업을 프로시저 내부의 쿼리문에서 처리하도록 만들어 놓았다. 직접 프로시저를 호출하는 경우도 없다 들었는데... 그건 차차 공부해나가야 할 것 같다. 

  SqlParameter 변수를 만들어서 프로시저의 매개변수에 값을 넣어주는 작업을 진행한 후에 'cmd.ExecuteNonQuery()' 메서드를 실행시켜 프로시저를 호출시켰다.


  위와 같은 절차를 통해 실시간으로 편의점 물품 가격 변동 값을 DB에 넣어주는 SERVER FORM을 구현해보았다. 코드를 짤때도 느끼지만 짜고나서 너무 마구잡이로 코드를 짜는것같다는 느낌을 받는다. 다른 사람들 코드도 보고 여러 방식으로 코드를 짜보는 방법밖에 없는 것 같다.

반응형