예약하기 버튼을 눌러 진입하는 경우이다.
날짜와 회의실을 선택 후 상세 입력하기 페이지를 누르면 정보를 입력할 수 있다.
오늘보다 과거를 선택하면 ALERT창이 뜨며 정보 정정을 요청한다.
시작 시간을 선택하면 자동으로 종료 시간이 한시간 뒤로 설정된다.
주최자, 참석자 검색은 ajax를 활용해 비동기 방식으로 조회한다.
.gif)
첫 화면과는 다르게 시간과 날짜, 회의실의 값이 입력 되어 있고 상세 내용도 활성화 되어있다.
.gif)
원래 예약된 시간은 아래 사진처럼 회색으로 표시되어야하는데, 영상에서는 표시되지 않아서 캡쳐해서 가지고 왔다.
해당 기능도 ajax를 이용했다.
시간 값을 비교해 이미 테이블에 존재하는 값이면 색깔을 회색으로 변경해준다.

아래 함수는 class안에서 선언한 함수다.
두 개의 테이블에 각각 비슷한 시간 값을 저장한다.
rez_time_show 와 rez_time_info 테이블에 저장하는데 end_time과 같은 값을 저장하고 안하고의 차이 밖에 없다.
이렇게 저장하는 이유는 위에서 캡쳐한 이미지와 연관이 있다.
rez_time_show는 예약된 시간을 회색으로 보여주는 ajax를 위해 생성한 테이블이다.
rez_time_info는 예약 현황 페이지에서 사용하기 때문에 end_time이 저장되면 안된다. 저장되면 테이블(프론트에서 유저가 보는 부분)에서 볼 때 실제 회의 시간보다 +30분 더 예약된 것 처럼 보이기 때문이다.
이 외에 다른 기능에서도 각각 사용되긴 하는데, 대표적인 이유는 위의 두 상황 때문에 테이블을 분리해 저장했다.
성능 상의 이유로 저장할 때 bulk_create를 사용했다.
for문을 돌며 다수의 오브젝트를 만들어 낼 경우 save() 메소드 한 번당 DB와의 connection이 한번 발생 하며 insert구문을 수행 하게 된다. 즉, 반복 횟수 == connection수가 되어서 서비스에 큰 부하가 생겨 장애를 발생할 수 있기 때문이다.
이럴때 사용하는것이 bulk operation이며 이 bulk를 사용하면 다수의 레코드를 생성, 업데이트 할 때 한 번의 커넥션 만으로 insert 혹은 update를 수행 할 수 있다.
class AddRezView(View):
def insertTimeInfo(self, str_time, end_time, rez_date, room_name, rezno):
insert_list = []
insert_list2 = []
for time in self.time_list:
str_time = int(str_time)
end_time = int(end_time)
time.key = int(time.key)
if str_time <= time.key and time.key < end_time :
insert_list.append(RezTimeInfo(
rezno = rezno,
room_name = room_name,
rez_date = rez_date,
time = time.key
))
if str_time <= time.key and time.key <= end_time :
insert_list2.append(RezTimeShow(
rezno = rezno,
room_name = room_name,
rez_date = rez_date,
time = time.key
))
RezTimeInfo.objects.using('bi').bulk_create(insert_list)
RezTimeShow.objects.using('bi').bulk_create(insert_list2)
예약 후 오늘 날짜가 아닌 해당 날짜 페이지가 보여졌으면 좋겠다는 요청을 받았다.
httpResponseRedirect로는 데이터를 보낼 수 없어서render를 사용했다.
그렇다 보니 새로고침 될 때 마다 데이터가 save되는 현상이 발생했다.
해당 현상을 방지하기 위해 form의 유효성 검사를 진행하기 전에 for문을 이용해 중복값을 검사하고, 중복되는 경우 httpResponseRedirect로 list페이지로 되돌아가도록 설정했다.
유저가 첫 예약을 진행할 때 동일한 값을 보내지 못하도록 jquery와 ajax로 작업을 해둬서 예약 시 튕기는 것 처럼 보일 걱정은 없다.
for i in rezlist :
if i.rez_date == rez_date and i.room_name == room_name and i.str_time == str_time :
return HttpResponseRedirect(reverse('reservation:list'))
if form.is_valid():
data.save(using='bi')
rezno = RezMeetingroom.objects.using('bi').latest('rezno').rezno
self.insertTimeInfo(str_time, end_time, rez_date, room_name, rezno)
rezinfo = ViRezlist.objects.using('bi').filter(rez_date=rez_date)
return render(request, 'reservation/r_rez_list.html', {'sysdate' : rez_date, 'user':user[0], 'rezinfo' : rezinfo, 'meetingroom':meetingroom, 'time_list' : time_list})
else:
return HttpResponse(form.errors)
사내 회의실을 예약할 수 있는 웹사이트를 제작했습니다.
기존에 개발 되어 있던 서버와 Django 환경에 app을 추가해 개발했습니다.
회의실을 예약하기 위해 회의실에 방문해 앞 종이에 기록하는 불편함을 없애고
사무실 자리에서 편리하게 예약할 수 있도록 했습니다.
에자일 방식으로 주요 기능을 개발하고 내부 피드백을 받아 기능을 추가하는 방법으로 개발했습니다.
현재 사내에서 유용하게 사용 중이며, 피드백이 들어오면 필요한 내용인지 검토 후 개발 및 수정을 진행하고 있습니다.
안녕하세요. 잘 읽었습니다! 혹시 타임라인 표는 직접 만드신건지, 라이브러리를 쓰신건지 알 수 있을까요? 저도 비슷한 프로젝트를 진행중인 학생인데 이 부분에서 막혀서 여쭤봅니다! 날짜마다, 회의실 갯수마다 테이블을 새로 불러올 방법이 생각나지 않아서 애먹고 있네요...