스터디 노트

스프링 빈, 자바 빈, 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'