백엔드의 신 되기 1일차

손성호·2026년 3월 27일

백엔드의 신 되기

목록 보기
1/2

어쩌다보니 백엔드 본격적으로 백엔드를 개발해보기 시작했다.
백엔드 개발도 해봤으면 좋겠다는 이사님의 말에 백엔드 개발을 자원했고,
데빈의 도움아래 간단한 엔티티를 수정하는 코드단에서의 작업을 해보았는데 너무 재밌었다.
그래서 이번에는 다른 프로젝트의 추가기능(설문조사)관련 백엔드 개발을 해보기로했다.
이름하여 "백엔드의 신 되기"

1일차.
오늘 한 일은 db설계다.
나는 사실 학교 db수업을 듣고 백엔드를 포기한 사람이다. (데이터베이스 c+의 충격)
그치만 회사일을 하다보니, db지식들은 필수불가결 요소였다.
'도망친곳에 낙원은 없다.' + '피할 수 없으면 즐겨라'
기왕하는김에 재밌게 그리고 "잘"하고싶었다.
정규화, key, 테이블간의 관계 같은 간단한 지식들을 학습을 한 후에 테이블을 설계했다.

다행히 기존의 erd가 있었고 이걸 참고하여 3개의 테이블을 설계했다.

  • template: 설문조사 템플릿을 저장하는 테이블이다.
    피그마상에서 template에 대해 crud하는 페이지가 있어, crud기능을 고려하여 짜야했다.

  • survey: 템플릿을 바탕으로 실제 설문과 관련된 데이터를 저장하는 테이블이다.
    마찬가지로 crud기능이 필요하다.

  • answer: 설문응답과 관련한 로그 테이블이다.

테이블별로 컬럼들을 상세하게 살펴보자
survey_template 테이블

컬럼명			컬럼설명						데이터타입
id (PK)			내부 용도 (인덱싱, 조인)			bigInt
uid				외부 노출 용도 (상세페이지경로)	varchar(36)
title			템플릿 제목					varchar(50)
description		템플릿 설명					varchar(100)
created_by		생성자 id						bigInt
created_at		생성일						dateTime(3)
updated_by		수정자 id						bigInt
updated_at		수정일						dateTime(3)
deleted_at		삭제일						dateTime(3)
questions		질문문항						json

고민되었던건 2가지였다.

  1. '질문양식을 어떻게 저장할 것인가?' 였다.
    템플릿이란건 결국 설문조사에 사용되는 질문들에대한 템플릿을 말하는건데..
    양식이 다양할 것이라 생각했다.
    그러면? ENUM으로 설정하고 코드단에서 ENUM별로 설정하는 방법도 생각했는데
    찾아보니 json 타입이 있었다.
    json형식으로 저장한다면 다양한 양식들을 쉽게 저장할 수 있을 것이라 생각했다.

  2. '생성자, 수정자에 대해서 id를 저장할지? 이름을 저장할지?' 였다.
    난 처음에 생성자 이름으로 FK로 생각을 했다.
    왜냐하면 기획화면상에서는 템플릿 생성자 이름으로 노출되었기 때문이다.
    그래서 db에도 이름을 넣어야지했는데..
    백엔드 개발자분한테 리뷰받는 과정에서 잘못되었다는걸 깨달았다.
    데이터간의 관계를 생각해보았을 때, 사용자의 이름이 unique가 아닐수도 있기 때문이다.
    그래서 안정적으로 unique성을 보장해주는 user의 id를 저장하도록했다.
    이름을 가져오는 부분은 service단에서 id를 가지고 user테이블을 조회하면 해결이 되는 부분이였다!

+소프트딜리트를 권장해주셨다. (delete보다 update가 비용이 적음, 후에 데이터가 필요할 수도 있음)

survey 테이블

컬럼명			컬럼설명						데이터타입
id (PK)			내부 용도 (인덱싱, 조인)			bigInt
uid				외부 노출 용도 (상세페이지경로)	varchar(36)
template_id(FK)	참고하는 템플릿 번호				bigint
title			설문조사 제목					varchar(50)
description		설문조사 설명					varchar(100)
created_by		생성자 id						bigInt
created_at		생성일						dateTime(3)
updated_by		수정자 id						bigInt
updated_at		수정일						dateTime(3)
deleted_at		삭제일						dateTime(3)
deleted_at		삭제일						datetime(3)
start_at		설문조사 시작일					datetime
end_at			설문조사 종료일					datetime
status			설문조사 상태					varchar(20)
type			설문조사 유형					varchar(20)

여기선 처음에 status와 type컬럼을 ENUM으로 설정해서 문제였다.
mysql에선 enum타입을 잘 안쓰신다고.. enum을 사용할바엔 아예 enum테이블을 만들어서 관련 enum값을 사용한다고했다. 그래서 varchar로 변경했다.

또한 template_id를 fk로잡고 survey_template 테이블과 1:n관계를 지어줬다.
이때 고민된건 템플릿이 사라진다면??? 설문조사는 어떻게 될까였다.
fk지만, 설문조사가 사라지지 않는것이 사용흐름상 자연스럽다고 생각했다.
템플릿과 설문조사의 관계는 부모 관계보단 형제 관계가 조금 더 자연스럽다고 느껴졌다.
'템플릿이 있어야 설문조사를 쓸 수 있어!' 보단
'설문조사를 쓸 때, 템플릿이 있어서 이걸 이용하면 편해~' 이런 관계라고 볼 수 있다.

answer 테이블

컬럼명			컬럼설명						데이터타입
id (PK)			내부 용도 (인덱싱, 조인)			bigInt
uid				외부 노출 용도 (상세페이지경로)	varchar(36)
survey_id (FK)	설문id						bigint
user_id			응답자 id						bigint
created_by		생성자 id						bigInt
created_at		생성일						dateTime(3)
updated_by		수정자 id						bigInt
updated_at		수정일						dateTime(3)
answer			설문응답						json

answer테이블은 survey_id를 fk로 설정했는데, 설문이 사라지면 해당 로그들도 사라진다고 생각했다.
-> survey테이블은 소프트딜리트로 삭제하므로 실제로 사라지진 않을 것이다.

완성한 ERD

3일정도 여기에만 몰두한것 같은데 어렵지만 재밌는 한주였다.
처음 개발할 때 느꼈던 재미를 다시 느낄 수 있었다.
ps. 많은 질문에도 친절하게 답해주신 debin, ian에게 무한한 감사..

profile
사용자를 위한 웹화면을 개발하고 있습니다.

0개의 댓글