맨위로가기

코드 재사용

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

코드 재사용은 소프트웨어 개발에서 이미 개발된 코드를 다른 프로젝트에서 활용하는 것을 의미한다. 코드 재사용은 편의적 재사용과 계획적 재사용으로 나뉘며, 편의적 재사용은 내부 및 외부 재사용으로 세분화된다. 코드 재사용은 소프트웨어 라이브러리, 디자인 패턴, 프레임워크, 고차 함수, 컴포넌트 등 다양한 기술과 방법론을 통해 구현된다. 그러나 코드 재사용은 의존성 문제, 추가 노력, 비용 문제 등의 비판과 한계를 가진다.

더 읽어볼만한 페이지

  • 소프트웨어 공학 - 통합 개발 환경
    통합 개발 환경(IDE)은 코드 편집, 빌드, 디버깅 등 소프트웨어 개발에 필요한 여러 기능을 통합적으로 제공하는 응용 프로그램이다.
  • 소프트웨어 공학 - 소프트웨어 개발
    소프트웨어 개발은 요구사항 분석, 설계, 코딩, 테스트, 배포, 유지보수를 포함하는 컴퓨터 프로그램 및 관련 데이터를 만드는 과정으로, 다양한 방법론과 도구가 사용되며, 개발자 외에도 다양한 전문가들이 참여한다.
코드 재사용
일반 정보
개념소프트웨어 개발에서 기존의 소프트웨어 자산을 재사용하여 새로운 소프트웨어를 구축하는 방법
목표개발 시간 단축, 비용 절감, 품질 향상
관련 용어API
라이브러리
프레임워크
디자인 패턴
컴포넌트
재사용 방법
코드 재사용기존 코드를 복사하여 붙여넣거나, 함수 또는 모듈 형태로 재사용
객체 지향 프로그래밍상속, 합성 등을 통해 코드 재사용
컴포넌트 기반 개발미리 개발된 컴포넌트를 조립하여 소프트웨어 개발
서비스 지향 아키텍처 (SOA)웹 서비스 등을 통해 기능을 재사용
장점
생산성 향상개발 시간 단축 및 개발 비용 절감
품질 향상검증된 코드를 재사용하여 오류 감소
유지보수 용이성코드를 체계적으로 관리하여 유지보수 비용 절감
표준화일관성 유지
단점
과도한 일반화특정 상황에 맞지 않는 코드를 재사용하여 성능 저하
의존성 증가재사용되는 코드에 문제가 발생 시 전체 시스템에 영향
호환성 문제서로 다른 환경에서 개발된 코드를 재사용 시 문제 발생 가능성
기술 부채부적절한 재사용으로 인해 발생할 수 있음
재사용 수준
아이디어 재사용기존 시스템의 개념이나 아키텍처를 활용
명세 재사용기존 시스템의 요구사항 명세나 설계 명세를 활용
디자인 재사용기존 시스템의 디자인 패턴이나 아키텍처를 활용
코드 재사용기존 시스템의 코드를 직접 활용
재사용 기술
라이브러리특정 기능을 수행하는 코드 모음
프레임워크소프트웨어 개발의 뼈대 역할
디자인 패턴문제 해결을 위한 일반적인 해결책
API (Application Programming Interface)소프트웨어 간의 인터페이스
컴포넌트독립적으로 배포 가능한 소프트웨어 단위
재사용 고려 사항
재사용성 평가코드의 재사용 가능성을 평가
유지보수성코드의 유지보수 용이성을 고려
테스트 용이성코드의 테스트 용이성을 고려
문서화코드의 사용법 및 동작 방식을 문서화

2. 역사

2. 1. 초기 역사

2. 2. 학문적 연구의 시작

2. 3. 한국에서의 발전

3. 유형

코드 재사용의 유형은 크게 편의적 재사용과 계획적 재사용으로 나뉜다.


  • '''편의적 재사용(opportunistic reuse)'''은 프로젝트를 시작할 때 재사용가능한 콤포넌트가 있는지를 찾아보고 재사용한다.[8][9]
  • '''계획적 재사용(planned reuse)'''은 컴퍼넌트를 차후에 재사용가능하도록 전략적으로 설계해 나간다.[8][9]


편의적 재사용은 다시 내부 재사용과 외부 재사용으로 세분화할 수 있다.

  • '''내부 재사용(internal reuse)'''은 팀내에서 만든 콤포넌트를 재사용한다. 어디까지나 편의상이며 계획적인 것이 아니기 때문에, 인터페이스의 조정 등에 추가적인 비용이 발생할 수 있다.[8][9]
  • '''외부 재사용(external reuse)'''은 서드파티에서 만든 콤포넌트를 구하여 사용한다. 유상인 경우, 조달비용을 자신이 직접 개발할 때 드는 비용의 20% 이하로 잡는 것이 일반적이다. 또, 조달한 콤포넌트를 학습하여 활용하는데 걸리는 시간도 고려해야 한다.[8][9]


상황적 재사용은 프로젝트 시작 시 재사용 가능한 컴포넌트가 이미 존재함을 인지하고 재사용하는 것을 의미한다.[9] 이는 다시 내부 재사용과 외부 재사용으로 나눌 수 있는데, 내부 재사용은 팀이 자체 제작한 컴포넌트를 활용하는 것이고, 외부 재사용은 서드 파티 컴포넌트를 조달하여 사용하는 것이다. 유료 컴포넌트의 경우, 자체 개발 비용의 20% 이하가 일반적인 조달 비용이며, 컴포넌트 학습 및 통합 시간 역시 고려해야 한다.[9]

재사용의 형태 또는 구조와 관련하여, 코드는 참조 또는 포크될 수 있다.[9]

  • '''참조''' - 클라이언트 코드는 재사용된 코드를 참조하므로, 서로 다른 생명 주기를 가지며 서로 다른 버전을 가질 수 있다.
  • '''포크''' - 클라이언트 코드는 재사용된 코드의 로컬 또는 개인 복사본을 포함하므로, 단일 생명 주기와 단일 버전을 공유한다.


포크 재사용은 코드 중복의 한 형태이므로 권장되지 않지만, 격리, 재사용된 코드를 변경할 수 있는 유연성, 더 쉬운 패키징, 배포 및 버전 관리와 같은 이점이 있을 수 있다.[9]

3. 1. 계획적 재사용 (Planned Reuse)

계획적 재사용은 처음부터 재사용을 염두에 두고 소프트웨어 구성 요소를 설계하고 개발하는 방식이다. 장기적인 관점에서 효율성과 생산성을 높일 수 있지만, 초기 투자 비용이 많이 들 수 있다. 컴포넌트를 차후에 재사용가능하도록 전략적으로 설계해 나간다.

체계적인 소프트웨어 재사용은 소프트웨어 산업의 생산성을 높이고 품질을 향상시키는 전략이지만, 실제로 소프트웨어 재사용을 성공적으로 구현하는 것은 어렵다. 소프트웨어 재사용이 구현되는 컨텍스트에 따라 달라지기 때문이다. 체계적인 소프트웨어 재사용과 관련하여 해결해야 할 몇 가지 문제점은 다음과 같다.

  • 명확하고 잘 정의된 제품 비전은 소프트웨어 제품군(SPL)의 필수적인 기반이다.
  • 진화적인 구현 전략은 회사에 더 실용적인 전략이 될 것이다.
  • 성공을 보장하기 위해 지속적인 관리 지원과 리더십이 필요하다.
  • SPL 엔지니어링을 지원하기 위한 적절한 조직 구조가 필요하다.
  • 프로젝트 중심 회사에서 제품 중심 회사로의 사고방식 변화가 필수적이다.

3. 2. 편의적 재사용 (Opportunistic Reuse)

편의적 재사용은 이미 개발된 소프트웨어 구성 요소를 찾아 새로운 프로젝트에 맞게 수정하거나 조합하여 사용하는 방식이다. 단기적으로는 비용과 시간을 절약할 수 있지만, 장기적으로 유지보수 및 확장성에 어려움을 겪을 수 있다.

편의적 재사용은 프로젝트 시작 시 재사용 가능한 컴포넌트가 있는지 찾아보고 재사용한다. 팀 내에서 만든 컴포넌트를 재사용하는 내부 재사용은 어디까지나 편의상 재사용하는 것이며 계획적인 것이 아니기 때문에, 인터페이스 조정 등에 추가 비용이 발생할 수 있다. 외부 재사용은 서드파티에서 만든 컴포넌트를 구해 사용하며, 유상인 경우 조달 비용은 직접 개발 비용의 20% 이하로 잡는 것이 일반적이다. 또한, 조달한 컴포넌트를 학습하고 활용하는 데 걸리는 시간도 고려해야 한다.

3. 3. 내부 재사용 (Internal Reuse)

내부 재사용은 조직 내부에서 개발된 자산을 재사용하는 방식이다.[8][9] 팀 내에서 만든 컴포넌트를 재사용하며, 이는 프로젝트에 중요한 컴포넌트를 제어하려는 비즈니스 결정일 수 있다.[8] 어디까지나 편의적 혹은 상황적 재사용이며 계획적인 것이 아니기 때문에, 인터페이스 조정 등에 추가적인 비용이 발생할 수 있다.[8][9]

3. 4. 외부 재사용 (External Reuse)

외부 재사용은 서드 파티(Third Party)에서 만든 컴포넌트를 구해 사용하는 방식이다.[8] 유료인 경우, 조달 비용은 자체 개발 비용의 20% 이하로 책정하는 것이 일반적이다.[8] 또한 조달한 컴포넌트를 학습하고 활용하는 데 걸리는 시간도 고려해야 한다.[8]

4. 형태

4. 1. 참조 (Reference)

4. 2. 포크 (Fork)

5. 기술 및 방법론

;소프트웨어 라이브러리

코드 재사용의 매우 일반적인 예시는 라이브러리를 사용하는 것이다.[11] 각종 형식으로 정보의 변환, 외부기억장치 액세스, 외부 프로그램과의 인터페이스, 정보(수, 단어, 이름, 위치, 날짜 등)의 조작과 같은 일반적인 조작은, 많은 프로그램으로 필요하게 된다.[11] 새로운 프로그램을 쓸 때, 라이브러리의 코드를 사용해 그것들 작업을 실행하도록 할 수 있어 차바퀴의 재발명과 같이 같은 조작을 실행하는 프로그램을 또 만들어 쓸 필요는 없다.[11] 라이브러리의 실장은 특수한 사례도 포함하여 자주 평가되고 있다고 하는 이점이 있다.[11] 결점은, 성능 향상이나 출력 형식을 바꾸고자 할 때 세부사항을 조절할 수 없는 점과 라이브러리를 취득·학습·설정하는 데에 시간과 비용이 든다는 점이다.[11]

;디자인 패턴

디자인 패턴은 비슷한 문제를 풀기 위한 범용적인 해법이다. 디자인 패턴은 개념적이고, 개별 문제의 필요에 따라서 수정 가능하다. 추상 클래스와 인터페이스는 특정의 패턴의 실장에 재사용 가능하다.

; 체제

서드파티 응용 프로그램이나 체제를 통해 소프트웨어의 큰 부분을 재사용하는 것도 많다. 다만 체제는 통상 특정 영역에 고유한 것으로, 광범위하게 응용하기는 어렵다.

5. 1. 소프트웨어 라이브러리 (Software Libraries)

코드 재사용의 매우 일반적인 예시는 라이브러리를 사용하는 것이다.[11] 각종 형식으로 정보의 변환, 외부기억장치 액세스, 외부 프로그램과의 인터페이스, 정보(수, 단어, 이름, 위치, 날짜 등)의 조작과 같은 일반적인 조작은, 많은 프로그램으로 필요하게 된다.[11] 새로운 프로그램을 쓸 때, 라이브러리의 코드를 사용해 그것들 작업을 실행하도록 할 수 있어 차바퀴의 재발명과 같이 같은 조작을 실행하는 프로그램을 또 만들어 쓸 필요는 없다.[11] 라이브러리의 실장은 특수한 사례도 포함하여 자주 평가되고 있다고 하는 이점이 있다.[11] 결점은, 성능 향상이나 출력 형식을 바꾸고자 할 때 세부사항을 조절할 수 없는 점과 라이브러리를 취득·학습·설정하는 데에 시간과 비용이 든다는 점이다.[11]

5. 2. 디자인 패턴 (Design Patterns)

디자인 패턴은 반복적으로 발생하는 문제에 대한 일반적인 해결책이다. 디자인 패턴은 특정 문제에 맞게 수정하여 사용할 수 있으며, 추상 클래스나 인터페이스를 통해 재사용할 수 있다.

5. 3. 프레임워크 (Frameworks)

개발자는 일반적으로 타사 응용 프로그램 및 프레임워크를 통해 대규모 소프트웨어 조각을 재사용하지만, 프레임워크는 일반적으로 특정 영역(도메인)에만 적용된다.

5. 4. 고차 함수 (Higher-Order Function)

함수형 프로그래밍에서 고차 함수는 이전에 디자인 패턴이나 체제가 사용되었던 많은 경우에 사용될 수 있다. 고차 함수는 함수를 인자로 받거나 결과로 반환하는 함수를 의미한다.

5. 5. 컴포넌트 (Component)

객체 지향적인 관점에서 컴포넌트는 협업하는 클래스 집합(또는 하나의 클래스)과 인터페이스를 나타낸다. 인터페이스는 컴포넌트 교체를 가능하게 하는 역할을 한다. 재사용 가능한 컴포넌트는 컴포넌트 소스 코드 관리 기술([https://github.com/teambit/bit CSCM])을 사용하여 SCM 저장소 간에 격리되고 동기화될 수도 있다.

5. 6. 기타 기술

제네릭 프로그래밍, 자동 프로그래밍, 메타프로그래밍, 소프트웨어 프로덕트 라인은 파생 개발을 지원하며, 핵심 자산(재사용 가능한 소프트웨어 자산)을 생성한다. 애셋 기반 개발은 객체 지향 기술을 기반으로 광범위한 소프트웨어 재사용을 실현하려는 시도이다.

6. 비판 및 한계

코드 재사용은 재사용되는 컴포넌트에 대한 의존성을 야기한다.[14] 롭 파이크는 "약간의 복사가 약간의 의존성보다 낫다"라고 주장했다.[14] 그가 구글에 합류했을 때, 구글은 코드 재사용을 매우 강조하고 있었는데, 그는 구글의 코드베이스가 컴파일 속도와 유지 관리 측면에서 이전 정책의 결과로 여전히 고통받고 있다고 믿는다.[14]

재사용 가능한 코드는 일반적으로 작성하고 설계하는 데 더 많은 노력이 필요하다. 프레드 브룩스는 그의 에세이 "타르 구덩이"와 "은탄환은 없다"에서 이 노력과 관련된 상당히 높은 비용에 대해 논의한다. 오류는 종종 그 비용을 회수할 메커니즘에 대한 신중한 이해 없이 노력을 쏟는다는 것이다. 정당성은 종종 물리적 제조 공정의 재사용 가능한 부품과의 잘못된 유추에서 비롯된다. 코드를 작성하는 것은 여러 장치의 생산보다는 단일 제품의 설계와 유사하기 때문에 잘못된 것이다.

6. 1. 의존성 문제

코드 재사용은 재사용되는 컴포넌트에 대한 의존성을 야기한다.[14] 롭 파이크는 "약간의 복사가 약간의 의존성보다 낫다"라고 주장했다.[14] 그가 구글에 합류했을 때, 구글은 코드 재사용을 매우 강조하고 있었는데, 그는 구글의 코드베이스가 컴파일 속도와 유지 관리 측면에서 이전 정책의 결과로 여전히 고통받고 있다고 믿는다.[14]

재사용 가능한 코드는 일반적으로 작성하고 설계하는 데 더 많은 노력이 필요하다. 프레드 브룩스는 그의 에세이 "타르 구덩이"와 "은탄환은 없다"에서 이 노력과 관련된 상당히 높은 비용에 대해 논의한다. 오류는 종종 그 비용을 회수할 메커니즘에 대한 신중한 이해 없이 노력을 쏟는다는 것이다. 정당성은 종종 물리적 제조 공정의 재사용 가능한 부품과의 잘못된 유추에서 비롯된다. 코드를 작성하는 것은 여러 장치의 생산보다는 단일 제품의 설계와 유사하기 때문에 잘못된 것이다.

6. 2. 추가 노력 필요

재사용 가능한 코드는 일반적으로 작성하고 설계하는 데 더 많은 노력이 필요하다.[14] 프레드 브룩스는 그의 에세이 "타르 구덩이"와 "은탄환은 없다"에서 이와 관련된 상당히 높은 비용에 대해 논의한다.[14] 오류는 종종 그 비용을 회수할 메커니즘에 대한 신중한 이해 없이 노력을 쏟는다는 것이다.[14] 정당성은 종종 물리적 제조 공정의 재사용 가능한 부품과의 잘못된 유추에서 비롯된다.[14] 코드를 작성하는 것은 여러 장치의 생산보다는 단일 제품의 설계와 유사하기 때문에 잘못된 것이다.[14]

6. 3. 비용 문제

코드 재사용은 재사용되는 컴포넌트에 대한 의존성을 야기한다.[14] 롭 파이크는 "약간의 복사가 약간의 의존성보다 낫다"라고 주장했다.[14]

재사용 가능한 코드는 일반적으로 작성하고 설계하는 데 더 많은 노력이 필요하다. 프레드 브룩스는 그의 에세이 "타르 구덩이"와 "은탄환은 없다"에서 이와 관련된 비용에 대해 논의했다.

7. 한국의 현황 및 과제

참조

[1] 학술지 Software Reuse Research: Status and Future 2005-07
[2] 서적 API design for C++ https://www.worldcat[...] Morgan Kaufmann 2011
[3] 학술지 Towards An Algorithms Ontology Cluster: for Modular Code Reuse and Polyglot Programming https://www.research[...] 2016
[4] 웹사이트 4. Code Reuse: Functions and Modules - Head First Python, 2nd Edition [Book] https://www.oreilly.[...] 2022-01-26
[5] 학술지 CODE reuse in practice: Benefiting or harming technical debt https://pure.rug.nl/[...] 2020-09
[6] 웹사이트 What Is Software Reuse? http://lombardhill.c[...] Lombard Hill Group 2014-10-22
[7] 웹사이트 What Is Software Reuse? http://lombardhill.c[...] 2014-10-22
[8] 서적 Rapid Development: Taming Wild Software Schedules https://archive.org/[...] Pearson Education
[9] 웹사이트 It's not just reuse http://sharednow.blo[...]
[10] 학회 Contemplating Systematic Software Reuse in a Small Project-centric Company http://portal.acm.or[...]
[11] 웹사이트 Code reuse http://docforge.com/[...]
[12] 서적 Code-reuse Attacks: New Frontiers and Defenses http://dl.acm.org/ci[...] North Carolina State University 2011
[13] 학회 Jump-oriented programming: a new class of code-reuse attack https://web.comp.nus[...] ACM 2017-08-07
[14] 기타 Go Proverbs – Rob Pike – Gopherfest – November 18, 2015 https://www.youtube.[...] 2016-02-26



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com