컴포넌트와 모듈은 정보처리기사 자격증에서도 나오는 내용인데 이 두 용어의 차이가 모호했다.
모듈 (Module) 이란?
모듈은 생각보다 쉽게 생각할 수 있다.
우리가 프로그램을 만들 때, 하나의 기능을 만들거나 하나의 클래스를 만들게 된다. 이것을 모듈이라고 한다.
생각보다 너무 간단하게 작성했는데 이것을 실제 예로 들어보겠다.
계산기를 작성해보자. 우리는 더하기 연산을 작성한다.
int sum(a, b) {
return a + b;
}
이제 이것은 하나의 모듈이다. 그 외 -, *, / 연산도 모듈이라고 할 수 있다.
그럼 우리는 의문을 가질 수 있다. 모듈은 함수 또는 메소드인가요? 정답은 아니오다.
public class Calculator {
public int plus();
public int minus();
public int divide();
public int multiple();
}
이런 다수의 기능을 가지고 있는 Calculator class도 모듈이다.
왜냐하면 사칙연산이라는 하나의 기능을 갖고 있기 때문이다.
boolean check(int num) {
if (num > 10) {
return false;
}
return true;
}
int sum(a, b) {
int c = a + b;
if (check(c)) {
return c;
}
return 10;
}
이렇게 되어 있을 때, check는 모듈이 되지 않는다. 왜냐하면 sum의 기능을 수행하기 위한 과정이기 때문이다.
import mymodule.*;
int main() {
// mymodule의 각 기능들
sout(mymodule.Caculator.sum(3, 4));
sout(mymoudle.Member.login(id, password));
}
여러 모듈을 담고 있는 집합체 또한 모듈이다.
예를 들어 로그인하여 회원만 계산기를 사용할 수 있는 프로그램이라면 올바른 기능인 것이다.
이렇게 모듈은 프로그램 수준에 따라서 사용할 수 있는 각 기능들을 의미한다.
여기서 프로그램 수준을 따른 기능의 의미가 독립적이라는 의미이다.
이런 모듈을 작성할 때는 어떻게 구성할 지를 생각하고 '설계'한다.
그래서 모듈은 설계시점에서 의미있는 요소라고 한다.
다만 주의해야 할 점은 예시를 기능으로 작성했다고 '모듈 = 기능'으로 생각하면 안된다.
예시에서 설명했듯 모듈은 모듈로 구성이 될 수 있다. 여기서 모듈 내에 있는 코드들을 포괄해서 모듈이라고 칭한다.
하나의 기능에 대해서만 모듈이 아닌 변수, 메서드, 클래스들을 포괄해서 모듈이라고 한다.
변수의 집합 = 메서드, 메서드 집합 = 클래스, 클래스 집합 = 패키지가 모두 모듈이 된다.
컴포넌트 (Component) 란?
컴포넌트와 모듈의 차이를 이해하기가 정말 어려웠다.
여러 기능의 모듈 설계를 했다면 컴포넌트는 저런 모듈을 직접 사용하는 역할이다.
여기서 말하는 '직접 사용하는 역할'이라는게 참 모호했는데, 배포에 대해서 알고 있어야한다.
먼저 컴포넌트를 조금 더 자세하게 설명해보자면 '실행 시점에 의미있는 요소'이다.
풀어서 설명하자면 모듈 중 기능을 수행하기 위한 최소의 모듈을 의미하는 것이다.
로그인을 생각해보자. 로그인에는 입력값 검증, 사용자 검증, 예외처리 등의 작업이 이루어질 것이다.
이 각 각을 모듈이라고하며 이 모듈들을 포함한 로그인 모듈이 존재할 것이다.
클라이언트 입장에서 로그인을 할 때 입력값 검증, 사용자 검증, 예외처리를 하고 로그인을 하지 않는다.
그저 로그인 기능만 사용한다.
이렇게 특정 기능을 수행하기 위한 최소의 기능을 클라이언트가 실행한다.
즉, 실행 시점에 의미있는 요소가 되는 것이다. 이렇게 최소의 기능(모듈)을 수행할 수 있는 것이 컴포넌트이다.
어느 책이나 블로그나 가시성없이 설명만 되어 있어서 정확하기 이해하기 힘들었을텐데 이 글을 통해 개념을 잡았으면..
내가 참고한 블로그에서도 공부해보면 좋은 시간이 될 것 같다.
실행 시점의 다른 해석
선수 개념으로 OS 개념이 필요하다. 프로그램을 실행하게 되면 프로세스 상태가 된다.
이 프로세스는 기본적으로 하나의 스레드를 가지고 있다.
스레드는 실행 단위이므로 스레드 상태를 가질 수 있는 것을 컴포넌트라고 할 수 있다.
앞서 설명한 로그인에서 여러 모듈에 대해 모두 스레드를 생성한다고 생각해보자.
입력값 검증에서 컨텍스트 스위칭, 사용자 검증에서 컨텍스트 스위칭, ...
아무리 스레드의 컨텍스트 스위칭이 가볍다고는 하나 프로그램의 기능이 매우 떨어질 것이다.
위 블로그에서 말하는 클라이언트 - 서버 시스템에서 1개의 서버와 10개의 클라이언트가 존재할 때,
모듈은 2개이고 컴포넌트는 11개라고 한다. 이유가 뭘까??
내 지인은 서버의 모듈 1개와 클라이언트 각 각의 모듈 1개씩이 필요한 것 아니냐? 그러니 총 10개의 모듈이 아니냐?
위와 같은 질문을 던졌는데 처음 설명한 배포의 개념이 여기서 필요하다.
클라이언트 - 서버 시스템의 자세한 내용은 여기를 참고하면 좋겠다.
클라이언트 - 서버 시스템을 배포하면 각 각 하나씩의 모듈이 필요하게되고 클라이언트들은 클라이언트 서버에 접속해서 백엔드 서버에 요청하게 된다.
이 때, 클라이언트 서버는 하나이므로 다수의 사용자가 접속하게 된다면 클라이언트 서버에서는 각 각의 클라이언트를 스레드로 관리하게 될 것이다. 즉, 클라이언트에는 1개의 모듈에 10개의 컴포넌트(스레드)가 생기게 된다.
서버에서는 1개의 모듈에 1개의 컴포넌트(스레드)가 생기게 된다. (1프로세스 = 최소 1스레드를 가짐)
컨테이너 (Container) 란?
컨테이너는 컴포넌트를 이해하게 되었으면 굉장히 쉬운 개념이다.
웹사이트의 경우 프론트 서버에서 html, css, js 등으로 view를 제공하게 된다.
그리고 각 각의 기능이 필요한 웹 페이지들을 생성해서 적절하게 기능을 배치하여 클라이언트들에게 UI를 제공하는데
이 때, 하나의 웹 페이지 = 하나의 백엔드 서버의 기능들이 아니다.
하나의 백엔드 서버의 기능으로 몇 개의 웹 페이지를 만들어서 각 각의 기능을 적절히 배치하는 것이다.
즉, 기능들이 모여있는 곳이 컨테이너인데 여기서 말하는 기능은 실행할 수 있는 최소의 기능이고 이는 즉, 컴포넌트를 의미한다.
정리
- 모듈
- 독립적인 기능들
- 재사용이 가능 (작은 기능들을 재사용하여 큰 기능을 만들 수 있음)
- 작은 기능들, 작은 기능들이 모여있는 큰 기능들, 큰 기능들이 모인 집합체, 집합체들이 모인 패키지
- 프로그램 코드의 일부들
- 컴포넌트
- 모듈 중 실행할 때 필요한 최소한의 단위
- 독립적이어야 함. (로그인에서 아이디와 비밀번호를 찾아주면서 로그인이 된다면 말이 안됨.)
- 프로그램의 일부들
- 재사용 가능함. (다른 프로그램의 일부로 사용 가능)
- 컨테이너
- 컨테이너 수준에 따른 컴포넌트들의 집합체
- 특정한 기능들을 수행할 수 있는 프로그램 수준
'IT > 기술블로그' 카테고리의 다른 글
클라이언트-서버 시스템 (Client-Server System) (0) | 2024.02.26 |
---|---|
컴퓨터에서 Interface란? (1) | 2024.01.02 |