본문 바로가기
기록 및 문서화/책

객체지향의 사실과 오해 3장 타입과 추상화

by 1005ptr 2021. 12. 2.
반응형

이번에는 오늘 있었던 독서 모임에서 나왔던 이야기들을 정리하려고 한다.

 

1번 내용. 인터페이스 아이템 컨버터

외부 인터페이스 데이터 수신용도의 DTO 클래스가 있고, 이 데이터를 내부에서 사용하기 위한 DTO 클래스가 존재한다.

외부 인터페이스용 DTO와 내부 사용 클래스를 분리하는것은 맞다고 본다.

이유

- 외부 인터페이스의 변화는 우리가 통제할 수 없기 때문

- 한 클래스가 두가지 역할을 하게 되기 때문(하나의 역할을 하는게 명확해서 좋다.)

내부 클래스로 변환하기 위해 코드가 더러워지는 부분이 아쉽다.

둘 사이에 변환시켜주는 컨버터 클래스 또는 빌더 클래스를 만드는것에 대해서 굳이 그렇게까지? 라고 생각한다는 의견

 

나는 반드시 만들어야 한다고 생각한다.

이유

- 특정 외부 서비스와의 인터페이스 처리를 한곳에 모을수 있게 된다.

- 모아둠으로써 인터페이스 변경 발생 시 코드 변경을 최소화 할 수 있다.

- 빌더클래스는 하나의 서비스 단위로 만들어주면 될거 같다.

- 코드가 깔끔해진다. 가독성이 좋아진다.

 

2번 내용. JPA 방식과 현재 우리의 방식 비교

현재 우리는 MyBatis를 쓰고 DTO를 단순히 데이터를 담는 통으로서 사용하고 있다.

기존에는 데이터 변경이 있으면 DTO 밖에서 수정을 가한다. 안에는 변수만 있고 별다른 로직이 없다.

JPA에서는 엔티티 클래스 내부에 데이터 변경 메서드가 존재한다. 데이터 변경은 특정 행위에 따라서 변경되며 행위란 단순히 세터함수가 아니라 비즈니스적인 의미를 가지고있다고 생각하면 된다.

JPA에서 Entity 클래스의 역할은 데이터를 담는 통에서 그치지 않는다는 것.

 

이걸 데이터 관점에서 데이터와 기능을 합쳐서 관리 한다. 뭐 이런 이야기를 했다.

데이터와 기능을 합쳐서 관리한다? 이건 객체지향의 기본 개념이네?

이게 더 객체지향적인 방식이라고 생각이 든다.

 

지금 생각해보니 객체 스스로 판단하고 행동해야 된다고 책에 나오는데

기존의 DTO는 스스로 동작했다고 보기는 힘들다.

엔티티 스스로 자신의 데이터를 관리한다는 데이터 소유와 관리의 주체를 해당 개념 스스로 결정한다.

3번 내용. 책의 설명 용어

책에서 나오는 상태, 행동, 타입에 대응되는 것이 무엇인가?

타입과 클래스가 동등관계가 아니라는 부분

 

타입은 객체들의 행동, 역할을 추상화하여 해당 역할을 수행할 수 있는 경우 해당 타입으로 분류하는 것.

이라고 나는 이해한다.

타입과 클래스의 차이는 이런 타입이라는 개념을 객체지향 언어에서 구현하기 위한 하나의 방식이라는 점

클래스는 순전히 타입을 구현한 것이 아니고, 여러가지 용도를 가지고 있다고 한다.

 

상태는 변수

행동은 메서드

타입은 어떤어떤 행동을 할 수 있는 객체에 대해서 분류하고 추상화한 것

4번 내용. 상태, 변수에 대한 추가 내용

타입은 역할이다. 행동에 따라 결정된다. 객체의 내부 상태에 따라서 타입이 결정되지 않는다.

이 부분은 객체지향 언어인 자바, C# 인터페이스에 변수를 정의할 수 없는 부분에서도 확인할 수 있다.

위에서 상태는 변수라고 헀는데 좀더 정확히 말하자면 상태란 객체의 상태를 이야기하는 것이다.

변수는 멤버 변수, 지역 변수, 전역 변수 등 여러가지로 나뉜다.

여기서 객체의 상태를 나타내는 변수라 하면 멤버 변수를 말한다고 생각한다.

전역 변수는 특정 객체에 상관없이 전역적으로 관리되는 데이터로 만약 이 변수가 변경되는 데이터라면(변수라는 단어 자체가 변경된다는 의미를 담고있긴 하다. 변하지 않는다면 상수라고 해야 되겠다.)

이 전역 변수는 객체의 상태라고는 보기 힘들다고 생각한다.

그런데 만약 전역변수가 객체의 행동에 영향을 끼친다면 전역변수도 마찬가지로 상태인것인데...

 

참고로 지역 변수는 행동중에 실행되고 사라지기 때문에 객체의 상태에는 해당하지 않는다고 생각한다.

 

5번 내용. 용어 이해와 선택

용어 선택에 신경을 쓰자

책으로 개념을 익혔으니까 혼용되는 용어를 의식적으로 구분해서 쓰려고 노력하자.

DTO와 VO의 차이

두 용어 모두 어떤 특징을 가지는 객체들을 분류한다는 점에서 타입처럼 타입을 추상화하는 타입이라는 느낌도 든다.

실제로 대개 DTO 클래스들은 Base~ 라는 이름을 가지는 공통 클래스를 상속하게 된다.

Base DTO 클래스에는 Create, Update, Delete 된 시간, 실행한 사용자 정보 등이 들어가게 된다.

 

DTO와 VO는 데이터를 담는 객체라는 공통점이 있다.

DTO는 Data Transfer Object - 데이터를 운반하는 객체 라고 해석된다.

VO는 Value Object - 값 객체 라고 해석된다. 값처럼 동작하는 객체 라고도 해석된다.

 

DTO는 주로 외부에 데이터를 보내고 받을 때 데이터를 담는 통 느낌으로 사용된다.

VO는 이번에 잘못 설명했는데 값처럼 동작하는 객체라고 한다. 전에 공부했었는데 또 까먹었다.

값처럼 동작한다는 것은

- 기본적으로 객체는 동일한 값을 가지더라도 동등 비교 시 서로 다르다고 인식한다.

- 값 객체는 값이 동일한 경우 두 객체가 같다고 판단하는 객체를 의미한다.

- equals와 hashcode 함수를 오버라이딩해서 값에 따라 동등비교가 되도록 구현한다.

 

반응형

댓글