컴포넌트(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

 

Dagger 2 for Android Beginners — DI part I

This story is the second part of the series, Dagger 2 for Android Beginners. If you did not read the previous one, you can start from here.

medium.com

 

 

빌드(Build)

 

소스코드를 오브젝트 코드로 변경하는 것을 컴파일(Compile)이라 한다. 흔히 .java를 .class나 .o 파일로 만든다거나, .cpp 파일을 .o 파일로 만드는 행위를 의미하는데, 애플리케이션을 빌드한다는 것은 이보다 더 큰 범위를 뜻한다.

 

어떤 프로젝트 단위에서 특정 플랫폼 위에서 홀로 돌아갈 수 있는 프로그램을 만들려면, 소스코드 외에 다양한 파일들이 요구되기도 한다. 의존성 관련 파일도 포함될 것이다. 그리고 소스코드를 포함한 프로젝트 내 여러 파일들을 실행가능한 프로그램으로 변환하는 절차를 빌딩(Building)이라 한다. 빌딩은 컴파일링(Compiling), 링킹(Linking), 패키징(Packaging) 같은 단계들의 집합으로 구성된다.

 

그리고 이 역할을 수행하기 위해 빌드 도구(Build Tool)가 존재한다. 빌드 도구란 소스코드로부터 실행가능한 애플리케이션을 제작하는 과정을 자동화하는 프로그램이다.

 

빌드 도구는 주로 아래의 내용을 수행한다.

  • 의존성 있는 라이브러리, 패키지, 파일 등을 다운로드하기
  • 바이너리 코드로 컴파일 해서 패키징하기
  • 프로그램 테스트
  • 배포하기

빌드 도구: Maven, Ant, Gradle, Gulp, Webpack

 

[+] 추가

Maven vs Gradle

Ant vs Maven vs Gradle

 

 

Reference

 

의존성: https://medium.com/@harivigneshjayapalan/dagger-2-for-android-beginners-introduction-be6580cb3edb

 

Dagger 2 for Android Beginners — Introduction

Dagger is a fully static, compile-time dependency injection framework for both Java and Android. It is an adaptation of an earlier version…

medium.com

 

의존성 관리: https://arload.wordpress.com/2008/07/10/dependency/

 

Dependency에 대한 고찰

요즘 소프트웨어가 갈수록 거대해지면서 소프트웨어 통제에 대해 많은 애기를 들을수 있습니다. 그리고 소프트웨어 통제를 들어보신 분이라면, xDepend 라는 툴은 한번쯤 들어보셨을 겁니다. 이번  post는 아키텍쳐 설계시 dependency는 무엇이고 어떠한 종류가 있는지 설명하고, dependency를 관리할때 유용한 Layering과  xdepen…

arload.wordpress.com

 

인트로: https://medium.com/@dulajdilshan/do-you-know-maven-a-dependency-manager-or-a-build-tool-what-is-pom-bd7dd8b43e80

 

Do you know MAVEN ? A Dependency Manager or a Build tool ? What is POM ?

How would you like to understand maven ? Build tool ?

medium.com

 

For Java

https://www.diatomenterprises.com/dependency-management-tools-for-java/

 

Dependency management tools for Java

Regardless of your experience in Java you have certainly heard about building applications. Even if your single Java code consists of just one class declaration...

www.diatomenterprises.com

 

 

For Python

https://packaging.python.org/tutorials/managing-dependencies/

 

Managing Application Dependencies — Python Packaging User Guide

Managing Application Dependencies The package installation tutorial covered the basics of getting set up to install and update Python packages. However, running these commands interactively can get tedious even for your own personal projects, and things ge

packaging.python.org

 

https://medium.com/@jimjh/managing-dependencies-in-python-applications-b9c93dda98c2

 

Managing Dependencies in Python Applications

How to build reliable environments, share internal libraries, and migrate major versions in a growing organization.

medium.com

 

For C/C++

https://foonathan.net/blog/2016/07/07/cmake-dependency-handling.html

 

Tutorial: Easy dependency management for C++ with CMake and Git

This tutorial describes a simple way to handle external dependencies for C++ projects. It only uses native CMake and git, doesn't require any external package managers and is completely transparent for the user.

foonathan.net

 

https://hackernoon.com/approaches-to-c-dependency-management-or-why-we-built-buckaroo-26049d4646e7

 

Approaches to C++ Dependency Management, or Why We Built Buckaroo

C++ is an unusual language in that it does not yet have a dominant package manager (we’re working on it!).

hackernoon.com

 

 

'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

 

플러그인 제작 (unity3d 라이브러리 추가하기)

 

인텔리 J에서 하는 경우

https://jhedde.tistory.com/entry/Unity-Android-Java-플러그인-붙이기-1

 

Unity - Android Java 플러그인 붙이기 (1)

최근 프로젝트를 진행하는 중에 삽질을 많이 해야하는 일을 맡게 되었다. 삽질을 좀 했는데 삽질한 것을 기록하기 위해 포스팅을 한다. 이 글은 Android, Java 에 대해 기본적인 이해를 전제로 쓰여졌다. 1. 플러..

jhedde.tistory.com

안드로이드 스튜디오에서 하는 경우

https://slway000.tistory.com/35

 

[UNITY] 안드로이드 플러그인 만들기 Part 1

유니티3D 안드로이드(Android) 플러그인(Plugin) 만들기 Part 1. 안드로이드 스튜디오(Android Studio) 2.1.1 기준입니다. * 안드로이드 스튜디오(Android Studio) 상위 버전 분들은 여기 를 눌러 확인바랍니다. *..

slway000.tistory.com

* 해당 버전보다 높은 버전일 경우 gradle 스크립트 문제로 jar 파일이 생성되지 않는다.

해결책은 안드로이드 스튜디오 버전을 바꾸거나 gradle 스크립트 내에서

from('build/intermediates/bundles/release/') -> from('build/intermediates/intermediate-jars/release/') 로 변경

 

 

이클립스에서 하는 경우

https://westwoodforever.blogspot.com/2013/07/unity3d-android-plugin.html

 

Unity3D Android Plugin 이클립스에서 빌드하기

개발하면서 나온 이슈를 정리하고 있습니다. 출처만 남겨주시고 마음대로 퍼가주세요.

westwoodforever.blogspot.com

 

 

유니티에서 플러그인 사용

https://jhedde.tistory.com/entry/Unity-Android-Java-플러그인-붙이기-3?category=653994

 

Unity - Android Java 플러그인 붙이기 (3)

Unity - Android Java 플러그인 붙이기 (2) 이전 글에서는 Andorid Libary Project 를 통째로 담을 수 있는 AAR 파일을 만들어 적용시켰었다. 이제는 Unity 에서 Android Java Class 에 접근할 수 있는 방법에 대..

jhedde.tistory.com

 

레퍼런스

https://docs.unity3d.com/kr/530/Manual/PluginsForAndroid.html

 

유니티 - 매뉴얼: Android 플러그인 빌드

고급 Unity 모바일 스크립팅 Android 스플래시 화면 사용자 지정 Android 플러그인 빌드 이 페이지는 Android의 Native Code Plugins에 대해 설명합니다. Android 플러그인을 빌드 Android 플러그인을 빌드하려면 우선 Android NDK를 구하여 공유 라이브러리 (shared library)를 구축하는 데 필요한 단계를 이해하십시오. 플러그인을 구현하기 위해 C++(.cpp)을 사용하는 경우, name mangli

docs.unity3d.com

https://docs.unity3d.com/kr/current/Manual/AndroidAARPlugins.html

 

AAR 플러그인과 Android 라이브러리 - Unity 매뉴얼

Android Archive(AAR) 플러그인은 컴파일된 Java, 네이티브 (C/C++)코드, 리소스 또는 Android 매니페스트가 포함된 번들입니다. .aar 파일 자체는 모든 에셋을 포함하는 zip 아카이브입니다. 자세한 내용은 Android 라이브러리 생성에 대한 Android 개발자 문서를 참조하십시오.

docs.unity3d.com

 

 

+ Recent posts