본문 바로가기
Dev/Python

파이썬 기초: 모듈(Module)과 패키지(Package)의 활용

by DevGyu0511 2026. 1. 12.
반응형

개요

프로그램의 규모가 커질수록 모든 코드를 하나의 파일에 작성하는 것은 유지보수 측면에서 불가능에 가깝다. 파이썬은 코드를 논리적으로 분리하고 재사용할 수 있도록 '모듈'과 '패키지'라는 강력한 시스템을 제공한다.

모듈과 패키지의 정의

모듈은 함수나 변수, 클래스를 모아놓은 하나의 .py 파일이며, 패키지는 이러한 모듈들을 디렉터리 구조로 관리하는 묶음이다. 효율적인 코드 관리를 위해 각각의 역할을 이해하는 것이 중요하다.

1.모듈(Module)

특정 기능을 수행하는 단위 코드의 집합체이다. 독립적인 .py 파일로 존재하며, 다른 프로그램에서 불러와 재사용할 수 있는 가장 기본적인 단위이다.

2.패키지(Package)

물리적으로는 여러 모듈을 포함하는 '폴더'의 개념이다. 점(.) 연산자를 사용하여 계층 구조를 형성하며, 대규모 프로젝트에서 코드의 소속을 명확히 하는 역할을 한다.

모듈(Module): 코드의 단위 분리

모듈은 코드를 기능별로 분리하여 가독성을 높이고 유지보수를 용이하게 한다.

1.모듈 만들기 및 불러오기

파일을 생성하는 것만으로도 모듈이 완성된다. import 기능을 통해 모듈을 가져올 수 있다.

# my_module.py (모듈 파일 생성)
def greet(name):
    return f"Hello, {name}!"

# main.py (모듈 호출)
import my_module
print(my_module.greet("Python"))

2.별칭(Alias) 사용

모듈 이름이 길어 사용이 불편하거나 이름 충돌이 예상될 때 'as' 키워드로 별명을 붙여 효율적으로 호출한다.

import my_long_name_module as ml
ml.execute_function()

3.표준 라이브러리 활용

math, datetime 등 파이썬에서 기본 제공하는 표준 모듈을 사용하여 복잡한 기능을 직접 구현하지 않고도 구현 속도를 높인다.

패키지(Package): 모듈의 체계적 관리

패키지는 모듈들을 계층적 디렉터리 구조로 묶어 관리함으로써 프로젝트의 무결성을 확보한다.

1. 패키지 구조

관련 있는 모듈들을 폴더 내에 배치한다. 계층 구조를 통해 코드의 분류를 시각화하고 논리적으로 연결한다.

my_project/
├── main.py
└── calculator/          # 패키지 폴더
    ├── __init__.py      # 패키지 인식 파일
    ├── adder.py         # 모듈 1
    └── subtractor.py    # 모듈 2
  • 'init.py'의 역할: 해당 디렉터리가 단순한 폴더가 아니라 파이썬 패키지임을 선언하는 파일이다. Python 3.3 이후 버전에서는 생략이 가능하지만, 패키지 초기화 로직을 담거나 하위 호환성을 위해 관례적으로 생성한다.

2. 경로 지정

'import 패키지.모듈' 형식을 사용하여 기능의 출처를 명확히 규정한다. 이는 대형 프로젝트에서 전역 네임스페이스가 오염되는 것을 방지하는 핵심 기법이다.

# calculator 패키지 안의 adder 모듈을 가져오는 예제
from calculator import adder

result = adder.add(10, 20)
print(f"결과: {result}")

3. 외부 패키지 설치

패키지 관리 도구인 'pip'를 활용하여 전 세계 개발자들이 공개한 외부 라이브러리를 프로젝트에 통합하여 기능을 확장한다. 대표적으로 HTTP 요청을 보내는 'requests' 패키지가 있다.

# 터미널에서 설치 명령 실행
pip install requests
# 설치한 외부 패키지를 실제 코드에서 사용
import requests

response = requests.get("[https://api.github.com](https://api.github.com)")
print(f"상태 코드: {response.status_code}")

모듈과 패키지 활용 시 주의사항

파이썬 프로젝트를 설계할 때 발생할 수 있는 잠재적인 오류를 방지하기 위해 다음 사항을 준수해야 한다.


1.파일명이 파이썬 표준 라이브러리 명칭과 겹칠 경우의 문제

표준 라이브러리와 동일한 이름으로 파일을 만들면, 파이썬은 내부 라이브러리 대신 현재 폴더의 파일을 먼저 참조하여 에러를 발생시킨다.

# random.py (사용자가 만든 파일)
def my_func():
    print("사용자 정의 함수")

# main.py
import random
# 에러 발생: 표준 random 모듈의 randint를 찾을 수 없음
print(random.randint(1, 10)) 

2.직접 실행될 때와 임포트될 때의 동작 구분

파이썬 인터프리터는 파일을 직접 실행할 때 해당 파일의 이름을 묻지 않고 무조건 "main"이라는 특수한 값을 'name' 변수에 할당한다. 반면, 다른 파일에 의해 임포트될 때는 실제 파일명이 할당된다. 이를 이용해 테스트 코드가 의도치 않게 실행되는 것을 방지한다.

# my_module.py
def add(a, b):
    return a + b

# 직접 실행(python my_module.py) 시에만 __name__에 "__main__"이 들어가 아래 코드가 작동한다.
if __name__ == "__main__":
    print("이 코드는 파일을 직접 실행했을 때만 출력된다.")
    print(add(10, 20))

결론

모듈과 패키지는 단순한 코드 정리를 넘어 객체지향 프로그래밍(OOP)의 핵심 설계 원칙을 실현하는 도구이다. 모듈화를 통해 우리는 각 코드 조각의 독립성을 보장하는 캡슐화(Encapsulation)를 달성하고, 서로 다른 기능이 엉키지 않도록 관심사를 분리할 수 있다.

결국 잘 짜인 패키지 구조는 객체지향이 추구하는 '부품화된 소프트웨어'의 기반이 된다. 오늘 배운 모듈과 패키지 시스템을 단순히 문법으로만 보지 말고, 유지보수가 용이하고 확장이 자유로운 '객체지향적 아키텍처'를 구축하는 첫걸음으로 삼아보길 바란다.

반응형