예제 코드를 보며 설명하기 전에
우선! 여기서나오는 동일성(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(싱클톤 스코프)
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(프로토타입 스코프)
객체를 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을 생성하여 관리한다.
'Spring' 카테고리의 다른 글
[Spring] 예제로 보는 Annotation-based Container Configuration (0) | 2020.05.12 |
---|---|
[Spring] 예제로 보는 Ioc Container - Customizing the Nature of a Bean (0) | 2020.04.30 |
[Spring] 예제로 공부하는 IoC - Dependecies (제어의 역전 - 의존성) (0) | 2020.04.19 |
[스프링부트와 AWS로 혼자 구현하는 웹 서비스] PostsUpdateRequestDto 오류 (0) | 2020.03.25 |
[스프링부트와 AWS로 혼자 구현하는 웹 서비스] Chapter 3 실습 오류 (0) | 2020.03.24 |