작성
·
389
0
싱글톤 패턴을 깨트리는 방법으로 Reflection, 직렬화/역직렬화 두 가지 방법을 설명해주셨고 굉장히 흥미롭게 들었습니다.
다만 들으면서 싱글톤을 깨트리는 방법이 존재한다고 하더라도 저걸 고려하면서 코드를 짜야할까?라는 생각이 들었습니다.
저는 아직 취준생이라 그런지 리플렉션이나, 직렬화/역직렬화 방식으로 객체를 생성해본 적이 없어서 이런 생각을 하는 거 같습니다.
실무에서 리플렉션을 이용해서 객체를 생성하는 경우가 종종 발생하나요? 굳이 왜 리플렉션을 이용해 객체를 생성하는 건지 어떨 때, 리플렉션을 사용해서 객체를 생성하는지 예시가 궁금합니다.
스프링을 쓰면서 직렬화/역직렬화가 이루어지는 것은 아래 정도의 케이스밖에 생각나지 않아요.
1. Client <-> Server 데이터를 주고받을 때, (dto)
Server <-> DB 데이터를 주고받을 때, (Entity)
하지만 DTO나 Entity를 싱글톤으로 만들어줄 이유가 없으므로 직렬화/역직렬화 때문에 싱글톤이 깨지는 경우가 발생할까가 의문입니다.
<질문 정리>
리플렉션이나 이용해서 객체를 생성하는 경우가 실무에서 종종 사용되는 방법 인가요?
직렬화/역직렬화가 이루어지는 클래스는 싱글톤으로 설정할만한 클래스가 아닐 텐데 직렬화/역직렬화 때문에 싱글톤이 깨지는 경우가 실무에서 종종 발생하는 문제인가요?
1~2번 질문에 대한 답이 만약 저렇게 객체를 생성하는 경우는 없다 라면 싱글톤을 구현할 때 저런 것을 고려하며 짤 이유가 있나요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
질문 주신 내용에 대해 답변드리겠습니다.
실무에서 리플렉션을 이용해 객체를 생성하는 경우는 분명 있습니다. 예를 들어, 스프링 프레임워크에서 리플렉션은 빈(Bean) 인스턴스를 생성하고 의존성을 주입할 때 내부적으로 사용됩니다. 스프링 부트 참고 문서에서는 리플렉션을 언급하고 있지 않지만, 스프링의 ApplicationContext
는 @Configuration
클래스를 파싱하고 @Bean
메소드를 리플렉션을 이용해 실행하는 과정을 포함합니다.
직렬화/역직렬화를 통해 싱글톤이 깨질 가능성이 있는 경우는 존재하지만, 이는 일반적으로 큰 문제가 되지 않습니다. 실무에서 싱글톤 패턴을 사용할 때는 일반적으로 무상태(stateless)이거나 애플리케이션 전반에 걸쳐 단일 인스턴스를 유지해야 할 경우에 사용합니다. DTO나 엔티티의 경우 싱글톤으로 관리할 필요가 없으므로 이 문제에 대해 고려하지 않아도 됩니다.
싱글톤 패턴을 구현할 때에 리플렉션과 직렬화/역직렬화에 의한 깨짐을 고려해야 하는지는 상황에 따라 다를 수 있습니다. 보안상 중요한 요소가 포함된 싱글톤 클래스의 경우, 다른 방법으로 인스턴스가 생성되는 것을 방지해야 할 필요가 있을 수 있으며, 이럴 경우는 추가적인 방어 메커니즘을 고려해야 합니다. 하지만 일반적인 애플리케이션 컨텍스트 내에서 단일 인스턴스를 유지하려는 목적으로 싱글톤을 사용한다면, 위에서 언급한 사례를 특별히 고려하지 않아도 될 것입니다.
싱글톤 패턴은 한정된 상황에서 유용할 수 있으나, 그것이 필요한 모든 상황에서 여러 사례를 고려해야 하는 것은 아닙니다. 개발할 때는 항상 해당 상황의 요구 사항과 콘텍스트를 파악한 후 필요한 디자인 패턴을 선택하고, 그에 따른 잠재적인 문제점을 고려하는 것이 중요합니다.