DTO, VO, DAO..
모두 Object, 즉 객체이다.
특별한 목적을 가지고 생성되는 객체이다.
DTO는 계층형 구조를 가진 웹 서버에서, Trasfer의 역할을,
VO는 불변하는 값을 표현하기위한 역할,
DAO는 DB 접근과 관련한 역할을 수행한다.
비슷하게 보이지만 객체는 상태와 행동을 가진 어떤 것이며, '이 객체들은 서로 소통하며 각자의 역할을 수행한다.' 결국 다 이 셋은 확실하게 구분되는 개념이다.
서비스를 개발한다고 생각해보자,
다음의 두가지 요구 사항이있다.
1) 회원가입할 때 주소 입력.
2) 기숙사 입학생의 가산점 계산을 위해 기숙사와 본가와의 거리를 구하는 객체가 존재(계산의 어려움때문에 '동' 기준으로 획일화)
<DTO>
엔티이에 이 두가지 기능을 구현한다고 생각해보자.
먼저 1번의 경우에는 이대로 구현할 수 있을 수도 있다. 하지만 요구사항이 변해서 주소 객체를 항상 전부 다 사용하는 것이 아니라 가공해야 한다던가, 주소 객체중 한두개 멤버 변수만 사용한다고 한다면 새로 만들어줘야할 수도 있다. 그렇게 되면 엔티티는 매~우 지전분해질 수 밖에 없다. 그렇기 때문에 이를 중간에서 표현해주며 view단이나 service, controller 단에서 처리해줄 객체가 필요하다. 이것이 바로 DTO다.
2번의 경우에도 비슷하다 본가의 거리를 구하는데 상세 주소정보는 필요하지 않다. 이럴 때는 DTO를 쓰면 여러 요구사항에 맞는 데이터 전송이 가능하다. 엔티티의 순수성을 그대로 보존할 수 있다.
<VO>
2번의 경우,
부산광역시 서면 = 10점
서울특별시 이태원 = 1점
이런식으로 학교 기준으로 변하지 않는 값을 만들어 넣을 수 있다. 이게바로 불변 값이다.
근데 이 vo를 사용할 때 주의할 점이 있다
바로 ==을 사용할 때
==은 객체가 동일한 객체인지 확인하는 연산자이다 그래서 객체의 내용이 같아도 참조하고 있는 주소값이 다르면 다른 값으로 나타낸다.
그래서 동등성 비교인 equals를 사용해줘야하는데, equals는 내용을 기준으로 검사를 하는데, 어떤 내용에 대해서 같은지 판단하려면 override를 해줘야한다.
그리고 컬렉션을 사용하면 컬렉션에서 동등성 비교할 때 hashcode기준으로 비교하기 때문에 hashcode도 오버라이딩해줄 필요가 있다.
1. 해쉬코드
2. VO DTO
https://jbb9229.github.io/blog/202003/value-object
'스프링 > MVC' 카테고리의 다른 글
Spring MVC - 포워드와 리다이렉트 forward , redirect (0) | 2021.12.30 |
---|