fs module 실습 - 리팩토링_01.16

송철진·2023년 1월 15일
0

리팩토링 전 링크: BE_intro_Assignment_10.25

소스코드

const fileSystem = require("fs"); 
const util = require('util')

const users = fileSystem.readFileSync("./users.csv", "utf-8");
const posts = fileSystem.readFileSync("./posts.csv", "utf-8");

const csvToObject = (csv) => {
    csv = csv.replace(/\r/g,"")     // users에 있는 \r을 제거
    csv = csv.replace(/, /g,",")    // posts에 있는 ", "을 ","로 변경
    const rows = csv.split("\n")
        .filter(el => el !== "")    // posts에 있는 ""을 제거
        .map(el => el.split(",")) 
    const result = []
    for(let i = 1; i<rows.length; i++){
        const obj = {}
        for(let j = 0; j<rows[0].length; j++){
            obj[rows[0][j]] = rows[i][j]
        }
        result.push(obj)    
    }
    return result
}

const postsByUsers = (postsArr, usersArr) => {
    for(let elU of usersArr){
        elU.posts = []
        for(let elP of postsArr){
            if(elU.id === elP.user_id) elU.posts.push(elP)
        }
    }
    return util.inspect(usersArr, {showHidden: false, depth: null, colors: true})
}

const usersArr = csvToObject(users)
const postsArr = csvToObject(posts)

console.log(postsByUsers(postsArr, usersArr))

TIL

당시 수강 중일 때는 빨리 과제 제출하고 다음날 자료를 예습해야한다는 급급한 마음에 이런 과제를 내준 의도를 파악할 여유가 없었다.

  • 왜 users.csv에는 "\r\n" 인데, posts.csv에는 "\n" 인가?
  • 왜 users.csv에는 0번째 줄이 ","로 구분되는데, posts.csv에는 ", " 로 구분되는가?
  • 왜 posts.csv에는 마지막 줄에 개행문자가 존재하는가?

사람이 csv파일을 작성하다보면 저장되는 형식이 다를 수 있다.
그럼 각 csv파일마다 서로다른 코드를 적용해서 매번 데이터를 입력할 것인가?
Nope! 어떤 예외에도 동일한 출력 결과를 만드는 하나의 함수를 만들고 적용하면 될 일이다.

1차 프로젝트를 진행할 때 fs모듈을 활용해서 csv파일에 모은 자료를 DB에 저장해야한다는 말을 듣고, 주변에서 당황의 탄식이 나왔을 때, 이 과제를 했던 게 생각나 여유롭게 블로그를 뒤졌지만... 기껏 공들여 기술블로그에 기록해놓으면 뭐하는가. 만들어놓은 건 오직 해당 과제만을 풀기 위한 죽은 코드였고 재활용이 불가능했다. 결국 당시엔 부트캠프의 의도와는 다르게 테이블플러스 라는 편리한 툴을 사용해서 DB를 채웠다는 이야기~.

이번 코테 대회에서도 그렇고 fs모듈을 잘 활용하는 것이 얼마나 중요한지 다시금 깨닫게 되었다.

이메일 유효성 검사 util을 학습하고, 프로그래머스를 풀고 동기의 기술과제를 함께 학습하면서 익숙해진 replace()와 정규표현식을 적용해봤는데 for문 없이 간단히 구현할 수 있어 좋았다.


      1. 백준을 풀면서 알게 된 것:
        filter()를 사용하면 대용량 배열 처리 시 메모리 overflow 가능성이 있다고 하여
        trim()을 사용해 문자열 양옆의 개행문자, 공백을 삭제하도록 수정함.

참조 링크

정규표현식
https://hamait.tistory.com/342

개행문자 제거하기
https://gurtn.tistory.com/108

profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글