Replies: 2 comments 3 replies
|
오 빨리하셨네요 ㅎㅎ |
1 reply
|
이게 꿈이아니죠 ? |
2 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
웹 애플리케이션과 싱글톤
싱글톤 패턴
📌 참고 : 싱글톤 패턴을 구현하는 방법은 여러가지가 있다. 여기서는 객체를 미리 생성해두는 가장 단순하고 안전한 방법을 선택했다.
🚫 싱글톤 패턴 문제점
스프링 컨테이너를 사용하면 객체를 다 싱글톤으로 만들어서 관리해준다.
싱글톤 컨테이너
싱글톤 컨테이너
스프링 컨테이너를 사용하는 테스트 코드
싱글톤 컨테이너 적용 후
⭐ 싱글톤 방식의 주의점 (중요 !!)
상태를 유지할 경우 발생하는 문제점 예시
상태를 유지할 경우 발생하는 문제점 예시
@configuration과 싱글톤
memberRepository()를 호출한다.new MemoryMemberRepository()를 호출한다.memberRepository()를 호출한다.new MemoryMemberRepository()를 호출한다.❓ 결과적으로 각각 다른 2개의
MemoryMemberRepository가 생성되면서 싱글톤이 깨지는 것 처럼 보인다. 스프링 컨테이너는 이 문제를 어떻게 해결할 지 테스트 해보자.검증 용도의 코드 추가
테스트 코드
new MemoryMemberRepository호출해서 다른 인스턴스가 생성이 되어야 하는데 ? 어떻게 된 일일까?AppConfig에 호출 로그 남김
❓ 그런데 출력 결과는 모두 1번만 호출된다.
@configuration과 바이트코드 조작의 마법
test/singleton/ConfigurationSingletonTest위의 코드에서
AnnotationConfigApplicationContext에 파라미터로 넘긴 값은 스프링 빈으로 등록된다. 그래소AppConfig도 스프링 빈이 된다.AppConfig스프링 빈을 조회해서 클래스 정보를 출력해보자.순수한 클래스라면 다음과 같이 출력이 되어야 한다.

AppConfig를 상속 받는 다른 임의의 클래스가 바로 싱글톤 이 되도록 보장해준다.AppConfig@CGLIB 예상 코드
@Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 스프링 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어진다.📌 참고 : AppConfig@CGLIB 는 AppConfig 의 자식 타입이므로, AppConfig 타입으로 조회할 수 있다.
@Configuration을 적용하지 않고,@Bean만 적용하면 어떻게 될까?@Configuration을 붙이면 바이트코드를 조작하는 CGLIB 기술을 사용해서 싱글톤을 보장하지만, 만약@Bean만 적용하면 어떻게 될까?MemberRepository가 총 3번 호출 된 것을 알 수 있다.@Bean에 의해 스프링 컨테이너에 등록하기 위해서이고, 2번은 각각memberRepository()를 호출하면서 발생한 코드이다.인스턴스가 같은지 테스트 결과
📍 정리
@Bean만 사용해도 스프링 빈으로 등록되지만, 싱글톤을 보장하지 않는다.memberRepository()처럼 의존관계 주입이 필요해서 메서드를 직접 호출할 때 싱글톤을 보장하지 않는다.@Configuration을 사용하자!🔖 번외 (단축키)
All reactions