의존성이 뭘까요?

우분투를 사용한지 이제 1년은 확실히 되었다고 말할 수 있는데

아직까지 의존성에 대해서는 정확한 개념이 안서는 상황입니다…

어플리케이션 설치나 삭제시 의존성이 많이 거론되고

패키지 파일을 만들때도 의존성을 고려한다고 어디선가 들었는데…

윈도 사용할때는 접해보지 못한 개념이라 정확하게 뭔지를 모르겠네요

의존성!! 어떤식으로 이해 해야 할까요??

그리고 의존성 없이 리눅스 프로그램을 만들 수는 없는건가요??

배포판이 달라지면 같은 프로그램이더라도 의존성을 달리해야 하는 건가요??

의존성이라는 개념이 저에게 너무 막연해 질문들이 뒤죽박죽이네요

고수분들의 의견을 듣고 싶습니다 ^^

의존성이라는건 말 그대로… A를 정상적으로 작동시키기 위해 B가 필수적일때 쓰는 말입니다. 즉, 역설적으로 말해, 프로그램을 처음부터 끝까지 맨땅에 헤딩하면서 혼자 만들었다면 의존성 같은건 없게 되겠죠. 하지만 이런 식으로 프로그램을 만들기가 매우 어렵고, 필요한 대부분의 소스가 공개되고 사용이 허락된 상황에선 굳이 그럴 이유가 없기 때문에 필요한건 가져다 쓰는 겁니다.

예를 들어서, 삼겹살을 구워 먹고 싶다고 합시다. 간단히 생각해서 돼지고기와 불판과 불이 필요하겠죠? 의존성 없이 코드하는 경우는, 직접 돼지를 길러서 잡은 다음, 직접 쇠를 녹여 만든 불판에 마찰열로 불을 만들어서 고기를 구워 먹는거랑 같다고 할 수 있겠습니다. 이에 반해, 의존성이 있는 경우는, 누군가가 키워서 잡아 놓은 돼지고기를 가져다가 슈퍼에서 누군가가 만든 불판을 사서, 누군가가 만든 라이터를 가지고 불을 피워서 고기를 구워 먹는것과 같다고 생각하시면 됩니다.

프로그램을 깔고 지울때 의존성 이야기를 하는 이유는 이런 경우입니다. 예를 들어 삼겹살을 구워 먹는 행위에서 없어선 안 될 것은 돼지고기와 불이겠지요? 만약 돼지고기를 파는 사람이 갑자기 이사를 가버리거나 불을 구할 수가 없어진다면 불판은 아무런 쓸모가 없게 됩니다 (삼겹살 먹는데 특화된 불판이라고 가정해 봅시다. ^^). 하지만 그 반대로, 불판이 없다고 해서 돼지고기와 불이 무용지물이 되지는 않죠. 후라이팬으로 구워 먹을 수도 있을것이고, 불로 라면을 끓일수도 있을겁니다. 그래서 의존성 관계에서 하단에 있는 것은 상단에 있는 프로그램이 지워졌다고 해서 지워지지는 않지만 하단의 프로그램이 지워지면 상단의 프로그램도 함께 지워지도록 하는 거지요.

윈도우즈쪽에서 이 개념을 별로 보시지 못하는 이유는 대부분의 프로그램들이 그런 식으로 내부 기능을 공유할 수 있도록 되어 있지 않기 때문이지요. 하지만 윈도우즈 진영에서도 아예 없지는 않습니다. 예를 들어, 윈도우즈에서 피진을 깔면 GTK+가 같이 깔립니다. 한국의 유명한 브라우저 확장인 웹마는 알맹이가 IE기 때문에, IE가 없이는 작동이 불가능하지요.

[quote="crimsonbynw":2civvs5s]
윈도 사용할때는 접해보지 못한 개념이라 정확하게 뭔지를 모르겠네요
[/quote:2civvs5s]
MS 윈도우에도 컴파일설치가 가능하고 동적 라이브러리를 사용하기 때문에
패키지별 의존성이 존재합니다.

[quote="crimsonbynw":2civvs5s]
의존성!! 어떤식으로 이해 해야 할까요??
[/quote:2civvs5s]
영어 단어 뜻과 큰 차이이가 없습니다.

A패키지 컴파일할때 B패키지에 의존성이 있다.
–> A패키지 컴파일 할려면 B패키지가 있어야한다는 겁니다.

A프로그램을 실행할때 B라이브러리에 의존성이 있다.
–> A프로그램을 실행할때 B라이브러리 파일이 필요하다는 겁니다.

[quote="crimsonbynw":2civvs5s]
그리고 의존성 없이 리눅스 프로그램을 만들 수는 없는건가요??
[/quote:2civvs5s]

당연히 가능합니다.

컴파일의 경우에는 A패키지에 B패키지를 포함시키면됩니다.

  • 다른 용도에 의해서 이미 B패키지가 설치된 사용자는 A패키지만 설치하면
    되는데… A와 B가 한개의 패키지로되있으면 쓸데없이 B패키지 부분도 다운로드
    및 설치도 하는 삽질을 하게됩니다.
  • 라이센스 문제로 A패키지에 B패키지를 포함시킬 수 없는 경우도 있습니다.

실행의 경우에는 정적으로 링킹하면 라이브러없이 실행가능합니다.

  • 동적 라이브러리의 장점을 잃어버리게 되는데…
    이렇게 제작하는 경우는 드물겠죠…
  • 마찬가지로 라이센스 문제로 정적으로 컴파일하면 안되는 경우도 있습니다.

윈도에서도 의존성이 필요한 건 마찬가지입니다만,

윈도에서는 의존성을 명백하게 처리해 주는 체계가 없습니다.
사용자 컴퓨터에 의존성 패키지(?)들이 이미 다 있기를 바라거나, 아예
하나의 인스톨러 안에 의존성 패키지들을 죄다 담게 되기도 합니다.

예를 들어,

[quote:lf0y6lj0]프로그램을 실행할 수 없습니다 XXX.dll 파일을 로드할 수 없습니다.[/quote:lf0y6lj0]

이것도 해당 프로그램이 XXX.dll 에 의존성을 가지고 있는데,
설치 프로그램이 이를 해결해주지 않으니 문제가 되는 것이지요.

다른 컴퓨터나 웹에서 해당 dll 파일을 복사해야되는 황당한 일이 일어나기도 합니다.
또는

[quote:lf0y6lj0]이 프로그램은 DirectX 버전이 몇 이상이어야 합니다.[/quote:lf0y6lj0]

이런 것도 의존성이라고 부르는 겁니다 ‘ㅅ’/