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

IThinkSo님의 프로필 이미지
IThinkSo

작성한 질문수

토비의 스프링 6 - 이해와 원리

클래스의 분리

클래스 필드 레벨에서의 객체 생성에 대해 질문있습니다.

해결된 질문

작성

·

200

0

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

기존에는 PaymentService 클래스의 prepare 메서드 내부에서 provider 객체를 생성했었습니다.
강의 중간에 토비님께서 provider를 클래스 필드로 변경하시고, 생성자에서 객체 생성을 하셨습니다.

변경 이후에 Provider는 PaymentService와 생명주기를 함께합니다.(생명주기라는 단어가 올바른지 모르겠네요.) PaymentSerivce가 메모리 해제되지 않으면, Provider도 계속 메모리를 차지하게 됩니다.

하지만 메서드 레벨에서 객체 생성을 한다면, Provider는 GC에 의해 비교적 일찍 메모리 해제가 될 수 있을 것 같습니다.

제 생각에는 클래스와 메서드의 호출 패턴에 따라서 선택이 달라질 것 같은데,
토비님께서는 클래스 필드 레벨 선언과 메서드 레벨 선언을 정하시는 룰이 있으신지 궁금합니다!

답변 1

0

토비님의 프로필 이미지
토비
지식공유자

PaymentService나 ExRateProvider 구현 클래스의 인스턴스는 보통 서버에서는 싱글톤 빈으로 만들어지고 서버가 돌아가는 동안에 딱 한 개만 만들어집니다. 그래서 서버가 종료될 때까지 GC가 안 되지만 겨우 오브젝트 한 개니까 매번 만들고 GC하는 것보다 훨씬 효율적입니다. 그래서 필드로 주입 받아서 가지고 있는 것이 이런 경우에 적절합니다.

필드 레벨에 하나의 오브젝트를 고정하고 쓰는 경우에 주의할 것은 이게 멀티 쓰레드에 안전한, 상태가 없은 오브젝트인지입니다. 서버에서 매 요청마다 다른 값을 가지는 DTO 같은 건 필드에 넣어두고 쓰지 않죠. 이런 건 로컬 변수로 만들어서 쓰고 버리는게 맞습니다. 반면 대부분의 서비스형 오브젝트는 변경하는 상태를 직접 가지고 있지 않기 때문에 하나만 만들어서 재사용되도록 하는 것이 좋습니다.

IThinkSo님의 프로필 이미지
IThinkSo

작성한 질문수

질문하기