-
스프링 빈, 자바 빈, DTO, VO의 차이점과 불변객체(Immutable Object)스터디 노트 2023. 10. 20. 13:19
1. 스프링 빈
스프링 빈은 객체와 이름, 클래스 타임 정보가 스프링 컨테이네로 관리되는 객체를 말합니다.
2. 자바 빈
기본 생성자가 선언되어야 하고, Getter/Setter 팬으로 클래스 내부 속성에 접근이 가능해야 하며 java.io.Serializable을 구현하고 있어야 합니다.
참고로 스프링 빈과 자바 빈은 혼동이 생길 수 있는데 자바 빈은 스프링 빈이 될 수 있어도, 그 반대는 불가능합니다.
3. DTO(Data Transfer Object)
소프트웨어 사이에 데이터를 전달하는 객체를 의미합니다. 특히 내부에 비즈니스 로직이 없는 것을 권장하며 Getter 메소드 정도는 허용할 수 있습니다.
4. VO(Value Object)
특정 데이터를 추상화해 데이터 표현을 하는 객체를 의미하며 equals메소드를 재정의 해 클래스의 값을 서로 비교할 수 있는 기능을 제공하는게 좋습니다.
또한 조회된 Value를 담고 있기 때문에 VO객체 자체는 immutable 속성으로 구현하는게 좋습니다.
불변객체(Immutable Object)
여기서 말하는 불변 속성들은 데이터를 담고 있는 객체(DTO나 VO)를 만들 때 가장 중요한 요점 중 하나입니다.
이를 지킴으로써 멀티쓰레딩 환경에서도 안전하게 데이터를 관리할 수 있기 때문이지요.
즉, 불변객체의 경우 하나의 상태만을 갖고 있기 때문에 데이터를 안전하게 사용할 수 있으며, 외부의 수정에는 닫혀있어야 합니다.
불변 객체를 설계하는 방식은 다음과 같습니다.
- 클래스를 final로 선언합니다.
- 클래스의 멤버변수들을 final로 선언합니다.
- 생성자를 직접 선언하고 기본 생성자는 사용 불가하도록 처리합니다.
- 멤버변수에 setter는 절대 만들지 말고, getter만 구현합니다.
다음은 Lombok 라이브러리를 활용한 불변객체의 예시입니다.
@Getter public final class Bank { private final String address; private final Long volume; public Bank(String address, Long volume) { this.address = address; this.volume = volume; } }
자바는 기본적으로 생성자를 명시적으로 선언하지 않으면 파라미터가 없는 기본 생성자를 제공합니다.
이를 통해 어디서든 해당 객체에 접근하여 새로운 객체를 만들어낼 수 있게됩니다.
이는 객체에 여러 상태를 저장할 수 있게 되며 이는 불변객체라고 부를 수 없습니다.
그렇기 때문에 생성자에 필요한 매개변수를 입력해야지만 객체를 생성할 수 있도록 만들어줍니다.
또한 멤버변수에 대한 Setter 메소드를 제공하지 않으므로 객체를 생성할 때 한 번만 Value를 수정할 수 있게 만들어줍니다.
💡 또한 Class 설계 시 final 키워드를 클래스에 선언해줄 수 있는데, 이를 선언하면 클래스의 상속을 불허하게 됩니다.
즉 메소드 오버라이드를 방지하는 효과를 누릴 수 있게 됩니다.
There is no default constructor available in 'com.my.signservice.Bank'
'스터디 노트' 카테고리의 다른 글
Spring MVC Component의 동작구조(그림주의) (0) 2023.10.23 HTTP Status Code (0) 2023.10.20 Transaction이 뭐길래? (1) 2023.10.19 @RequiredArgsConstructor 가 하는 일 (1) 2023.10.18 스프링 빈 스코프에 대하여 (0) 2023.10.18