카테고리 없음

API 설계 고민: 추가, 수정, 삭제가 한 번에 일어나는 구조

rimkongs 2024. 7. 7. 09:08

 
오늘은 내가 했던 API 설계 고민을 공유해볼것임

 
 
 
어느 날 회사에서 아래와 같은 시안을 건네 받았음
(회사꺼는 공개할 수 없기에 Tistory 관리자 페이지에서 최대한 비슷한 구조의 UI 를 가져왔슴다)

 
이 시안이 뭣이냐하면.. 
우측 하단에 [변경사항 저장] 버튼을 누르면 CRUD 가 한 번에 일어나는 구조의 페이지임
 
 
삭제 혹은 수정만 하는 API 는 설계하기 쉬운데 CRUD 가 한 번에 일어나야한다고 생각하니 갑자기 머리가 지끈해짐
[저장] 버튼 누를 때 변경사항 있는 row 들은 API payload 로 전부 전달을 해야할 터인데...
API 서버 입장에서 각 row 들이 수정/삭제/추가 중에 무엇인지는 어떻게 구분하지????

 
 
 
아!!! row 에 id 값이 있으면 수정 혹은 삭제,  id 값이 없으면 추가로 구분해야겠구나? 난 혹시 천재?????

 
 
 
이러고 뚝딱뚝딱 만들었음... 근데.. 정상 작동은 하는데.. 코드가 너무 복잡쓰.. 
5일 뒤에 해당 API 코드를 다시 보니 1도 안 읽히고 뭔 생각으로 이렇게 짰는지 잘 기억이 안 났음
사태의 심각성을 인지....

 
(그런데 변명하자면... 회사 내 일부 직원분들만 쓸 페이지라서 설계 고민 크게 안 하고 뚝딱 만든 것도 있음.. 그냥.. 그렇다구요..하하)
 
 
그래서 급 코드를 수습하기 시작했는데..
operationType 이라는 필드를 둬서 해당 row 가 CREATE, UPDATE, DELETE 중 어떤 값인지 구분하도록 수정함
아래와 같은 구조임

{
  "products": [
    {
      "operationType": "CREATE",
      "title": "맛있는 사과"
    },
    {
      "id": 23,
      "operationType": "UPDATE",
      "title": "달콤한 오렌지"
    },
    {
      "id": 28,
      "operationType": "DELETE",
      "title": "시원한 수박"
    }
  ]
}

 
그래서 서버에서는 배열을 loop 돌며 if 문으로 분기 처리해서 DB에 어떤 작업을 수행할 지 결정했음
이 row 의 operationType 이 CREATE면, ~~
UPDATE면, ~~
DELETE면, ~~~~
..
 
이러니까 훨씬 코드 보기에 편안해졌음

 
 
 
그런데 문득 지금 이 글을 쓰면서 생각이 든 건..
아래와 같이 CREATE/UPDATE/DELETE 를 key 값으로 하는 배열로 받아도 좋았을 것 같다.
그러면 loop 돌면서 if 분기 처리 안 해도 되니까!!!

{
  "DELETE": [
    {
      "id": 23
    }
  ],
  "CREATE": [
    {
      "title": "달콤한 오렌지"
    }
  ],
  "UPDATE": [
    {
      "id": 9,
      "title": "새콤한 딸기"
    },
    {
      "id": 13,
      "title": "아삭한 사과"
    }
  ]
}

 
 
 
 
음.. 이건 갑자기 생각난거니까.. 언젠가 기회가 된다면 리팩토링 할거임.. 지금 할 일이 많아서..
(이러고 평생 안 고쳐졌다고 한다)
그럼 이만..