SQLite 데이터베이스 활용: CRUD 작업 구현 🚀

콘텐츠 대표 이미지 - SQLite 데이터베이스 활용: CRUD 작업 구현 🚀

 

 

안녕하세요, 여러분! 오늘은 SQLite 데이터베이스를 활용해서 CRUD 작업을 구현하는 방법에 대해 알아볼 거예요. 이거 완전 꿀팁이에요! 🍯 Java 개발자들이라면 꼭 알아야 할 내용이니까 집중해주세요~

먼저, CRUD가 뭔지 아시나요? Create(생성), Read(읽기), Update(수정), Delete(삭제)의 약자예요. 데이터베이스 조작의 기본 중의 기본이죠. 이걸 SQLite로 구현하면 여러분의 앱이 더욱 강력해질 거예요! 😎

그럼 이제부터 하나씩 파헤쳐볼까요? 준비되셨나요? 레츠고~! 🏃‍♂️💨

1. SQLite 소개 - 가벼운 녀석이 온다! 🏋️‍♂️

SQLite는 경량 데이터베이스 시스템이에요. 무슨 말이냐고요? 간단히 말해서, 가볍고 빠르다는 거죠! 🚀 서버가 필요 없고, 설정도 간단해서 모바일 앱이나 소규모 프로젝트에 딱이에요.

SQLite의 장점:

  • 서버리스 (Serverless): 별도의 서버 프로세스나 시스템이 필요 없어요.
  • 제로 설정 (Zero-configuration): 설치나 관리가 필요 없어요. 그냥 쓰면 돼요!
  • 크로스 플랫폼 (Cross-platform): 여러 운영체제에서 사용할 수 있어요.
  • 자체 포함 (Self-contained): 외부 종속성이 없어요. 독립적이죠!
  • 트랜잭션 지원: ACID(원자성, 일관성, 고립성, 지속성) 속성을 완벽히 지원해요.

ㅋㅋㅋ 완전 개발자 친화적이죠? 이런 특징 때문에 SQLite는 안드로이드 앱 개발에서도 많이 사용돼요. 여러분도 재능넷 같은 플랫폼을 만들 때 SQLite를 활용하면 좋을 거예요! 😉

🔍 재능넷 Tip: 재능넷에서 프로그래밍 관련 재능을 찾아보세요! SQLite 전문가들의 도움을 받을 수 있을지도 몰라요~

자, 이제 SQLite에 대해 알았으니 본격적으로 CRUD 작업을 구현해볼까요? 긴장하지 마세요, 쉽게 설명해드릴게요! 😊

2. SQLite 설정 - 준비운동부터 시작해요! 🤸‍♂️

CRUD 작업을 하기 전에 먼저 SQLite를 설정해야 해요. Java에서 SQLite를 사용하려면 JDBC 드라이버가 필요해요. 이건 마치 Java와 SQLite 사이의 통역사 같은 거예요! 🗣️

SQLite JDBC 드라이버 설치 방법:

  1. SQLite JDBC 드라이버를 다운로드해요. (여기에서 받을 수 있어요)
  2. 다운로드한 JAR 파일을 프로젝트의 클래스패스에 추가해요.
  3. 이제 준비 완료! 👍

Maven을 사용한다면 더 쉽게 할 수 있어요. pom.xml 파일에 다음 의존성을 추가하면 돼요:


<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.36.0.3</version>
</dependency>

버전은 최신 버전으로 바꿔주세요! 항상 최신 버전을 사용하는 게 좋아요. 버그 수정이나 성능 개선이 있을 수 있거든요. 😉

자, 이제 SQLite를 사용할 준비가 됐어요! 어때요? 생각보다 쉽죠? ㅋㅋㅋ

💡 Pro Tip: 프로젝트에 라이브러리를 추가할 때는 항상 버전 호환성을 체크하세요. 가끔 최신 버전이 기존 코드와 충돌할 수 있어요!

다음으로 넘어가기 전에, SQLite 데이터베이스 연결을 위한 기본 코드를 볼까요?


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class SQLiteConnection {
    public static Connection connect() {
        Connection conn = null;
        try {
            // db 파일 경로
            String url = "jdbc:sqlite:C:/sqlite/db/chinook.db";
            // 연결 생성
            conn = DriverManager.getConnection(url);
            
            System.out.println("SQLite에 연결되었습니다.");
            
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        return conn;
    }
}

이 코드는 SQLite 데이터베이스에 연결하는 기본적인 방법을 보여줘요. url 부분에는 여러분의 데이터베이스 파일 경로를 넣으면 돼요. 😊

자, 이제 기본 설정은 끝났어요! 다음 단계로 넘어갈 준비가 됐나요? CRUD 작업의 세계로 들어가볼까요? 가즈아~! 🚀

3. Create 연산 - 새로운 데이터를 만들어볼까요? 🎨

CRUD의 첫 번째 글자, C는 Create를 의미해요. 데이터베이스에 새로운 데이터를 추가하는 거죠. SQL에서는 INSERT 문을 사용해요. 재능넷에서 새로운 사용자를 등록하는 것처럼요! 👤➕

기본적인 INSERT 문 구조:


INSERT INTO 테이블명 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);

자, 이제 Java 코드로 이걸 어떻게 구현하는지 볼까요? 예를 들어, 사용자 테이블에 새 사용자를 추가하는 코드를 작성해볼게요.


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UserDAO {
    public void addUser(String username, String email, String password) {
        String sql = "INSERT INTO users(username, email, password) VALUES(?,?,?)";
        
        try (Connection conn = SQLiteConnection.connect();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, username);
            pstmt.setString(2, email);
            pstmt.setString(3, password);
            pstmt.executeUpdate();
            System.out.println("새 사용자가 추가되었습니다!");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

우와~ 이게 바로 새 사용자를 추가하는 코드예요! 😲 어떤가요? 생각보다 복잡하지 않죠?

🔑 Key Point: PreparedStatement를 사용하면 SQL 인젝션 공격을 방지할 수 있어요. 보안에 좋답니다!

이 코드를 사용하려면 이렇게 하면 돼요:


UserDAO userDAO = new UserDAO();
userDAO.addUser("cooluser", "cool@example.com", "securepassword123");

짜잔~ 이렇게 하면 새로운 사용자가 데이터베이스에 추가돼요! 🎉

근데 잠깐, 여기서 중요한 점! 실제 서비스에서는 절대 비밀번호를 평문으로 저장하면 안 돼요. 꼭 암호화해서 저장해야 해요. 보안은 정말 중요하니까요! 🔒

자, 이제 Create 연산에 대해 알아봤어요. 어때요? 생각보다 쉽죠? ㅋㅋㅋ 다음은 Read 연산으로 넘어가볼까요? 데이터를 읽어오는 방법을 배워볼 거예요. 준비되셨나요? 고고! 🚀

4. Read 연산 - 데이터를 읽어볼까요? 📚

CRUD의 두 번째 글자, R은 Read를 의미해요. 이미 저장된 데이터를 조회하는 거죠. SQL에서는 SELECT 문을 사용해요. 재능넷에서 사용자 정보를 조회하는 것과 같아요! 🕵️‍♀️

기본적인 SELECT 문 구조:


SELECT 컬럼1, 컬럼2, ... FROM 테이블명 WHERE 조건;

자, 이제 Java 코드로 이걸 어떻게 구현하는지 볼까요? 사용자 정보를 조회하는 코드를 작성해볼게요.


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDAO {
    public void getUser(String username) {
        String sql = "SELECT * FROM users WHERE username = ?";
        
        try (Connection conn = SQLiteConnection.connect();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, username);
            ResultSet rs = pstmt.executeQuery();
            
            if (rs.next()) {
                System.out.println("사용자 정보:");
                System.out.println("Username: " + rs.getString("username"));
                System.out.println("Email: " + rs.getString("email"));
                // 비밀번호는 보안상 출력하지 않아요!
            } else {
                System.out.println("해당 사용자를 찾을 수 없습니다.");
            }
            
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

우와~ 이게 바로 사용자 정보를 조회하는 코드예요! 😲 어떤가요? 이해가 되나요?

💡 Pro Tip: ResultSet은 쿼리 결과를 담고 있는 객체예요. next() 메소드를 사용해 결과를 하나씩 확인할 수 있어요!

이 코드를 사용하려면 이렇게 하면 돼요:


UserDAO userDAO = new UserDAO();
userDAO.getUser("cooluser");

짜잔~ 이렇게 하면 "cooluser"라는 사용자의 정보가 출력돼요! 🎉

근데 여기서 한 가지 더! 만약 여러 명의 사용자 정보를 한 번에 조회하고 싶다면 어떻게 해야 할까요? 그럴 땐 이렇게 할 수 있어요:


public List<User> getAllUsers() {
    List<User> users = new ArrayList<>();
    String sql = "SELECT * FROM users";
    
    try (Connection conn = SQLiteConnection.connect();
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
        
        while (rs.next()) {
            User user = new User();
            user.setUsername(rs.getString("username"));
            user.setEmail(rs.getString("email"));
            users.add(user);
        }
        
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    
    return users;
}

이 코드는 모든 사용자의 정보를 List로 반환해요. 완전 편하죠? ㅋㅋㅋ

자, 이제 Read 연산에 대해 알아봤어요. 어때요? 데이터를 조회하는 게 그렇게 어렵지 않죠? 다음은 Update 연산으로 넘어가볼까요? 데이터를 수정하는 방법을 배워볼 거예요. 준비되셨나요? 레츠고! 🚀

5. Update 연산 - 데이터를 수정해볼까요? ✏️

CRUD의 세 번째 글자, U는 Update를 의미해요. 이미 저장된 데이터를 수정하는 거죠. SQL에서는 UPDATE 문을 사용해요. 재능넷에서 사용자가 자신의 프로필 정보를 수정하는 것과 같아요! 🖋️

기본적인 UPDATE 문 구조:


UPDATE 테이블명 SET 컬럼1 = 값1, 컬럼2 = 값2, ... WHERE 조건;

자, 이제 Java 코드로 이걸 어떻게 구현하는지 볼까요? 사용자 정보를 수정하는 코드를 작성해볼게요.


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UserDAO {
    public void updateUserEmail(String username, String newEmail) {
        String sql = "UPDATE users SET email = ? WHERE username = ?";
        
        try (Connection conn = SQLiteConnection.connect();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, newEmail);
            pstmt.setString(2, username);
            int affectedRows = pstmt.executeUpdate();
            
            if (affectedRows > 0) {
                System.out.println("사용자 이메일이 성공적으로 업데이트되었습니다!");
            } else {
                System.out.println("해당 사용자를 찾을 수 없습니다.");
            }
            
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

우와~ 이게 바로 사용자 이메일을 수정하는 코드예요! 😲 어떤가요? 이해가 되나요?

🔍 Key Point: executeUpdate() 메소드는 영향을 받은 행의 수를 반환해요. 이를 통해 업데이트가 성공했는지 확인할 수 있어요!

이 코드를 사용하려면 이렇게 하면 돼요:


UserDAO userDAO = new UserDAO();
userDAO.updateUserEmail("cooluser", "newcool@example.com");

짜잔~ 이렇게 하면 "cooluser"의 이메일이 "newcool@example.com"으로 업데이트돼요! 🎉

근데 여기서 한 가지 더! 만약 여러 개의 정보를 한 번에 업데이트하고 싶다면 어떻게 해야 할까요? 그럴 땐 이렇게 할 수 있어요:


public void updateUser(User user) {
    String sql = "UPDATE users SET email = ?, password = ? WHERE username = ?";
    
    try (Connection conn = SQLiteConnection.connect();
         PreparedStatement pstmt = conn.prepareStatement(sql)) {
        
        pstmt.setString(1, user.getEmail());
        pstmt.setString(2, user.getPassword());  // 실제로는 암호화된 비밀번호를 저장해야 해요!
        pstmt.setString(3, user.getUsername());
        
        int affectedRows = pstmt.executeUpdate();
        
        if (affectedRows > 0) {
            System.out.println("사용자 정보가 성공적으로 업데이트되었습니다!");
        } else {
            System.out.println("해당 사용자를 찾을 수 없습니다.");
        }
        
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
}

이 코드는 사용자의 이메일과 비밀번호를 동시에 업데이트해요. 완전 편하죠? ㅋㅋㅋ

자, 이제 Update 연산에 대해 알아봤어요. 어때요? 데이터를 수정하는 게 그렇게 어렵지 않죠? 다음은 마지막으로 Delete 연산으로 넘어가볼까요? 데이터를 삭제하는 방법을 배워볼 거예요. 준비되셨나요? 고고씽! 🚀

6. Delete 연산 - 데이터를 삭제해볼까요? 🗑️

CRUD의 마지막 글자, D는 Delete를 의미해요. 저장된 데이터를 삭제하는 거죠. SQL에서는 DELETE 문을 사용해요. 재능넷에서 사용자가 자신의 계정을 탈퇴하는 것과 같아요! 😢

기본적인 DELETE 문 구조:


DELETE FROM 테이블명 WHERE 조건;

자, 이제 Java 코드로 이걸 어떻게 구현하는지 볼까요? 사용자 정보를 삭제하는 코드를 작성해볼게요.


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UserDAO {
    public void deleteUser(String username) {
        String sql = "DELETE FROM users WHERE username = ?";
        
        try (Connection conn = SQLiteConnection.connect();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, username);
            int affectedRows = pstmt.executeUpdate();
            
            if (affectedRows > 0) {
                System.out.println("사용자가 성공적으로 삭제되었습니다!");
            } else {
                System.out.println("해당 사용자를 찾을 수 없습니다.");
            }
            
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

우와~ 이게 바로 사용자를 삭제하는 코드예요! 😲 어떤가요? 이해가 되나요?

⚠️ 주의사항: 데이터 삭제는 신중하게 해야 해요! 한 번 삭제된 데이터는 복구하기 어려울 수 있어요.

이 코드를 사용하려면 이렇게 하면 돼요:


UserDAO userDAO = new UserDAO();
userDAO.deleteUser("cooluser");

짜잔~ 이렇게 하면 "cooluser"가 데이터베이스에서 삭제돼요! 🎉 (물론, 실제로는 사용자 확인 절차를 거쳐야 해요!)

근데 여기서 한 가지 더! 만약 특정 조건에 해당하는 모든 사용자를 삭제하고 싶다면 어떻게 해야 할까요? 그럴 땐 이렇게 할 수 있어요:


public void deleteInactiveUsers(int days) {
    String sql = "DELETE FROM users WHERE last_login < date('now', '-' || ? || ' days')";
    
    try (Connection conn = SQLiteConnection.connect();
         PreparedStatement pstmt = conn.prepareStatement(sql)) {
        
        pstmt.setInt(1, days);
        int affectedRows = pstmt.executeUpdate();
        
        System.out.println(affectedRows + "명의 비활성 사용자가 삭제되었습니다.");
        
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
}

이 코드는 마지막 로그인 날짜가 일정 기간 이상 지난 사용자를 모두 삭제해요. 완전 편하죠? ㅋㅋㅋ

자, 이제 Delete 연산에 대해 알아봤어요. 어때요? 데이터를 삭제하는 게 그렇게 어렵지 않죠? 이걸로 CRUD 연산 전체를 다 배웠어요! 👏👏👏

여러분, 정말 대단해요! SQLite로 CRUD 작업을 구현하는 방법을 모두 배웠어요. 이제 여러분도 재능넷 같은 멋진 플랫폼을 만들 수 있을 거예요! 😎

🎉 축하해요: 여러분은 이제 SQLite 마스터예요! CRUD 연산을 자유자재로 다룰 수 있게 됐어요!

다음 섹션에서는 지금까지 배운 내용을 종합해서 실제 프로젝트에 적용하는 방법을 알아볼 거예요. 준비되셨나요? 고고! 🚀

7. 실제 프로젝트 적 용 - 모든 것을 하나로! 🏗️

자, 이제 우리가 배운 모든 것을 하나로 모아볼 시간이에요! 실제 프로젝트에서 CRUD 작업을 어떻게 구현하는지 살펴볼게요. 재능넷 같은 플랫폼을 만든다고 생각해봐요. 어떤 기능이 필요할까요? 🤔

예를 들어, 사용자 관리 시스템을 만들어볼게요. 이 시스템은 다음과 같은 기능을 가질 거예요:

  • 새 사용자 등록 (Create)
  • 사용자 정보 조회 (Read)
  • 사용자 정보 수정 (Update)
  • 사용자 삭제 (Delete)

먼저, 사용자 정보를 담을 User 클래스를 만들어볼게요:


public class User {
    private int id;
    private String username;
    private String email;
    private String password;

    // 생성자, getter, setter 메소드는 생략했어요.
}

그리고 이제 UserDAO 클래스에 CRUD 작업을 모두 구현해볼게요:


import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class UserDAO {
    private Connection connect() {
        // SQLite 연결 코드 (이전에 본 것과 동일)
    }

    public void addUser(User user) {
        String sql = "INSERT INTO users(username, email, password) VALUES(?,?,?)";
        
        try (Connection conn = this.connect();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, user.getUsername());
            pstmt.setString(2, user.getEmail());
            pstmt.setString(3, user.getPassword());
            pstmt.executeUpdate();
            System.out.println("새 사용자가 추가되었습니다!");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }

    public User getUser(String username) {
        String sql = "SELECT * FROM users WHERE username = ?";
        
        try (Connection conn = this.connect();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, username);
            ResultSet rs = pstmt.executeQuery();
            
            if (rs.next()) {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setEmail(rs.getString("email"));
                user.setPassword(rs.getString("password"));
                return user;
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        return null;
    }

    public void updateUser(User user) {
        String sql = "UPDATE users SET email = ?, password = ? WHERE username = ?";
        
        try (Connection conn = this.connect();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, user.getEmail());
            pstmt.setString(2, user.getPassword());
            pstmt.setString(3, user.getUsername());
            pstmt.executeUpdate();
            System.out.println("사용자 정보가 업데이트되었습니다!");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }

    public void deleteUser(String username) {
        String sql = "DELETE FROM users WHERE username = ?";
        
        try (Connection conn = this.connect();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, username);
            pstmt.executeUpdate();
            System.out.println("사용자가 삭제되었습니다!");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }

    public List<User> getAllUsers() {
        List<User> users = new ArrayList<>();
        String sql = "SELECT * FROM users";
        
        try (Connection conn = this.connect();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setEmail(rs.getString("email"));
                user.setPassword(rs.getString("password"));
                users.add(user);
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        return users;
    }
}

우와~ 이게 바로 완전한 CRUD 기능을 갖춘 UserDAO 클래스예요! 😲 어떤가요? 이해가 되나요?

💡 Pro Tip: 실제 프로젝트에서는 비밀번호를 암호화해서 저장해야 해요. 보안은 정말 중요하니까요!

이제 이 UserDAO를 사용해서 사용자 관리 시스템을 구현할 수 있어요. 예를 들어, 이렇게 사용할 수 있죠:


public class UserManagementSystem {
    private UserDAO userDAO = new UserDAO();

    public void registerUser(String username, String email, String password) {
        User newUser = new User();
        newUser.setUsername(username);
        newUser.setEmail(email);
        newUser.setPassword(password);
        userDAO.addUser(newUser);
    }

    public void displayUserInfo(String username) {
        User user = userDAO.getUser(username);
        if (user != null) {
            System.out.println("사용자 정보:");
            System.out.println("Username: " + user.getUsername());
            System.out.println("Email: " + user.getEmail());
        } else {
            System.out.println("사용자를 찾을 수 없습니다.");
        }
    }

    public void updateUserEmail(String username, String newEmail) {
        User user = userDAO.getUser(username);
        if (user != null) {
            user.setEmail(newEmail);
            userDAO.updateUser(user);
        } else {
            System.out.println("사용자를 찾을 수 없습니다.");
        }
    }

    public void deleteUserAccount(String username) {
        userDAO.deleteUser(username);
    }

    public void listAllUsers() {
        List<User> users = userDAO.getAllUsers();
        for (User user : users) {
            System.out.println("Username: " + user.getUsername() + ", Email: " + user.getEmail());
        }
    }
}

짜잔~ 이렇게 하면 완전한 사용자 관리 시스템이 완성돼요! 🎉

이 시스템을 사용하려면 이렇게 하면 돼요:


UserManagementSystem ums = new UserManagementSystem();

// 새 사용자 등록
ums.registerUser("cooluser", "cool@example.com", "securepassword123");

// 사용자 정보 조회
ums.displayUserInfo("cooluser");

// 사용자 이메일 업데이트
ums.updateUserEmail("cooluser", "supercool@example.com");

// 모든 사용자 목록 조회
ums.listAllUsers();

// 사용자 삭제
ums.deleteUserAccount("cooluser");

어때요? 이제 여러분도 SQLite를 사용해서 완전한 CRUD 기능을 갖춘 시스템을 만들 수 있게 됐어요! 👏👏👏

🎓 학습 포인트: 실제 프로젝트에서는 예외 처리, 로깅, 트랜잭션 관리 등 더 많은 것들을 고려해야 해요. 하지만 이 예제를 통해 기본적인 구조를 이해할 수 있죠!

여러분, 정말 대단해요! 이제 SQLite로 CRUD 작업을 구현하는 방법을 완벽히 마스터했어요. 이 지식을 바탕으로 재능넷 같은 멋진 플랫폼을 만들 수 있을 거예요! 😎

다음에는 더 심화된 주제로 나아가볼까요? 예를 들어, 데이터베이스 인덱싱, 트랜잭션 관리, 또는 ORM(Object-Relational Mapping) 사용법 같은 것들이요. 준비되면 언제든 시작해요! 화이팅! 🚀