본문 바로가기

내일배움캠프

뉴스피드 프로젝트 5일차

오늘부로 뉴스피드 프로젝트는 종료되었다. 온라인 강의를 통해 배운 지식과 구글링하면서 얻은 새로운 지식을 활용해서 다양한 시도를 해볼 수 있는 알찬 프로젝트 였지만 그만큼 내가 원하는 수준의 개발을 하지 못해서 아쉬움도 많은 프로젝트 였다.

 

원래 필자가 맡은 역할은 로그인, 로그아웃 구현, aws s3를 이용한 파일 업로드 구현이었다. 파일 업로드를 적용할 부분은 회원 정보의 프로필 사진과 게시글의 사진 혹은 동영상이었다. 게시글의 사진과 동영상은 예상보다 개발시간이 길어져서 미처 다 구현 못하고 프로필 사진만 반영했다.

 

원래는 저장된 사진중 하나를 지정해서 그 사진을 교체하는 로직을 만들려고 했다. 그런데 아무리 고민을 해보고 구글링을 해봐도 어떻게 구현해야 할 지 전혀 감이 잡히지 않았다. 결국 사진을 일괄적으로 교체하는 걸로 합의를 봤는데 그마저도 코드가 복잡해져서 완성하지 못했다.

게시글 사진 업로드 구현을 위해 몸부림 친 흔적들...

게시글 수정 기능 일부:

if(fileList != null) {
            List<NewsfeedImg> imgList = newsfeedImgRepository.findAllByNewsFeed(newsfeed);
            if(!imgList.isEmpty()) {
                if(imgList.size() >= fileList.size()) {
                    for (int i = 0; i < fileList.size(); i++) {
                        s3Service.deleteFile(imgList.get(i).getFileName());
                        imgList.get(i).updateFileName(s3Service.uploadFile(fileList.get(i), "newsfeed"));
                        fileUrlList.add(s3Service.readFile(imgList.get(i).getFileName()));
                    }
                } else if (imgList.size() < fileList.size()) {
                    int i = 0;
                    for (i = 0; i < imgList.size(); i++) {
                        s3Service.deleteFile(imgList.get(i).getFileName());
                        imgList.get(i).updateFileName(s3Service.uploadFile(fileList.get(i), "newsfeed"));
                        fileUrlList.add(s3Service.readFile(imgList.get(i).getFileName()));
                    }
                    for (int j = i; j < fileList.size(); j++) {
                        NewsfeedImg img = NewsfeedImg.builder()
                                .fileName(s3Service.uploadFile(fileList.get(j), "newsfeed"))
                                .newsFeed(newsfeed)
                                .build();
                        fileUrlList.add(s3Service.readFile(img.getFileName()));
                        // newsfeedimg 엔티티 만들고 레포지토리에서 save()메소드 호출하는걸 깜빡했다.
                    }
                }
            } else {
                List<String> fileNameList = s3Service.uploadFileList(fileList);
                for(String fileName : fileNameList) {
                    NewsfeedImg img = NewsfeedImg.builder()
                            .fileName(fileName)
                            .newsFeed(newsfeed)
                            .build();
                    newsfeedImgRepository.save(img);
                    fileUrlList.add(s3Service.readFile(img.getFileName()));
                }
            }

파일 유효성 검사:

private String validateFile(MultipartFile file) {
    String fileName = file.getOriginalFilename();
    ArrayList<String> imgValidate = new ArrayList<>();
    ArrayList<String> videoValidate = new ArrayList<>();
    imgValidate.add(".jpg");
    imgValidate.add(".jpeg");
    imgValidate.add(".png");
    imgValidate.add(".JPG");
    imgValidate.add(".JPEG");
    imgValidate.add(".PNG");
    videoValidate.add(".mp4");
    videoValidate.add(".avi");
    videoValidate.add(".gif");
    videoValidate.add(".MP4");
    videoValidate.add(".AVI");
    videoValidate.add(".GIF");
    String idxFileName = fileName.substring(fileName.lastIndexOf("."));
    if (imgValidate.contains(idxFileName) || videoValidate.contains(idxFileName)) {
        if (imgValidate.contains(idxFileName) && file.getSize() <= 10240L) { // file size는 byte로 리턴하는데 kbyte로 잘못 계산했다.
            throw new CustomException(ErrorCode.IMG_SIZE_OUTOFRANGE);
        } else if (videoValidate.contains(idxFileName) && file.getSize() <= 204800L) {
            throw new CustomException(ErrorCode.VIDEO_SIZE_OUTOFRANGE);
        }
    } else {
        throw new CustomException(ErrorCode.WRONG_FILE_FORMAT);
    }
    return file.getOriginalFilename();
}

이렇게 코드가 너무 복잡해져서 한번 버그가 생기면 어디가 문제인지 찾기가 굉장히 어려웠다. 

 

KPT 회고

Keep - 현재 만족하고 있는 부분


  • 원활한 소통 덕분에 문제 발생 시 빠르게 해결할 수 있었습니다.
  • issue로 브랜치를 생성하고 commit 내역을 관리하여 가독성 좋은 Git 기록을 유지할 수 있었습니다.
  • pull request를 통해 merge를 진행하면서 충돌을 보다 쉽게 해결할 수 있었습니다.
  • 본인의 기능을 적절한 기간 내에 구현하여 추가 구현 단계로 빠르게 넘어갈 수 있었습니다.
  • 하루에 최소 30분 이상 회의를 가지면서 친목을 다져 팀 프로젝트에서 다양한 아이디어가 부담없이 나왔습니다.
  • 처음 설계 시 entity를 함께 설계하여 관련된 이슈가 많이 없었습니다.

Problem & Try - 불편하게 느끼는 부분


  • pull request 코드 리뷰 부족
    • Problem: pull request를 머지 용도로만 사용했습니다.
    • Try: 코드 리뷰를 함께 진행했으면 좋았을 것 같습니다.
  • 시간 분배 문제
    • Problem: 시간 분배를 제대로 하지 못해 추가 구현 및 명예의 전당 기능을 더 구현하지 못했습니다.
    • Try: 각자 기능 구현에 필요한 시간을 대략적으로 파악했다면 더 많은 기능을 구현할 수 있었을 것 같습니다.
  • 예약어 오류
    • Problem: 테이블 생성 시 예약어를 사용하여 오류가 발생했습니다.
    • Try: 테이블명을 user에서 users로 변경하여 해결했습니다.
  • 테스트 케이스 부족
    • Problem: 추가 구현 기능 이후, 충분한 테스트가 진행되지 못했습니다.
    • Try: 테스트 케이스를 더 많이 작성하고, 각 기능에 대해 충분한 테스트를 진행하여야 합니다
  • 각자 추가 구현한 목록에 대한 상호작용 부족
    • Problem: 소셜 로그인 기능의 프로필 사진 출력과 aws에 저장된 프로필 사진출력 기능이 서로 겹칠 때 해결책을 찾지 못했습니다. 추가 구현 시 설계부터 진행하지 않아 해당 필드가 겹치는 문제가 발생하였습니다.
    • Try: 개발하면서 막히면 최대한 도움을 구하고 그래도 어려우면 적정 선에서 타협을 해야 합니다. 개발도중 entity가 변경이 될 때 함께 공유 및 설계가 필요할 것 같습니다.

 

'내일배움캠프' 카테고리의 다른 글

gradle의 clean기능  (0) 2024.06.13
Spring 심화주차 Part1  (0) 2024.06.13
뉴스피드 프로젝트 4일차  (0) 2024.06.11
뉴스피드 프로젝트 2일차  (0) 2024.06.07
뉴스피드 프로젝트 1일차  (0) 2024.06.04