Python - What is DTO Class (Getter/Setter) in Python?

2 분 소요

① ② Python

Python에서 DTO 클래스(Getter/Setter)는?

DTO(Data Transfer Object) : 데이터 전송 객체를 의미하며, 계층간 데이터 교환을 위한 자바빈즈를 의미하는 용어로 사용되었다. DTO는 로직을 갖고 있지 않는 순수한 데이터 객체이며, getter/setter 메소드만을 갖는다.

파이썬에서 Getter, Setter는 어떻게 구현하는지 알아본다.

우선 자바의 DTO 구조를 살펴본다. 자바에서 DTO 코드는 다음과 같다.

Java에서 DTO 코드 예제

public class UserDTO {
    private String username;
    private String email;

    public UserDTO(String username, String email) {
        this.username = username;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "UserDTO{" +
                "username='" + username + '\'' +
                ", email='" + email + '\'' +
                '}';
    }

    public static void main(String[] args) {
        UserDTO userDTO = new UserDTO("john_doe", "john@example.com");
        System.out.println(userDTO);
    }
}

파이썬에서 getter, setter

파이썬에서는 속성 접근 제어를 위해 getter/setter 메소드를 명시적으로 정의하지 않는다. 파이썬에서는 속성 시스템을 사용하여 속성에 접근하는 방식을 제어한다.

파이썬 DTO 클래스 예제

class UserDTO:
    # __init__ : 생성자
    # self : 자기 자신을 가리키는 참조자
    # self.username : 인스턴스 변수
    # 파이썬에서 __init__은 생성자로 사용되며, 클래스의 인스턴스가 만들어질 때 한 번만 호출된다.
    def __init__(self, username, email):
        self.username = username
        self.email = email
    
    # 파이썬에서 __str__은 객체를 문자열로 표현할 때 사용한다.
    def __str__(self):
        return f'UserDTO(username={self.username}, email={self.email})'

# Usage
user_data = UserDTO(username='john_doe', email='john@example.com')
print(user_data)

파이썬 Getter, Setter 메소드 구현하기

파이썬에서는 getter/setter 메소드를 일반적인 메소드 형태가 아닌, 데코레이터를 사용하여 메소드를 정의한다.

파이썬 getter/setter 클래스 예제

class UserDTO:
    def __init__(self, username, email, value):
        self._username = username
        self._email = email
        self._value = None
    
    #@property : getter
    @property
    def username(self):
        return self._username

    @property
    def email(self):
        return self._email
    
    @property
    def value(self):
        return self._value

    @value.setter
    def add_value(self, new_value):
        self._value = new_value    

# 클래스 내부에 정의된 메소드는 첫 번째 인자로 항상 인스턴스 자신을 가리키는 self를 전달받는다.
# 클래스를 생성하고, 인스턴스 변수에 접근하려면 인스턴스를 생성해야 한다.
# UserDTO 크래스의 인스턴스를 생성하고, 인스턴스 변수에 접근해보자.
# 매개변수에 값을 전달하지 않으면, 기본값으로 None이 할당된다.
# 여기서 user_data는 UserDTO 클래스의 인스턴스이다.
user_data = UserDTO(username='john_doe', email='john@example.com', value=None)

# getter
# 인스턴스에서 값 가져오기
# 각각의 인스턴스 변수에 접근하기 위해서는 인스턴스 변수 앞에 점(.)을 붙여야 한다.
# 인스턴스 변수에 접근하는 방법은 다음과 같다.
print(user_data.username) 
print(user_data.email)

# setter
# 인스턴스 변수에 값 할당이 되지 않았기 때문에, getter로 정의된 메소드를 호출하면 None이 출력된다.
print(obj.value)  # Output: None

## setter로 정의된 메소드(add_value)를 호출하면, 인스턴스 변수에 값을 할당할 수 있다.
obj.add_value = 42  
print(obj.value)  # Output: 42

댓글남기기