본문 바로가기

Spring18

@Configuration 과 Singleton 위 코드는 설정 정보를 자바 코드로 작성한 AppConfig 클래스 이다 memberService 빈을 만드는 코드를 보면 'memberService()' 를 호출한다. 해당 메서드를 호출하면 'new MemoryMemberRepository()' 를 호출한다. orderService 빈을 만든느 코드도 동일하게 'memberRepository()' 를 호출한다. 해당 메서드 역시 호출 시에 'new MemoryMemberRepository()' 를 호출한다. 결과적으로 각각 다른 2개의 'MemoryMemberRepository' 가 생성되면서 싱글톤 보장이 깨지는 것 처럼 보인다. 그렇다면 스프링 컨테이너는 이 문제를 어떻게 해결할까? AppConfig 의 자바 코드를 보면 분명히 각각 2번의 호출에.. 2020. 12. 7.
Spring Container - 싱글톤 컨테이너 Spring Container 는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 1개만 생성하고 관리한다. 지금까지 학습하고 사용한 Spring Bean 이 바로 싱글톤으로 관리되는 Bean 이다. Spring Container Spring Container 는 싱글턴 패턴을 따로 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다. Spring Container 는 싱글턴 컨테이너 역할을 한다. 이렇게 싱글턴 객체를 생성하고 관리하는 기능을 Singleton Registry 라고 한다. Spring Container 의 이런 기능 덕분에 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글턴(단 1개의 인스턴스)으로 유지할 수 있다. 싱글턴 패턴을 위한 지저분한 코드가 들어가지 않아도 된다. (st.. 2020. 12. 4.
Singleton Container - 웹 애플리케이션과 Singleton Spring 은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생된 기술이었다. 대부분의 Spring Application 은 Web Application 이다. (물론 웹이 아닌 다른 애플리케이션(배치, 데몬) 개발도 얼마든지 개발할 수 있다.) 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 스프링이 아닌 순수한 DI 컨테이너인 AppConfig 는(싱글톤 구현이 아닌 경우) 위와 같이 여러 요청이 생길 때 마다 해당 서비스를 책임지는 객체 인스턴스를 매번 생성하는 문제가 발생한다. 만약 고객의 트래픽이 초당 100이 나온다면 초당 최소 100개의 객체가 생성되고 소멸된다. (의존 관계가 있는 경우 더 많을 수 있다.) 이는 곧 메모리 낭비로 이어지게 된다. (초당 요청 개수가 그렇게 .. 2020. 12. 2.
Spring Bean 설정 메타 정보 - BeanDefinition 지난 게시글 "Spring 의 다양한 설정 형식 지원 편" 에서는 Spring 이 단순 자바 코드 뿐만 아니라, XML, Groovy 등 다양한 설정 형식을 지원하는 것을 알아보았다. 이번 게시글에선 어떻게 Spring 이 유연하게 다양한 설정 형식들을 지원할 수 있는지에 대해 알아볼 것이다. 먼저, 그 결론부터 말하자면 핵심은 "BeanDefinition" 라는 추상화 이다. 쉽게 이야기하면, Spring AOP 나 관심사의 분리 에서 말했 듯이 역할과 구현을 개념적으로 나눈 것을 의미한다. Spring 은 설정 파일 (자바, XML, Groovy 등)을 읽어 BeanDefinition 을 만들기만 하면 된다. 그리고 Spring Container 는 이것이 자바 코드로 만든 것인지, 아니면 XML 로.. 2020. 12. 1.
Spring 의 다양한 설정 형식 지원 - 자바 코드, XML Spring Container 는 다양한 형식의 설정 정보를 받아드릴 수 있게 유연하게 설계되어 있다. 대표적인 예시로는 다음 아래와 같다. Java code XML Groovy Annotation 기반 자바 코드 설정 사용 AppConfig 파일을 생성하여 자바 문법을 활용한 설정 방식이다. new AnnotationConfigApplicationContext(AppConfig.class) AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다. XML 설정 사용 최근 스프링 부트를 사용하면서 XML 기반의 설정은 잘 사용하지 않는다. 그렇지만, 많은 Legacy 프로젝트들이 XML 로 되어있는 경우가 많다. XML 사용하면 컴파일 없이.. 2020. 11. 30.
BeanFactory 와 ApplicationContext BeanFactory Spring Container 의 최상위 인터페이스 이다. Spring Bean 을 관리하고 조회하는 역할, 책임을 담당하는 명세 이다. Spring Bean 에 관련된 모든 기능은 대부분 BeanFactory 가 제공하는 기능이다. "getBean()" 과 같은 메서드 제공 ApplicationContext BeanFactory 의 모든 기능을 상속 받아서 제공하는 인터페이스 이다. Bean 에 대한 관리와 모든 기능들을 BeanFactory 에서 제공해주는데 불구하고, 왜 ApplicationContext 를 사용하는가? BeanFactory 와 ApplicationContext 이 둘의 차이점은 과연 무엇인가? 실제 Application 을 개발할 때는 Bean 을 관리하고 조.. 2020. 11. 29.
관심사의 분리 각각의 인터페이스를 공연하는 배역이라 가정할 때, 실제 배역에 맞는 배우를 선택하는 것은 누가 하는가? 각 역할을 누가 할지는 배우들 본인이 정하는게 아니다. 역할이 아닌 구현까지 봐라보는 것은 배우가 자신의 역할 뿐만 아니라 상대 배우도 직접 선택하는 것이나 다름 없는 것이다. 이는 결코 유연한 공연을 진행할 수 없다. 유연한 공연을 진행하기 위해선 그 누가 오더라도 해당 배역은 대체될 수 있어야 한다. 관심사를 분리하는 것의 진정한 의미는 배우는 본인의 역할인 배역을 수행하는 것에만 집중할 수 있도록 하는 것이다. 다양한 역할, 책임을 주어지는 것이 아니라 본연의 역할과 책임 한가지만 가질 수 있도록 하는 것을 의미한다. 이를 구현하기 위해선 역할을 지정해주는 책임을 가진 별도의 기획자가 필요하다. .. 2020. 11. 12.
Spring AOP AOP란 Aspect-Oriented Programming 의 약자이다. 서로 다른 곳에서 사용되고 있는 Aspect(관점) 들을 모아 모듈화 하는 기법이다. 즉, 다시 말해 Aspect 은 여러 곳에서 공통으로 적용되는 기능을 의미한다. (e.g. 로깅, 트랜잭션, 접근 제어 등의 보안) 용어 정리 Target Object 부가 기능을 부여할 대상 Spring 에서는 대게 Service 계층이 해당 Advice 부가 기능을 정의한 구현체 Aspect가 어느 시점에 적용이 될 지를 결정 아래의 여러 어노테이션을 통해 적용 시점을 변경시킬 수 있다. @Before 메소드 실행 전 기능 수행 @After 메소드 결과와 상관없이 메소드가 완료 된 이후에 기능 수행 @AfterReturning 메소드가 성공적으.. 2020. 10. 19.