자바 혹은 스프링을 공부하다보면 뭐 String은 Immutable하다. 불변 객체이다 등 불변이라는 단어를 자주 들어봤을 것이다.
이러한 내용 속에서 습득하고, 익힌 정보들은 다음과 같다.
객체 지향 프로그래밍에서 정의하는 불변 객체(Immutable object)는 다음과 같다.
1. 불변 객체 ( Immutable Object )
불변 객체는 생성 후 상태를 바꿀 수 없는 객체를 말한다. ( 반대 개념은 가변 객체 )
불변 객체의 장점은 다음과 같다
- 조작의 단순화
- 성능 개선
많은 객체 지향 언어들에서 객체는 참조(reference) 형태로 전달하고 받는다. 그래서 이 참조를 통해 공유돼어 있다면 그 상태가 언제든지 변경될 가능성이 존재한다.
불변 객체는 객체를 복제할 때 객체 전체가 아니라 단순히 참조만 복사하고 끝난다. 참조는 보통 객체 그 자체보다 훨씬 작아서(전형적으로 포인터 크기), 메모리가 절감되며 프로그램의 성능에도 좋다.
가변 객체의 참조는 어떤 위치에서 객체를 변경하게 되면 이 객체를 공유하는 모든 장소에서 영향을 받기에 이슈가 발생할 가능성이 높으며, 추적하기에 어렵다.
불변 객체는 멀티 스레드 프로그래밍에서도 유용하다. 데이터가 불변 객체에 저장돼 있다면 복수의 스레드에 의해서 특정한 스레드의 데이터가 변경될 우려없이 데이터에 접근할 수 있다.
그래서 어떠한 객체의 생성을 고려할 때 불변으로 만들지 가변으로 만들지 고민하게 된다.
DTO 혹은 VO 객체를 만들 때 이러한 고민을 해본 적이 있나? 평소의 '나' 같으면 DTO를 불변객체라고 생각을 해본 적도 없었다.
그래서일까 오늘 발생한 일련의 사건에서 많은 이해의 시간이 필요했고, 사실 아직까지도 크게 막 와닿지 않는다.
평소에 그냥 그렇게 썼으니까, 그러한 부분들이 체화되어 있었는데, 그러한 관점을 깨어버린 하루였다.
DTO? 불변객체? WHY?
2. DTO ( Data Transfer Object )
우리는 이 DTO를 흔히 말해서 그릇이라고 이야기를 한다. (데이터를 담는 그릇)
이 DTO는 데이터 전송 객체이다. 그래서 데이터를 전송하기 위해 생성되는 객체를 말한다. Controller 계층과 Service 계층 사이 데이터를 전달하기 위해 DTO에 데이터를 담아 전달하며 DTO의 내부에는 비즈니스 로직이 아닌 오로지 데이터만 저장할 수 있도록 해야한다.
이 DTO를 효과적으로 사용하기 위해서는 다음과 같은 조건이 있다.
- 상용구 코드를 최소화
- 작성이 용이해야 함
- 읽을 수 있어야 함.
왜 DTO를 불변객체로 만드는 것이 좋을까?
이 DTO 혹은 VO 객체를 생성할 때, Immutable 즉 불변으로 생성한다면 여러가지 장점이 존재한다. 앞서 불변객체에서 언급한 장점들이 여기에 적용되는데, 멀티 쓰레드 환경에서 동기화를 고려할 필요없이 안전하게 사용이 가능하며, 캐싱에서도 유리하다. 또한 프로퍼티의 값이 변화될 일이 없고, 값이 변경되어서는 안되는 객체를 방어적 복사를 하는 거 보다는 애초에 불변객체로 생성 하는것이 성능을 비롯한 여러 가지 장점을 가진다. 재사용도 얼마든지 할 수 있다.
이 entity는 dB라고 생각하면 쉽다. 그래서 엔티티 클래스 내부에셔 요청이나 응답 값을 전달하는 클래스로 사용하면 view가 바뀌면 entity 역시 그에 맞춰서 계속 바꿔줘야한다.
많은 클래스들은 이 entity를 바라보고 있기에 만약에 entity에서 변경이 발생한다면 다른 클래스들 역시 변경을 해줘야 한다는 점이 발생한다. 그래서 만약 데이터를 변경하고 싶다면 비교적 자유로운 DTO 클래스를 이용하는 것이다. 이는 보통 여러 데이터를 join해서 사용하기에 이러한 기능을 entity 하나만으로 처리하기 힘들기 때문이다.
결론 : DTO도 불변객체로 만들어서 사용하기!
참고 :
https://www.okta.com/kr/identity-101/dto
https://shanepark.tistory.com/437
https://studyandwrite.tistory.com/433
'기술면접 관련 및 참고하기' 카테고리의 다른 글
도커(Dokcer)가 뭔데? 도커 사용기 (2) | 2023.03.03 |
---|---|
[ 10분 테코톡 ] - Stream 그리고 For Loop (0) | 2022.12.26 |
나의 고찰 1 - 백엔드 입장에서 보는 유의미한 데이터란?? (봉투패턴) (0) | 2022.12.16 |
웹 애플리케이션의 이해 (0) | 2022.12.08 |
왜 Git의 Commit message는 중요할까?, 좋은 커밋 메시지란? (0) | 2022.12.08 |