컴포넌트(Component)
배포의 단위로, 계속 요구사항을 수용하며 바뀔 수 있는 타입들의 집합이다. 이러한 타입들을 여러 컴포넌트로 구성할 경우 컴포넌트화(Componentiation)라고 한다. 단순히 소스코드만 포함된 것이 아니라, 정말 소프트웨어를 배포할 때 필요한 모든 것을 일컫는다.
의존성(Dependency)
프로그램이 실행되기 위해 다른 일부를 요구할 때를 의미하며, 보통 A(=요구하는 프로그램)가 B(=다른 일부)에 의존한다고 표현한다.
예를 들어, 자동차가 기름이 있어야 동작하는데 그 기름이 특정 공장에서 제조한 기름이어야 할 경우 자동차는 그 기름에 의존한다고 할 수 있다. 이처럼 소프트웨어 개발에도 특정 일부가 있어야만 프로그램이 동작할 수 있는 경우 의존한다, 의존성이 존재한다고 말한다.
소프트웨어가 커지면 커질수록 의존성을 관리할 필요가 있다. 프로그래머는 제품의 컴포넌트(Component)를 개발할 때 빈번하게 다른 컴포넌트를 재사용할 수 있다. 이는 실제 사례에서 많이 볼 수 있다. 문제는 재사용할 코드도 많고, 그 코드들은 또 다른 코드를 재사용하고, ... 이러한 상황이 계속 반복되면 굉장히 복잡하고 골치아파진다. 그래서 이미 이용 가능한, 같은 유형의 컴포넌트를 개발하는데 시간을 쏟기보다 비즈니스 로직에 집중하기 위해 의존성 관리(Dependency Management)를 알아두는 것이 매우 중요하다.
또한, 의존자(dependant)가 프로젝트에서 필수적인 구성요소일 경우 hard dependency 라고 하고, 선택적인 구성요소일 경우 soft dependency 라고 한다.
객체 지향 프로그래밍(Object-Oriented Programming, OOP)에서 의존성은 크게 4가지로 분류될 수다.
- Class Dependency: A 클래스의 생성자나 메소드에서 B 클래스를 사용 중일 경우, B 클래스가 다른 패키지 또는 컴포넌트에 존재한다면 A 클래스는 해당 패키지나 컴포넌트를 선언하지 않고서는 실행할 수 없다. B 클래스 없이 A 클래스가 객체로 인스턴스화될 수 없는 것이다.
- Interface Dependency: 클래스에서 특정 인터페이스 타입을 사용 중일 경우 위와 마찬가지로 해당 인터페이스에 대한 정보 없이 클래스를 객체로 인스턴스화할 수 없다.
- Method or Field Dependency: 클래스에서 특정 객체의 메소드나 필드를 사용 중일 때 발생한다.
- Direct and indirect Dependency: A 클래스가 B 클래스를 의존하고, B 클래스가 C 클래스를 의존할 때, A 클래스는 C 클래스를 간접적으로 의존한다고 한다. 왜냐하면 어차피 C 클래스가 없으면 B 뿐만 아니라 A 클래스도 객체로 인스턴스화될 수 없기 때문이다.
좀 더 큰 범위에서는 다음과 같이 분류된다.
- API Dependency (Surface Dependency): 함수의 인자, 반환 값, 인터페이스 등 외부 API에 접근하는 부분을 포함할 경우 발생한다. Interface, Parameter, Return Type, Attribute, Nested Type 이 API Dependency의 좋은 예이다.
- Implementation Dependency: 내부적으로 특정 Type 을 사용하거나 메소드를 사용하는 경우에 해당된다.
- Circular Dependency: A 와 B 가 서로 의존하는 경우에 해당되며, 간접적인 경우도 포함된다. 최악의 의존성이다.
의존성을 없애는 방법: https://medium.com/@harivigneshjayapalan/dagger-2-for-android-beginners-di-part-i-f5cc4e5ad878
빌드(Build)
소스코드를 오브젝트 코드로 변경하는 것을 컴파일(Compile)이라 한다. 흔히 .java를 .class나 .o 파일로 만든다거나, .cpp 파일을 .o 파일로 만드는 행위를 의미하는데, 애플리케이션을 빌드한다는 것은 이보다 더 큰 범위를 뜻한다.
어떤 프로젝트 단위에서 특정 플랫폼 위에서 홀로 돌아갈 수 있는 프로그램을 만들려면, 소스코드 외에 다양한 파일들이 요구되기도 한다. 의존성 관련 파일도 포함될 것이다. 그리고 소스코드를 포함한 프로젝트 내 여러 파일들을 실행가능한 프로그램으로 변환하는 절차를 빌딩(Building)이라 한다. 빌딩은 컴파일링(Compiling), 링킹(Linking), 패키징(Packaging) 같은 단계들의 집합으로 구성된다.
그리고 이 역할을 수행하기 위해 빌드 도구(Build Tool)가 존재한다. 빌드 도구란 소스코드로부터 실행가능한 애플리케이션을 제작하는 과정을 자동화하는 프로그램이다.
빌드 도구는 주로 아래의 내용을 수행한다.
- 의존성 있는 라이브러리, 패키지, 파일 등을 다운로드하기
- 바이너리 코드로 컴파일 해서 패키징하기
- 프로그램 테스트
- 배포하기
빌드 도구: Maven, Ant, Gradle, Gulp, Webpack
[+] 추가
Reference
의존성: https://medium.com/@harivigneshjayapalan/dagger-2-for-android-beginners-introduction-be6580cb3edb
의존성 관리: https://arload.wordpress.com/2008/07/10/dependency/
For Java
https://www.diatomenterprises.com/dependency-management-tools-for-java/
For Python
https://packaging.python.org/tutorials/managing-dependencies/
https://medium.com/@jimjh/managing-dependencies-in-python-applications-b9c93dda98c2
For C/C++
https://foonathan.net/blog/2016/07/07/cmake-dependency-handling.html
https://hackernoon.com/approaches-to-c-dependency-management-or-why-we-built-buckaroo-26049d4646e7
'Note' 카테고리의 다른 글
오픈소스 가이드 (0) | 2019.06.30 |
---|---|
Eclipse + Android SDK (0) | 2019.04.06 |
Android Plugin 만들기 / Unity 에서 사용하기 (0) | 2019.03.30 |
NginX 프록시 환경설정 방법 (Nginx - WSGI) (0) | 2019.02.27 |
[GooglePlay] 인앱 결제 (0) | 2018.12.29 |