inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

코딩으로 학습하는 GoF의 디자인 패턴

싱글톤 패턴 5부 - 자바와 스프링에서 찾아보는 패턴

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

551

정 민욱

작성한 질문수 4

0

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

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

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

 

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

 

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

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

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

 

<질문 정리>

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

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

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

java 디자인-패턴

답변 1

0

인프런 AI 인턴

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

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

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

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

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

많이 사용되는 패턴의 순서를 정한다면 어떤 순서일까요?

0

110

1

@Builder에 대해 사소한 질문

0

52

1

default 기능이 있는 interface와 추상클래스의 차이

0

50

1

실무 코드에 디자인 패턴 적용 시의 '기준'에 대해 조언을 얻고 싶습니다.

0

42

1

데코레이터 패턴, before 가 O(2^n) 인 이유

0

42

0

혹시 다음강의는 언제쯤..

0

346

1

volatile 사용 이유에 대해서 여쭤보고 싶습니다!

0

616

3

Spring Security 의 ProviderManager (AuthenticationManager) 도 옵저버 패턴을 사용하고 있다고 볼 수 있을까요?

0

391

2

코드에 약간 오타가 있는거 같습니다.

0

430

1

싱글톤 (Singleton) 패턴 구현 방법 3 - 2번 퀴즈에 대해 질문이 있습니다.

0

568

2

안녕하세요, 강의 순서 질문드립니다.

0

685

1

스프링 시큐리티 WebSecurityConfigurerAdapter deprecated 대체 코드

0

2431

1

팩토리메소드 = 추상팩토리?

2

922

1

중재자 패턴에 관하여~

0

510

1

undo 메소드 작업중에서

1

365

1

익명클래스로 객체 생성시 의문점

0

586

1

mediator패턴에서 객체끼리 순환참조는 어떻게 해결해야할까요

0

479

1

객체간에 this를 넘기는 부분에 관련해 질문이 있습니다..

1

366

1

전략 패턴과 상태 패턴에 관련해서 질문이 있습니다.

0

283

1

플라이웨이트 패턴 3부에서 HashMap 동시성 질문입니다.

0

259

1

enum 이 이른 초기화 방법이 아니라는 것은,

0

504

1

해당 코드가 C# 에선 접근 관련 컴파일 에러가 뜹니다.

0

434

1

설계관련 궁금증이 있습니다.

0

327

0

설계관련 궁금증이 있습니다.

0

236

0