header wave

Post

프로젝트) 이미지 라벨링 사이트 -4

2022-10-08 PM 06/33
#javascript
#react
#study
#project

6) Git

이번 프로젝트에서는 Git을 효율적으로 사용했다. 이전까지는 git을 단순히 Github에 업로드하기 위한 Tool 정도로 이해하고 있었는데, 이번 프로젝트를 통해 Git을 잘 사용하면 효율적으로 코드를 관리할 수 있다는 것을 알게 되었다.

img.png

Git log

문제가 발생했을 때, 혹은 기능별 개발이 필요할 때 Git Branch를 사용했다.

Branch는 말 그대로 나무줄기(가지?) 처럼 뻗어나가며 버전을 관리하는 느낌이다. 무언가 수정한 부분이 필요할 때 현상태를 복사하여 새로운 나무줄기를 만들어 코드를 수정할 수 있다.

또한 수정완료 후 Main 나무줄기와 다시 합쳐서 전체 코드를 수정하는 기능도 가능했다. (Merge)

웹 어플리케이션 실행 시, 뷰와 관계된 컴포넌트는 한번 로드된 이후 지속해서 리렌더링이 될 필요가 없다.

이 부분을 개선하고자 rerendering이란 Branch를 만들어 코드 수정을 했다.

img.png

이후 Merging을 통해 Main 코드를 수정한 코드로 덮어씌울 수 있었다.

img.png

7) Downloading Function

라벨링을 하면 좌표들이 state에 저장된다. 이 저장된 state들을 local에 txt 포맷으로 로컬에 저장할 수 있어야 한다.

이를 위해 <a> 태그를 사용했다.

<a> 태그에 아래와 같이 text 파일 생성하여 담을 수 있다. ("data:attachment/text,")

encodeURI를 통해 state에 저장된 값들을 text 형식으로 엔코딩해 텍스타 파일에 추가할 수 있다.

hiddenElement.href =
          "data:attachment/text," +
          encodeURI(
            element.labelName +
              " " +
              element.x1 +
              " " +
              element.y1 +
              " " +
              element.x2 +
              " " +
              element.y2
          );

파일의 이름은, 이미지명.txt로 설정했다.

hiddenElement.download = `${fileName}.txt`;

그리고 해당 기능은 Save 버튼 클릭시 실행된다. 그래서 버튼 클릭 시, a 태크의 클릭 이벤트도 같이 일어나 파일이 다운로드 된다.

hiddenElement.click();

img.gif

8) Deploy

프로젝트의 배포를 위해 Netlify를 이용했다. Github과 연동해서 자동배포가 가능한데 배포 과정도 매우 간단했다.

https://imagelaber.netlify.app/

9) Improvement plan

  • imageShowBox 컴포넌트에 drawing function, image loading, saving 등의 기능이 작성되어 코드가 무척 길다.

    추후 기능별 분리가 필요하다.

  • react hook을 사용한 성능 최적화가 된다면 좋을 것 같다.

  • canvas를 컴포넌트 형식으로 만들어 Layer를 분리한다면 성능적으로 더 좋을 것이다.

(현재 이미지 레이어와, 라벨링이 그려지는 레이어가 같은 컴포넌트에 들어있는데 라벨링이 그려질 떄 지속적으로 리렌더링이 일어나면서 이미지도 계속해서 다시 그려지게 된다. 컴포넌트 별로 나눠서 동시에 리렌더링이 일어나지 않도록 개선이 필요하다.)