프로그래밍⚡️/기타 등등

npm 라이브러리 등록하기, 오픈소스에 기여해 봤습니다

Kwangkki 2024. 5. 25. 10:35

한창 오픈소스 문화에 관심을 가졌을 때 무작정 npm에 라이브러리 하나를 등록했었습니다. 한국 욕설을 * 표시로 바꾸는 라이브러리인데요. 욕설 json 파일을 불러와 반복문으로 필터하는 간단한 기능입니다.
 
문제는 json 파일을 import하는 과정이나 라이브러리르 import하는 과정에서 module 설정을 제대로 이해하지 못해 다운로드 해도 사용할 수 없는 상태였습니다. 그렇게 방치된지 8개월이 지나고, 급! 생각나서 리팩토링 해봤습니다.
 

오픈소스 라이선스

제가 만든 라이브러리는 다른 오픈소스를 수정하여 재배포한 것인데요. 오픈소스라고 마구 퍼다 나를 수 있는 것은 아닙니다. 오픈소스에도 제약의 강도에 따른 라이선스가 존재하는데요. 크게 MIT, BSD, GPL 정도가 있습니다. NPM 라이브러리에도 라이선스가 모두 존재합니다.
 

npm 라이브러리 상세페이지에 보면 license 탭이 존재합니다.

 

BSD는 그 유명한 BSD 운영체제에서 비롯되었습니다. 유닉스의 횡포에 대항하던 빌 조이를 비롯한 버클리 대학생들이 만든 BSD OS 말이죠. 오픈소스 혁명의 시발점이이나 다름없기 때문에 그 의미가 남다릅니다.
 
GPL은 수정, 배포에 좀 더 까다로운 조건이 붙는데요. 오픈소스의 아버지라고도 불리는 리처드 스톨만이 설립한 자유소프트웨어재단에서 제창한 라이선스입니다.
 
이런 오픈소스 라이선스의 역사적 배경을 일일이 뜯어보면 정말 재밌는 이야기가 많습니다. 혹시 오픈소스의 역사에 대해 궁금하시다면 제가 예전에 쓴 글을 추천드립니다!
https://drakon.tistory.com/77
 
약간 사담처럼 되었는데요. 어쨌든, 제가 만든 라이브러리는 MIT 라이선스를 보유한 'badwords'라는 라이브러리를 베이스로 만들었습니다. MIT 라이선스는 가장 자유로운 라이선스 중 하나로 원작자의 저작권만 고지한다면 수정, 병합, 복사, 사용, 배포에 제약이 없습죠. 아 그리고 한국용 올라온 욕필터 라이브러리가 하나 더 있더라고요. 이 분의 코드도 참고 했습니다! 'badwords-ko'
 

오픈소스 수정

온전한 제 창작물을 오픈소스로 만들면 가장 좋겠지만 본신 실력도 부족하거니와, 기존 오픈소스를 수정, 재창작, 디벨롭하는 것이야 말로 오픈소스 문화의 묘미이기 때문에 수정 및 재배포를 해보았습니다. 
 
1. 필터 기능 디벨롭
기존 라이브러리에는 욕이 포함된 단어 덩어리 모두 필터가 되거나 혹은 모두 필터가 안 되는 현상이 있었습니다.

export default function TestPage() {
  const filter = new Filter();
  filter.addWords("funk");
  console.log(filter.clean("funkyou"));
  console.log(filter.clean("funk you"));
  
  filter.addWords("욕");
  console.log(filter.clean("욕입니다"));
  console.log(filter.clean("욕 입니다"));
}

 
콘솔 출력 결과

 
 
이 라이브러리는 처음에 isProfane 메서드로 문장에 욕이 포함되어있는지를 확인합니다. 만약 isProfance가 true를 뱉으면 다음 단계인 replaceWord 메서드로 넘어가는데요. 여기서 단어가 포함된 모든 덩어리를 *로 치환합니다. 그래서 아래와 같이 수정했습니다.
 
 
기존

replaceWord(string) {
    return string
      .replace(this.regex, '')
      .replace(this.replaceRegex, this.placeHolder);
  }

 
수정

replaceWord(string) {
    const filterWord = this.list.find((word) => {
      return string.match(new RegExp(word, "gi")); //정규표현식으로 단어 검색하여 리스트와 매치
    });

    if (filterWord) { // 필터된 욕이 존재하면 *로 치환
      return string.replace(
        new RegExp(filterWord, "gi"),
        this.placeHolder.repeat(filterWord.length)
      );
    } else {
      return string;
    }
  }

 
 
우선 filterWord에서 find를 욕 리스트와 match해서 해당하는 욕만을 가려냅니다. 다음 조건문에서는 필터된 단어를 *로 치환한 후 return 하게 됩니다. 핵심은 filterWord로 욕만 가려내 치환한다는 간단한 수정입니다.
 
2. 욕 리스트 수정
제가 왜 굳이 한국 욕 필터 라이브러리를 만들기로 마음 먹었냐하면, 제대로 된 한국 욕 리스트를 찾기 힘들었기 때문입니다. 그래서 인터넷에 공개된 욕 리스트들과 제가 생각하는 욕들을 합쳐서 새로운 리스트를 만들었습니다. 필터 기능보다 이 작업이 핵심이라 생각하고 거의 일주일 동안 욕 리스트 만드는 작업만 했더랬죠.. 물론 addwords 메서드로 욕 배열을 추가할 수 있습니다!
 
그 외 한국어에 맞춰 필터 메서드를 좀 더 수정한 후 배포했습니다.
 
아 그리고 기존 commonJS 방식의 module.export 방식을 ES6의 export default 방식으로 변경했었는데, 이런 경우 ES6의 모듈 방식을 지원하지 않는 프로젝트에서는 사용이 힘들다고 하더라고요. 이 부분은 좀 더 찾아보고 다시 바꿔볼 예정입니다.
 

오픈소스 배포

예전에 라이브러리 저장소를 개인 서버에서 운영하시는 분을 보고 '와 저런 방식으로도 할 수 있구나' 감탄한 적이 있었습니다. 하지만 저는 뉴비이기 때문에 npm의 저장소에 배포를 했습니다 하하
 
저의 경우 이미 배포된 라이브러리기 때문에 업데이트만 하면 되었습니다. 그래서 무척 간단했죠. 터미널에서 npm 로그인 후, npm publish만 입력했을 뿐..
 

 
 
물론, 버전업을 해줘야합니다. 저는 불안정한 상태여서 0.0.X로 배포했었는데요. 이번에 1.0.1 버전으로 정식 배포했습니다.
 
https://www.npmjs.com/package/badword-filter-ko

 

badword-filter-ko

한국 욕을 필터링 할 수 있습니다. 욕 리스트도 있습니다. 보기만 해도 어지러운 욕들입니다 . Latest version: 1.0.1, last published: 6 days ago. Start using badword-filter-ko in your project by running `npm i badword-filter-k

www.npmjs.com

 
 

오픈소스 기여

정말 간단한 프로젝트였지만 평소 동경하던 오픈소스 문화에 동참했다는 사실만으로 상당한 만족감을 느끼고 있습니다. 오픈소스 기여는 뛰어난 개발자들의 전유물이라고만 생각했었는데요. 책에서 본 어느 구절의 따뜻한 응원에 용기를 얻어 정말 보잘 것 없는 기능, 코드가 되었더라도 '해보자' 마음 먹었고, 도전 해봤습니다. 제가 받았던 응원을 공유하며 마무리. 그리고 다음 목표는 컨트리뷰션에 도전해보는 것!
 

<개발자 원칙> 중