본문 바로가기

CS BASIC/정보시스템 일반

[CS BASIC] 데이터와 다양한 데이터 객체들(DAO, DTO, VO)

개요

데이터의 중요성

 

오늘은 프로그래밍에서 사용 가능한 다양한 객체들의 유형에 대해서 알아보도록 하겠습니다.

프로그램에서 필요한 ‘정보’를 다루는 방법은 정말 다양한데요.

 

단순히 편지의 역할처럼 데이터를 담아서 다른 곳으로 이동하는 역할을 수행시킬수도 있고,

은행 ATM기처럼 데이터가 필요할 때마다 꺼내쓰거나 넣을 수 있도록 특화된 객체도 있습니다.

 

때로는, 공공 기관에서 중요한 정보를 보호하기 위해 읽기 전용으로 제한된 pdf 파일과 같은 객체도 존재합니다.

 

그중에서도 오늘은 객체지향 프로그래밍에서 많이 사용하는 데이터와 관련된 객체들

DAO(Data Access Object), DTO(Data Transfer Object), VO(Value Object)에 대해 알아보도록 하겠습니다.

 

데이터 객체들에 대해서 본격적으로 알아보기 전에!

데이터(Data)가 무엇인지 정말 간단하게 살펴보고 가도록 하겠습니다.

 

데이터(자료, Data)란?

- In computing, data is information that has been translated into a form that is efficient for movement or processing.
- 자료는 문자, 숫자, 소리, 그림, 영상, 단어 등의 형태로 된 의미 단위이다. 
- 보통 연구나 조사 등의 바탕이 되는 재료
- 자료를 의미있게 정리하면 정보가 됨

 

데이터(Data)는 우리 주변에 존재하는 기록할 수 있는 것(The Recordable things)이라고 할 수 있습니다.

 

매일 아침에 알람에 맞춰 눈을 뜰 때에도 우리는 ‘시간’이라는 데이터를 사용하고 있습니다.

또한, 등교나 출근을 하기 위해 대중교통의 위치 정보를 확인할 때에도 ‘위치’라는 정보를 사용하게 되죠.

 

이처럼 정보는 특별히 어딘가에 감춰져서 특수한 절차를 거쳐야만 얻어낼 수 있는 것이 아닌,

마치 공기와도 같이 우리 주변에서 쉽게 수집 가능한 것들이 대부분 입니다.

 

그러나 이러한 데이터는 그 자체만으로는 특별한 의미를 갖기는 어렵기 때문에

보통 유의미한 결과로 해석되어 고객을 맞춤으로 한 서비스를 제공하는 등

등 별도로 가공 및 처리되는 과정을 통해 ‘정보’로 재탄생하게 되어 가치를 갖게 됩니다.

 

데이터는 언제 어디서나 존재하기 때문에 별로 중요하지 않다고 생각이 들 수도 있을 것 같지만,

아무리 주변에서 쉽게 구할 수 있는 데이터라도 특정 사람임을 추정할 수 있고 추적할 수 있게 한다면 

그것은 유의미한 ‘정보’가 되는 것이고 이는 필연적으로 소중히 다뤄져야할 것입니다.

 

인류 사회가 정보화 됨에 따라 데이터의 양은 매우 방대해졌고,

데이터를 분석하는 일은 과거와 달리 매우 거시적인 ‘작업’이 되어서 이제는 별도로 분석을 위한 기법이 연구 되었을 정도이죠. 

 


 

데이터가 많다는 것은 알겠는데, 그러면 데이터는 어디에 저장하죠?

 

이처럼 데이터는 어디서나 수집 가능하지만, 단순히 존재만으로는 가치를 생산하기 어렵기 때문에

오늘날의 프로그램에서는 이러한 데이터를 효율적으로 저장 및 가공할 수 있도록 다양한 프로그램 및 도구들이 만들어졌습니다.

 

컴퓨터 프로그램은 모든 데이터를 0과 1로 이루어진 이진수로 기억하고 계산하기 때문에

컴퓨터에 프로그램으로 전기적 신호를 줘서 정보를 일정한 패턴을 갖게 해서 나중에 해석될 수 있도록 저장할 수도 있습니다.

 

그런데, 이러한 정보를 저장하는 곳에 전류가 끊긴다면, 지금까지 저장된 정보는 모두 사라져 버리는 것일까요?

다행히도 이러한 불행한 일은 일어나지 않았으며, 기록된 데이터가 영구적으로 또 반복적으로 재 사용될 수 있도록 다양한 기술이 훌륭한 과학자 및 엔지니어들에 의해 연구되어있습니다.

 

이 중 가장 대표적인 기술이 ‘데이터베이스(Database)’라고 할 수 있죠.

 

데이터 베이스는 그 자체로 굉장히 다양한 내용을 다룰 수 있기 때문에 오늘은 간단한 설명만 하고 넘어가도록 하겠습니다.

 

데이터 베이스와 같은 도구들은 사람들에게 가치를 생산해줄 수 있는 다양한 데이터를

영구적으로 저장할 수 있도록 특화되어 개발자가 편하게 데이터를 다를 수 있도록 도와줍니다.

 

물론 이렇게 잘 만들어진 데이터 베이스도 천재지변이나 불의의 사고로 인해 물리적으로 파괴되어 버리면 복구할 수 없으니,

이러한 사고를 대비하여 오늘날의 프로그램에서는 다양한 보존 방법,

백업(backup)을 통해 데이터를 나누어 저장하여 사고가 발생하더라도 빠르고 유연하게 대처할 수 있도록 해줍니다.

 

하지만 모든 데이터가 데이터를 영속적으로 저장할 필요는 없을 수도 있습니다.

 

어떤 프로그램이 실행 중인 상황에서만 데이터를 저장했다가, 

프로그램이 종료되거나 전기가 차단되는 상황에서 굳이 데이터를 ‘기억’할 필요가 없을 수도 있습니다.

 

예를 들자면, 계산을 위해 임시로 기억해두던 숫자 데이터가 있는데 계산을 완료한 상황에서는 다른 곳에 데이터를 저장해서 계산을 위해 기억하던 숫자에 대한 데이터까지 기억될 필요가 없다면, 이에 해당한다고 할 수 있겠네요.

 

이처럼 다양한 곳에서 쓰일 수 있는 데이터를 효율적으로 다루기 위해 아래와 같은 다양한 데이터 객체들이 탄생하게. 되었습니다.

 


 

DAO(Data Access Object)

DAO는 데이터 베이스에서 사용하기에 특화된 객체입니다.

 

DAO에 대한 정의를 내리자면, 데이터베이스(Database, DB)에 접근하기 위하여 특화된 자료형 이라고 할 수 있습니다.

DAO는 데이터 베이스에서 수행하는 생성(CREATE), 읽기(READ), 수정(UPDATE), 삭제(DELETE)의 네 가지 작업을 효과적으로 수행할 수 있도록 최적화되어 있습니다.

 

여기서 ‘최적화’라는 의미는 데이터베이스에 데이터를 저장하기 위한 객체로서 개발자가 최소한의 부분만 수정해도 정상적으로 기능을 수행할 수 있다고 설명할 수 있습니다.

 

이게 무슨 소리라고 궁금하시다면, 답변해 드리는 것이 인지상정이죠!

DAO는 자바(Java)나 코틀린(Kotlin)과 같은 언어에서 주로 인터페이스(interface)어노테이션(annotation)이라는 것을 통해서 만들게 되는데요.

 

인터페이스와 어노테이션에 대해서는 자바나 코틀린 문법 관련 포스팅에서 별도로 다루도록 하겠습니다.

(추가적으로 특히 인터페이스와 관련된 포스팅을 작성하게 되면 지금의 포스트에 업데이트 하도록 할 예정입니다.)

 

DAO는 데이터베이스라는 프로그램에서 사용하는 특수한 도구와 데이터를 주고 받기 위해

즉, 데이터 베이스와 통신하기 위한 매개체로 사용하게 됩니다.

 

왜냐하면, 데이터 베이스와 프로그램은 서로 같은 컴퓨터에서 돌아가는 프로그램이라는 점에서 같다고 볼 수 있지만

각자 서로 만들어진 목적에 맞추어 설계 및 개발 됨으로 인해서 같은 데이터라도 서로가 이해하기 더 좋은 방식으로 데이터를 저장 및 다루고 있기 때문입니다.

 

물론, 엄밀히 말하자면 더 많은 설명이 필요하지만 글이 길어질 수 있어서 여기까지만 설명하도록 하겠습니다.

 

그래서 프로그램과 데이터베이스는 서로 통신하기위해 데이터를 바꿔주는 작업,

즉 사람으로 비유하자면 ‘통역’하는 과정이 필요하게 되고

이는 단순하고 반복적인 코드인 보일러 플레이트 코드(boilerplate code)들이 ‘항상’ 필요하게 됩니다.

 

왜냐하면, 통역에서도 마찬가지로 같은 단어는 같은 의미를 품고 있듯이

서로 데이터를 다루는 방법은 다를지라도 결국에는 서로 일정한 ‘패턴’이 존재할 테니 어쩌면 필연적인 결과일지도 모르겠네요.

 

그렇기에 이렇게 반복적이고 동일한 작업에 대해서 대부분의 프로그램 개발 환경 (IDE, Integrated development environment)에서는 프로그램을 실행 또는 빌드(Build)하는 과정에서 자동으로 만들어주도록 기능을 제공하고 있습니다.

 

엄밀히 말하자면, 단순하고 반복적인 코드가 사라지는 것은 아니지만 더이상 개발자가 단순하고 반복적인 일에 집중하지 않아도 되도록 도와준다고 이해하시면 좋겠네요.

 

그렇기 때문에 대부분의 DAO는 이러한 개발을 도와주는 ‘도구’에게 어떤 식으로 만들면 돼~ 하고 안내만 해주면 이해하고 개발자를 대신해서 작업해줄 수 있기 때문에

 

DAO는 인터페이스와 어노테이션이라는 방법을 통해서 만들게 되고 수정하면, 그 기능을 수행할 수 있게 되는 것입니다.

 

구체적인 프로그램 코드와 함께하는 설명은 서버 프로그래밍이나 안드로이드 프로그래밍 관련 포스팅에서 별도로 다뤄보도록 하겠습니다.

 

DAO(Data Access Object)의 예시

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "user_data")

data class User (
    @PrimaryKey(autoGenerate = true) var id: Long? = null,
    @ColumnInfo(name = "user_name") val userName: String,
    @ColumnInfo(name = "age") val age: Int
)

 


 

DTO(Data Transfer Object)

 

DTO는 데이터의 전송에 최적화된 객체입니다.

데이터를 전송하는 일은 간단하게 생각하면 데이터를 ‘기록’하고 ‘인출’하는 기능만 있으면 충분할거에요.

 

즉, 객체지향 언어에서 이러한 ‘기록’은 ‘캡슐화’라는 기법을 통해 setter로 관리되고,’ 인출’ 또는 ‘데이터 꺼내쓰기’는 getter로 관리되는데요.

 

데이터를 주고 받는 과정에서는 굳이 데이터를 가공하고, 계산하는 작업이 필요 없으므로,

계산을 비롯한 데이터 ‘처리’에 대한 기능이 존재하지 않는 ‘객체’를 특별히 DTO(Data Transfer Object)가 만들어지게 된 것입니다.

 

이러한 DTO는 자바에서는 롬복(Lombok)이라는 도구를 통해서 어노테이션(annotaion)이라는 안내서에 따라서

자동으로 ‘기록’하는 setter와 ‘인출’하는 ‘getter’를 자동으로 생성해주기도 합니다.

 

코틀린(Kotlin)과 같은 비교적 최신 프로그래밍 언어에서는 데이터 클래스(Data Class)라는 새로운 문법을 통해 이러한 작업을 대신해주고 있습니다.

 

정말 시간이 갈수록 개발자가 반복적으로 해야할 일이 많이 줄어드니 정말 편리해진 것 같습니다.

 

DTO(Data Transfer Object)의 예시

// Java의 롬복(Lombok)을 사용한 DTO(Data Transfer Object)의 생성

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PersonDTO {

    private String name;
    
    private int age;

}

 

 

// 코틀린의 데이터 클래스(Data Class)
// 굉장히 많은 것이 생략되어 있지만, 이 자체로 getter, setter, toString()등의 메서드가 구현되어 있다.

data class Person(
  val name: String, 
  val age: Int
)

 


 

VO(Value Object)

앞선 설명에서 정말로 중요한 데이터, 예를 들어 공공 기관에서 중요한 정보를 보호하기 위해 읽기 전용으로 제한된 pdf 파일과 같은 데이터를 다루는 객체도 있다고 설명을 드렸습니다.

 

이에 해당하는 경우가 무엇이 있을까요?

 

보다 자세한 설명을 하기 위해서는 비동기(Async)와 스레드(Thread) 그리고 병렬처리에 대한 아주 무거운 내용을 다뤄야할 것 같아서 간단하게 설명을 드려보도록 하겠습니다.

 

컴퓨터는 한 번에 한 가지 작업에만 몰두 할 수도 있고, 여러 가지 작업을 동시에 수행할 수도 있습니다.

마치 사람으로 비유하자면 사람이 돈을 세는 일을 하는데, 손이 한 쌍 뿐이라 한 번에 한 묶음 정도의 돈을 샐 수 있지만

컴퓨터는 필요하다면 자신의 손을 여러 개로 늘려서 동시에 돈을 샐 수도 있는 것이죠.

 

이런데 이러한 상황에서 주의할 것이 있습니다.

 

만일 동시에 돈을 세다가 돈을 어디까지 세었는지 확인하고자 한다면?

 

아무리 동시에 여러 일을 처리하는 것이 좋다고 하지만,

신뢰성과 정확성이 중요한 돈을 세는 일에서 컴퓨터가 돈을 세긴 했는데 그 수치가 정확하지 않고 오차가 있다면?

과연 이때는 컴퓨터가 합리적으로 일을 수행한 것일까요?

 

이처럼 어떠한 상황 속에서도 변하지 않는 고유한 데이터임 믿을 수 있는 것이 필요한 상황이 분명 존재하고,

VO(Value Object)는 이러한 상황 속에서 특히 병렬처리와 비동기 환경에서는

너무나도 사용하기 좋은 데이터를 다루는 ‘도구’가 되는 것입니다.

 

VO(Value Object)의 예시

// 자바의 열거형(enum) 자료형
// 간단한 열거형의 예시 (Days)
    enum Days {
        SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
    }

// Enum 상수 사용 예시
 Days today = Days.WEDNESDAY;

 

// 코틀린(Kotlin)의 열거형(enum) 자료형
// 간단한 열거형 (Days)
enum class Days {
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

// Enum 상수 사용 예시
val today = Days.WEDNESDAY

// Enum 상수 출력
println("Today is: $today")

 

 

참고 자료

https://ko.wikipedia.org/wiki/%EC%9E%90%EB%A3%8C

 

자료 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 데이터는 여기로 연결됩니다. 컴퓨터 과학 용어에 대해서는 데이터 (컴퓨팅) 문서를 참고하십시오. 여러 종류의 자료 중 일부. 자료(資料, data, 데이터, 문화어:

ko.wikipedia.org

https://www.techtarget.com/searchdatamanagement/definition/data

 

What is Data? - Definition from WhatIs.com

This definition explains the meaning of data, which is information that has been translated into a form that supports efficient movement or processing.

www.techtarget.com

https://velog.io/@ha0kim/DAO-DTO-VO-%EC%B0%A8%EC%9D%B4

 

DAO, DTO, VO,Entity 차이

완전 기본

velog.io

https://velog.io/@leesomyoung/Java-DAO-DTO-VO%EC%9D%98-%EA%B0%9C%EB%85%90

 

[Java] DAO, DTO, VO의 개념

1. DAO (Data Access Object) DAO는 Data Access Object의 약자로, DB의 데이터에 접근하기 위한 객체를 가리킨다. DB에 접근하기 위한 로직을 분리하기 위해 사용한다. 직접 DB에 접근하여 data를 삽입, 삭제, 조

velog.io