inflearn logo
강의

講義

知識共有

オブジェクト - 設計原則編

セクション4 クイズ

4-2 값 객체 질문

解決済みの質問

96

Yojae Jang

投稿した質問数 1

1

안녕하세요. 좋은 강의 감사합니다.

값 객체에 대한 내용을 듣고 궁금했던 점이 있었는데, 섹션 4 퀴즈를 풀면서 해소되는 동시에 새로운 질문이 생겼습니다.

값 객체를 사용하는 메소드를 과도하게 호출하여 OOM(Out of Memory)이 발생할 것으로 예상되는 경우, 이를 어떻게 회피할 수 있는지 궁금합니다.

아직 강의를 전부 듣지 않아서 이후에 나올 내용일 수도 있겠지만, 지금 드는 생각으로는 Map을 이용해 내부적으로 캐시를 구현하여 메모리 사용량을 줄이는 방법이 떠오르는데, 이 접근법이 맞을지 궁금합니다.

객체지향 소프트웨어-테스트 소프트웨어-설계

回答 2

3

eternity

Yojae Jang님 안녕하세요.

제가 오늘 아침부터 계속 강의를 하느라 이제서야 답글을 남기네요.

답변이 늦어져서 죄송합니다.

 

값 객체는 기본적으로 크기고 작고, 일시적으로 사용한 후에 곧바로 메모리를 해제하는 방식으로 사용됩니다.

따라서 일반적인 백엔드 환경에서는 의도적으로 엄청난 양의 값 객체를 생성한 후에 참조를 계속 유지해서 가비지 컬렉터에 넘겨지지 않도록 하지 않는 이상 값 객체로 인해 OOM이 발생할 확률은 거의 없다고 보셔도 무방합니다.

JDK에 포함된 많은 클래스들이 값 객체 방식으로 구현되어 있음에도 OOM을 고민하지 않고 쓰는 것처럼 직접 만든 값 객체라고 하더라도 OOM에 대한 걱정없이 편하게 사용하셔도 괜찮습니다.

 

물론 일반적인 환경이 아니라 메모리가 아주 작은 환경에서 실행해야 하거나 게임의 그래픽 구성 요소처럼 크기가 매우 큰 객체들이 대량으로 생성되는 경우도 있을 수 있습니다.

 

이 경우에는 값 객체를 매번 생성하는 대신 Flyweight 패턴(https://refactoring.guru/ko/design-patterns/flyweight, https://gameprogrammingpatterns.com/flyweight.html)을 이용해서 여러 객체들 사이에서 동일한 객체를 공유하는 방법을 사용할 수 있습니다.

여러 객체 사이에 동일한 객체를 공유하는 대신 한 시점에 하나의 객체에 의해서만 독점적으로 사용된다면 Object Pool 패턴(https://gameprogrammingpatterns.com/object-pool.html)을 사용할 수도 있습니다.

 

위 방법들은 전체적으로 코드를 복잡하게 만들기 때문에 정말 OOM이 발생할 수 있는 꼭 필요한 상황에서만 사용하시는게 좋을 것 같아요. 🙂

 

답변이 되었는지 모르겠네요.

감사합니다.

1

Yojae Jang

답변 감사합니다. 답변에 달아주신 링크도 확인 같이 하겠습니다 🙂

1

eternity

답변 쓰신 후에 다시 확인해보니 링크가 잘못 걸려 있었네요.
링크 수정해 놓았습니다. 🙂
감사합니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. Yojae Jang님!

값 객체 사용 시, 메모리 문제와 관련된 질문에 대해 깊이 있는 고민이 느껴집니다. 객체지향 설계에서는 값 객체(Value Object)를 많이 사용하게 되는데, 이러한 패턴을 사용할 때 성능과 메모리 관리를 고려하는 것은 중요한 과제입니다.

값 객체와 메모리 관리

값 객체는 불변성이 보장되며, 경우에 따라 많이 생성되고 사라지는 특성이 있습니다. OOM(Out of Memory) 문제가 발생할 수 있는 경우는 주로 과도한 객체 생성이 지속적으로 반복될 때입니다. 이를 해결할 수 있는 몇 가지 방법을 짚어보겠습니다.

  1. 캐싱:

    • 값 객체가 자주 재사용될 수 있는 값이라면, 캐시를 통해 이미 생성된 객체를 재사용하는 것이 좋은 방법입니다. 이때 Map 같은 컬렉션을 사용해서 캐시 구현이 가능합니다. 이는 Flyweight 패턴의 한 예로 봐도 좋습니다.
  2. 적절한 범위의 객체 수명 관리:

    • 불필요하게 오래 생존할 필요가 없는 객체가 지속적으로 참조되어 메모리 누수가 발생하지 않도록 주의해야 합니다. Garbage Collection이 효과적으로 동작하도록 객체의 수명을 잘 관리하는 게 필요합니다.
  3. 객체 풀링(Object Pooling):

    • 메모리와 객체 생성 비용을 줄이기 위해 몇 가지 자주 사용되는 객체를 미리 만들어두고 재사용하는 방법도 고려할 수 있습니다. 하지만 이는 복잡성을 늘릴 수 있으니 상황에 맞게 잘 판단해야 합니다.

질문하신 부분과 관련하여 기존의 답변이 유익할 수 있습니다:
- ORM을 사용한 설계 시 값 객체의 장단점

위 링크에서는 ORM 환경에서의 값 객체 사용 시 메모리 관리와 관련된 논의가 이루어졌습니다. 이 내용을 통해 이해를 더욱 깊게 하실 수 있을 것이라 생각합니다.

강의를 통해 배운 내용을 실무에 어떻게 적용할지 고민하시는 모습이 아주 인상깊습니다. 추가적으로 궁금한 점이 있다면 언제든지 질문해 주세요. 지식공유자님께서 곧 더욱 자세한 답변을 해주실 것입니다.

저는 질문자님의 이해를 돕고자 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적인 질문이 있으시면 언제든지 말씀해 주세요!

0

Yojae Jang

ORM을 사용한 설계 시 값 객체의 장단점

링크의 페이지가 404 인데 어떤 페이지 였을까요?

0

eternity

이건 저도 궁금하기는 하네요.

AI가 달아놓은 답변 안에 404 오류가 발생하는 링크가 들어있는 경우가 종종 보이던데 제목으로 봐서는 제 강의는 아니고 다른 강의의 답변인 것 같은데 삭제가 된 것인지 궁금하네요.

레이어드 아키텍처에서 도메인 중심 패키지 구조를 적용하거나 변화하는 시점이 있을까요?

1

40

2

tryMove(..) 메서드 ArrayIndexOutOfBoundsException 제보

1

63

2

5-4 Sealed Interface는 주로 모든 케이스 검증이 필요할 때 사용하나요?

1

458

1

Game, Player, Room간의 관계에 대한 질문을 드려요

1

109

2

6-2 보호 로직 중복 이슈

1

106

2

3-2 메서드를 얼마나 작게 나누는게 적절한가요?

1

131

3

7-3 Reader의 소유권 이동에 관해

1

59

2

디자인 패턴에 대해선 어떤 생각을 가지고 계신지 궁금합니다.

2

113

1

8-5 책임 분리를 통한 중복 코드 제거 과정에서 특정 조합은 불가능할 때

2

492

2

인스턴스 증가에 대한 우려

2

131

2

6-2. 명령과 쿼리 분리 원칙 질문

2

492

2

9-1 사소한 강의자료 오류

1

83

2

7-3 상속을 이용한 중복 제거 질문 있습니다!

3

1152

1

함수형 스타일에 대해선 어떻게 생각하시나요?

1

105

2

값 객체 활용에 대해

1

139

2

실례지만 여기에 후기 올립니다.

2

548

3

동일성과 동등성 설명이 바뀐 것 같습니다.

1

116

2

인터페이스명이 변경된 걸까요??

0

92

2

player 내부에 worldmap

3

148

2

9-6 순환참조인거 같은데..

0

116

2

8-5 오타

0

67

2

7-5 자막오타

0

59

2

7-5 자막오타

0

59

2

7-3 AbstractReader에 대해

0

62

2