inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

클래스의 분리

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

해결된 질문

299

IThinkSo

작성한 질문수 2

0

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

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

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

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

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

java spring

답변 1

1

토비

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

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

수업을 잘 듣고 있습니다.

0

103

2

jackson(3.0.2 버전) ObjectMapper.readValue 에러타입

0

108

2

템플릿과 콜백의 역할 경계를 구분하는 기준

0

99

1

테스트를 작성하지않아도 되는 경우

0

86

2

오브젝트 정의 중 배열에 대해서

0

63

2

스프링 레거시를 이용하는 회사에서 일을 하게 될것같은데

0

109

2

JpaTransactionManager에 대해 궁금합니다.

0

81

2

스프링빈과 Clock 클래스 관련

0

44

2

Seprate Interface 패턴에 대한 궁금증

0

46

2

테스트의 기준을 어떤식으로 설정하는 것이 바람직한 테스트일까요 ?

0

51

2

오브젝트와 인스턴스

0

38

1

WebApiExRateProvider 템플릿 콜백 패턴을 적용하면서 테스트 코드를 만들어보았습니다.

0

62

2

템플릿 콜백 패턴 관련하여 궁금한 것이 있습니다!

0

59

2

상태 변경 API 질문

0

120

2

빈에 대한 질문

0

97

1

안녕하세요.

0

145

2

Payment 엔티티에 exRateProvider 주입

0

101

1

@Transactional private 사용유무

0

156

1

JdbcClient 생성 질문

0

190

2

안녕하세요 PaymentConfig 질문드립니다.

0

110

2

[공유] 윈도우 사용자를 위한 http 명령어 오류 해결 방법

0

244

2

생성자 파라미터성자 파라미터

0

237

2

토비님 ! BigDecimal 관련 링크를 못찾겠어요

2

343

2

인터페이스 사용에 관하여 질문드립니다.

0

307

3