programing

Spring 시제품 스코프는 언제 사용해야 합니까?

powerit 2023. 7. 27. 22:25
반응형

Spring 시제품 스코프는 언제 사용해야 합니까?

는 제가 정히확언제싶알습다니고하를 사용해야 하는지 알고 .prototype봄에 스코프?는 저는그것다을이습니했해다니▁i.singleton빈이 요청된 경우 동일한 개체 인스턴스를 반환합니다.

그렇다면 왜 우리가 고려해야 하는 것일까요?prototype?

예를 들어 설명하면 필요성을 이해하는 데 많은 도움이 될 것입니다.

단순한 정의를 명확하게 하기 위해:

  • 프로토타입 스코프 = 주입/검색할 때마다 새 개체가 생성됩니다.새 기능을 사용합니다.SomeBean()매번.

  • 싱글톤 스코프 = 동일한 개체가 주입/검색될 때마다 반환됩니다.여기서는 다음 중 하나의 인스턴스를 인스턴스화합니다.SomeBean그리고 매번 반납합니다.

시제품 원두는 사용 시 생성됩니다.따라서 상태 저장 콩이 필요할 때는 프로토타입 스코프가 필요하거나 콩에 값을 저장하고 싶지 않을 때가 있습니다.프로토타입 빈은 하나의 세션 또는 일부 통화와 연결될 수 있습니다.

예:

DAO(데이터 액세스 개체)는 일반적으로 프로토타입으로 구성되지 않습니다. 일반적인 DAO에는 대화 상태가 없기 때문입니다. 이 작성자가 싱글톤 다이어그램의 핵심을 재사용하는 것이 더 쉬웠을 뿐입니다.

스코프 프로토타입을 사용하면 실시간 시스템과 같은 보다 우수하고 안정적인 애플리케이션 설계/아키텍처를 구축할 수 있는 흥미로운 사용 사례가 있습니다.

차량 추적을 위한 실시간 시스템을 구축해야 하며, 5초마다 2,000,000대의 차량이 정보를 공유하게 될 것이라고 상상해 보십시오. 서버 측에서는 두 개 이상의 개별 구성 그룹을 사용합니다. 하나는 차량용이고 다른 하나는 트럭용입니다.

이 간단한 예를 바탕으로 프로토타입 패턴을 통해 메모리의 개별 구성 그룹과 함께 작동하도록 애플리케이션을 설계하면 성능이 향상됩니다.

따라서 이 경우 서버가 트럭으로부터 새 메시지를 수신할 때마다 서버는 VehicleGroupConfiguration 인스턴스의 해시 맵에서 메모리의 구성 인스턴스를 가져온 다음 이 메시지에 필요한 구성 동작(예: 시간 초과, 재시도...)을 적용합니다.

이 상황을 구현하는 데는 여러 가지 방법이 있지만, 이 예는 프로토타입 패턴이 성능 및 설계 패턴 문제에서 매우 강력하다는 것을 보여줍니다.

설명서에 나와 있듯이 프로토타입 스코프로 Bean Foo를 만드는 것은 다음과 같습니다.

Foo foo = new Foo(dependency1, dependency2, ...);
foo.initialize(dependency7, dependency8...);

빈 에 프로토타입 스코프 입니다.new즉, 인스턴스 생성 및 초기화에 사용되는 종속성을 새 인스턴스가 필요한 코드 외부에 유지해야 합니다.

예를 들어,

// need to explicitly mention dependencies here
public void createdWithNew(Dependency dependency1, Dependency dependency2) {
  Foo foo = new Foo(dependency1, dependency2, ...);
  foo.doSomething();
}

// Dependencies managed in class Foo by Spring
public void createdWithSpring(Foo foo) {
  foo.doSomething();
}

예를 들어 다음과 같은 EJB2 Java Entity beans와 유사한 지속성 코드를 작성하려는 경우가 있습니다.

Person p = ...
p.setName("John Doe");
p.save(); // write to DB

JPA 방식을 사용하는 대신

Person p = new Person();
p.setName("John Doe");
personService.save(p); // write to DB

엔티티 비코드 스타일에서는 개인 인스턴스가 어떻게 지속되어야 하는지 알아야 하므로, 코드를 작성하는 사람이 알지 못하는 지속성 세부사항을 주입해야 합니다.

다른 예:응용 프로그램의 여러 위치에서 비 스레드 세이프 SimpleDateFormat Java 클래스를 구성 파일의 형식 패턴과 함께 사용하려는 경우(다른 조건에 따라 다른 형식을 사용할 수 있음).파일(또는 스프링 속성)에서 형식 문자열을 로드하는 모든 위치에 새 형식 인스턴스를 만드는 대신 프로토타입 스코프를 사용하여 공통 형식 설정에 대한 세부 정보를 한 곳에 두고 매번 새 인스턴스를 가져올 수 있습니다.

프로토타입 범위 콩은 더 오래 실행되거나 리소스 집약적인 작업을 수행하고 여러 메서드 호출에서 상태를 유지할 필요가 없는 서비스에 유용합니다.각 메서드 호출에 대해 빈의 새 인스턴스를 만들면 리소스가 여러 요청 간에 공유되지 않고 각 요청이 다른 요청과 독립적으로 처리됩니다.이를 통해 잠재적인 동시성 문제를 방지하고 성능을 향상시킬 수 있습니다.

반면, 싱글톤 스코프 빈은 짧고 빠른 작업을 수행하는 서비스나 여러 메서드 호출에서 상태를 유지해야 하는 서비스에 유용합니다.빈의 단일 인스턴스를 사용하면 메서드 호출 간에 상태를 유지할 수 있으며 각 메서드 호출에 대해 새 인스턴스를 생성하는 오버헤드를 피할 수 있습니다.

일반적으로 서비스의 특정 요구사항에 따라 적절한 범위를 선택하는 것이 중요합니다.서비스가 여러 메소드 호출 간에 공유 상태를 필요로 하거나 가볍고 효율적이어야 하는 경우 일반적으로 싱글톤 범위가 더 나은 선택입니다.그러나 서비스가 장기간 실행되거나 리소스를 많이 사용하거나 여러 요청 간에 분리해야 하는 경우 일반적으로 프로토타입 범위가 더 좋습니다.

예:

사용자 입력을 기반으로 보고서를 생성하는 응용 프로그램이 있다고 가정합니다.각 보고서에는 서로 다른 데이터 집합이 필요하며 생성하는 데 시간이 오래 걸립니다.사용자가 동일한 리포트를 다시 보려는 경우 리포트를 여러 번 생성하지 않도록 할 수 있습니다.

이 경우 프로토타입 범위 빈을 사용하여 각 보고서를 생성할 수 있습니다.사용자가 리포트를 요청하면 리포트 생성기의 새 인스턴스를 생성하고 리포트를 생성한 다음 리포트를 사용자에게 반환합니다.이렇게 하면 사용자가 동일한 보고서를 다시 요청하면 보고서 생성기의 새 인스턴스가 생성되어 보고서가 새로 생성되고 재사용되지 않도록 합니다.

PDF Generator bean에 프로토타입 bean 스코프를 사용하는 경우 PDF 파일 생성 요청이 있을 때마다 bean의 새 인스턴스가 생성됩니다.PDF 생성은 시간이 걸리는 리소스 집약적인 작업일 수 있으므로 유용하며, 동일한 빈 인스턴스를 사용하여 여러 PDF 파일을 동시에 생성하여 리소스를 묶지 않습니다.PDF 파일에 대한 각 요청은 별도의 PDF Generator bean 인스턴스에서 처리되므로 여러 요청 간에 리소스가 공유되지 않습니다.

PDF Generator bean에 싱글톤 bean 스코프를 사용할 경우 애플리케이션 시작 시 생성되는 bean 인스턴스는 하나뿐입니다.즉, 여러 사용자가 동시에 PDF 파일을 생성하려고 할 경우 동일한 PDF Generator bean 인스턴스를 사용하여 생성하게 됩니다.여러 사용자가 동일한 리소스를 놓고 경쟁하기 때문에 잠재적으로 리소스 경합이 발생할 수 있습니다.또한 한 사용자의 PDF 생성 프로세스가 완료되는 데 시간이 오래 걸릴 경우 다른 사용자의 요청이 지연될 수 있습니다.

이 시나리오에서는 PDF 파일에 대한 각 요청이 다른 요청과 독립적으로 처리되고 여러 요청 간에 리소스가 공유되지 않도록 하기 위해 프로토타입 bean 스코프를 사용하는 것이 좋습니다.각 요청에 대해 PDF Generator bean의 새 인스턴스를 생성하여 잠재적인 동시성 문제를 방지하고 성능을 향상시킵니다.

언급URL : https://stackoverflow.com/questions/21969044/when-to-use-spring-prototype-scope

반응형