분류 전체보기 99

[섹션5-4] 싱글톤 방식의 주의점

싱글톤 방식의 주의점 싱글톤 방식 주의점 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 상태를 무상태(stateless)로 설계해야 한다! 상태를 무상태로 설계한다는 것은 , 쉽게 말해 상태를 가지지 못하도록 설계한다. 즉 값을 변경할 수 없도록 설계한다는 의미이다. 싱글톤을 설계할 때 이를 구현하는 방법은 크게 Stateful한 설계 방식과 Stateless 설계 방식으로 나눌 수 있다. stateful 싱글톤은 변경 가능한 상태를 가진 싱글톤이고, stateless 싱글톤은 변경 가능한 상태가 없는 싱글톤을 말한다. 특정 클라이언트에 의존적인 필드가 있으면 안된다. 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다! 필..

[섹션5-3] 싱글톤 컨테이너

스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다. 지금까지 우리가 학습한 스프링 빈이 바로 싱글톤으로 관리되는 빈이다. 스프링 컨테이너는 객체를 1개만 생성해서 가지고 있는다 싱글톤 컨테이너 스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다. - 이전에 설명한 컨테이너 생성 과정을 자세히 보자. 컨테이너는 객체를 하나만 생성해서 관리한다. - 요청이 들어오면 자신이 미리 생성해서 가지고 있었던 객체를 주기 때문에 응답 받은 객체는 모두 동일한 객체이다. 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리 라고 한다. 스프링 컨테이너의 이런 기능 덕분에 싱..

[섹션5-2] 싱글톤 패턴과 문제점

싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 똑같은 객체 타입의 인스턴스가 2개 이상 생성하지 못하도록 막는 것이다. How? private 생성자를 사용해서 외부에서 임의로 new를 하지 못하도록 하는 것이다 SingletoneService public class SingletoneService { // 1. static 영역에 객체를 딱 1개만 설정해둔다 private static final SingletoneService instance=new SingletoneService(); // 2. public으로 열어서 객체 인스턴스가 필요한 경우 static 메서드를 통해서만 이용할 수 있도록 한다 public static SingletoneService getInst..

[섹션5-1] 웹 어플리케이션과 싱글톤 ( 순수 DI컨테이너의 문제점 )

우리는 스프링 애플리케이션을 이용해서 주로 웹 애플리케이션 개발을 한다. 웹 애플리케이션의 경우 여러 고객이 동시에 요청을 한다. 우리가 스프링을 이용하지 않는 순수한 자바 코드로만 만들어본 DI컨테이너를 이용한다면 (스프링 컨테이너를 생성하지 않고 AppConfig 를 이용해서 객체를 생성하고 주입 받는 방법) public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } 세명의 고객이 요청을 하면 객체도 3개 생성되는 것이다. 만약 만명의 고객이 동시에 요청하면 새로운 객체를 만개를 만들어야 한다는 것인데 이것은 매우 비효율적이며 메모리의 낭비가 심할 것이다. 즉, 스프링이 없는 순수한 DI컨테이너는 고..

[섹션4-8] 스프링 빈 설정 메타정보 - BeanDefinition

지금까지 스프링 컨테이너의 설정을 어노테이션 기반의 자바 코드와 XML파일을 이용해서 해보았다. 그런데 스프링은 어떻게 이렇게 다양한 설정 형식을 지원하는 것일까? 스프링 컨테이너 설정 형식은 어노테이션 기반의 자바 코드도 되고, XML파일로 설정해도 되고, 사용자 임의로 만들어서 설정을 해줘도 된다. 이것이 가능한 이유는 바로 BeanDefinition 이라는 추상화 때문이다. 쉽게말해 역할과 구현을 분리 해줬기 때문에 설정 클래스를 바꿔끼워도 상관이 없었던 것이다. 스프링 컨테이너는 빈 설정과 관련된 설정을 구체적인 설정 클래스들에 의존하고 있는 것이 아닌, BeanDefinition 이라는 인터페이스에 의존하고 있다. 즉, 스프링 컨테이너는 설정 클래스가 자바 코드인지, XML인지 몰라도 된다. 오..

[섹션4-7] 다양한 설정 형식 지원- 자바코드, XML

XML로 스프링 컨테이너 설정하기 지금까지는 스프링 컨테이너 설정 방법으로 어노테이션 기반의 자바 설정 클래스를 사용했다. 하지만 스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있도록 유연하게 설계 되어있다. 자바 코드 뿐만아니라 XML로 스프링 컨테이너를 설정하는 방법에 대해 알아보자. 어노테이션 기반 자바 코드 설정 어노테이션 기반의 자바 설정 클래스 new AnnotationConfigApplicationContext(AppConfig.class) 자바로 된 설정 코드를 넘기면 된다. XML 설정 사용 최근에는 스프링 부트를 사용하며 XML기반의 설정은 잘 사용하지 않는다 GenericXmlApplicationContext 를 사용하면서 xml 설정 파일을 넘기면 된다. XmlAppCon..

[섹션4-6] BeanFactory 와 ApplicationContext

BeanFactory와 ApplicationContext의 차이점 스프링 컨테이너 생성에 관한 공부를 할때 BeanFactory에 대한 언급이 잠깐 있었다. BeanFactory와 ApplicationContext의 차이가 무엇인지 알아보자. BeanFactory 스프링 컨테이너의 최상위 인터페이스다. 스프링 빈을 관리하고 조회하는 역할을 담당한다. 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다. getBean() 을 제공한다. ApplicationContext BeanFactory 기능을 모두 상속받아서 제공한다. 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까? 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물..

스프링 빈 조회 정리

9~11 의 글 동안 스프링 빈을 조회하는 방법에 대해서 알아보았다. 각 글의 내용을 간단하게 정리해보자 스프링 빈 조회 - 기본 스프링 빈 조회 - 동일한 타입이 둘 이상 스프링 빈 조회- 상속관계 빈 등록 스프링 컨테이너에 빈을 등록하는 방법으로 어노테이션을 기반으로하는 자바 설정 클래스를 이용하였다. @Configuration 으로 등록된 클래스를 설정 클래스, 설계도로 하여 @Bean으로 등록된 메서드들의 이름을 빈 이름으로 하여 저장소에 빈을 등록했다. 빈 조회 - 기본 스프링에서 빈을 조회하는 가장 기본적인 방법은 getBean을 이용하는 것이다. getBean(빈 이름, 빈 타입) getBean(빈 이름) getBean(빈 타입) 찾고자 하는 빈이 컨테이너에 등록되어있지 않다면 NoSuchB..

[섹션4-5] 스프링 빈 조회- 상속관계

클래스들 간에 상속관계가 있을 때, 빈을 조회하는 방법은 무엇일까? 부모 타입으로 조회하면, 자식타입도 함께 조회한다 - 부모 타입을 조회하면 자식 타입으로 등록된 빈들도 같이 조회하여 우리에게 알려준다. 자바의 최상위 부모는 object 이다. ( 우리 눈에는 코드로 보이지 않지만 모든 클래스에는 extends Object 가 생략되어있다) 따라서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면 모든 스프링 빈을 조회한다. ApplicationContextExtendFindTest 상속관계가 있는 타입의 빈들을 조회하는 방법에 대해서 알아보자 public class ApplicationContextExtendsFindTest { AnnotationConfigApplicationContext..

[섹션4-4] 스프링 빈 조회 - 동일한 타입이 둘 이상인 경우

앞의 글에서 타입으로 빈을 조회하는 방법에 대해 알아보았다. 그런데 만약 같은 타입의 빈이 둘 이상이라면 스프링은 어떤 빈을 알려줄까? ApplicationContextSameBeanFindTest public class ApplicationContextSameBeanFindTest { // 동일한 타입이 둘 이상인 경우 빈 조회하는 방법 AnnotationConfigApplicationContext ac= new AnnotationConfigApplicationContext(SameBeanConfig.class); @Test @DisplayName("타입으로 조회시 동일한 타입이 둘 이상이면 중복오류") public void findBeanByDuplicate(){ MemberRepository bea..