쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
구매 만족 후기
추천 재능
















           
0, 마케팅위너

         
232, 씨쏘네임



136, 삼월




81, 21030
해당 지식과 관련있는 인기재능

안녕하세요.신호처리를 전공한 개발자 입니다. 1. 영상신호처리, 생체신호처리 알고리즘 개발2. 안드로이드 앱 개발 3. 윈도우 프로그램...

 운영하는 사이트 주소가 있다면 사이트를 안드로이드 앱으로 만들어 드립니다.기본 5000원은 아무런 기능이 없고 단순히 html 페이지를 로딩...

 안녕하세요. 안드로이드 기반 개인 앱, 프로젝트용 앱부터 그 이상 기능이 추가된 앱까지 제작해 드립니다.  - 앱 개발 툴: 안드로이드...

소개안드로이드 기반 어플리케이션 개발 후 서비스를 하고 있으며 스타트업 경험을 통한 앱 및 서버, 관리자 페이지 개발 경험을 가지고 있습니다....

Qt 모바일 앱에서 데이터베이스 활용: SQLite 연동

2025-01-16 00:19:15

재능넷
조회수 333 댓글수 0

Qt 모바일 앱에서 데이터베이스 활용: SQLite 연동 🚀📱

콘텐츠 대표 이미지 - Qt 모바일 앱에서 데이터베이스 활용: SQLite 연동

 

 

안녕, 친구들! 오늘은 정말 재미있고 유용한 주제로 이야기를 나눠볼 거야. 바로 Qt 모바일 앱에서 SQLite 데이터베이스를 어떻게 활용하는지에 대해서 말이야. 😎 이 주제는 프로그램 개발 카테고리의 모바일/앱 분야에 속하는 내용이니까, 모바일 앱 개발에 관심 있는 친구들은 귀 쫑긋 세워봐!

우리가 일상적으로 사용하는 스마트폰 앱들, 예를 들어 메모 앱이나 할 일 목록 앱 같은 것들은 어떻게 우리가 입력한 정보를 저장하고 있을까? 바로 이런 앱들 대부분이 SQLite라는 작고 강력한 데이터베이스를 사용하고 있어. 오늘은 이 SQLite를 Qt 기반의 모바일 앱에 어떻게 연동하고 활용하는지 알아볼 거야. 재능넷에서도 이런 기술을 활용해서 사용자들의 정보를 안전하게 저장하고 관리하고 있다는 사실, 알고 있었어? 😉

💡 알아두면 좋은 팁: SQLite는 서버가 필요 없는 경량 데이터베이스 시스템이야. 그래서 모바일 앱에서 특히 인기가 많지. 왜냐하면 별도의 설정 없이도 앱 내에서 바로 사용할 수 있거든!

자, 이제 본격적으로 Qt 모바일 앱에서 SQLite를 어떻게 활용하는지 하나씩 알아보자. 준비됐어? 그럼 출발~! 🚗💨

1. SQLite란 무엇일까? 🤔

SQLite는 작고 빠르며 신뢰할 수 있는 SQL 데이터베이스 엔진이야. '작다'는 말에 속지 마. 이 녀석, 엄청난 능력자라고! 😎

  • 서버리스(Serverless): 별도의 서버 프로세스나 시스템이 필요 없어.
  • 제로 구성(Zero-configuration): 설치나 관리가 필요 없어. 그냥 사용하면 돼!
  • 크로스 플랫폼(Cross-platform): 거의 모든 플랫폼에서 동작해. 윈도우, 맥, 리눅스, 안드로이드, iOS 등등.
  • 자체 포함(Self-contained): 외부 의존성이 거의 없어. 그래서 앱에 쉽게 포함시킬 수 있지.
  • 트랜잭션(Transactional): ACID를 완벽하게 지원해. (뭔 소린지 모르겠다고? 걱정 마, 나중에 설명해줄게 😉)

SQLite는 마치 스위스 군용 칼 같아. 작지만 다재다능하고, 어디서나 유용하게 쓸 수 있지. 재능넷 같은 플랫폼에서도 이런 특성을 활용해서 사용자 데이터를 효율적으로 관리할 수 있어.

🎨 재미있는 사실: SQLite는 '공공영역(Public Domain)'에 있어. 이게 무슨 뜻이냐고? 누구나 자유롭게 사용할 수 있다는 거지! 상업용이든 비상업용이든 제한 없이 말이야. cool하지 않아? 😎

자, 이제 SQLite가 뭔지 대충 감이 왔지? 그럼 이제 Qt와 어떻게 연동하는지 알아보자고!

2. Qt에서 SQLite 설정하기 🛠️

Qt에서 SQLite를 사용하려면 먼저 몇 가지 설정이 필요해. 걱정 마, 어렵지 않아! 그냥 따라오기만 해.

2.1 Qt 프로젝트 설정

먼저 Qt 프로젝트의 .pro 파일을 열고 다음 라인을 추가해줘야 해:

QT += sql

이렇게 하면 Qt의 SQL 모듈을 프로젝트에 포함시키는 거야. SQL 모듈은 데이터베이스 작업을 위한 클래스들을 제공해주지.

2.2 필요한 헤더 파일 포함하기

이제 소스 파일에서 필요한 헤더들을 포함시켜야 해. 주로 이런 것들이 필요할 거야:

#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>

이 헤더 파일들은 데이터베이스 연결, 쿼리 실행 등의 기능을 제공해줘.

2.3 데이터베이스 연결 설정

이제 실제로 SQLite 데이터베이스에 연결을 설정해보자. 보통 이런 식으로 해:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("myapp.db");

if (!db.open()) {
    qDebug() << "데이터베이스 연결 실패!";
} else {
    qDebug() << "데이터베이스 연결 성공!";
}

이 코드는 'myapp.db'라는 이름의 SQLite 데이터베이스 파일을 생성하거나 열어. 파일이 없으면 새로 만들고, 있으면 그걸 열지.

💡 꿀팁: 모바일 앱에서는 보통 앱의 문서 디렉토리에 데이터베이스 파일을 저장해. 이렇게 하면 앱이 삭제될 때 데이터베이스도 함께 삭제되니까 깔끔하지!

여기까지 했다면 기본적인 설정은 끝났어! 이제 SQLite를 사용할 준비가 된 거지. 어때, 생각보다 쉽지? 😉

다음 섹션에서는 실제로 데이터를 어떻게 저장하고 불러오는지 알아볼 거야. 재능넷에서도 이런 방식으로 사용자 정보나 재능 거래 내역 같은 걸 저장하고 관리할 수 있을 거야. 궁금하지? 그럼 계속 따라와!

3. 데이터 저장하기 (INSERT) 💾

자, 이제 우리의 앱에 실제로 데이터를 저장해보자! SQLite에서 데이터를 저장하는 건 INSERT 쿼리를 사용해. 근데 걱정 마, 생각보다 어렵지 않아!

3.1 테이블 생성하기

데이터를 저장하기 전에 먼저 테이블을 만들어야 해. 테이블은 데이터를 구조화해서 저장하는 곳이야. 예를 들어, 사용자 정보를 저장하는 테이블을 만들어보자:

QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS users ("
           "id INTEGER PRIMARY KEY AUTOINCREMENT,"
           "username TEXT NOT NULL,"
           "email TEXT NOT NULL,"
           "age INTEGER"
           ")");

이 쿼리는 'users'라는 테이블을 만들어. 각 사용자는 고유한 id, 사용자 이름(username), 이메일(email), 나이(age)를 가지게 돼.

🎈 재미있는 사실: 'IF NOT EXISTS'라는 구문을 봤어? 이건 테이블이 이미 있으면 새로 만들지 않겠다는 뜻이야. 이렇게 하면 앱을 여러 번 실행해도 테이블이 중복으로 생성되지 않아. 똑똑하지? 😏

3.2 데이터 삽입하기

이제 테이블에 실제 데이터를 넣어보자. INSERT 쿼리를 사용할 거야:

QSqlQuery query;
query.prepare("INSERT INTO users (username, email, age) "
              "VALUES (:username, :email, :age)");
query.bindValue(":username", "cooluser");
query.bindValue(":email", "cool@example.com");
query.bindValue(":age", 25);

if (query.exec()) {
    qDebug() << "데이터 삽입 성공!";
} else {
    qDebug() << "데이터 삽입 실패:" << query.lastError().text();
}

여기서 'prepare'와 'bindValue'를 사용한 이유가 뭘까? 이건 SQL 인젝션이라는 보안 위협을 방지하기 위해서야. 안전하고 효율적인 방법이지!

3.3 여러 데이터 한 번에 삽입하기

때로는 여러 개의 데이터를 한 번에 넣고 싶을 때가 있지? 그럴 땐 이렇게 할 수 있어:

QSqlQuery query;
query.prepare("INSERT INTO users (username, email, age) "
              "VALUES (:username, :email, :age)");

QVariantList usernames, emails, ages;
usernames << "user1" << "user2" << "user3";
emails << "user1@example.com" << "user2@example.com" << "user3@example.com";
ages << 20 << 25 << 30;

query.bindValue(":username", usernames);
query.bindValue(":email", emails);
query.bindValue(":age", ages);

if (query.execBatch()) {
    qDebug() << "여러 데이터 삽입 성공!";
} else {
    qDebug() << "데이터 삽입 실패:" << query.lastError().text();
}

이 방법을 사용하면 한 번의 쿼리로 여러 개의 데이터를 삽입할 수 있어. 효율적이지?

💡 프로 팁: 대량의 데이터를 삽입할 때는 트랜잭션을 사용하면 더 빠르게 처리할 수 있어. 트랜잭션은 여러 작업을 하나의 작업처럼 묶어주는 거야. 나중에 자세히 설명해줄게!

자, 이제 데이터를 저장하는 방법을 배웠어! 재능넷에서도 이런 식으로 새로운 사용자 정보나 재능 정보를 데이터베이스에 저장할 수 있을 거야. 멋지지 않아? 😎

다음 섹션에서는 저장한 데이터를 어떻게 불러오는지 알아볼 거야. 궁금하지? 그럼 계속 따라와!

4. 데이터 불러오기 (SELECT) 🔍

데이터를 저장했으니, 이제 그 데이터를 불러올 차례야! SQLite에서 데이터를 불러오는 건 SELECT 쿼리를 사용해. 어렵지 않으니까 걱정 마!

4.1 모든 데이터 불러오기

먼저, users 테이블의 모든 데이터를 불러오는 방법을 알아보자:

QSqlQuery query("SELECT * FROM users");
while (query.next()) {
    int id = query.value(0).toInt();
    QString username = query.value(1).toString();
    QString email = query.value(2).toString();
    int age = query.value(3).toInt();

    qDebug() << "ID:" << id << "Username:" << username 
             << "Email:" << email << "Age:" << age;
}

이 코드는 users 테이블의 모든 레코드를 가져와서 출력해. 'query.next()'는 다음 레코드로 이동하는 함수야. 레코드가 없을 때까지 계속 반복하는 거지.

4.2 특정 조건으로 데이터 불러오기

때로는 특정 조건에 맞는 데이터만 불러오고 싶을 때가 있어. 예를 들어, 나이가 25살 이상인 사용자만 불러오고 싶다면:

QSqlQuery query;
query.prepare("SELECT * FROM users WHERE age >= :age");
query.bindValue(":age", 25);

if (query.exec()) {
    while (query.next()) {
        qDebug() << "Username:" << query.value("username").toString()
                 << "Age:" << query.value("age").toInt();
    }
} else {
    qDebug() << "쿼리 실행 실패:" << query.lastError().text();
}

여기서도 prepare와 bindValue를 사용했어. 안전하고 효율적인 방법이라는 걸 기억해!

4.3 정렬해서 데이터 불러오기

데이터를 특정 순서로 정렬해서 불러오고 싶을 때는 ORDER BY를 사용해:

QSqlQuery query("SELECT * FROM users ORDER BY age DESC");
while (query.next()) {
    qDebug() << "Username:" << query.value("username").toString()
             << "Age:" << query.value("age").toInt();
}

이 쿼리는 사용자를 나이 순으로 내림차순 정렬해서 가져와. 'DESC'를 'ASC'로 바꾸면 오름차순 정렬이 돼.

🎓 알아두면 좋은 점: Qt에서는 모델-뷰 아키텍처를 지원해. QSqlTableModel이나 QSqlQueryModel을 사용하면 데이터베이스의 데이터를 UI와 쉽게 연동할 수 있어. 나중에 UI를 만들 때 유용하게 쓸 수 있을 거야!

4.4 집계 함수 사용하기

데이터의 통계를 내고 싶을 때는 집계 함수를 사용할 수 있어. 예를 들어, 사용자들의 평균 나이를 구해보자:

QSqlQuery query("SELECT AVG(age) as average_age FROM users");
if (query.next()) {
    qDebug() << "평균 나이:" << query.value("average_age").toDouble();
}

이외에도 COUNT(), SUM(), MIN(), MAX() 등의 집계 함수를 사용할 수 있어.

4.5 LIKE를 사용한 검색

특정 패턴의 데이터를 찾고 싶을 때는 LIKE를 사용해. 예를 들어, 이메일이 'example.com'으로 끝나는 사용자를 찾아보자:

QSqlQuery query;
query.prepare("SELECT * FROM users WHERE email LIKE :pattern");
query.bindValue(":pattern", "%example.com");

if (query.exec()) {
    while (query.next()) {
        qDebug() << "Username:" << query.value("username").toString()
                 << "Email:" << query.value("email").toString();
    }
}

여기서 '%'는 어떤 문자열이든 올 수 있다는 와일드카드 문자야.

자, 이제 데이터를 불러오는 다양한 방법을 배웠어! 재능넷에서도 이런 방식으로 사용자 정보를 검색하거나, 특정 조건의 재능을 찾아낼 수 있을 거야. 예를 들어, 특정 카테고리의 재능만 보여주거나, 가격순으로 재능을 정렬해서 보여줄 수 있겠지? 😉

다음 섹션에서는 저장된 데이터를 어떻게 수정하는지 알아볼 거야. 기대되지 않아? 그럼 계속 가보자고!

5. 데이터 수정하기 (UPDATE) ✏️

자, 이제 우리가 저장한 데이터를 수정하는 방법을 알아볼 차례야. 사람들의 정보는 항상 변할 수 있으니까, 이 기능은 정말 중요해!

5.1 기본적인 데이터 수정

SQLite에서 데이터를 수정할 때는 UPDATE 쿼리를 사용해. 예를 들어, 특정 사용자의 나이를 변경하고 싶다면 이렇게 할 수 있어:

QSqlQuery query;
query.prepare("UPDATE users SET age = :new_age WHERE username = :username");
query.bindValue(":new_age", 26);
query.bindValue(":username", "cooluser");

if (query.exec()) {
    qDebug() << "데이터 수정 성공!";
} else {
    qDebug() << "데이터 수정 실패:" << query.lastError().text();
}

이 쿼리는 'cooluser'라는 사용자의 나이를 26으로 변경해. WHERE 절은 정말 중요해. 이걸 빼먹으면 모든 사용자의 나이가 26으로 변경될 거야. 조심해야 해!

5.2 여러 필드 동시에 수정하기

한 번에 여러 필드를 수정하고 싶을 때도 있지? 그럴 땐 이렇게 해:

QSqlQuery query;
query.prepare("UPDATE users SET email = :new_email, age = :new_age "
              "WHERE username = :username");
query.bindValue(":new_email", "supercool@example.com");
query.bindValue(":new_age", 27);
query.bindValue(":username", "cooluser");

if (query.exec()) {
    qDebug() << "여러 필드 수정 성공!";
} else {
    qDebug() << "데이터 수정 실패:" << query.lastError().text();
}

이렇게 하면 한 번의 쿼리로 이메일과 나이를 동시에 수정할 수 있어. 효율적이지?

5.3 조건부 업데이트

때로는 특정 조건을 만족할 때만 데이터를 수정하고 싶을 수 있어. 예를 들어, 나이가 30 미만인 사용자의 이메일 도메인을 변경하고 싶다면:

QSqlQuery query;
query.prepare("UPDATE users SET email = REPLACE(email, '@old.com', '@new.com') "
              "WHERE age < :age");
query.bindValue(":age", 30);

if (query.exec()) {
    qDebug() << "조건부 업데이트 성공!";
} else {
    qDebug() << "데이터 수정 실패:" << query.lastError().text();
}

이 쿼리는 30세 미만 사용자의 이메일에서 '@old.com'을 '@new.com'으로 바꿔. REPLACE 함수를 사용해서 문자열을 교체하는 거야.

🎭 재미있는 사실: SQL의 UPDATE 문은 실제로 데이터를 '수정'하는 게 아니라, 기존 데이터를 삭제하고 새 데이터를 추가하는 방식으로 동작해. 하지만 우리 눈에는 그냥 수정된 것처럼 보이지!

5.4 안전한 업데이트 방법

데이터를 수정할 때는 항상 주의해야 해. 실수로 모든 데이터를 변경하거나, 잘못된 데이터로 업데이트하면 큰일 나니까! 그래서 트랜잭션을 사용하는 게 좋아:

QSqlDatabase::database().transaction();

QSqlQuery query;
query.prepare("UPDATE users SET age = :new_age WHERE username = :username");
query.bindValue(":new_age", 28);
query.bindValue(":username", "cooluser");

if (query.exec()) {
    if (QSqlDatabase::database().commit()) {
        qDebug() << "트랜잭션 커밋 성공!";
    } else {
        qDebug() << "트랜잭션 커밋 실패:" << QSqlDatabase::database().lastError().text();
    }
} else {
    QSqlDatabase::database().rollback();
    qDebug() << "쿼리 실행 실패, 롤백됨:" << query.lastError().text();
}

트랜잭션을 사용하면, 모든 작업이 성공적으로 완료될 때만 변경사항이 적용돼. 중간에 문제가 생기면 모든 변경사항이 취소되는 거지. 안전하고 믿음직스럽지?

자, 이제 데이터를 수정하는 방법을 배웠어! 재능넷에서도 이런 방식으로 사용자 프로필을 업데이트하거나, 재능 정보를 수정할 수 있을 거야. 예를 들어, 사용자가 자신의 스킬 레벨을 올리거나, 재능의 가격을 조정할 때 이런 UPDATE 쿼리를 사용할 수 있겠지? 😉

다음 섹션에서는 데이터를 삭제하는 방법에 대해 알아볼 거야. 준비됐니? 그럼 계속 가보자!

6. 데이터 삭제하기 (DELETE) 🗑️

때로는 데이터를 완전히 삭제해야 할 때가 있어. 예를 들어, 사용자가 계정을 탈퇴하거나, 오래된 데이터를 정리할 때 말이야. SQLite에서 데이터를 삭제할 때는 DELETE 쿼리를 사용해. 자, 어떻게 하는지 알아보자!

6.1 기본적인 데이터 삭제

특정 사용자를 삭제하고 싶다면 이렇게 할 수 있어:

QSqlQuery query;
query.prepare("DELETE FROM users WHERE username = :username");
query.bindValue(":username", "byeuser");

if (query.exec()) {
    qDebug() << "데이터 삭제 성공!";
} else {
    qDebug() << "데이터 삭제 실패:" << query.lastError().text();
}

이 쿼리는 'byeuser'라는 사용자를 데이터베이스에서 완전히 삭제해. 여기서도 WHERE 절이 정말 중요해. 이걸 빼먹으면... 음, 모든 사용자가 사라질 거야. 그러니까 정말 조심해야 해! 😱

6.2 조건부 삭제

특정 조건을 만족하는 데이터만 삭제하고 싶을 때도 있어. 예를 들어, 1년 이상 로그인하지 않은 사용자를 삭제하고 싶다면:

QSqlQuery query;
query.prepare("DELETE FROM users WHERE last_login < :old_date");
query.bindValue(":old_date", QDateTime::currentDateTime().addYears(-1));

if (query.exec()) {
    qDebug() << "오래된 사용자 삭제 성공!";
} else {
    qDebug() << "데이터 삭제 실패:" << query.lastError().text();
}

이 쿼리는 마지막 로그인 시간이 1년 이상 지난 사용자를 모두 삭제해. 데이터 정리에 유용하지?

6.3 관련 데이터 삭제 (외래 키 사용)

데이터베이스에서 테이블 간의 관계를 설정했다면, 한 테이블의 데이터를 삭제할 때 관련된 다른 테이블의 데이터도 함께 삭제할 수 있어. 이걸 '캐스케이드 삭제'라고 해. 예를 들어, 사용자를 삭제할 때 그 사용자의 모든 게시물도 함께 삭제하고 싶다면:

// 테이블 생성 시 외래 키 설정
QSqlQuery query;
query.exec("CREATE TABLE posts ("
           "id INTEGER PRIMARY KEY AUTOINCREMENT,"
           "user_id INTEGER,"
           "content TEXT,"
           "FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE"
           ")");

// 사용자 삭제 (관련 게시물도 함께 삭제됨)
query.prepare("DELETE FROM users WHERE id = :user_id");
query.bindValue(":user_id", 123);
query.exec();

이렇게 하면 사용자를 삭제할 때 해당 사용자의 모든 게시물도 자동으로 삭제돼. 편리하지?

⚠️ 주의사항: 데이터를 삭제하는 건 되돌릴 수 없는 작업이야. 그래서 실수로 중요한 데이터를 삭제하지 않도록 항상 주의해야 해. 가능하다면 삭제 전에 백업을 만들어두는 것도 좋은 방법이야!

6.4 소프트 삭제 (Soft Delete)

때로는 데이터를 실제로 삭제하지 않고, 삭제된 것처럼 표시만 하고 싶을 때가 있어. 이걸 '소프트 삭제'라고 해. 이렇게 하면 나중에 필요할 때 데이터를 복구할 수 있지. 예를 들어:

// 테이블에 is_deleted 컬럼 추가
QSqlQuery query;
query.exec("ALTER TABLE users ADD COLUMN is_deleted BOOLEAN DEFAULT 0");

// 소프트 삭제 실행
query.prepare("UPDATE users SET is_deleted = 1 WHERE id = :user_id");
query.bindValue(":user_id", 123);
query.exec();

// 삭제되지 않은 사용자만 조회
query.exec("SELECT * FROM users WHERE is_deleted = 0");

이 방법을 사용하면 데이터를 실제로 삭제하지 않고도 삭제된 것처럼 처리할 수 있어. 재능넷 같은 서비스에서는 이 방법이 유용할 수 있어. 사용자가 실수로 계정을 삭제했다가 다시 복구하고 싶어할 수도 있으니까!

자, 이제 데이터를 삭제하는 다양한 방법을 배웠어! 재능넷에서도 이런 방식으로 불필요한 데이터를 정리하거나, 사용자 요청에 따라 계정을 삭제할 수 있을 거야. 하지만 항상 신중하게 사용해야 한다는 걸 잊지 마!

다음 섹션에서는 지금까지 배운 내용을 종합해서 실제 앱에서 어떻게 활용할 수 있는지 예제를 통해 알아볼 거야. 기대되지? 그럼 계속 가보자고! 🚀

7. 실전 예제: 재능넷 앱 만들기 🌟

자, 이제 우리가 배운 모든 것을 활용해서 간단한 재능넷 앱을 만들어볼 거야. 이 앱에서는 사용자가 자신의 재능을 등록하고, 다른 사용자의 재능을 검색하고, 평가할 수 있게 할 거야. 재밌겠지? 😄

7.1 데이터베이스 설계

먼저 필요한 테이블을 만들어보자:

QSqlQuery query;

// 사용자 테이블
query.exec("CREATE TABLE IF NOT EXISTS users ("
           "id INTEGER PRIMARY KEY AUTOINCREMENT,"
           "username TEXT UNIQUE NOT NULL,"
           "email TEXT UNIQUE NOT NULL,"
           "password TEXT NOT NULL,"
           "created_at DATETIME DEFAULT CURRENT_TIMESTAMP"
           ")");

// 재능 테이블
query.exec("CREATE TABLE IF NOT EXISTS talents ("
           "id INTEGER PRIMARY KEY AUTOINCREMENT,"
           "user_id INTEGER,"
           "title TEXT NOT NULL,"
           "description TEXT,"
           "price REAL,"
           "created_at DATETIME DEFAULT CURRENT_TIMESTAMP,"
           "FOREIGN KEY(user_id) REFERENCES users(id)"
           ")");

// 리뷰 테이블
query.exec("CREATE TABLE IF NOT EXISTS reviews ("
           "id INTEGER PRIMARY KEY AUTOINCREMENT,"
           "talent_id INTEGER,"
           "reviewer_id INTEGER,"
           "rating INTEGER CHECK(rating >= 1 AND rating <= 5),"
           "comment TEXT,"
           "created_at DATETIME DEFAULT CURRENT_TIMESTAMP,"
           "FOREIGN KEY(talent_id) REFERENCES talents(id),"
           "FOREIGN KEY(reviewer_id) REFERENCES users(id)"
           ")");

이렇게 세 개의 테이블을 만들었어. users 테이블은 사용자 정보를, talents 테이블은 등록된 재능 정보를, reviews 테이블은 재능에 대한 리뷰 정보를 저장해.

7.2 사용자 등록 기능

새로운 사용자를 등록하는 함수를 만들어보자:

bool registerUser(const QString &username, const QString &email, const QString &password) {
    QSqlQuery query;
    query.prepare("INSERT INTO users (username, email, password) "
                  "VALUES (:username, :email, :password)");
    query.bindValue(":username", username);
    query.bindValue(":email", email);
    query.bindValue(":password", password);  // 실제로는 비밀번호를 해시화해서 저장해야 해!

    return query.exec();
}

이 함수를 사용하면 새로운 사용자를 쉽게 등록할 수 있어. 실제 앱에서는 비밀번호를 안전하게 해시화해서 저장해야 한다는 걸 잊지 마!

7.3 재능 등록 기능

사용자가 자신의 재능을 등록할 수 있는 함수를 만들어보자:

bool registerTalent(int userId, const QString &title, const QString &description, double price) {
    QSqlQuery query;
    query.prepare("INSERT INTO talents (user_id, title, description, price) "
                  "VALUES (:user_id, :title, :description, :price)");
    query.bindValue(":user_id", userId);
    query.bindValue(":title", title);
    query.bindValue(":description", description);
    query.bindValue(":price", price);

    return query.exec();
}

이 함수를 사용하면 사용자가 자신의 재능을 쉽게 등록할 수 있어.

7.4 재능 검색 기능

특정 키워드로 재능을 검색하는 함수를 만들어보자:

QList<qmap qvariant>> searchTalents(const QString &keyword) {
    QList<qmap qvariant>> results;
    QSqlQuery query;
    query.prepare("SELECT t.id, t.title, t.description, t.price, u.username "
                  "FROM talents t JOIN users u ON t.user_id = u.id "
                  "WHERE t.title LIKE :keyword OR t.description LIKE :keyword");
    query.bindValue(":keyword", "%" + keyword + "%");

    if (query.exec()) {
        while (query.next()) {
            QMap<qstring qvariant> talent;
            talent["id"] = query.value("id");
            talent["title"] = query.value("title");
            talent["description"] = query.value("description");
            talent["price"] = query.value("price");
            talent["username"] = query.value("username");
            results.append(talent);
        }
    }

    return results;
}
</qstring></qmap></qmap>

이 함수는 키워드를 받아서 제목이나 설명에 해당 키워드가 포함된 모든 재능을 검색해줘. 결과는 리스트 형태로 반환되니까 UI에서 쉽게 표시할 수 있을 거야.

7.5 리뷰 등록 기능

사용자가 재능에 대한 리뷰를 남길 수 있는 함수를 만들어보자:

bool addReview(int talentId, int reviewerId, int rating, const QString &comment) {
    QSqlQuery query;
    query.prepare("INSERT INTO reviews (talent_id, reviewer_id, rating, comment) "
                  "VALUES (:talent_id, :reviewer_id, :rating, :comment)");
    query.bindValue(":talent_id", talentId);
    query.bindValue(":reviewer_id", reviewerId);
    query.bindValue(":rating", rating);
    query.bindValue(":comment", comment);

    return query.exec();
}

이 함수를 사용하면 사용자가 특정 재능에 대해 평점과 코멘트를 남길 수 있어.

7.6 재능 상세 정보 조회

특정 재능의 상세 정보와 리뷰를 함께 조회하는 함수를 만들어보자:

QMap<qstring qvariant> getTalentDetails(int talentId) {
    QMap<qstring qvariant> result;
    QSqlQuery query;
    
    // 재능 정보 조회
    query.prepare("SELECT t.*, u.username FROM talents t "
                  "JOIN users u ON t.user_id = u.id WHERE t.id = :talent_id");
    query.bindValue(":talent_id", talentId);
    
    if (query.exec() && query.next()) {
        result["id"] = query.value("id");
        result["title"] = query.value("title");
        result["description"] = query.value("description");
        result["price"] = query.value("price");
        result["username"] = query.value("username");
    }
    
    // 리뷰 정보 조회
    QList<qmap qvariant>> reviews;
    query.prepare("SELECT r.*, u.username FROM reviews r "
                  "JOIN users u ON r.reviewer_id = u.id WHERE r.talent_id = :talent_id");
    query.bindValue(":talent_id", talentId);
    
    if (query.exec()) {
        while (query.next()) {
            QMap<qstring qvariant> review;
            review["rating"] = query.value("rating");
            review["comment"] = query.value("comment");
            review["reviewer"] = query.value("username");
            reviews.append(review);
        }
    }
    
    result["reviews"] = QVariant::fromValue(reviews);
    return result;
}
</qstring></qmap></qstring></qstring>

이 함수는 특정 재능의 상세 정보와 함께 해당 재능에 대한 모든 리뷰를 함께 반환해. UI에서 이 정보를 사용해서 재능의 상세 페이지를 구성할 수 있을 거야.

💡 프로 팁: 실제 앱에서는 이런 데이터베이스 작업을 별도의 클래스나 모듈로 분리하는 것이 좋아. 이렇게 하면 코드 관리가 쉬워지고, 나중에 데이터베이스를 변경하거나 확장할 때도 편리해.

자, 이제 우리는 재능넷 앱의 기본적인 백엔드 기능을 모두 구현했어! 이 함수들을 사용해서 사용자 인터페이스를 만들면, 멋진 재능 거래 플랫폼이 완성될 거야. 사용자들은 자신의 재능을 등록하고, 다른 사람의 재능을 검색하고, 리뷰를 남길 수 있게 되었어.

이 예제를 통해 SQLite 데이터베이스를 Qt 모바일 앱에서 어떻게 활용하는지 실제로 볼 수 있었지? 물론 실제 앱에서는 더 많은 기능과 보안 처리, 에러 핸들링 등이 필요하겠지만, 기본적인 구조는 이런 식이야.

여기까지 왔다면, 넌 이제 Qt와 SQLite를 사용해서 간단한 데이터베이스 기반의 모바일 앱을 만들 수 있는 능력을 갖췄어! 정말 대단해! 👏👏👏

더 궁금한 점이 있거나, 다른 기능을 추가하고 싶다면 언제든 물어봐. 난 항상 여기 있을 테니까! 화이팅! 🚀

관련 키워드

  • Qt
  • SQLite
  • 모바일 앱
  • 데이터베이스
  • CRUD 연산
  • 트랜잭션
  • 쿼리
  • 바인딩
  • 모델-뷰 아키텍처
  • 재능 거래 플랫폼

지적 재산권 보호

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2025 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

안녕하세요. 경력 8년차 프리랜서 개발자 입니다.피쳐폰 2g 때부터 지금까지 모바일 앱 개발을 전문적으로 진행해 왔으며,신속하 정확 하게 의뢰하...

IOS/Android/Win64/32(MFC)/MacOS 어플 제작해드립니다.제공된 앱의 화면은 아이폰,아이패드,안드로이드 모두  정확하게 일치합니...

📚 생성된 총 지식 13,203 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2025 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창