0. 학습 목표

→ 로그인 회원 정보를 JSON 파일로 저장하고, 프로그램 시작 시 다시 불러오는 구조를 학습합니다.

더보기

0.1 이번 글에서 다룰 내용

이번 글에서는 로그인 회원 정보를 JSON 파일로 저장하고 다시 불러오는 방법을 학습합니다.

지난 Model - View Section의 6강. Model/View 과제 구현 에서는 회원 정보를 코드 안에 직접 작성했습니다.

이번에는 회원 정보를 member.json 파일에 저장합니다.

프로필 View에서 회원 정보를 수정하면 Model모델의 값이 바뀌고, 그 값이 파일에도 저장되도록 구현합니다.

Model, Storage, member.json 파일의 역할 구조
구분 내용
핵심 개념 회원 정보를 코드 안에만 두지 않고 JSON 파일로 저장하고 다시 불러옵니다.
실습 준비 PySide6의 QFile, QTextStream과 Python의 json 모듈을 사용합니다.
최종 목표 프로그램을 껐다 켜도 수정된 회원 정보가 member.json 파일을 통해 유지되도록 만듭니다.

이번 단계의 핵심: Model은 회원 데이터를 관리하고, Storage는 회원 데이터를 파일에 저장하고 불러오는 역할을 담당합니다.

 

1. 프로그램을 껐다 켜면 회원 정보가 사라지는 이유

→ 코드 안에만 저장된 회원 정보는 프로그램이 종료되면 수정 상태가 유지되지 않습니다.

더보기

1.1 기존 구현의 회원 정보 저장 방식

지난 구현에서는 회원 정보를 코드 안에 직접 작성했습니다.

예를 들면 아래처럼 딕셔너리 형태로 회원 정보를 만들었습니다.

# 기존 방식

member = {
    "id": "test",
    "pw": "1234",
    "name": "홍길동",
    "email": "test@test.com",
    "phone": "010-1234-5678",
}

이 방식은 Model/View 구조를 처음 이해하기에는 좋습니다.

하지만 프로그램 실행 중 프로필 정보를 수정해도, 프로그램을 종료하면 수정한 내용이 사라집니다.

상황 결과
프로필 View에서 이름 수정 실행 중에는 Model 값이 바뀔 수 있습니다.
프로그램 종료 메모리에 있던 수정 값이 사라집니다.
프로그램 다시 실행 코드 안에 적힌 기본 회원 정보로 다시 시작합니다.

 

1.2 파일 저장이 필요한 이유

수정한 회원 정보를 유지하려면 프로그램 밖에 데이터를 저장해야 합니다.

이번 강의에서는 데이터베이스 대신 JSON 파일을 사용합니다.

JSON은 딕셔너리처럼 key와 value 구조를 표현하기 좋아서 회원 정보 저장에 적합합니다.

# member.json 예시

{
    "id": "test",
    "pw": "1234",
    "name": "홍길동",
    "email": "test@test.com",
    "phone": "010-1234-5678"
}

프로그램이 시작되면 member.json 파일에서 회원 정보를 읽어옵니다.

프로필을 수정하면 Model 값을 바꾸고, 변경된 값을 다시 member.json 파일에 저장합니다.

 

1.3 이번 강의에서 바꿀 구조

코드 내부 저장 방식에서 파일 저장 방식으로 바뀌는 구조

 

기존에는 Model이 회원 정보를 코드 안에서 바로 만들었습니다.

# 기존 구조

MemberModel
    └── 코드 안에 회원 정보 직접 저장

새 구조에서는 파일 저장과 불러오기를 담당하는 MemberStorage를 추가합니다.

# 새 구조

MemberStorage
    ├── member.json 읽기
    └── member.json 저장

MemberModel
    ├── 회원 정보 관리
    ├── 로그인 검사
    └── 프로필 수정

TabWindow
    ├── 로그인 View
    ├── 메인화면 View
    └── 프로필 View

 문제의 핵심: 프로그램이 끝나도 데이터를 유지하려면 Model의 값을 파일에 저장하고, 다음 실행 때 다시 불러와야 합니다.

 

2. 회원 정보를 JSON 파일로 저장하고 불러오기

→ MemberStorage를 만들어 member.json 파일을 읽고 쓰는 기능을 구현합니다.

더보기

2.1 프로젝트 구조 만들기

이번 강의에서는 지난 Model/View 로그인 프로그램 구조를 확장합니다.

회원 정보를 저장하고 불러오는 파일을 따로 만들기 위해 member_storage.py를 추가합니다.

# 프로젝트 구조

tab_login_file_storage/
    ├── main.py
    ├── member_model.py
    ├── member_storage.py
    └── tab_window.py
파일 역할
main.py 프로그램을 실행합니다.
member_model.py 회원 정보 관리, 로그인 검사, 프로필 수정을 담당합니다.
member_storage.py member.json 파일 저장과 불러오기를 담당합니다.
tab_window.py QTabWidget 화면과 버튼 동작을 담당합니다.

 

2.2 member_storage.py 작성하기

먼저 회원 정보를 파일에 저장하고 불러오는 MemberStorage를 만듭니다.

여기서는 QFile과 QTextStream으로 파일을 읽고 쓰고, Python의 json 모듈로 딕셔너리를 JSON 문자열로 바꿉니다.

import json

from PySide6.QtCore import QFile, QIODevice, QTextStream


class MemberStorage:
    """회원 정보를 JSON 파일에 저장하고 불러오는 클래스"""

    def __init__(self, file_path="member.json"):
        self.file_path = file_path

    def default_member(self):
        return {
            "id": "test",
            "pw": "1234",
            "name": "홍길동",
            "email": "test@test.com",
            "phone": "010-1234-5678",
        }

    def load_member(self):
        if not QFile.exists(self.file_path):
            member = self.default_member()
            self.save_member(member)
            return member

        file = QFile(self.file_path)

        if not file.open(QIODevice.OpenModeFlag.ReadOnly | QIODevice.OpenModeFlag.Text):
            return self.default_member()

        stream = QTextStream(file)
        json_text = stream.readAll()
        file.close()

        try:
            return json.loads(json_text)
        except json.JSONDecodeError:
            return self.default_member()

    def save_member(self, member):
        file = QFile(self.file_path)

        if not file.open(QIODevice.OpenModeFlag.WriteOnly | QIODevice.OpenModeFlag.Text):
            return False

        stream = QTextStream(file)
        stream << json.dumps(member, ensure_ascii=False, indent=4)
        file.close()

        return True

이 클래스는 화면을 전혀 모릅니다.

QLineEdit, QPushButton 같은 GUI 코드는 들어가지 않습니다.

오직 파일을 읽고 쓰는 역할만 담당합니다.

메서드 역할
default_member() member.json 파일이 없을 때 사용할 기본 회원 정보를 만듭니다.
load_member() member.json 파일에서 회원 정보를 읽습니다.
save_member() 회원 정보를 member.json 파일에 저장합니다.

 

2.3 member.json 파일 생성 결과

프로그램을 처음 실행했을 때 member.json 파일이 없으면 기본 회원 정보를 파일로 저장합니다.

생성되는 member.json 파일은 아래와 비슷합니다.

# member.json

{
    "id": "test",
    "pw": "1234",
    "name": "홍길동",
    "email": "test@test.com",
    "phone": "010-1234-5678"
}

이제 회원 정보는 코드 안에만 있는 것이 아니라 실제 파일로 저장됩니다.

핵심 확인: MemberStorage는 회원 정보를 파일에 저장하고 불러오는 역할만 담당합니다.

 

3. 로그인 Model에 파일 저장 기능 연결하기

→ MemberModel이 MemberStorage를 사용해 회원 정보를 불러오고 저장하도록 연결합니다.

더보기

3.1 member_model.py 수정하기

이제 MemberModel이 회원 정보를 직접 만들지 않도록 수정합니다.

대신 MemberStorage에서 회원 정보를 불러옵니다.

from member_storage import MemberStorage


class MemberModel:
    """회원 정보 관리, 로그인 검사, 프로필 수정을 담당하는 클래스"""

    def __init__(self):
        self.storage = MemberStorage()
        self.member = self.storage.load_member()
        self.is_logged_in = False

    def check_login(self, user_id, user_pw):
        if user_id == self.member["id"] and user_pw == self.member["pw"]:
            self.is_logged_in = True
            return True

        return False

    def get_member_info(self):
        if not self.is_logged_in:
            return None

        return {
            "id": self.member["id"],
            "name": self.member["name"],
            "email": self.member["email"],
            "phone": self.member["phone"],
        }

    def update_profile(self, name, email, phone):
        if not self.is_logged_in:
            return False

        self.member["name"] = name
        self.member["email"] = email
        self.member["phone"] = phone

        return self.storage.save_member(self.member)

MemberModel은 이제 시작할 때 member.json 파일에서 회원 정보를 읽습니다.

프로필을 수정하면 self.member 값이 바뀌고, save_member()를 통해 파일에도 저장됩니다.

코드 역할
self.storage = MemberStorage() 파일 저장/불러오기 도구를 준비합니다.
self.storage.load_member() member.json 파일에서 회원 정보를 읽습니다.
check_login() 입력한 ID/PW와 Model의 회원 정보를 비교합니다.
update_profile() Model 값을 수정하고 파일에도 저장합니다.

 

3.2 update_profile()의 저장 흐름

프로필 수정에서 가장 중요한 코드는 update_profile()입니다.

self.member["name"] = name
self.member["email"] = email
self.member["phone"] = phone

return self.storage.save_member(self.member)

앞의 세 줄은 Model 안의 회원 정보를 수정합니다.

마지막 줄은 수정된 회원 정보를 member.json 파일에 저장합니다.

그래서 프로그램을 종료하고 다시 실행해도 수정된 값이 유지됩니다.

프로필 수정 후 member.json 파일에 저장되는 흐름

주의할 점: 프로필 View에서 입력값만 바꾸고 파일에 저장하지 않으면, 프로그램을 다시 실행했을 때 수정 내용이 유지되지 않습니다.

 

4. 화면 코드에서 Model을 함께 사용하기

→ 로그인 View, 메인화면 View, 프로필 View가 하나의 MemberModel을 공유하도록 구성합니다.

더보기

4.1 tab_window.py 전체 코드

이제 화면을 구성하는 tab_window.py를 작성합니다.

기본 구조는 지난 Model/View 구현과 거의 같습니다.

달라진 점은 MemberModel 안에서 파일 저장 기능까지 처리된다는 것입니다.

from PySide6.QtWidgets import (
    QWidget,
    QTabWidget,
    QLabel,
    QLineEdit,
    QPushButton,
    QVBoxLayout,
    QHBoxLayout,
)


class LoginView(QWidget):
    def __init__(self, member_model, tab_widget, main_view, profile_view):
        super().__init__()

        self.member_model = member_model
        self.tab_widget = tab_widget
        self.main_view = main_view
        self.profile_view = profile_view

        self.id_input = QLineEdit()
        self.id_input.setPlaceholderText("아이디를 입력하세요")

        self.pw_input = QLineEdit()
        self.pw_input.setPlaceholderText("비밀번호를 입력하세요")
        self.pw_input.setEchoMode(QLineEdit.EchoMode.Password)

        self.message_label = QLabel("로그인 정보를 입력하세요.")

        self.login_button = QPushButton("로그인")
        self.login_button.clicked.connect(self.login)

        layout = QVBoxLayout()
        layout.addWidget(QLabel("[로그인]"))
        layout.addWidget(QLabel("아이디"))
        layout.addWidget(self.id_input)
        layout.addWidget(QLabel("비밀번호"))
        layout.addWidget(self.pw_input)
        layout.addWidget(self.login_button)
        layout.addWidget(self.message_label)

        self.setLayout(layout)

    def login(self):
        user_id = self.id_input.text()
        user_pw = self.pw_input.text()

        if self.member_model.check_login(user_id, user_pw):
            self.message_label.setText("로그인 성공!")

            self.main_view.refresh()
            self.profile_view.refresh()

            self.tab_widget.setCurrentIndex(1)
        else:
            self.message_label.setText("로그인 실패! 아이디 또는 비밀번호를 확인하세요.")


class MainView(QWidget):
    def __init__(self, member_model):
        super().__init__()

        self.member_model = member_model

        self.title_label = QLabel("[메인화면] 로그인한 회원 정보")
        self.id_label = QLabel("아이디:")
        self.name_label = QLabel("이름:")
        self.email_label = QLabel("이메일:")
        self.phone_label = QLabel("전화번호:")

        layout = QVBoxLayout()
        layout.addWidget(self.title_label)
        layout.addWidget(self.id_label)
        layout.addWidget(self.name_label)
        layout.addWidget(self.email_label)
        layout.addWidget(self.phone_label)

        self.setLayout(layout)

    def refresh(self):
        member = self.member_model.get_member_info()

        if member is None:
            return

        self.id_label.setText(f"아이디: {member['id']}")
        self.name_label.setText(f"이름: {member['name']}")
        self.email_label.setText(f"이메일: {member['email']}")
        self.phone_label.setText(f"전화번호: {member['phone']}")


class ProfileView(QWidget):
    def __init__(self, member_model, main_view):
        super().__init__()

        self.member_model = member_model
        self.main_view = main_view

        self.id_label = QLabel("아이디:")

        self.name_input = QLineEdit()
        self.email_input = QLineEdit()
        self.phone_input = QLineEdit()

        self.update_button = QPushButton("수정하기")
        self.update_button.clicked.connect(self.update_profile)

        self.message_label = QLabel("프로필 정보를 확인하거나 수정하세요.")

        layout = QVBoxLayout()
        layout.addWidget(QLabel("[프로필]"))
        layout.addWidget(self.id_label)

        name_layout = QHBoxLayout()
        name_layout.addWidget(QLabel("이름"))
        name_layout.addWidget(self.name_input)

        email_layout = QHBoxLayout()
        email_layout.addWidget(QLabel("이메일"))
        email_layout.addWidget(self.email_input)

        phone_layout = QHBoxLayout()
        phone_layout.addWidget(QLabel("전화번호"))
        phone_layout.addWidget(self.phone_input)

        layout.addLayout(name_layout)
        layout.addLayout(email_layout)
        layout.addLayout(phone_layout)
        layout.addWidget(self.update_button)
        layout.addWidget(self.message_label)

        self.setLayout(layout)

    def refresh(self):
        member = self.member_model.get_member_info()

        if member is None:
            return

        self.id_label.setText(f"아이디: {member['id']}")
        self.name_input.setText(member["name"])
        self.email_input.setText(member["email"])
        self.phone_input.setText(member["phone"])

    def update_profile(self):
        name = self.name_input.text()
        email = self.email_input.text()
        phone = self.phone_input.text()

        success = self.member_model.update_profile(name, email, phone)

        if success:
            self.refresh()
            self.main_view.refresh()
            self.message_label.setText("프로필 정보가 수정되고 파일에 저장되었습니다.")
        else:
            self.message_label.setText("프로필 정보를 수정할 수 없습니다.")


class TabWindow(QWidget):
    def __init__(self, member_model):
        super().__init__()

        self.setWindowTitle("로그인 정보 파일 저장")
        self.resize(420, 320)

        self.member_model = member_model
        self.tab_widget = QTabWidget()

        self.main_view = MainView(self.member_model)
        self.profile_view = ProfileView(self.member_model, self.main_view)
        self.login_view = LoginView(
            self.member_model,
            self.tab_widget,
            self.main_view,
            self.profile_view,
        )

        self.tab_widget.addTab(self.login_view, "로그인")
        self.tab_widget.addTab(self.main_view, "메인화면")
        self.tab_widget.addTab(self.profile_view, "프로필")

        layout = QVBoxLayout()
        layout.addWidget(self.tab_widget)

        self.setLayout(layout)

 

4.2 하나의 MemberModel을 공유하는 부분

TabWindow는 MemberModel을 하나만 받습니다.

그리고 MainView, ProfileView, LoginView에 같은 Model을 전달합니다.

self.main_view = MainView(self.member_model)
self.profile_view = ProfileView(self.member_model, self.main_view)
self.login_view = LoginView(
    self.member_model,
    self.tab_widget,
    self.main_view,
    self.profile_view,
)

이 구조 덕분에 세 View가 같은 회원 정보를 공유합니다.

그리고 프로필 수정 시 MemberModel이 파일 저장까지 처리합니다.

TabWindow가 하나의 MemberModel을 여러 View에 전달하는 구조

중요: View마다 MemberModel을 새로 만들면 파일 저장 구조가 꼬일 수 있습니다. 반드시 하나의 MemberModel을 공유해야 합니다.

 

5. main.py에서 프로그램 실행하기

→ QApplication을 만들고 MemberModel과 TabWindow를 연결해 프로그램을 실행합니다.

더보기

5.1 main.py 작성하기

마지막으로 main.py를 작성합니다.

main.py에서는 QApplication을 만들고, MemberModel과 TabWindow를 생성합니다.

import sys

from PySide6.QtWidgets import QApplication

from member_model import MemberModel
from tab_window import TabWindow


app = QApplication(sys.argv)

member_model = MemberModel()
window = TabWindow(member_model)
window.show()

sys.exit(app.exec())

 

5.2 실행 방법

터미널에서 프로젝트 폴더로 이동한 뒤 아래 명령어를 실행합니다.

python main.py

프로그램이 실행되면 로그인, 메인화면, 프로필 탭이 있는 창이 열립니다.

처음 실행할 때 member.json 파일이 없으면 자동으로 생성됩니다.

 

5.3 실행 전 파일 위치 확인

파일 이름과 위치가 아래처럼 되어 있는지 확인합니다.

# 실행 전 확인

tab_login_file_storage/
    ├── main.py
    ├── member_model.py
    ├── member_storage.py
    └── tab_window.py

주의할 점: 파일 이름이 다르면 import 부분에서 오류가 날 수 있습니다. 파일 이름을 main.py, member_model.py, member_storage.py, tab_window.py로 맞춰 주세요.

 

6. 로그인 정보 저장 흐름 확인하기

→ 로그인, 프로필 수정, 파일 저장, 다시 실행 후 불러오기 흐름을 확인합니다.

더보기

6.1 처음 실행할 때의 흐름

프로그램을 처음 실행하면 MemberModel이 MemberStorage를 만듭니다.

MemberStorage는 member.json 파일이 있는지 확인합니다.

파일이 없으면 기본 회원 정보를 만들고 member.json 파일로 저장합니다.

# 처음 실행 흐름

프로그램 실행
    ↓
MemberModel 생성
    ↓
MemberStorage 생성
    ↓
member.json 파일 존재 여부 확인
    ↓
파일이 없으면 기본 회원 정보 생성
    ↓
member.json 파일로 저장
    ↓
회원 정보를 Model에 저장

 

6.2 프로필 수정 후 저장 흐름

프로필 View에서 이름, 이메일, 전화번호를 수정합니다.

수정하기 버튼을 누르면 MemberModel의 update_profile()이 호출됩니다.

# 프로필 수정 후 저장 흐름

프로필 View에서 이름, 이메일, 전화번호 입력
    ↓
수정하기 버튼 클릭
    ↓
MemberModel.update_profile() 호출
    ↓
Model의 회원 정보 변경
    ↓
MemberStorage.save_member() 호출
    ↓
member.json 파일에 저장
    ↓
메인화면 View와 프로필 View 갱신

 

6.3 다시 실행할 때의 흐름

프로그램을 종료한 뒤 다시 실행하면 member.json 파일이 이미 존재합니다.

이때는 기본값을 새로 만들지 않고, 파일에 저장된 회원 정보를 다시 읽어옵니다.

# 다시 실행할 때의 흐름

프로그램 다시 실행
    ↓
MemberModel 생성
    ↓
MemberStorage.load_member() 호출
    ↓
member.json 파일 읽기
    ↓
이전에 수정한 회원 정보 불러오기
    ↓
로그인 후 화면에 표시

핵심 확인: 프로필을 수정한 뒤 프로그램을 껐다 켜도 수정된 값이 유지되면 파일 저장과 불러오기가 제대로 동작한 것입니다.

 

7. 실행 결과 확인하기

→ member.json 파일 생성, 프로필 수정, 다시 실행 후 유지 여부를 확인합니다.

더보기

7.1 로그인 정보 입력

프로그램을 실행한 뒤 아래 로그인 정보를 입력합니다.

항목 입력값
아이디 test
비밀번호 1234

로그인에 성공하면 메인화면 탭으로 이동합니다.

 

7.2 프로필 수정 입력 예시

프로필 탭에서 아래처럼 정보를 수정해 봅니다.

# 수정 입력 예시

이름: 김철수
이메일: kim@test.com
전화번호: 010-9999-8888

수정하기 버튼을 누르면 프로필 정보가 수정되고 파일에 저장됩니다.

프로젝트 폴더의 member.json 파일을 열어 보면 아래처럼 값이 바뀐 것을 확인할 수 있습니다.

# 수정 후 member.json 예시

{
    "id": "test",
    "pw": "1234",
    "name": "김철수",
    "email": "kim@test.com",
    "phone": "010-9999-8888"
}

 

7.3 프로그램을 다시 실행해서 확인하기

이제 프로그램을 종료한 뒤 다시 실행합니다.

다시 로그인하면 코드 안의 기본값이 아니라 member.json에 저장된 값이 화면에 표시되어야 합니다.

# 다시 실행 후 메인화면 결과

[메인화면] 로그인한 회원 정보

아이디: test
이름: 김철수
이메일: kim@test.com
전화번호: 010-9999-8888

이 결과가 보이면 파일 저장과 불러오기가 정상적으로 동작한 것입니다.

 

7.4 확인 체크리스트

아래 항목을 직접 확인합니다.

확인 항목 완료
프로그램 첫 실행 시 member.json 파일이 생성되는가?
로그인 성공 시 메인화면으로 이동하는가?
프로필 View에서 이름, 이메일, 전화번호를 수정할 수 있는가?
수정하기 버튼을 누르면 member.json 파일 내용이 바뀌는가?
프로그램을 다시 실행해도 수정된 정보가 유지되는가?
View가 파일을 직접 다루지 않고 Model과 Storage를 통해 처리하는가?

 

8. 코드 내부 저장 방식과 파일 저장 방식 비교하기

→ 회원 정보를 코드 안에 두는 방식과 JSON 파일에 저장하는 방식을 비교하고 정리합니다.

더보기

8.1 기존 방식

기존 방식은 회원 정보를 코드 안에 직접 작성하는 구조입니다.

# 기존 구조

MemberModel
    └── 코드 안의 딕셔너리로 회원 정보 관리

이 방식은 간단하지만 프로그램을 종료하면 수정한 내용이 유지되지 않습니다.

 

8.2 새 방식

새 방식은 회원 정보를 member.json 파일에 저장하고 다시 불러오는 구조입니다.

# 새 구조

MemberStorage
    └── member.json 읽기/쓰기

MemberModel
    └── MemberStorage를 사용해 회원 정보 관리

View
    └── MemberModel을 통해 회원 정보 사용

이 방식에서는 프로그램이 종료되어도 수정한 내용이 파일에 남아 있습니다.

다시 실행하면 member.json 파일에서 이전 값을 불러올 수 있습니다.

구분 기존 방식 새 방식
저장 위치 코드 안의 딕셔너리 member.json 파일
프로그램 종료 후 유지 수정 내용이 유지되지 않습니다. 파일에 저장된 값은 다시 불러올 수 있습니다.
수정 반영 실행 중 Model 값만 바뀝니다. Model 값과 파일 값이 함께 바뀝니다.
확장 방향 간단한 예제에 적합합니다. 여러 회원, CSV, 데이터베이스 저장으로 확장하기 좋습니다.

 

8.3 최종 구조 정리

이번 강의에서 만든 최종 구조는 다음과 같습니다.

# 최종 구조

main.py
    ↓
TabWindow 생성
    ↓
MemberModel 생성
    ↓
MemberModel이 MemberStorage 사용
    ↓
MemberStorage가 member.json 읽기/쓰기
    ↓
View는 MemberModel을 통해 회원 정보 사용

이 구조에서 View는 파일 저장 방법을 직접 알 필요가 없습니다.

View는 Model에게 회원 정보 수정을 요청하고, Model이 Storage를 통해 파일 저장을 처리합니다.

구성 요소 역할
TabWindow QTabWidget 화면과 View 연결을 담당합니다.
MemberModel 회원 정보 관리, 로그인 검사, 프로필 수정을 담당합니다.
MemberStorage member.json 파일 저장과 불러오기를 담당합니다.
member.json 프로그램 밖에 저장되는 회원 정보 파일입니다.

 

8.4 최종 정리

이번 글에서는 로그인 Model의 회원 정보를 JSON 파일에 저장하고 다시 불러오는 구조를 만들었습니다.

핵심 내용 정리
문제 파악 코드 안에만 저장된 회원 정보는 프로그램을 다시 실행하면 수정 상태가 유지되지 않습니다.
문제 해결 MemberStorage를 만들어 member.json 파일에 회원 정보를 저장하고 다시 불러왔습니다.
코드 분석 MemberModel이 MemberStorage를 사용해 파일 읽기/쓰기 기능을 연결하는 흐름을 살펴봤습니다.
비교 정리 코드 내부 저장 방식은 단순하고, 파일 저장 방식은 수정 내용을 유지할 수 있습니다.

기억할 문장: Model 데이터가 프로그램 종료 후에도 유지되려면 파일이나 데이터베이스 같은 외부 저장소에 저장해야 합니다.

 

8.5 프로젝트 파일

656.zip
0.01MB

 

참고. 공식 문서로 확인하기

→ QFile, QTextStream, JSON 저장 방식의 자세한 내용은 공식 문서에서 확인합니다.

더보기

참고 문서

이번 글에서 사용한 QFile, QTextStream, json 모듈은 아래 문서에서 자세히 확인할 수 있습니다.

참고: 이번 강의에서는 회원 1명의 정보를 JSON 파일로 저장했습니다. 다음 단계에서는 비밀번호와 같은 민감한 정보를 암호화하고, 여러 회원 목록, 회원가입, CSV 저장, 데이터베이스 저장으로 확장할 수 있습니다.