BOJ 10 Years 3부

BOJ 10 Years 2부에서 이어지는 내용입니다.

트래픽

사이트에 점점 많은 유저가 들어왔고, Auto Scaling과 Load Balancing을 적용하기로 했습니다. 이전에는 많은 유저가 들어올 것이 예상되는 대회의 경우에는 웹 서버 인스턴스의 크기를 매우 크게 켜서 이를 해결했었습니다. 이제 예전의 그 대회만큼 사용자가 평소에도 들어오기 때문에 두 가지를 적용하는 것이 좋다고 생각되었습니다.

기존 방식은 다음과 같았습니다.

  • 웹 서버 1대 운영
  • 개발 서버 없음

예전 BOJ의 특징으로 “개발 서버 없음”이 있습니다. 이것이 가능했던 이유는 개발자가 1명이었고, 유저가 그렇게 많지 않았기 때문이라 생각됩니다. 개발 서버가 없던 이유는 아마 이 글을 읽는 분들도 공감하실 수도 있지만, 세팅이 너무 귀찮았기 때문입니다.

프레임워크를 사용했다면 편하게 배포를 할 수 있었을 것 같은데, 모든 것을 직접 구현했기 때문에, 프리셋이 없어서 조금 어려웠습니다.

code.plus에서 사용하는 방식인 Elastic Beanstalk을 이용하기로 했고, Docker에 BOJ를 모두 넣고 배포하기로 결정했습니다.

배포와 함께 할 수 있게 된 것이 있습니다. 바로 독립 홈페이지의 제공입니다.

이렇게 독립된 대회 전용 홈페이지를 제공할 수 있게 되었습니다.

대회 전용 홈페이지를 구현하기 위해 소스를 최대한 공유하게 만들었습니다. 이 내용은 다른 글에서 다루는 것으로 하고 넘어가겠습니다.

BOJ Stack

BOJ Stack은 유저가 문제 업로드, 대회 생성과 같은 일을 할 수 있게 하는 사이트입니다. 드디어 유저가 BOJ에 문제를 직접 올릴 수 있는 길이 드디어 생긴 것입니다.

이제 유저가 데이터도 업로드할 수 있기 때문에, 2부에서 살펴본 S3를 사용하는 방식을 사용해야 합니다.

먼저, 예제 데이터의 채점이 어떻게 바뀌었는지 알아보겠습니다.

갖아 처음에 서버 하나를 사용할 때는 웹 서버와 채점 서버가 모두 같은 곳에 있었습니다. 따라서, 웹에서 예제 데이터를 추가하면 DB에 저장하면서 이를 파일로 만들었습니다.

채점 서버가 2대가 되면서 서버가 분리되었고, 파일을 만들고 scp로 채점 서버에 전송하는 과정이 추가되었습니다.

나중에 채점 서버가 N대가 되면 위의 방식을 사용할 수 없기 때문에, DB에 넣고 채점할 때마다 파일로 만드는 방식을 사용했습니다. 여기서 데이터의 버전을 추가해 데이터가 변경되었을 때만 파일을 만들게 수정했습니다.

유저가 업로드한 데이터의 채점은 예제 데이터의 채점에서 DB를 S3로 변경하면 됩니다.

데이터의 변경이 많이 일어나지 않고, 변경되지 않는다면 한 번만 다운받기 때문에 트래픽 요금이 많이 나오지 않았습니다.

BOJ Stack으로 업로드한 문제를 BOJ에 등록할 때는 채점 서버에 미리 다운받아 S3를 사용하지 않게 변경해 요금을 절약할 수 있었습니다.

BOJ Stack의 채점

BOJ Stack을 만들 때 가장 많이 신경썼던 것은 채점입니다. 별도의 채점 프로그램을 만드는 것은 좋지 않습니다. 예전 글에 보면 “코딩”이라는 기능이 있는데, 이 기능을 지원하기 위해 채점 프로그램을 별도로 만들었고, 유지 보수가 매우 힘들었던 기억이 있습니다.

문제의 채점 과정은 동일한데, DB의 위치와 데이터의 위치만 다릅니다. 채점 프로그램의 변경은 DB 구조의 변경보다 더 빈번하게 일어납니다. 따라서, BOJ의 DB를 복제한 BOJ Stack용 DB를 만들어, DB 이름만 변경해 채점 프로그램의 변경을 최소로해서 채점을 진행할 수 있게 되었습니다.

미래

아직도 BOJ에는 많이 개선되어야 할 부분이 있습니다.

대표적으로 2부에서 소개한 UserProblem이 있습니다. 이 정보를 계산하기 위해서 유저 U가 문제 P에 제출한 모든 소스를 검색하고 있습니다. 이 방법은 구현하기는 매우 편리하지만, 속도가 느리다는 단점이 있습니다.

매번 검색하게 구현한 이유는 재채점때문입니다. 재채점이 일어나면 가장 좋은 소스가 변하기 때문입니다. 재채점이 없다면 결과는 바뀌지 않을 것이고 다음과 같이 구현을 개선할 수 있습니다.

  • 제출한 소스가 “맞았습니다!!”를 받았다면, 가장 좋은 결과와 비교만 하면 됩니다.
  • 그 외의 경우에는 시도 횟수나 성공/실패만 변경하면 됩니다.

재채점의 경우에는 변경된 소스의 유저-문제에 대해서만 모두 다시 계산하면 됩니다.

마무리

꽤 많은 시간이 흘렀고, 겉과 속 모두 첫 모습은 찾아볼 수 없는 BOJ가 되었습니다.

10년이 지난 뒤 BOJ 20 Years 글을 작성할 수 있는 시기가 오면 좋겠습니다.

함께 읽으면 좋은 글

One thought on “BOJ 10 Years 3부

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

About Baekjoon

스타트링크 블로그에서 지루한 글을 담당하고 있습니다!