인증 앱 시작구조 정리
1. 사전준비(DB 연결정보)
<ConfigLoader.h>
#pragma once // 헤더 중복 방지
#include <QString>
#include <QVariant>
#include <QJsonDocument>
#include <QJsonObject>
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QCoreApplication>
struct DbConfig {
QString driver;
QString host;
int port;
QString database;
QString user;
QString password;
QString charset;
};
class ConfigLoader {
public:
static DbConfig load() {
DbConfig cfg;
cfg.driver = "QMYSQL";
cfg.host = "127.0.0.1";
cfg.port = 3306;
cfg.database = "enroll_recognize";
cfg.user = "root";
cfg.password = "Marin0806!"; // ← 하드코딩
cfg.charset = "utf8mb4";
return cfg;
}
};
> DB 정보 하드코딩 후 public으로 선언(DbManager.h에서 사용하기 위함)
<DbManager.h>
#pragma once // 헤더 중복 방지
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QDebug>
#include "ConfigLoader.h"
class DbManager {
public:
explicit DbManager(const QString& connectionName)
: connName(connectionName) {}
bool open() {
if (QSqlDatabase::contains(connName)) {
db = QSqlDatabase::database(connName);
} else {
DbConfig cfg = ConfigLoader::load();
db = QSqlDatabase::addDatabase(cfg.driver, connName);
db.setHostName(cfg.host);
db.setPort(cfg.port);
db.setDatabaseName(cfg.database);
db.setUserName(cfg.user);
db.setPassword(cfg.password);
}
if (!db.open()) {
qCritical() << "[DbManager] Failed to open DB:" << db.lastError().text();
return false;
}
QSqlQuery q(db);
q.exec("SET NAMES utf8mb4");
return true;
}
void close() {
if (db.isValid()) {
db.close();
}
QSqlDatabase::removeDatabase(connName);
}
QSqlDatabase database() const { return db; }
private:
QString connName;
QSqlDatabase db;
};
> ConfigLoader 객체를 사용해서 DB open / close 함수를 정의하여 public으로 선언
> 멤버변수들 중 db를 private로 선언하여 오로지 open / close 함수로만 변경할 수 있도록 은닉화함
2. 생성자 및 소멸자
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
// 1. UI 준비
ui->setupUi(this);
// 2. DB 동적 생성
// db에 이름을 붙이는 이유는 읽기 전용, 쓰기 전용, 다른 db 등 여러 db에 접속할 수 있음을 고려(확장성 고려)
db = new DbManager("RecognizeConnection");
// 2.1 DB의 사용자 얼굴 이미지로 학습
if (trainFromDatabase()) {
setMessage("모델 준비 완료");
} else {
setMessage("모델 준비 실패(등록 데이터 부족 또는 DB 오류)");
}
// 3. 시리얼 포트 연결 시도
if (!openSerial("/dev/rfcomm0", 9600)) {
if (!openSerial(QString(), 9600)) {
openSerial("/dev/ttyACM0", 9600);
}
}
// 4. 카메라 시작
startCamera();
}
MainWindow::~MainWindow() {
// 1. 카메라 종료
stopCamera();
// 2. 시리얼 닫기(MainWindow가 파괴되면서 닫히지만 명시적으로 닫아줌)
if (serial.isOpen()){
serial.close();
}
// 3. DB 동적 해제
if (db){
db->close();
delete db;
db = nullptr;
}
// 4. UI 제거
delete ui;
}
생성자 : UI 준비 -> DB 생성 후 로 사용자 얼굴 학습 -> 시리얼 포트 연결 -> 카메라 시작
소멸자 : 카메라 종료 -> 시리얼 포트 닫기 -> DB 닫기 -> UI 제거
'LMS 7 > 개발일지' 카테고리의 다른 글
| 25.09.15 / 제60회 전국기능경기대회 전시 작품 제작 프로젝트 2팀(안전/보안) / 9일차 (0) | 2025.11.04 |
|---|---|
| 25.09.12 / 제60회 전국기능경기대회 전시 작품 제작 프로젝트 2팀(안전/보안) / 8일차 (0) | 2025.11.04 |
| 25.09.10 / 제60회 전국기능경기대회 전시 작품 제작 프로젝트 2팀(안전/보안) / 6일차 (0) | 2025.11.04 |
| 25.09.09/ 제60회 전국기능경기대회 전시 작품 제작 프로젝트 2팀(안전/보안) / 5일차 (0) | 2025.11.04 |
| 25.09.08 / 제60회 전국기능경기대회 전시 작품 제작 프로젝트 2팀(안전/보안) / 4일차 (0) | 2025.11.04 |