학습 로그/Project

D+49 [Project] 개인 프로젝트를 팀 통합파일로 만들기 실습

goodjob^^ 2026. 6. 17. 17:46

ㅇ 일 자 : 2026년 6월 17일(수)

ㅇ 목 적 

    개인 프로젝트 패키지 파일들을 한데 모아 팀 통합파일로 만들어 실행해 보고, 개발 순서 역주행에 대한 문제점을 스스로 찾아보고 프로그램 개발 로직을 이해하기 위함이다.

 

ㅇ 후기 

오늘은 교육 49일째이다. 시간이 너무 빠르게 흘러 가는듯 하다. 파이썬에서 코드의 자동완성 기능이 Tab를 활용하여 많이 익숙해져 가고 있지만 아직도 개발자의 길은 갈길이 멀기도 하다. 그러나 흥미로움은 계속되고 있다.

이번에는 개인 프로젝트를 한 파일들을 가지고 하나로 통합 해서 팀 통합파일을 만드는 실습을 하였다. 어떠한 애로사항과 제한사항이 있는지 확인해 보고, 전체적인 프로그램 흐름 로직을 타인원들의 파일들도 확인하면서 토의하는 시간을 가졌다. 매우 유익한 시간이었다. 이에 사전 협의할 사항을 도출하면서 공부가 많이 되었다. 우선 생소한 용어들을 이해하게 되었고,  프로그램 파일들을 하나로 통합하였을때 애러를 최소화 하려면 파일구조, 서버, 코드작성 부분에서 지켜야 할 약속 같은것, 통신규약, DB항목, 각종 산출물에 대한 공통사항 등 다양한 토의가 이뤄졌다. 특히 개발산출물을 인공지능 응용해서 생성하고자 할때 개발자의 생각과 로직이해가 선행되어야 한다는 것이다. 인공지능이 많이 보편화 되어 가고 있는 시점이지만 아직도 비용으로 인한 제한사항은 당장 해소하지 못하는 것이 현실이다. 이제는 개발자들에게도 인공지능 응용에 대한 수요가 증가할 수 있을 것이다. "도전은 계속된다". 


 

1. 팀 프로젝트 시행전 사전 조치 및 협의할 사항
1. 1. 사전 협의할 사항

① 파일 구조 : 파일경로 설정, 프로젝트명, 뷰(V), 모듈(M), 모델뷰(MV), 리소스(R)

② 서버 : 서버는 어떤것 활용할 것인지 

③ 코드 작성 : 사용 함수명이 중복되지 않게 하기, 수정금지 부분 코드 사용 여부, JSON, KEY, 함수로 묶음부분 등

④ 통신 : IP, Port, TCP 지정,  패키지 버젼 

⑥ DB : 자료에 포함되어야 할 중요 핵심 요소나 항목들 사전 토의 합의

⑦ 각종 프로그램 개발 산출물 작성시 사전 협의해 할 사항들 확인 (예, 요구사항 명세서, API명세서 등)

     * 요구사항 명세서(동작 로직들),  API 명세서(주고받는 규칙들)


1. 파일 구조 

1.1. 다양한 통합파일 실행 방법이 있지만 아래 StackModelView를 활용하여 통합 실행 화면을 구성한다.

       각각의 패키지 파일들을 다운로드 해서 파이참 환경에서 새프로젝트를 구성한다.

 

1.2. 통합 폴더명 : my_total_project /
      |--- StackModelView.py          # 통합해서 새로 생성한 파일

      |--- StackModelViewMain.py  # 통합해서 새로 생성한 파일

      |--- requirements.txt               # 통합해서 새로 생성한 텍스트 파일

 

      |--- Package1.   # 개발자 1번의 패키지 파일

      |--- ManagerReservation /    
           |--- __init__.py
           |--- ManagerMain.py

           |--- ManagerNetWorkModel.py

           |--- ManagerUI (6개 파일)

           |--- ManagerViewModel (3개 파일)

           |--- __pycache__ (2개 파일)

      |--- CsharpSocektNetWork /    
           |--- CsharpSocektNetWork.csproj
           |--- CsharpSocektNetWork.http

           |--- Program.cs

           |--- Properties (1개 파일)

           |--- appsettings.Development.json

           |--- appsettings.json

           |---obj (6개 파일)

 

      |--- Package2.   # 개발자 2번의 패키지 파일

      |---danawa_car_ver

           |--- __init__.py
           |---__pycache__ (3개 파일)

           |---db (3개 파일)

           |---image_rc.py

           |---main.py

           |---model (7개 파일) 

           |---repository(7개 파일)

           |---res(6개 파일)

           |---res.qrc

           |---utils(5개 파일)

           |---view(13개 파일)

           |---widget.py

 

    |--- Package3.   # 개발자 3번의 패키지 파일

      |---project_manager 

           |--- __init__.py
           |---main.py

           |---PySide6_SQLite.txt

           |---requirements.txt

           |---__pycache__ (1개 파일)

           |---core (3개 파일)

           |---data(1개 파일)

           |---modules(5개 파일)

           |---ui (4개 파일)

           |---utils(3개 파일)

 

1.3. 예시 파일 구조
폴더명 :  my_total_project /
  | --- main.py 
  | --- Package1/
      | --- __init__.py
      | --- sub_app1.py   
  | ---  Package2/
      | ---__init__.py
      | ---sub_app2.py 
  | ---  Package3/
      | --- __init__.py
      | --- sub_app3.py

 

1.4. my_total_project /
      |--- StackModelView.py     # 통합해서 새로 생성한 파일

from PySide6.QtWidgets import QStackedWidget, QApplication
from PySide6.scripts.pyside_tool import project
import sys

# 다나와 차 버전 관련 커스텀 데이터베이스 및 레포지토리, 모델 임포트
from danawa_car_ver.db import DataBase
from danawa_car_ver.repository import UserRepo, CarRepo, QuoteRepo, FavoriteRepo, LogRepo
from danawa_car_ver.model import UserModel, CarModel, QuoteModel, FavoriteModel, AdminModel
from danawa_car_ver.widget import MainWidget

# 프로젝트 관리자(Project Manager) 관련 UI 및 데이터베이스 초기화 모듈 임포트
from project_manager.core.database import init_database
from project_manager.ui.login_window import LoginWindow
from project_manager.ui.main_window import MainWindow

# 예약 관리자(Manager Reservation) 뷰모델 임포트
from ManagerReservation.ManagerViewModel.ManagerViewModel import ManagerViewModel

# 프로젝트 관리자 모듈의 메타데이터 임포트
from project_manager.modules.module_panel import MODULE_META


class StackModelView(QStackedWidget):
    """
    QStackedWidget을 상속받아 여러 개의 화면(위젯)을 쌓아두고
    인덱스를 통해 화면을 전환하는 컨테이너 클래스입니다.
    """
    def __init__(self):
        super().__init__()

        # [주석 처리된 코드] 다나와 자동차 관련 DB, 레포지토리, 모델 초기화 로직
        # db = DataBase()

        # user_repo = UserRepo(db)
        # car_repo = CarRepo(db)
        '''quote_repo = QuoteRepo(db)
        favorite_repo = FavoriteRepo(db)
        log_repo = LogRepo(db)

        user_model = UserModel(user_repo)
        car_model = CarModel(car_repo)
        quote_model = QuoteModel(quote_repo)
        favorite_model = FavoriteModel(favorite_repo)
        admin_model = AdminModel(car_repo, quote_repo, log_repo)
        '''

        # 프로젝트 관리자 시스템의 데이터베이스를 초기화합니다.
        init_database()

        # [주석 처리된 코드] 다나와 자동차 메인 위젯 생성
        # self.a = MainWidget(user_model, car_model, quote_model, favorite_model, admin_model)
        
        # 예약 관리자 뷰모델 인스턴스를 생성합니다.
        self.b = ManagerViewModel()
        
        # 모듈 메타데이터를 전달하여 메인 관리자 창 인스턴스를 생성합니다.
        self.c = MainWindow(MODULE_META)
        
        # [주석 처리된 코드] 다나와 자동차 스택 위젯을 컨테이너에 추가
        # self.addWidget(self.a.stack)
        
        # 메인 관리자 창(MainWindow)을 첫 번째 스택(인덱스 0)으로 추가합니다.
        self.addWidget(self.c)
        
        # 예약 관리자 뷰(View)를 두 번째 스택(인덱스 1)으로 추가합니다.
        self.addWidget(self.b.View)
        
        # 프로그램 시작 시 첫 번째 화면(MainWindow, 인덱스 0)이 보이도록 설정합니다.
        self.setCurrentIndex(0)

 

      |--- StackModelViewMain.py # 통합해서 새로 생성한 파일

import sys
from PySide6.QtWidgets import QApplication
from ManagerReservation.ManagerViewModel.ManagerViewModel import ManagerViewModel
from StackModelView import StackModelView

# 해당 스크립트가 직접 실행될 때만 아래 블록을 수행합니다. (모듈로 import될 때는 실행 안 됨)
if __name__ == "__main__":
    
    # GUI 애플리케이션의 제어 흐름과 주요 설정을 관리하는 QApplication 인스턴스를 생성합니다.
    # sys.argv는 명령행 인자(Arguments)를 프로그램 내부로 전달합니다.
    app = QApplication(sys.argv)
    
    # 앞서 정의한 화면 전환 컨테이너(QStackedWidget)인 StackModelView 인스턴스를 생성합니다.
    widget = StackModelView()
    
    # 생성한 위젯(윈도우 창)을 화면에 표시합니다.
    widget.show()
    
    # 애플리케이션의 메인 이벤트 루프를 시작합니다. (app.exec() 또는 app.exec_())
    # 사용자가 창을 닫아 루프가 종료되면 시스템에 종료 상태 코드를 반환하며 프로그램을 완전히 종료합니다.
    sys.exit(app.exec())

     

|--- requirements.txt               # 통합해서 새로 생성한 텍스트 파일

certifi==2026.5.20
charset-normalizer==3.4.7
idna==3.18
PySide6==6.11.1
PySide6_Addons==6.11.1
PySide6_Essentials==6.11.1
requests==2.34.2
shiboken6==6.11.1
urllib3==2.7.0

openpyxl 3.1.5

 

1.5. 예시 파일 통합후 실행 파일

from PySide6.QtWidgets import QApplication, QMainWindow, QTabWidget
# ... (위젯 import 부분은 동일)

class TabbedApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("탭 통합 프로그램")
        self.resize(1000, 700)

        # 탭 위젯 생성
        self.tabs = QTabWidget()

        # 각 프로그램 위젯을 탭에 추가 (탭 이름 지정)
        self.tabs.addTab(AppOneWidget(), "첫 번째 프로그램")
        self.tabs.addTab(AppTwoWidget(), "두 번째 프로그램")
        self.tabs.addTab(AppThreeWidget(), "세 번째 프로그램")

        self.setCentralWidget(self.tabs)

 

※ 프로젝트 파일은 별첨 유지