본문 바로가기
dev/개발일지

clone_deep 깊은 복사 사용 후기

by Box 2021. 7. 30.
728x90

우선 나는 mongodb ,nodejs 를 쓰고있다.

댓글 관련 해서 로직을 개선중인데

현재 댓글에 deleteAt 값이 존재하는건  댓글의 작성자 이름, 댓글의 내용, 댓글 작성날짜를 null 로 바꿔주는데 문제가 생겼다.

deleteAt 값이있는 댓글들은 정상으로 null 을 띄워주는데 작성자 쪽은 해당 작성자가 여러 댓글을 썼다 예를 들면

하나만 deleteAt 이어서 그 게시글의 작성자 이름을 null 로 바꿔주면 그 작성자의 댓글 데이터들 전부 작성자 이름이 Null 해서 반환된다.

문제점을 찾아보았다.

  • forEach 함수로 해당array를 반복문 실행하는데 반복되는 배열들중 조건문으로 빼서 deleteAt 값이 있는것만 추출해서 작성자 이름을 null 로 바꾸는데 왜 모든 작성자 이름이 다 null 뜨는지 이해가 되지않는다.
    • 여기서 내가 찾아보고 물어보면서 찾은 거는 참조된 객체라서 그렇다고 들었다.
    • ( 문제 해결방법
      • 참조를 끊는다 
      • 객체를 새로 생성한다
      • deepclone 을 사용한다
        • 여기서 다 봤을때 현제 내가 하고 있는 프로젝트에서는 객체를 새로생성하는거 와 참조를 끊는거는 맞지않았다고 생각했다
        • 그래서 deepclone 을 사용하였다.
      • {a:0, {b:1}} 여기서 b 가 참조된 형태이다
        • 그래서 작성자는 해당 객체안에 객체 이며 참조된 객체
          • 그래서 하나만 = null 로 넣어도 나머지 다 null 로 바껴서 돌아온다.
          • 하지만 deep clone을 사용하면 원본은 안바뀌고 복사한 객체만 바뀐다.
  • 현재 프로젝트에 lodash 가 설치 되어있어 cloneDeep 을 썻다. 객체를 복사한후 그 복사한 객체로 반복문 돌려서 내가 원하는 로직으로 수정하였다. 아마 말보다는 직접 보면 이해가 빠를거같다.
    • 내가 한말은 정확한게 아니다. 그냥 내가 해보고 이렇구나 해서 이해한 내용이다
      • 혹시 잘못된 설명과 내용이 있으면 댓글 달아주시면 정말 감사할것같다.

  • 보면 clone_depth0 이 cloneDeep 함수사용하여 복사한 객체이다
    • 우선 내가 한방법은 deletAt 값이 있는 객체의 index (위치) 를 추출한다.
      •  원본 배열에서 해당 위치에 있는 객체를 제거한다.
        •  그후 그자리에 null 바꿔준 객체를 넣어주면
          • 해당하는 데이터의 작성자만 null 로 바뀌고 나머지 데이터의 작성자는 똑같은 작성자라도 이름이 잘나온다.
          • 끝!

이 문제를 해결하느라 조금 시간이 걸렸다.

그래도 지식이 한층 더 쌓인거 같아 뿌듯하다.  아직 많이 부족하지만 빨리 실력있는 개발자가 되고싶다.