본문 바로가기

Programming/C#

C#, Winform | 열차 예약 프로그램


 

오라클 + C#(Winform)을 이용해 제작한 열차 예약 및 열차 구간 관리 프로그램입니다.

 

2018년 2학기 데이터베이스 프로그래밍 개인 프로젝트였으며, 발표를 끝낸 뒤라 블로그에 업로드하기로 마음먹었습니다.

데이터베이스 설계 부분은 스스로 공부해보는 것이 가장 도움이 되는 방법이라 전체를 다 보여드리지는 않고, 쿼리 역시 제가 정말 고생하며 구현했기 때문에 공개하지 않도록 결정했습니다. 다만, 참고가 되기를 바라는 마음에 Winform으로 제작된 부분만 보여드릴 생각입니다.

 

+ 2021.05.06

오래된 소스기도 하고, 오라클 DB도 유실되긴 했지만 많은 분들이 소스코드를 필요로 하는 것 같아서 github 주소를 첨부하도록 하겠습니다. 괜한 똥고집 부린 것 같아 미안하기도 합니다.

github.com/ParrottKim/RailroadTicketingApp

 

[데이터베이스 테이블] 

 

C#은 블로그 글에서도 보이듯이 꾸준히 개발을 해 본 언어입니다. 물론 Winform과 WPF는 같은 C#을 사용하고 있지만 차이점도 분명 존재합니다. 그래도 Winform은 처음으로 .NET Framework로서 배웠던 경험이 있어서 쉽게 UI 및 기능 부분 개발을 할 수 있었습니다.

하지만 문제는 데이터베이스 설계와 쿼리 작성이었습니다. 테이블 구성이 잘못되면 원하는 데이터를 불러오는 쿼리를 작성할 때 어려움이 생기고, 그렇게 되면 프로그램 구현도 어려워지게 됩니다. 그래서 저 역시 테이블을 한 번 갈아엎었던 경험이 있었습니다.

 

 

  [솔루션 탐색기]

 

Winform은 [Form 하나 + UserControl 여러 개]의 구조로 제작되었습니다. 폼 안에 Container로 명명된 Panel 위에 'Container.Controls.Add(UserControl)' 으로 MainPage 좌측의 버튼을 클릭할때마다 Container 위에 UserControl이 보여지게 만들었습니다.

 

이는 아래에 설명할 세 가지 Form 전부 공통된 사항입니다.

 

1. LoginPage

 [로그인 화면]

 

'LoginPage.cs + SignInControl'로 구성된 로그인 화면입니다. 

별 기능은 없으며 데이터베이스에 있는 유저 ID와 비밀번호 검색 후 일치하면 MainPage로 이동합니다. 원래는 회원가입도 구현했는데 데이터베이스 설계를 한 번 뒤엎으면서 같이 제작하던 프로그램 역시 엉켜버려(...) 시간도 촉박해진 관계로 로그인 화면만 살려왔습니다.

참고로 'Forgot your password?' 버튼 역시 구현을 못했습니다.

 


 

2. MainPage

 

2.1 HomeControl

 

[홈 화면]

 

'HomeControl.cs'로 구성된 홈 화면이었습니다.

원래 기획대로라면 다양한 기능이 들어갈 예정이었는데 제작 기간이 생각보다 빠듯해서 전부 넣지는 못하고

     좌측 상단(필수), 로그인 화면에서 입력한 'User ID' 바인드

      우측 중단(선택), 당시 KTX 사고 사과문 링크 연결

      하단(선택), 추천 여행지 링크 연결

      좌측 탭 상단(선택), 현재 시간

이 정도만 추가했습니다.

 

 

좌측 중단에 있는 '할인율'은 실제로 적용되는 퍼센티지인데, 먼저 할인률이 나뉘게 되는 여러 조건을 if문으로 나눈 다음 'Passenger' 테이블에서 바인딩 된 'USER_ID'를 찾아 일치하는 컬럼의 'AGE' 값을 받아옵니다.

이 'AGE'의 값이 if문에 걸리게 되면

     PRICE × 할인 비율 × 선택한 티켓 갯수

의 방식으로 티켓 값을 계산하게 됩니다.

물론 현실의 판매 방식은 이렇지는 않지만(...) 교수님께서는 충분히 노력했다고 생각해주신 것 같습니다.

 

 

2.2 TimetableControl

 

 [시간표 화면]

 

'TimetableControl.cs'로 구성된 시간표 화면입니다.

처음에는 지역별로 '도착시간 | 출발시간'으로 구성된 시간표였으나, 구간 정보를 추가 / 삭제하는 기능이 추가되면서 위와 같은 모습으로 수정되었습니다. 자세한 부분은 관리자 모드 화면에서 설명하겠습니다.

 

 

2.3 ReservationControl

 

[예약 화면 1]

 

'ReservationControl.cs'로 구성된 예약화면입니다.

주요한 컨트롤은,

     1) '상행선'이 적힌 CheckBox, 클릭시 '상행선' → '하행선' / '하행선' → '상행선'으로 전환됩니다.

     2) DataGridView, 출발역, 도착역 선택 후 '조회' 버튼을 클릭하면 해당하는 노선이 표시됩니다.

     3) CheckBox (x8), 해당하는 노선 중 원하는 노선을 클릭하면 8개의 체크박스로 이루어진 좌석이 드러납니다.

로 구성 되어있습니다.

 

 [빨간색 버튼 클릭시]

 

 [파란색 버튼 클릭시]

 

8개의 체크박스는 세 가지 상태로 나뉘어지는데,

     파란색(예약 가능) : 현재 예약이 가능한 상태

     하늘색(선택 중) : 사용자가 파란색 체크박스를 클릭한 상태, 오른쪽에 해당 좌석에 관한 정보가 출력됨

     빨간색(예약 불가) : 이미 예약이 된 좌석

 

빨간색 버튼을 클릭하게 되면 Label에 경고 메세지가 출력되며, 파란색 버튼 클릭시에는 예약 테이블에 들어가게 될 정보들이 나열됩니다.

가격은 'HomeControl' 부분에서 언급했던 가격방식을 사용했습니다.

 

 [예약 성공]

 

예약 성공시 나타나는 화면입니다.

 

 

2.4 StatusControl

 

[예약현황 화면]

 

 

 

 

'StatusControl.cs'로 구성된 예약현황 화면입니다.

예약 화면에서 해당 사용자가 예약한 모든 티켓에 관한 정보를 보여주고 예약된 티켓을 취소할 수도 있으며, 취소한 티켓은 예약 화면에서 다시 활성화가 되게 되어있습니다.

 

예매번호 '10'번의 데이터가 삭제되었음을 알 수 있다.

 

어느 열을 선택하는지에 상관 없이 원하는 행의 아무 열이나 클릭하고 오른쪽 하단의 '취소' 버튼을 누르면 해당 행의 '취소' 절차가 진행됩니다.

선택된 행의 값은 'this.DataGridView.Rows[this.DataGridView.CurrentCellAddress.Y].Cells[0].Value.ToString()'으로 가져올 수 있습니다.

 

 

3. AdminPage

관리자에게 필요한 역 정보, 구간 정보, 배차 정보, 통계(미구현) 등을 확인하거나 수정할 수 있는 화면입니다.

관리자 화면은 전체적인 테이블에 관여해야하며 INSERT, UPDATE, DELETE는 물론 프로그래밍적인 부분 또한 요구하는 부분이라 프로그래밍이 익숙하지 않으시다면 여태까지 잘 써오던 데이터베이스를 재설계해야 하거나 구현하지 못할 수도 있습니다.

실제로 최종발표 중에도 이 부분을 구현 못한 사람이 제일 많았던 것으로 기억합니다.

 

3.1 StationControl

[역 정보 화면]

 

'StationControl.cs'로 구성된 역 정보 화면입니다.

선택한 행 뒤에 역을 추가하거나, 선택한 행의 역을 삭제할 수도 있습니다.

 

'구미'역이 추가되었음을 알 수 있다.

 

'추가' 부분만 살펴보자면, 추가하고자 하는 역의 앞에 위치할 역을 선택한 뒤 순서와 정차시간을 입력하고 '추가' 버튼을 클릭하면 마지막 사진처럼 원하는 위치에 해당 역이 추가된 것을 확인할 수 있습니다.

또한 '추가'를 하게 되면 역 정보 화면뿐만 아니라 역 정보와 상호작용을 하게 되어있는 모든 테이블 및 화면에도 추가된 데이터를 넣어줘야 하므로 상당히 많은 작업이 요구되었습니다.

 

 

3.2 SectionControl

[구간 정보 화면]

 

'SectionControl.cs'로 이루어진 구간 정보 화면입니다.

기본적으로 역 정보 화면에서 새로운 역을 추가하게 되면 앞선 구간 정보의 소요시간과 구간요금을 가져오게 되어있습니다. 그래서 관리자가 따로 값을 지정해주어야 하는데, 이 화면이 바로 그 기능을 수행합니다.

 

 

3.3 IntervalControl

 

[배차 정보 화면]

'IntervalControl.cs'로 구성된 배차 정보 화면입니다.

새로운 배차를 추가하거나 삭제하는 기능을 수행하는 화면입니다. 물론 이 기능은 앞선 역 정보 화면과 구간 정보 화면에서 입력한 새로운 역을 포함한 배차가 형성되는지를 확인하기 위해 있다고 봐도 될 것 같습니다.

 

새로운 열차 번호와 정보를 입력하자.
'추가' 버튼을 클릭하면 '1501'번 열차가 새로 추가되었음을 알 수 있다.
'상행선' 부분에 도착역과 출발역에 '구미'가 포함된 '1501'번 열차가 추가되었음을 볼 수 있다.

 


 

+ 원래는 작년 말에 프로젝트 발표 이후 바로 작성하려던 글이었는데 그 동안 졸업작품과 인턴 때문에 상당히 바빠서 손을 대지 못하다가 반년이 지나서야 작성을 하게 되었습니다. 때문에 제가 그 때 설계했던 방법에 대해서 자세히 기억나지 않아서 제 코드를 제 스스로 공부하게 되었네요. 바로 작성했으면 좀 더 정확한 정보로 작성했을텐데 아쉬운 마음입니다.

 

+ 2021.05.06

오래된 소스기도 하고, 오라클 DB도 유실되긴 했지만 많은 분들이 소스코드를 필요로 하는 것 같아서 github 주소를 첨부하도록 하겠습니다. 괜한 똥고집 부린 것 같아 미안하기도 합니다.

github.com/ParrottKim/RailroadTicketingApp

'Programming > C#' 카테고리의 다른 글

C#, WPF | 악보 제작 프로그램  (0) 2018.07.09
C#, WPF | 음악 플레이어  (0) 2018.05.10
C#, Winform | 계산기  (0) 2018.03.30