Ocean_
꾸준한 프로그래밍
Ocean_
전체 방문자
오늘
어제
  • 분류 전체보기 (174)
    • About Me (4)
    • 우아한테크코스 (27)
    • C & LINUX (50)
    • Operating System (12)
    • Database (25)
    • Computer Vision (0)
    • Problem Solving (0)
      • Programmers (0)
      • BOJ (0)
    • 코코코딩공부 (44)
      • Spring (12)
      • JAVA (14)
      • 디자인 패턴 (4)
      • 책 읽기 (4)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 트랜잭션
  • Linux
  • bean
  • Spring
  • 데이터 조작어
  • 백준
  • SIGINT
  • 우아한테크코스5기
  • C++
  • 우테코
  • 블랙잭
  • 운영체제
  • 1259
  • OperatingSystem
  • C
  • 원시값 포장
  • 리눅스
  • 우테코5기
  • signal
  • 자바
  • DB
  • 우아한형제들
  • BOJ
  • OS
  • 우테코 체스
  • 정규화
  • Operating System
  • 인덱스
  • 프로세스
  • 우아한테크코스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Ocean_

꾸준한 프로그래밍

코코코딩공부/Spring

[Spring] 어떤 객체를 빈으로 등록해야 할까 ?

2023. 4. 23. 12:03

모든 객체를 스프링 빈으로 등록해도 괜찮은가 ?

애플리케이션의 모든 객체를 스프링 컨테이너가 관리할 필요는 없다.

 

그럼 어떤 객체를 스프링 빈으로 등록해야하나 ?

모든 객체를 스프링 빈으로 등록할 경우에는 메모리 사용량이 많아짐에 따라 애플리케이션의 성능에 문제가 생길 수 있다.

 

사실 완벽하게 생각하지는 못했지만 나의 생각은 이렇다.

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
    '코코코딩공부/Spring' 카테고리의 다른 글
    • [Spring] Dispatcher Servlet이란 ? & 미션 에서 찾아보기
    • [Spring] Servlet 이란 ?
    • [Spring] Bean 이란 ?
    • [Spring] 테스트 DB Failed to load ApplicationContext 에러
    Ocean_
    Ocean_
    dongVeloper

    티스토리툴바