Spring

[Spring] 예제로 보는 Bean Scope (Feat. 동일성, 동등성)

KEMON 2020. 4. 29. 02:45
728x90

예제 코드를 보며 설명하기 전에 

우선! 여기서나오는 동일성(identity)동등성(equals)의 차이를 알아야한다.

 

1. 동일성(identity)

객체 주소가 같다.

예)    (obj1 == obj2)    ---> true

@Test
public void testIdentity(){ //동일성 테스트
    A a1 = new A();
    A a2 = new A();
        
    Assert.assertTrue(a1==a2);  //결과 : false
        
    A a3=a1; //a3는 a1이 가리키는 메모리를 가리키고있다.
    Assert.assertTrue(a1==a3); //결과 : true
}
class A{}

2. 동등성(equals)

객체의 값이 같다 

예)  obj1.equals(obj2)    ---> true

@Test
public void testEquals(){ //동일성으로 보면 모두 다르다 그러나 동등성은 a1 과 a2는 동등하다
    A a1 = new A(10,"Hello world");
    A a2 = new A(10,"Hello world");
    A a3 = new A(5,"Hello");

    Assert.assertTrue(a1.equals(a2));  //equals는 동일성 비교이다. 따라서 override해줘야 함
    Assert.assertFalse(a1.equals(a3));
}

@EqualsAndHashCode
@AllArgsConstructor
class A{
    private int a1;
    private String a2;
}

 

@EqualsAndHashCode 어노테이션을 붙이지 않으면 Assert.assertTrue(a1.eqauls(a2))  의 결과는 false가 난다.

이유는 equals는 동일성 비교이기 때문이다.

우리는 동등성 비교를 보기 위해서 override를 해줘야 하므로 @EqualsAndHashCode 어노테이션을 붙여서 테스트 해야한다.

 

본격적으로 Bean Scope에 대해서 알아보자.

1. Singleton Scope(싱클톤 스코프)  

싱글톤 스코프 (출처 : https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-scopes)

IoC Container에서 호출될 때 단 하나의 객체를 만들어서 그것을 재사용하는 것. 싱글톤 패턴의 싱글톤과 같다 (동일성 보장)

xml설정은 아래와 같이 설정한다. (Default값이 singleton이기때문에 아래의 두 줄의 코드는 같은 의미이다!)

 

<bean id="A" class="kr.co.dev.cli.A"></bean>
<bean id="A" class="kr.co.dev.cli.A" scope="singleton"></bean>
@Slf4j
public class Main {
    public static void main(String[] args)  {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        A a1 = context.getBean("A",A.class);
        A a2 = context.getBean("A",A.class);

        log.info((a1==a2));     //결과 값 : true
    }
}
class A{}

※Singleton의 경우 동일성이 보장되어 obj1 == obj2 가 true가 된다.

2. Prototype Scope(프로토타입 스코프)

프로토타입 스코프(출처 : https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-scopes)

객체를 IoC Container에서 호출할 때 매번 객체를 생성해서 만든다. (클래스 이름에 new를 붙여서 만드는 것과 동일) 

xml설정은 아래와 같이 설정한다.

<bean id="A" class="kr.co.dev.cli.A" scope="prototype"></bean>
@Slf4j
public class Main {
    public static void main(String[] args)  {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        A a1 = context.getBean("A",A.class);
        A a2 = context.getBean("A",A.class);

        log.info((a1==a2));     //결과 값 : false
    }
}
class A{}

※prototype의 경우 동일성이 보장되지 않아 obj1 == obj2 가 false가 된다.

 

※스프링 공식 사이트를 참고해 보면 Default로 Singleton Scope로 Bean을 생성하여 관리한다.

 

728x90