웹개발 초보자가 알아야 할 자료구조

Daehyun Kim 님이 연재중인 개알못인 당신이 웹개발을 시작한다면 (4) 을 보고, 괜히 의견 제시했다가 글을 쓰게 되었네요ㅋㅋ (점심시간에 잠깐 쓴거라 좀 허접합니다ㅠㅠ)

Daehyun Kim 의 연재글은 개알못인 사람이 웹개발할 때를 위한 글이고, 실제 개발시에 도 가장 많이 쓰는 자료 구조는 배열(array), 해시(hash) 이기 때문에 이 2가지만 써도 좋겠다는 의견을 제시하게 되었습니다.

웹개발 공부를 한다면 꼭 한번쯤 연습삼아 해봐야할 프로젝트가 “게시판 만들기” 입니다. 그리고 그걸 진행할 때 일반적으로 사용하는 자료구조가 array이고, 좀 더 추가 고민이 들어갈 때 hash를 알아야 합니다

왜 그런지 아래에서 설명해 보겠습니다.

array, hash에 대한 설명 자체는 여기서 하지 않습니다. 개알못인 당신이 웹개발을 시작한다면 (4) 의 내용을 참고하세요.

배열(Array)

아주 단순한 게시판을 만든다고 가정하고, 게시글 1개에 들어가는 정보는 아래와 같다고 합니다.

글번호, 제목, 내용, 글쓴이, 조회수

그리고 각 데이터의 타입은 아래와 같습니다.

  • 글번호 (type=숫자)
  • 제목 (type=문자열)
  • 내용 (type=문자열)
  • 글쓴이 (type=문자열)
  • 조회수 (type=숫자)

그리고 게시글이 여러개가 있을 수 있어서, 이 데이터들은 array 형태로 들어가서, 순차적으로 게시글 목록을 보여줄 수 있을 것입니다.

해시(Hash, aka. Dictionary)

array 말고, hash가 필요한 상황은 어떤게 있을까요? 그것은 hash와 array의 가장 큰 차이인 “탐색속도" 에서 찾을 수 있습니다.

당신이 개발한 게시판에서 누군가 엄청나게 흥미로운 글을 올렸고, 그 글을 엄청나게 많은 사람들이 조회하는 상황이 발생했습니다. 그런데 당신의 게시판은 조회가 일어날 때마다, DB(여기선 RDB)에서 Select 하고, 조회수를 +1 씩 올리며 갱신합니다. 그러면 DB 부하가 생겨서 서비스할 수 없는 상태가 될 수 있습니다.

어떻게 해야 할까요?

이 게시판에는 특정 글을 식별할 수 있는 “글번호"라는 key가 있습니다. 그리고, 게시글 조회가 발생하면, 아래와 같이 contentDictionary 라는 곳에 글번호를 key로 글 내용을 저장해둡니다.

contentDictionary.put(글번호, “글 내용….”)

그리고 또 조회가 발생할 때, 글번호 만으로 메모리에서 빠르게 “글내용…”을 가져옵니다.

content = contentDictionary.get(글번호)

그러면 DB 까지 가지도 않고, 메모리상에서 처리할 수 있어서, DB의 부하를 줄일 수 있습니다. 일종의 “캐시" 역할을 할 수 있죠.

그리고 조회수의 경우도 글번호를 키로 증가 시킬 수 있습니다. 사용자가 조회하면, 아래와 같이 합니다.

readCountDictionary.put(글번호, readCount + 1)

그리고 아래와 같이 5의 배수마다 DB 반영을 하면, 이런 처리를 1/5로 줄일 수 있습니다.

if readCount % 5 == 0
 DB 반영

만약 array로 순차탐색 해야 한다면, 자주 발생하는 read 에 대한 처리가 비효율적으로 일어나서 서비스가 느려질 수 있습니다. 게시글이 10,000 개면 array 순차탐색은 최악의 경우 O(10,000) 이지만, Hash는 O(1)입니다.

마무리

데이터 크기가 커지고, 이런 상황이 점점 더 심해지면 분산캐시, key-value store 같은 것들을 검토하게 될 것입니다. 그 외에도 실제 적용시에는 처리해야 할 이슈가 더 많지만 기본 개념과 키워드만 알아뒀다가 실제 적용시 더 알아보시기 바랍니다.

추가로 Stack, Queue, Tree, Graph 등의 자료구조가 있지만, 필요할 때 공부하시면 됩니다. 일단은 그런게 있구나 하는 정도만 알아두세요.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.