요구사항을 놓쳤을 때 벌어지는 일 - 정렬 설계 수정기
안녕하세요 졸린개발자입니다.
오늘은 실무 중 겪은 실패 경험을 공유하려 합니다
정렬에 대한 요구사항을 받고 auto increment id를 기반으로 정렬을 했다가
잘못 설계했음을 깨닫고 변경하는 과정이였는데요
그럼 떠나볼까요~?
초기 설계: id 기반 정렬
제가 받은 요구사항과 비슷한, 간단한 예시를 설명드리겠습니다
- 리뷰가 있고, 그 리뷰에는 연관된 태그들이 있음
- 태그들은 유저가 입력한 순서대로 노출이 되어야 함
- 태그들은 언제든지 변경될 수 있음
예를 들면, 아래와 같이 리뷰와 태그가 저장이 되고, 유저가 입력한 순서대로 태그가 그대로 노출이 되어야 합니다
- 리뷰1 #맛있어요 #또오고싶네요
- 리뷰2 #와우 #진짜맛있네요
위 요구사항에서, 유저가 입력한 순서대로 태그를 노출시켜야 한다는 조건을 보고
생성순으로 정렬을 하면 되지 않을까? 라는 생각에 아래와 같이 설계를 하였습니다
- Review
- id: Long (auto increment)
- name: String
- tags: List<Tag>
- Tag
- id: Long (auto increment)
- name: String
리뷰의 태그를 저장할때는, 입력이 들어온 그대로 생성을 해주게 하였습니다
- 리뷰1 #맛있어요 #또오고싶네요
- 태그 저장 -> #맛있어요 -> id:1
- 태그 저장 -> #또오고싶네요 -> id:2
나중에 태그를 불러올때는 id 순서대로 정렬해서 들고오게 처리를 하게 해서 마무리를 지으려는 그 순간!
문제 발견 - 태그 수정을 하게 되면?
하지만 수정을 하면 어떻게 될까요?
아래 에서
- 리뷰1 #맛있어요(id:1) #또오고싶네요(id:2)
아래 처럼 변경하려면?
- 리뷰1 #좋아요 #맛있어요 #또오고싶네요
id로 정렬을 하려면
기존에 있던 태그들의 id를 변경해야 합니다
- 리뷰1 #좋아요(id:3) #맛있어요(id:4) #또오고싶네요(id:5)
하지만 지금 db에서는 auto increment를 쓰고 있으니
기존 데이터를 전부 날리고, 새로운 태그들을 save해야하는 상황입니다
이 태그가 많지 않다면 괜찮겠지만
만약 많아진다면 어떨까요?
회사의 요구사항에서는 이런 태그들이 몇백개, 몇천개나 들어올 수도 있다는 가능성이
충분히 있다고 판단되었습니다
따라서, 몇백개의 태그가 달려있는 리뷰의 제일 앞에 새로운 태그를 붙이면
몇백개의 태그를 다 삭제한 후에, 다시 생성을 해야하는 과정을 거쳐야 했죠
이 과정에서 태그를 하나만 수정해도, 사용자는 긴 시간을 기다려야 하는 문제점이 충분히 예상되었습니다
설계 변경: order 컬럼 도입
위의 문제 때문에, 저는 설계를 변경하기로 하였습니다
- Review
- id: Long (auto increment)
- name: String
- tags: List<Tag>
- Tag
- id: Long (auto increment)
- name: String
- order: int
Tag에 order컬럼을 추가하고, 생성할때에는 order를 넣고
조회할때에는 order를 기반으로 정렬을 수행하도록 변경하였습니다
그럼 이제 아래와 같은 상황에서, 제일 앞에 새로운 태그를 붙이려면 어떻게 해야할까요?
- 리뷰1 #맛있어요(order:1) #또오고싶네요(order:2)
간단합니다, 기존의 태그들은 order만 업데이트해주고, insert는 하나만 해주면 되겠죠
- 리뷰1 #좋아요(order:3) #맛있어요(order:1 -> 4) #또오고싶네요(order:2 -> 5)
기존에는 태그를 다 삭제하고, 다시 다 만들어주는 과정에서
이제는 업데이트를 통해 기존의 태그들을 한번에 변경을 할 수 있게 되었습니다
결론
이 경험을 통해, 정렬의 요구사항을 제대로 파악하는 것이 중요하다고 느꼈습니다
만약 리뷰가 만들어지고 나서 태그를 변경할 수 없다 라고 하면
id 기반의 정렬이 유효하겠죠
하지만 태그들을 변경할 수 있다는 요구사항을 놓침으로써
성능이슈가 발생할 수 있었습니다
이번에는 빠르게 판단하여, 개발 중간에 설계를 변경하여 처리했습니다만
이런 행운은 언제까지나 올 수 없겠죠
소프트웨어 개발자가, 요구사항을 잘 보고
어떻게 데이터를 저장할지를 잘 설계하는것이 중요하다고 느낀 순간이였습니다
읽어주셔서 감사합니다. 혹시 비슷한 경험이 있다면 댓글로 공유해 주세요!