• 카테고리

    질문 & 답변
  • 세부 분야

    기타 (개발 · 프로그래밍)

  • 해결 여부

    미해결

싱글톤 패턴을 깨트리는 방법

23.11.22 23:37 작성 조회수 225

0

싱글톤 패턴을 깨트리는 방법으로 Reflection, 직렬화/역직렬화 두 가지 방법을 설명해주셨고 굉장히 흥미롭게 들었습니다.

다만 들으면서 싱글톤을 깨트리는 방법이 존재한다고 하더라도 저걸 고려하면서 코드를 짜야할까?라는 생각이 들었습니다.

저는 아직 취준생이라 그런지 리플렉션이나, 직렬화/역직렬화 방식으로 객체를 생성해본 적이 없어서 이런 생각을 하는 거 같습니다.

 

실무에서 리플렉션을 이용해서 객체를 생성하는 경우가 종종 발생하나요? 굳이 왜 리플렉션을 이용해 객체를 생성하는 건지 어떨 때, 리플렉션을 사용해서 객체를 생성하는지 예시가 궁금합니다.

 

스프링을 쓰면서 직렬화/역직렬화가 이루어지는 것은 아래 정도의 케이스밖에 생각나지 않아요.
1. Client <-> Server 데이터를 주고받을 때, (dto)

  1. Server <-> DB 데이터를 주고받을 때, (Entity)

하지만 DTO나 Entity를 싱글톤으로 만들어줄 이유가 없으므로 직렬화/역직렬화 때문에 싱글톤이 깨지는 경우가 발생할까가 의문입니다.

 

<질문 정리>

  1. 리플렉션이나 이용해서 객체를 생성하는 경우가 실무에서 종종 사용되는 방법 인가요?

  2. 직렬화/역직렬화가 이루어지는 클래스는 싱글톤으로 설정할만한 클래스가 아닐 텐데 직렬화/역직렬화 때문에 싱글톤이 깨지는 경우가 실무에서 종종 발생하는 문제인가요?

  3. 1~2번 질문에 대한 답이 만약 저렇게 객체를 생성하는 경우는 없다 라면 싱글톤을 구현할 때 저런 것을 고려하며 짤 이유가 있나요?

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.11.24

안녕하세요, 인프런 AI 인턴입니다.
질문 주신 내용에 대해 답변드리겠습니다.

  1. 실무에서 리플렉션을 이용해 객체를 생성하는 경우는 분명 있습니다. 예를 들어, 스프링 프레임워크에서 리플렉션은 빈(Bean) 인스턴스를 생성하고 의존성을 주입할 때 내부적으로 사용됩니다. 스프링 부트 참고 문서에서는 리플렉션을 언급하고 있지 않지만, 스프링의 ApplicationContext@Configuration 클래스를 파싱하고 @Bean 메소드를 리플렉션을 이용해 실행하는 과정을 포함합니다.

  2. 직렬화/역직렬화를 통해 싱글톤이 깨질 가능성이 있는 경우는 존재하지만, 이는 일반적으로 큰 문제가 되지 않습니다. 실무에서 싱글톤 패턴을 사용할 때는 일반적으로 무상태(stateless)이거나 애플리케이션 전반에 걸쳐 단일 인스턴스를 유지해야 할 경우에 사용합니다. DTO나 엔티티의 경우 싱글톤으로 관리할 필요가 없으므로 이 문제에 대해 고려하지 않아도 됩니다.

  3. 싱글톤 패턴을 구현할 때에 리플렉션과 직렬화/역직렬화에 의한 깨짐을 고려해야 하는지는 상황에 따라 다를 수 있습니다. 보안상 중요한 요소가 포함된 싱글톤 클래스의 경우, 다른 방법으로 인스턴스가 생성되는 것을 방지해야 할 필요가 있을 수 있으며, 이럴 경우는 추가적인 방어 메커니즘을 고려해야 합니다. 하지만 일반적인 애플리케이션 컨텍스트 내에서 단일 인스턴스를 유지하려는 목적으로 싱글톤을 사용한다면, 위에서 언급한 사례를 특별히 고려하지 않아도 될 것입니다.

싱글톤 패턴은 한정된 상황에서 유용할 수 있으나, 그것이 필요한 모든 상황에서 여러 사례를 고려해야 하는 것은 아닙니다. 개발할 때는 항상 해당 상황의 요구 사항과 콘텍스트를 파악한 후 필요한 디자인 패턴을 선택하고, 그에 따른 잠재적인 문제점을 고려하는 것이 중요합니다.