본문 바로가기

IT

[백엔드] output json을 신경써서 만들어야 하는 이유(안티패턴)

Contents

신입과 주니어 개발자들이 놓치는 부분 중에 하나는 "디테일"이다.

동작하는데 문제가 없으니까, 현재의 방법이 맞다고 느끼는 "착각"에 빠지기 쉽다.

그 중에, return 값에 대해서 이야기 해볼까 한다.

 

먼저 아래 json을 확인해보자. 그리고, 문제점을 찾아보자.

{
    "precheck": {"comment": "검증 완료", "status": 1},
    "rules": {
        "min_stock_rule": {"comment": "최소 재고 충족", "status": 1, "value": 3},
        "promo_price_rule": {"comment": "프로모션 가격 미적용", "status": 0, "vlaue": 0}
    }
}

 

문제점

간단하게 예시를 만들어봤다.

위 json의 문제점이 무엇일까?

 

바로, "동적 키로 의미를 담는 구조" 이다.

 

위의 json에서 생각해보자.

1. 새로운 rule이 생긴다면?

2. rule의 순서가 중요하다면?

 

즉, 가장 큰 문제점은 확장 할 수 없는 구조라는 뜻이다.

 

뿐만 아니라, 유지보수하는데, 수많은 문제나, 계속해서 작업을 해야하는 리소스 낭비로 이루어진다.

 

새로운 규칙이 생길 때 마다 키이름 자체가 바뀌는 구조는 안티 패턴 중에 하나이며, 이는 곳, 파싱/검증/집계/캐시 영역에서 key 설계가 불안정해진다. 이는 결국 당신이 해야할 작업을 늘리는 것이다.

 

특히, 기능이 빠르게 추가되거나, 기획 변경이 자주 일어나는 기업에서는 매번 작업이 필요한 점은 분명히 큰 단점으로 돌아온다.

 

만약, 위와 같은 json모양으로 Front-end까지 나가게 되는 경우, 더 많은 문제에 직면하게 된다.

 

다국어 지원이 필요해서 i18n을 사용하고자 한다면, 매번 키 변경을 필요로 할 것이고, Front-end의 typescript typing은 기능을 만드는 건지 type을 만드는 건지 헷갈릴 정도로, typing에 많은 리소스가 들어가게 될 것이다.

 

또다른 확장성 문제에서는 순서를 보장할 수 있는 가? 와 동일한 rule이 발생하는 경우? 이다.

당신이 위와 같이 json을 설계했는데, 대표나 기획자들의 의견으로 순서를 보장해 달라 라는 의견이나, 동일한 rule이 동시에  발생해야 한다며, 기획 변경 사항을 전달해 줬다고 가정해보자.

 

위의 json을 가지고 있었다면, 당신은 바뀐 기획에 맞추어 json도 다시 재설계에 들어가야한다. 만약 이미 기능이 배포되어 있었다면, Front-end에서도 작업을 해야한다.

 

순서 보장은 리스트로 관리했다면, 문제가 없을 것이다.

동일한 rule이 발생하는 경우라면, key가 곂치게 되기 때문에, 덮어씌워지는 문제가 발생한다. 이로 인해서, 동작은 하는데, 의도와는 다르게 동작하여, 다른 값이 적재되는 불상사가 벌어지게 된다.

 

원인 분석

그렇다면, 왜 신입, 주니어는 위와 같은 설계를 하게 될까를 고민해봤다.

key value로 값을 제공할 때, 값을 사용하기 용이하다고 판단했을 경우도 있고, O(1) 이 좋으니까, 속도를 위해서 택했을 수도 있다.(아니면, 정말 생각 없이 했거나)

 

그런데, 다시 한번 생각해보자. O(1) 속도가 필요할 정도로, 속도를 빠르게 하고자 하는 데이터가 정말로 그 만큼 많은 데이터를 사용하고 있는지 생각해보자.

보통의 경우, return값을 동적 key로 해야할 정도로, 많은 데이터를 내려야 하는 경우가 아닐 수 있다.

만약, 그렇다 하더라도, 사용하는쪽에서 1번의 순회로 hash table을 생성하고, 반복해서 재사용하는 경우가 더 좋을 수 있다.

 

결론

잠시 얘기가 딴길로 샌것 같지만, 

결론을 내려보자면, 

 

1. 확장성(기능)

2. 개발 리소스 재투자 가능성

3. 순서 보장 불가

4. 동일 key 표현 불가

5. i18n 등 Front-end 편의성 손해

 

위의 문제들이 발생하므로, key를 동적으로 하는 안티패턴은 지양해야 한다.

최소한, 아래와 같은 모양으로 구성해야한다.

 

이로서, 모든 key는 고정되도록 변경되었다.

단순히 return값에 조금 신경쓴 결과로, 해당 코드가 얻어가는 이점은 무수히 많아졌다.

{
    "precheck": {"comment": "검증 완료", "status": 1},
    "rules": [
        {"type":"min_stock_rule", "comment": "최소 재고 충족", "status": 1, "value": 3},
        {"type":"promo_price_rule", "comment": "프로모션 가격 미적용", "status": 0, "vlaue": 0}
    ]
}