[Python] VO, DTO, DAO

2023. 5. 22. 15:31

 

아래 소개할 객체는 객체지향 프로그래밍에서 데이터를 캡슐화하여 전달하는 목적으로 사용되는 클래스다.

 

 

객체지향 프로그래밍에서 객체를 만들려면

바로 만들지 못하고 항상 클래스를 만든 후 해당 클래스를 이용해 객체를 만들어야 한다.

 


VO (Value-Object, 값 객체)

주로 데이터의 불변성(immutable)을 강조

데이터의 상태를 나타내기 위한 클래스

VO 클래스의 인스턴스는 한 번 생성되면 그 값을 변경할 수 없음 (읽기만 가능)

class PersonVO:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age

DTO (Data-Transfer-Object, 데이터 전송 객체)

데이터를 전송하고 전달받기 위한 목적으로 사용되는 클래스

로직을 갖고 있지 않은 순수한 데이터 객체

DTO 클래스의 인스턴스는 데이터를 변경할 수 있음 (읽기, 수정 가능)

class PersonDTO:
    def __init__(self):
        self.name = None
        self.age = None

    def get_name(self):
        return self.name

    def set_name(self, name):
        self.name = name

    def get_age(self):
        return self.age

    def set_age(self, age):
        self.age = age

DAO (Data-Access-Object, 데이터 접근 객체)

데이터베이스, 파일 시스템 등과 같은 영구 저장소에 접근해 데이터를 조작하는 역할을 담당하는 객체

비즈니스 로직과 데이터 접근 로직을 분리하기 위해 사용

일반적으로 CRUD 작업을 수행

데이터 엑세스 로직을 캡슐화하고, 클라이언트 코드에서는 DAO메서드를 호출해 데이터 조작을 수행

import sqlite3

class StudentDAO:
    def __init__(self, db_path):
        self.connection = sqlite3.connect(db_path)
        self.cursor = self.connection.cursor()

    def create_student(self, student):
        self.cursor.execute("INSERT INTO students (name, age) VALUES (?, ?)", (student.name, student.age))
        self.connection.commit()

    def get_student(self, student_id):
        self.cursor.execute("SELECT * FROM students WHERE id=?", (student_id,))
        row = self.cursor.fetchone()
        if row:
            student = Student(row[0], row[1], row[2])
            return student
        else:
            return None

    def update_student(self, student):
        self.cursor.execute("UPDATE students SET name=?, age=? WHERE id=?", (student.name, student.age, student.id))
        self.connection.commit()

    def delete_student(self, student_id):
        self.cursor.execute("DELETE FROM students WHERE id=?", (student_id,))
        self.connection.commit()

    def close(self):
        self.cursor.close()
        self.connection.close()