강의

멘토링

로드맵

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

Yojae Jang님의 프로필 이미지
Yojae Jang

작성한 질문수

오브젝트 - 설계 원칙편

섹션 4 퀴즈

4-2 값 객체 질문

해결된 질문

작성

·

21

1

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

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

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

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

답변 2

1

조영호님의 프로필 이미지
조영호
지식공유자

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이 발생할 수 있는 꼭 필요한 상황에서만 사용하시는게 좋을 것 같아요. 🙂

 

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

감사합니다.

0

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

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

값 객체와 메모리 관리

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

  1. 캐싱:

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

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

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

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

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

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

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

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

Yojae Jang님의 프로필 이미지
Yojae Jang
질문자

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

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

조영호님의 프로필 이미지
조영호
지식공유자

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

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

Yojae Jang님의 프로필 이미지
Yojae Jang

작성한 질문수

질문하기