개발자 노트

프로젝트를 진행하며 알게 된 것들. 본문

토이프로젝트/클라이언트-서버 폴더 동기화

프로젝트를 진행하며 알게 된 것들.

jurogrammer 2020. 4. 29. 13:56

FtpSyn하며 알게된 것들

1.폴더삭제는 recursive삭제해야 함.

  • 디렉토리는 파일을 담는 그릇 정도. 파일시스템.!
  • 디렉토리 삭제는 -> 디렉토리 내 파일들을 삭제한다는 것. 그 파일 내에는 또 디렉토리가 있으므로 디렉토리 탐색하며 삭제.
  • 말이 안되지만 디렉토리만 삭제 한다면?
    1. 파일에 접근할 수 없다.
    2. 파일이 삭제 된다해도 파일 시스템상 삭제된 파일이 기록됨.
      • 이건 운영체제상 삭제관리가 아닌 것.

2.interface 사용 이유 -> 다형성으로 의존성 약화

  • 파일 내용의 수정여부를 판단하기 위해 sha-1을 이용했다.
  • 그런데 나중에 다른 해쉬함수를 이용할 수도 있다. sha-1이 아주 적은 확률로 충돌할수있다나...
  • 그래서 sha-256으로 할 수 있는거 아니야?
  • ->그럼 hashFunction이라는 interface를 생성해서 그 기능을 sha-1,sha-256이 구현하도록 해. 그리고 그것을 이용하는 클래스는 hashFunction Type으로 sha-1이나 sha-256의 객체를 받는다. 이러면 확장성 해결!

3.Spring에서 DTO를 이용하는 이유

  • ftp syn에서 path, fileName, hash값을 주고 받아야 함.
  • 클래스의 편의에 맞게 어디선 path fileName hash를 각각 보내주고, 어떤 곳에선 json으로 주고 받기로 했다.
    • 어떤 클래스가 어떤 자료형을 받는지, 출력하는지 매번 확인해야 함. -> 복잡해진다.
  • 따라서 JSON으로 통일하기로 했다.
  • DTO도 이런 면과 통하는 것 같다. rest-api에서 보통 사용하는 JSON으로 안하는 이유는 아마 의존성 문제일 것 같다. 자바의 기본 기능으로도 해결할 수 있는데 굳이 내부적으로 JSON을 이용할 필요는 없는 것 같다.

4.File 객체를 파일명만 입력하여 생성하면 workspace내 파일명이 등록된다.

  • 현재 작업 디렉토리를 변경하더라도 File을 이름으로만 읽을 땐 프로젝트의 기본 workspace가 기준이 된다.

5.FtpClient changeDirectory

  • 자바에서는 역슬래쉬(\)2개로 디렉토리 경로 설정 가능하나, FtpClient는 안된다. 그런데 컴파일에러, 런타임에러는 발생하지 않아서 뭐가 틀렸는지 확인하기 어렵게 한다. ㅜ
  • ftpClient는 슬래쉬(/)만 지원해준다.

6.초기 데이터 입력 필요성(디렉토리 설정)

  • 동기화할 directory, server, port번호 등은 바뀌므로 properties에 저장해두었다.
  • 그런데 다른 사람도 이용할 것을 생각하면 접근하여 수정하도록 해줘야 한다.
  • 따라서 처음 실행했을 때 입력을 하도록 또는 옵션을 주어 입력할 수 있도록 한다.
  • 이래서 UI따로 두어서설정해야 하나보다.

7.Test 방법에 대한 공부 필요성

  • edwith에서 풀스택 부스트코스를 듣는데 프론트,백엔드 가르치시는 강사분들이 모두 중간중간 Test해주는 습관을 가지고 계셨다.

  • 메인 클래스를 선언하여 테스트해보는식으로 했는데... 다음과 같은 문제가 있었다.

    • 패키지 내에 메인클래스를 선언하다보니 jar파일을 만들 때 이것들이 포함된다.

    • 클래스 또는 메소드 단위가 아닌, 메소드 내에서 에러가 발생하는지 확인할 땐 실행 중 사이에 테스트 내용을 작성해야 하므로 테스트 확인한 후에 지워주고, 나중에 코드를 수정후 테스트할 때 다시 작성해주고.... 번거로웠다.

8.컨테이너 사용하는 이유

  • Spring으로 배울 땐 그럴 수 있지 정도였는데 해보니 체감된다.
  • 예를 들어 File을 읽어오는 클래스가 FileReadManager라하자.
    생성한 객체를 A란 객체에서 쓰일 수 있고 B란 객체에서도 쓰일 수 있다.
    그런데 싱글 쓰레드로 돌리거나 멀티 쓰레드로 돌린다하더라도 그 이상의 객체는 조작할 수 없다.
    다르게 말하자면 A에서 fileReadManager를 사용다하고 나면 B에 이를 전달해주면 된다.
    굳이 B에서 사용하겠다고 fileReadManager 객체를 생성할 필요가 없다.
  • 그런데 누가? B객체에게 전달해줄것인가? 제 3자가 해줘야만 한다. (A가 다 사용하면 전달하는 방식으로 코드 구성하기엔 복잡성이 증가할 것이다.)
  • 그것이 바로 컨테이너! 객체를 관리해주는 클래스다.(객체를 담아두고 있다는 의미에서 container인것같다.)
  • 이걸로 얼마나 편할지 실감되지 않나.. 단순히 parameter로 전달받음으로써 클래스 이름에 얽매이지 않는다.(객체 생성시 new 클래스이름 객체이름) 메모리관리도 용이하다.
반응형

'토이프로젝트 > 클라이언트-서버 폴더 동기화' 카테고리의 다른 글

배포시 문제  (0) 2020.04.30
ver 1.0문제  (0) 2020.04.29
mavenProjectBuild문제  (0) 2020.04.29
UML  (0) 2020.04.29
프로젝트 개요  (0) 2020.04.29
Comments