외부 라이브러리의 사용에 대한 고찰

윤뿔소·2023년 9월 10일
0

현업 관련 경험

목록 보기
3/4

입사 후 백엔드 개발자이자 대표님이 가장 강조한 것 중 하나가 바로 라이브러리 사용에 대한 규칙에 대해 엄청 강조했다. 그것에 대한 고찰을 작성해보려고 한다.

앞서 내가 생각하는 고찰은 대표님의 말씀을 그대로 옮기지 않고 내 마음대로 각색해 작성했고, 이 모든 방법론이 옳다고 생각하지 않았으면 좋겠다. 하나의 주관적인 의견으로 바라보고, 비판점이 있다면 댓글로 써주시길 바란다.

라이브러리

고찰을 생각하기 전 먼저 라이브러리를 정의해봐야겠다.

특정 기능 또는 작업을 수행하기 위해 미리 작성돼있는, 소프트웨어 개발에서 사용되는 코드, 함수, 클래스, 또는 모듈의 모음

또한 npm 설치 등과 같이 프로젝트 외부에서 가져오는 외부 라이브러리, 프로젝트 내부에서 커스텀 훅, 함수화 등을 통해 재사용 가능케 만드는 등의 내부 라이브러리로 나눌 수 있다.

라이브러리는 비슷한 작업을 반복해서 구현할 필요를 줄이기 위한 재사용성, 코드를 구조화하고 관리하기 쉽게 만들기 위한 모듈화, 특정 작업에 대한 가장 효율적인 방법론을 제시해 협업을 쉽게하는 표준화 등의 특징을 가지고 있다.

이러한 용이성 때문에 시간 절약이 많이 됐고, 그러한 라이브러리의 커뮤니티들(npm 등)도 많이 지원돼 쉽게 개발이 가능해졌다.

외부 라이브러리에 대한 남용의 위험성

내부 라이브러리는 걍 개발자가 자기 스타일에 맞게 재사용하여 만들고, 또 여기서 얘기하기에는 성격이 좀 달라 다른 글에 설명을 하겠다.

외부 라이브러리가 커뮤니티도 좋고 나보다 경력도 높고 똑똑이분들이 만들었으니 모든 부분들을 외부 라이브러리로 만들면 좋을까? 바퀴를 발명하지 마라 했으니 모든 바퀴들을 사와야할까?

이 글에선 외부 라이브러리를 대체한다면 어떤 단점이 있을까를 얘기해보겠다. 모두가 그렇다는 얘기는 아니란 점 참고 바란다.

성능 저하

너무 많은 외부 라이브러리를 사용하면 애플리케이션의 성능에 부정적인 영향을 미칠 수 있다.

라이브러리들은 추가적인 코드와 리소스를 필요로 하며, 이로 인해 빌드 시간이 오래 걸려 로딩 시간이 증가하고 메모리 사용량이 늘어날 수 있다. 특히 성능이 데스크탑보다 낮은 모바일 디바이스에서는 성능 저하가 더 큰 문제가 될 수 있다.

또한 외부 라이브러리 특성 상 사용하지 않는 기능들이 사용하는 기능보다 더 많아 리소스 낭비도 쉽게 일어나기 때문에 성능 저하가 특히 문제가 된다.

프로젝트의 복잡성 증가 및 코드베이스 어려움 심화

너무 많은 외부 라이브러리를 도입하면 프로젝트의 코드베이스가 복잡해지고, 이해하기 어려워진다.

각 라이브러리는 자체적인 문법과 사용법을 가지며, 이를 효과적으로 조합하려면 많은 노력이 필요하다. 예를 들어 @tanstack/react-query 같은 경우 useQuery, useMutaion같은 Hooks 경우 몇십가지의 API와 옵션, 리턴값에 대한 사용법을 익혀야한다.물론 모든 기능을 사용하지 않지만 복잡성이 커지는 것은 피할 수 없음

더군다나 여러 라이브러리 간의 충돌 문제나 버전 관리도 더 복잡해질 수 있으며, 이로 인해 디버깅과 유지보수가 어려워질 수 있다.

따라서 충분한 DOC가 없다면 프로젝트의 복잡성은 증가하고, 새로운 개발자가 프로젝트에 참여하기 어려워질 수 있다.

프로젝트의 안정성과 보안을 위협

외부 라이브러리의 업데이트를 소홀히 하거나 관리하지 않으면 보안 취약점이나 호환성 문제가 발생할 수 있다.

라이브러리 개발자가 보안 패치를 배포하더라도, 이를 프로젝트에 적용하지 않으면 해킹 및 보안 위협에 노출될 수 있다. 또한 이러한 점에 대해 피드백이 바로 적용되지 못해 보안이 뚫렸음에도 대응을 못한다는 한계가 있다.

또한, 라이브러리가 더 이상 지원되지 않는 경우에도 프로젝트의 안정성이 저하될 수 있다. 중요한 기능을 가진 라이브러리를 사용하고 있다가 NPM 및 커뮤니티가 죽어버린다면(몇개월 이상 개발이 되지 않는다면) 프로젝트도 죽어버리는 경우가 있다.

외부 라이브러리에 대한 의존성 심화

라이브러리를 과도하게 사용하면 개발자들이 해당 라이브러리에 지나치게 의존하는 경향이 생길 수 있다. 이는 개발자들이 기본적인 개념과 언어의 이해를 소홀히 하거나 라이브러리에 대한 심층적인 이해 없이 개발을 진행할 수 있음을 의미한다.

결과적으로 의존도가 너무 높아진 나머지 프로젝트 팀은 라이브러리에 종속돼 프로젝트를 유연하게 관리하거나 변경하기 어려워질 수 있다.

외부 라이브러리를 사용하기 위한 기준

이제 우리는 아무 거나 주워먹으면 탈난다는 사실을 알았다. 이제 그러면 무엇을 우리가 먹고 뱉는지 알아야할 차례이다.

프로젝트 성격 파악

모든 사람이 어울리는 옷을 입으면 이쁘듯이, 프로젝트의 성격을 정확하게 파악해 어떤 옷을 줄 지 생각해야한다.

정확히 어떤 기능이 필요하며, 프로젝트의 목표는 무엇인지 이해하고 라이브러리를 사용해야한다. 비즈니스적인 목표일 수도 있고, 소프트웨어 개발 목표일 수도 있다.
예를 들어 프로젝트의 비즈니스적인 방향성이 다양한 연령층이나 분야의 클라이언트들에게 준다면 최대한 접근성이 좋은 라이브러리를 써야하고, 만약 특정 연령층이나 특정 분야에서 필요없다고 생각하는 라이브러리는 가차없이 삭제해버리는 것이 맞을 것이다.

라이브러리 장단점 및 성능 파악

어떤 라이브러리를 사용하면 어떤 특정 기능을 빠르게 구현할 수 있는지, 하지만 라이브러리가 가져올 잠재적인 문제나 성능 저하을 일으킬 수 있는지 고려해야 한다.

라이브러리의 문서와 예제를 통해 기능과 사용법을 확인하고, 다른 실사용자들의 깃헙 이슈 등의 리뷰 및 피드백도 참고해서 장단점을 확실히 해야한다.

또한 프로젝트의 성능 요구사항에 따라 라이브러리를 선택해야 한다.
예를 들어 대규모 애플리케이션이나 디지털 소외 계층을 타겟으로 잡을 경우 성능 최적화가 중요한데, 라이브러리가 어떻게 성능을 처리하고 최적화되어 있는지 고려해야 한다. 만약 확실치 않다면 성능 테스트와 벤치마킹을 통해 라이브러리의 성능을 확인할 필요가 있다.

라이브러리 커뮤니티 및 지원 규모 파악

라이브러리의 커뮤니티와 지원 규모를 평가해야 한다. 활발한 커뮤니티와 지속적인 업데이트가 있는 라이브러리를 선택하는 것이 좋다.
미래를 예측할 수 없지만 이렇게 하면 라이브러리에 대한 문제나 버그에 대한 지원을 받을 확률이 높아지고, 커뮤니티의 지식과 리소스의 공급이 활발해 활용할 수 있다.

예시

이러한 기준들을 세워서 나는 라이브러리들을 골랐다. 고르는 과정 중에서의 예시와 실제 꿀팁들을 얘기해보고 싶다.

쇼핑으로 치자면 어느게 판매량과 별점이 높아요? 를 보여주는 사이트다.

실제로 상태관리 라이브러리를 고를 때를 보여주자면

위 사진을 보면 리덕스가 압도적으로 높은 사용량이 있어 거의 표준이라고 봐도 무방하다. 하지만 실제로 단점을 따져봤을때 쓰는 기능보다 많은 코드 보일링, 큰 패키지 용량, 어려운 문법 등의 단점이 있다.

또한 리코일이 문법이 쉽고 편리한 사용성으로 각광을 받았었는데, 위 사진을 보면 알겠지만 크리티컬한 버그가 생겼는지 6개월 전부터 개발을 하고있지 않다.(6 months ago)

그래서 다시 상태관리 라이브러리를 한 곳에 모아놓고 보았는데 주스탠드가 작년부터 계속 사용량이 많아지는 걸 볼 수 있다. 또한 업데이트 주기도 괜찮고, 패키지 용량도 리덕스보다 배는 적고, 문법도 되게 쉬운 편이다.

결론적으로 이러한 점들을 npm trends에서 한눈에 보고, 깃헙도 보니 라이브러리를 보다 쉽게 고를 수 있었다.

결론

라이브러리는 개발자들에게 효율성, 모듈화, 표준화 등의 이점을 제공하며 개발 프로세스를 간소화한다. 그러나 너무 많은 외부 라이브러리를 사용하는 것은 몇 가지 위험성이 도사리고 있고, 고찰과 함께 옳게 선택돼야 한다.

  1. 성능 최적화: 라이브러리 선택 시 프로젝트의 성능 요구사항을 고려해야 한다. 라이브러리가 어떻게 성능을 처리하고 최적화되어 있는지를 확인하고 선택해야 한다.

  2. 복잡성 관리: 너무 많은 라이브러리 도입은 프로젝트의 코드베이스를 복잡하게 만들고 유지보수를 어렵게 할 수 있다. 필요한 기능과 성격에 맞게 라이브러리를 선택하고, 코드베이스를 깔끔하게 유지해야 한다.

  3. 안정성 및 보안: 외부 라이브러리의 업데이트를 소홀히 하거나 관리하지 않으면 보안 취약점이나 호환성 문제가 발생할 수 있다. 라이브러리의 지속적인 관리와 보안 패치를 예상해 고려해야 한다.

  4. 의존성 관리: 너무 많은 라이브러리 사용은 개발자들이 해당 라이브러리에 지나치게 의존하는 경향을 불러올 수 있다. 기본적인 개념과 언어에 대한 이해를 소홀히하지 않도록 주의해야 한다.

라이브러리를 선택할 때는 프로젝트의 성격을 정확히 파악하고, 라이브러리의 장단점과 성능을 평가하며, 활발한 커뮤니티와 지원 규모를 고려해야 한다. 라이브러리 선택에는 신중함과 균형감을 유지하는 것이 중요하다.

라이브러리 선택은 프로젝트의 성공과 개발자 팀의 효율성에 큰 영향을 미칠 수 있으므로 신중한 판단과 다양한 논의가 필요하다.

profile
코뿔소처럼 저돌적으로

5개의 댓글

comment-user-thumbnail
2023년 9월 17일

무조건적으로 내가짠코드보다 낫겠지 하고 무조건 의존해서 쓴거 같은데 이글 읽으니까 좀더 신중하게 써야 된다고 느껴지네요 ㅎㅎ

답글 달기
comment-user-thumbnail
2023년 9월 17일

저도 이 라이브러리를 선택한 이유가 무엇인가요?라는 질문에 저조차도 정확하게 대답을 못했던 기억이 있어요 ㅜ 항상 신중하게 ..!!

답글 달기
comment-user-thumbnail
2023년 9월 17일

성능 저하랑 보안 문제가 가장 중요시해야 할 요소겠군요 !

답글 달기
comment-user-thumbnail
2023년 9월 17일

이 라이브러리를 왜 썼는지.. 다른 라이브러리랑 차이점은 뭐인지를 면접에서 많이 받았었던 기억이 나네요
예전에는 그냥 사람들이 많이 쓰니까요! 하고 썼지만 이제는 왜 따져보고 써야 하는지 알겠습니다 👍

답글 달기
comment-user-thumbnail
2023년 9월 19일

저도 항상 라이브러리를 이용할 때마다 고민되는것 같아요
하지만 나도 모르게 더 편한 라이브러리를 이용하게 되는 현실.... ㅎㅎ
이 블로그 읽으면서 다시한번 라이브러리 사용에 대한 생각을 해보게 되어 좋았습니다 !

답글 달기