인프런 커뮤니티 질문&답변

info님의 프로필 이미지
info

작성한 질문수

Microservice 내부 아키텍처 와 EventStorming 설계

VO 관련 궁금한점

해결된 질문

작성

·

239

0

VO Money 에서 add(money:Money) 함수에 대해서 궁금합니다.

VO는 불변인데 Money를 초기화 해서 값을 재할당 하는건지 어떤식으로 이해하면 좋을지 궁금합니다.

답변 1

0

han jeong heon님의 프로필 이미지
han jeong heon
지식공유자

안녕하세요

우선 value object의 생명주기는 불변이니 한번에 생성하고, 삭제되는 성격을 가지고 있습니다.

네 그래서 구현한다면 다음과 같이 하면 됩니다.

public class Money {
    public int value;

    // Constructor to initialize the value
    public Money(int value) {
        this.value = value;
    }

    // Method to add the value of another Money object to the current object
    public void add(Money money) {
        this.value += money.value;
    }

    // Main method for testing
    public static void main(String[] args) {
        Money money1 = new Money(10);
        Money money2 = new Money(20);

        System.out.println("Before addition:");
        System.out.println("Money 1 value: " + money1.value);
        System.out.println("Money 2 value: " + money2.value);

        // Add the value of money2 to money1
        money1.add(money2);

        System.out.println("\nAfter addition:");
        System.out.println("Money 1 value: " + money1.value);
        System.out.println("Money 2 value: " + money2.value);
    }
} 
info님의 프로필 이미지
info
질문자

답변 감사합니다.

몇 가지 더 궁금한게 있어서 질문드립니다!


1. 작성해주신 예시는 값을 변경하는데 괜찮은걸까요?? 불변 객체 처럼 취급 하라는 말이 아니였는지 예시에서 코드를 조금 수정했는데 이렇게 이해하면 잘못 이해한 부분인지 궁금합니다.

public final class Money {
    private final int value;

    public Money(int value) {
        this.value = value;
    }

    public Money add(Money money) {
        return new Money(this.value + money.value);
    }

    public int getValue() {
        return value;
   }

    public static void main(String[] args) {
        Money money1 = new Money(10);
        Money money2 = new Money(20);

        System.out.println("Before addition:");
        System.out.println("Money 1 value: " + money1.getValue());
        System.out.println("Money 2 value: " + money2.getValue());

        money1 = money1.add(money2);
        System.out.println("\nAfter addition:");
        System.out.println("Money 1 value: " + money1.getValue());
        System.out.println("Money 2 value: " + money2.getValue());
    }
}
  1. VO는 생성 삭제가 자유롭고 따로 생명주기가 없는줄 알았는데 생명주기가 불면 이라면 이미 만들어진 Entity에서 VO의 값을 변경해야 할 때 Entity가 다시 생성되어야 하는건가요? 아니면 그렇기에 VO의 값을 변경할 수 있는건가요?

     

     

    2-1. https://www.inflearn.com/questions/1124319/vo%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%A7%88%EB%AC%B8%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4 이전 질문에서 값의 수정이 필요하다면 VO 보단 Entity를 고려하라고 말씀해주셨는데 작성해주신 예시와 같이 값을 변경할 수 있다면 Entity를 고려해야 하는 이유도 궁금합니다.

     


    2-2. Entity가 이미 생성이 되었는데 VO는 나중에 생성할 수 있나요?

 

han jeong heon님의 프로필 이미지
han jeong heon
지식공유자

아 죄송합니다. 제가 잘못된 예시를 드렸네요.

수정하신 코드가 맞습니다.

값 객체는 불변이므로 새로운 인스턴스를 반환해야 하는데 코드를 잘못 작성했네요.

public Money add(Money money) {
        return new Money(this.value + money.value);
    }

그리고 2번 질문은 아 제가 생명주기라는 용어를 잘못 사용해서 그런게 느끼신 것 같습니다. 생명주기가 있는 객체가 엔티티고 생명주기가 무의미한 성격을 vo로 모델링 하는 것이 맞습니다.

그리고 엔티티의 속성으로 vo가 정의되었다면 vo 객체를 생성해서 교체 할 수 있습니다.

info님의 프로필 이미지
info

작성한 질문수

질문하기