모든 객체를 스프링 빈으로 등록해도 괜찮은가 ?
애플리케이션의 모든 객체를 스프링 컨테이너가 관리할 필요는 없다.
그럼 어떤 객체를 스프링 빈으로 등록해야하나 ?
모든 객체를 스프링 빈으로 등록할 경우에는 메모리 사용량이 많아짐에 따라 애플리케이션의 성능에 문제가 생길 수 있다.
사실 완벽하게 생각하지는 못했지만 나의 생각은 이렇다.
Thread-safe 가아니면 스프링 빈을 등록할 필요하다.
예를들어 user라는 객체는 애플리케이션 실행 중 계속해서 생성 될 수 있는데 spring bean을 등록해서 사용하면 디폴트가 싱글턴이기에 새로운 객체가 생성되지 않을 수 있다. → 빈스코프를 변경해서 사용하면 어떨까 ? (가능할 것 같기도 하다)
중간에 user라는 객체가 생성 되었다가 사용이 끝나는 객체가 존재한다면 빈 등록을 할 필요가 없다. 하지만 Controller, service 같은 것들은 실행하는 시점에 객체가 생성되야하고 DI기능을 사용하기 때문에 빈등록을 해야한다.
빈으로 등록하는 것과 스태틱 메서드를 사용하는 것 중 어떤 방법이 좋은가 ?
빈으로 등록 할 때
특정 메소드를 호출하고자 할 때 static이 아니라면 객체를 new해서 newClass.method 와 같은 방식으로 사용해야한다. 하지만 이런 방식은 스프링의 IOC 에 맞지 않는다. IOC는 객체의 생성, 소멸 권한을 IOC컨테이너에 넘겼는데 그 외적인 부분에서 생성을 하기 때문이다. 이럴 경우에는 bean등록하는 것이 좋다.
static으로 등록할 때
static으로 선언시 static 영역에 있으므로 속도, 메모리적으로 이득을 볼 수 있지만 만들어진 static 안에서 다른 객체를 생성하거나 호출 할 때 의존성 주입을 사용할 수 없다. 그 객체에 대한 생성, 소멸을 직접 관리해야되기에 불편하다.
메소드가 외부 자원에 의존하지 않고 수신한 매개변수에 대해서만 처리를 수행할 경우 , 객체 생성이 필요 없을 경우 static메소드를 사용해도 좋다.
→ 예를 들면 util같은 것들은 Static을 사용해도 될 것 같다.
무엇을 선택하는 것이 좋은가 ?
static은 JVM에 오직 하나의 인스턴스를 갖는다. 하지만 싱글턴으로 빈 등록 시 매 spring context마다 인스턴스를 갖는다. 애플리케이션이 오직 하나의 Context를 가지고 있다면 이 둘은 같게 작동한다. 그러므로 static을 사용할 필요가 없지만, 여러개의 spring context를 사용한다면 성능을 위해 정적을 사용하는 것이 좋아 보인다.
근데 요즘 스프링부트는 여러개의 서블릿을 띄울일도 없다.
ApplicationContext context1 = new AnnotationConfigApplicationContext("~~");
BeanTest b1 = context1.getBean("myBean", BeanTest.class);
ApplicationContext context2 = new AnnotationConfigApplicationContext("~~");
BeanTest b2 = context2.getBean("myBean", BeanTest.class);
// 값은 false 이다.
System.out.println(b1 == b2);
'코코코딩공부 > Spring' 카테고리의 다른 글
[Spring] Dispatcher Servlet이란 ? & 미션 에서 찾아보기 (0) | 2023.04.30 |
---|---|
[Spring] Servlet 이란 ? (0) | 2023.04.30 |
[Spring] Bean 이란 ? (0) | 2023.04.23 |
[Spring] 테스트 DB Failed to load ApplicationContext 에러 (0) | 2023.04.18 |
[Architecture] Layered Architecture (3) | 2023.04.15 |