은) 블로그 기획 (3편) - django 강좌

이제 프로그래밍을 시작하기에 앞서 우리가 뭘 만들 것인지 먼저 살펴 보려 한다. 강좌 예고편에서 밝혔듯이 이 강좌는 웹 기획자나 초보 웹 개발자를 대상으로 하기에 개떡 같이 말을 해서 찰떡 같이 알아 듣는 불친절함(?)을 보이지 않으려 한다.

불친절함? 내가 머리가 안좋은 탓인지는 모르겠지만 뭘 만들 지 머리에 잘 그려지지도 않는 상황에서 무턱대고 “안녕, 여러분 (hello world)”부터 화면에 찍으며 개발 공부를 하면 많은 어려움에 봉착했다. 혹 다른 이들도 나처럼 머리 속에 뭔가 그려지지 않으면 개발을 하거나 공부를 하는 데 어려움을 겪을 수도 있으니 다소 마음이 급하더라도 차근 차근 각 강좌를 밟아 나가도록 하자.

블로그 구성 요소

블로그는 다음과 같은 주요 요소로 구성되어 있다.

  • 글 쓰기
  • 글 목록
  • 글 낱개로 보기
  • 댓글(comment) 보기
  • 댓글 달기
  • 글 걸기/받기 (trackback)

이외에도

  • 글 갈래 (category)
  • 꼬리표 (tag)
  • 파일 첨부하기

등 다양한 요소가 있다. 우리는 위 요소들 중 파일 첨부하기, 그리고 글 걸기/받기(trackback)를 제외한 것들을 만들 것이다. 두 요소를 구현하지 않는 이유는 초보자를 위한 강좌에서 다루기엔 다소 번거로운 처리나 기능 구현이 필요하기 때문이다. 나중에 요청이 많으면 따로 강좌를 쓸 것을 약속한다.

블로그 흐름도

전체 흐름도

우선 전체 흐름도를 보자.

블로그에 접근하는 첫 경로는 글 낱장주소(permalink) 아니면 글 목록이다. 이용자가 접근한 주소를 통해 이를 구분 해야 하는데, 다음과 같이 구분할 것이다.

  • /entry/숫자 : 낱장주소
  • / 혹은 /page/숫자 : 글 목록

각 단계 마다 특별히 어려운 내용은 없으니 각 도형이 무엇을 뜻하는 지만 집고 넘어 가려 한다. 아참, 각 단계 마다 일련번호를 붙여 놨는데 이 번호는 기억 해두자. 이후 강좌에서 간간히 이 일련번호를 언급할 것이다.

  • 마름모꼴 (빨간색) : 조건
  • 네모꼴 (밝은 황갈색) : 처리
  • 뾰족/둥근변 도형 (연두색) : 화면 출력/표시/화면 반환
  • 빗변 네모꼴 (주황색) : 이용자 입력 (수동 입력)
  • 파란 도형 : 시작, 끝

이는 내 마음대로 뜻을 부여한 게 아니라 순서도(흐름도)에서 원래 쓰이는 개념이다.

글 쓰기 흐름도

댓글 영역 열기 흐름도

댓글 입력 흐름도

블로그 자료 구조

이제 블로그에 들어갈 자료 덩어리를 틀 지어보자. 아니, 잠깐. 그에 앞서 각 자료형으로는 무엇이 있는지 간단히 짚고 넘어가자.

우선 문자형이 있다. 문자형이라 하면 오직 문자만 들어갈 수 있으니 숫자는 들어 갈 수 없는 건가 싶겠지만, 숫자도 들어 갈 수 있다. 다만 숫자도 문자처럼 들어간다. 언어에 따라 조금씩 다른데, 우리가 다룰 파이썬은 문자형인 숫자와 숫자형인 숫자는 서로 더하거나 빼는 셈(연산)을 할 수 없다.

문자형은 다시 크게 두 가지로 나눌 수 있는데(엄밀히 말해서 서로 다른 자료형이다), 유니코드 문자형일반 문자형이 그것이다. 유니코드. 유니코드. 많이 들어 본 낱말이다. 자세한 것은 인터넷에 있는 다른 글을 참고하길 바라고, 이 강좌에선 다양한 나랏말을 표현 할 수 있는 멋진 문자형이라고 알아두자. 물론 우린 이 멋진 문자형을 쓸 것이다. 어떻게 파이썬 안에서 일반 문자형과 유니코드 문자형을 구분해서 쓸 것인지는 이후에 다룰 것이다.

다음은 숫자형이 있다. 자료형(type) 이름에서 알 수 있듯이 숫자만 들어 갈 수 있다. 문자형은 숫자를 넣을 경우 그 숫자가 문자형인 숫자가 되지만, 숫자형엔 문자가 들어 갈 수 없다.

이외 파이썬이나 DBMS에 따라 자료형이 따로 더 있는데, 이건 이후 차츰 다룰 것이다.

글 자료 구조

블로그 글은 어떻게 구성될까? 우선 글이라 하면 제목과 본문이 있을 것이다. 이 둘엔 숫자 뿐 아니라 다른 문자도 들어가니 마땅히 문자형으로 구성해야 한다.

  • 글 제목 : 문자형 (80글자)
  • 글 본문 : 문자형 (무지 길게)

글 제목은 더 길게 써도 상관은 없지만, 편의상 80글자 정도로 제한하자. 본문은 DBMS에서 제공하는 최대 길이까지 다 쓸 수 있게 했다.

글 제목과 본문 말고도 더 있다. 바로 글 갈래와 꼬리표이다.

자, 우선 글 갈래. 글 갈래는 미리 정해놓은 갈래에서 어느 하나를 고른다(꼭 하나일 필요는 없지만 편의상 하나만 고를 수 있게 할 것이다). 그리고 각 글 갈래 이름은 언제든지 바뀔 수 있다. 그렇다면 각 글 마다 글 갈래 이름을 함께 저장하는 것 보다는 그 글 갈래를 가리키게만 하고, 글을 출력할 때 글 갈래 정보도 함께 가져오는 것이 나을 것이다.

예를 들어서, 어떤 기업에 “한날”이라는 사람이 속해 있다고 치자. 한날의 개인 정보로는 이름이나 생년월일, 살고 있는 곳 등이 있을 것이다. 그런데 그 기업에 각 부서 마다 한날이라는 사람 정보를 담으려고 그 개인 정보 모두를 보관하고 관리하는 것은 효율성이 떨어진다. 그래서 대부분 “한날”을 가리키는 어떤 고유한 값(주민등록번호나 입사 번호)을 정하고, 각 부서 안에선 한날과 다른 이용자를 그 고유한 값으로 구분할 것이다. (사실 구치소나 감옥에서 수감 번호로 사람을 구분한다는 예를 들려다 왠지 삭막한 느낌이 들어 예를 바꿨다)

마찬가지로 글 갈래 역시 각 글 마다 미리 정해놓은 글 갈래를 가리키게 하고, 그 가리키는 고유한 값을 정하면 된다. 이걸 숫자로 해보자. 1번 글 갈래는 “낙서”, 2번 글 갈래는 “생각하기”, 3번 글 갈래는 “중얼 중얼”로 하듯이 말이다.

꼬리표는 글 갈래와 다르다. 글 갈래는 글 갈래 이름을 바꾸는 것과 상관 없이 그 글이 글 갈래를 계속 가리키고 있지만, 꼬리표는 이름을 바꾸면 그 꼬리표를 달고 있던 모든 글들이 더 이상 새로 이름을 바꾼 꼬리표를 포함하지 않는다. 마치 글 본문에 “한날”이라는 낱말이 딱 하나 있는데, 글 본문에서 그 낱말을 “하는 날”로 바꿔서 더 이상 그 글엔 “한날”이 존재하지 않는 것과 같다. 즉, 꼬리표는 꼬리표 이름 자체가 고유한 값이다. 그러므로 문자형으로 하자.

  • 글 갈래 : 숫자형 (100개)
  • 꼬리표 : 문자형 (20글자)

자, 또 뭐가 있을까? 댓글이 있다. 그런데 얘네들은 그 자체가 글과 구분되는 개체이므로, 얘네를 글 자체에 담을 필요는 없다. 글 갈래와 마찬가지로 댓글이 각 글을 가리키게만 하면 된다. 대신 댓글 수 정도는 글 정보에 담을 수 있을 것이다.

물론 개수를 글 정보에 넣지 않아도 된다. 하지만 글을 읽어 올 때 마다 매번 댓글 수를 세기 보다는 댓글이 달리거나 지워질 때 마다 각 글에 있는 개수를 바꾸고, 글을 읽어 올 때 이 개수도 함께 읽어 오는 것이 좀 더 편하고 효율성 있을 것이다.

  • 댓글 수 : 숫자형 (6만개 정도)

글을 쓰면 언제 썼는 지 알아야 한다. 바로 날짜인데, 이 날짜를 숫자형으로 해야 할 지 문자형으로 해야 할 지 조금 애매하다. 다행히 DBMS에는 날짜형이라는 자료형이 따로 존재하며 파이썬에도 날짜를 나타내는 자료형을 다루는 모듈이 있고, django는 이 둘을 적절히 잘 관리하며 이어준다. 파이썬과 DBMS에서 날짜형을 어떻게 다룰 지는 나중에 알아보기로 하고 여기서는 간단히 “날짜/시간형”이라고만 해두자. (“날짜형”이라고 하지 않고 굳이 “날짜/시간형”이라고 한 이유는 시간 정보를 담지 않는 “날짜형”이 이미 있기 때문이다)

  • 작성일시 : 날짜/시간형

마지막으로 각 글을 구분 지을 일련번호가 필요하다. 혼자서 블로그를 관리한다면 작성일시가 글 마다 겹칠 일이 없으므로 작성일시를 고유한 일련번호로 할 수도 있겠지만, 무결성을 보장하진 않으니 따로 일련번호를 만들자.

  • 일련번호 : 숫자형 (6만개 정도)

이제 글 구조는 다 잡았다. 정리 해보자. 자료 항목 이름 옆에 괄호로 묶은 영문 이름이 있는데 이것은 나중에 우리가 실제 개발을 할 때 두고 두고 마주 칠 녀석들이다. 기억 할 필요는 없지만 미리 눈에 익혀 두자.

  • 일련번호(id) : 숫자형 (6만개)
  • 글 제목 (Title) : 문자형 (80글자)
  • 글 본문 (Content) : 문자형 (길게)
  • 작성일시 (created) : 날짜/시간형
  • 글 갈래 (Category) : 숫자형 (6만개)
  • 꼬리표 (Tags) : 문자형 (20글자)
  • 댓글 수 (Comments) : 숫자형 (6만개)

꽤 간결하다. 나중에 자세히 다루겠지만, 글 갈래와 꼬리표는 django 안에서 다루는 자료형과 DBMS에서 다루는 자료형이 달라질 것이다. 같은 개체에 대해 서로 다른 자료형을 가진다니 벌써부터 신경 쓰일텐데, “글 갈래”와 “꼬리표”라는 개체로만 머리 속에 그려두자.

글 갈래 자료 구조

글 자료 구조는 이것 저것 여러 가지가 있었지만 글 갈래는 간단하다. 각 글 갈래를 구분 할 일련번호와 글 갈래 이름만 있으면 된다.

  • 일련번호(id) : 숫자형 (6만개)
  • 글 갈래 이름(Title) : 문자형 (40글자)

대부분 블로그 도구를 보면 글 갈래도 부모, 자식 관계가 있는데, 이 강좌에선 그런 깊이 단계를 두지 않을 것이다. 나중에 이 강좌를 보며 블로그 도구를 만든 뒤에 직접 그런 깊이 단계를 구현 하는 것도 좋을 것이다.

꼬리표(tag) 자료 구조

꼬리표 자료 구조는 간단하면서도 간단하지 않다. 자료 구조 자체는 매우 간단한데, 작동 방식이 쉽지 않다. 우선 자료 구조부터 보자.

  • 일련번호(id)
  • 꼬리표 이름(Title) : 문자형

참 간단하다. 그런데 이것만으로는 동작이 깔끔하질 않다.

예를 들자. 1번 글에 “한날, 파이썬, django”라는 꼬리표가 있다. 2번 글엔 “한날, 기획, 놀이”라는 꼬리표가 있다. 그렇다면 현재 존재하는 모든 꼬리표는 “한날, 파이썬, django, 기획, 놀이”이다.

각 글은 꼬리표를 여러 개(n개) 가질 수 있으며, 반대로 각 꼬리표 역시 여러 글에 속할 수 있다. 이런 관계를 부적절한 관계...라고 하진 않고, n 대 n 관계라고 할 수 있다. 글 갈래는 n 대 n 관계가 아니라 n 대 1 관계이다. 각 글이 글 갈래 하나만 가리키기 때문이다.

“한날”이라는 꼬리표로 글을 검색하면 1번 글과 2번 글이 나온다. 그런데 둘 중 어느 한 글에서 “한날”이라는 꼬리표를 떼낸 뒤 “한날”로 검색하면 그 꼬리표를 가지고 있는 글만 나올 것이다. 마치 글 본문에서 어떤 낱말(한날)을 고쳐서(하는 날) 더 이상 그 낱말(한날)로는 그 글을 끄집어 낼 수 없는 것 같다.

그래서 각 글이 포함하고 있는 꼬리표를 다른 곳에 따로 모아 두고, 각 꼬리표를 담고 있는 글을 가리키게 한다. 꼬리표 바구니가 있는데, 각 꼬리표는 자신을 담고 있는 글을 가리키고 있는 꼴이다. 그렇기 때문에 위 꼬리표 자료 구조엔 가리키고 있는 글 정보도 있어야 한다.

  • 일련번호(id)
  • 꼬리표 이름(Title) : 문자형 (20글자)
  • 가리키고 있는 글 정보(Entry) : 숫자형 (그 글의 일련번호)

어떤가? 생각만 해도 아주 처리하기 귀찮을 것 같다. 글에 꼬리표를 빼거나 더할 때 마다 관련 자료들도 그런 내용을 반영해야 하니 말이다. 그것도 각 꼬리표 마다 해당 꼬리표가 이미 있는 지 없는 지 확인도 해야 한다. 하지만 너무 걱정하지 않아도 된다. django 에서는 아주 쉽고 깔끔하게 이런 처리를 할 수 있다. 여기선 자료 구조와 왜 이런 구조인지 이유만 이해하면 된다.

댓글 자료 구조

댓글 자료 구조는 뻔하다. 척 보면 척일테니 자세한 설명은 건너뛰고 바로 자료 구조를 보자.

  • 일련번호(id)
  • 글쓴이(Name) : 문자형 (20글자)
  • 암호(Password) : 문자형 (32글자)
  • 본문(Content) : 문자형 (2000글자)
  • 작성일시(created) : 날짜/시간형
  • 가리키는 글 정보(Entry) : 숫자형 (그 글의 일련번호)

Ajax 를 적용할 곳

지난 강좌에서 Ajax 기법을 쓸 것이라 했다. 어떤 부분에 Ajax 기법을 쓸 것인지 미리 정해보자.

우리나라 블로그 도구나 서비스를 보면 “댓글 (3)” 이걸 누르면 그 아래 그 글에 달린 댓글을 가져와서 보여준다. 이미 글 화면을 출력할 때 댓글 정보도 함께 가져온 뒤 댓글 여는 부분을 누르면 보여주는 경우도 있고, 누를 때 서버에서 댓글들을 가져와 보여주는 경우도 있다. 우린 후자 방식을 따를 것이다. 즉, 댓글을 가져오는 방식 중 하나를 Ajax로 구현 할 것이다.

또 하나는 댓글을 쓸 때 굳이 화면 전체를 새로 그리지 않고, 작성한 댓글만 서버로 보내고 댓글 영역만 갱신하는 기능도 Ajax로 구현할 수 있다. 역시 우리나라 블로그들에서 흔히 볼 수 있는 방식이다.

이외 필요하다면 여러 부분에 Ajax 기법을 적용할 수 있다. 예를 들면, 글 쓰기 영역에서 일정 시간 마다 글을 서버에 자동 저장 한다거나 댓글 삭제를 Ajax로 할 수도 있다. 이런 부분은 위 두 기능을 Ajax로 구현하고 나면 스스로도 어렵지 않게 응용해서 만들 수 있으므로 굳이 이 강좌에서 일일이 다루진 않을 것이다.


이로써 블로그를 만들 기본 기획은 끝났다. 다음 강좌에선 드디어 파이썬과 django 냄새가 나는 내용이 나올 것이다. 그렇다고 해서 바로 다음 강좌에서 눈에 보이는 뭔가를 만들진 않는다. ^^; 당장 눈 앞에 파이썬과 django 가 그려낸 화면을 보고 싶어 답답하더라도 조금만 더 참고 차근 차근 나아가면 곧 그리 될 것이다.

그래도 고민 끝에 2주 분량을 이번 회 하나로 다듬어 합쳐서 강좌 진행 속도를 좀 더 올렸다. 원래는 기획 부분이 이번 주 분량이고, Ajax나 글 걸기/받기(trackback) 내용이 다음 주 분량이었으나 실제 개발(coding)에 앞서 준비 과정이 너무 길어져(원래는 총 4주 분량) 지겨워 질까봐 줄인 것이다. 강좌에선 속도감을 위해 다소 희생한 부분이 있으니, 좀 막연하거나 확실히 이해가 안된다면 인터넷에서 열심히 검색하며 개념을 채우길 바란다.