객체 지향 설계와 스프링
스프링을 배우기에 앞서 다형성과 역할-구현 분리, SOLID 5원칙이 왜 좋은 객체 지향 설계의 토대가 되는지 정리합니다.
스프링을 배우기에 앞서 다형성과 역할-구현 분리, SOLID 5원칙이 왜 좋은 객체 지향 설계의 토대가 되는지 정리합니다.
회원 조회와 주문 할인 정책 예제를 구현하며 DIP 위반 문제를 발견하고, AppConfig로 관심사를 분리하는 과정을 정리합니다.
중복이 있던 AppConfig를 리팩터링해 역할과 구현이 한눈에 드러나도록 정리하고, 그 과정에서 지켜지는 SOLID 원칙을 살펴봅니다.
순수 자바 코드로 작성했던 AppConfig를 @Configuration과 @Bean으로 전환해 스프링 컨테이너에 빈을 등록하고, ApplicationContext에서 빈을 조회해 사용하는 과정을 정리합니다.
스프링 컨테이너의 최상위 인터페이스인 BeanFactory와, 이를 상속해 국제화·환경변수·이벤트·리소스 조회 같은 부가 기능을 제공하는 ApplicationContext의 역할을 정리합니다.
자바 코드 대신 XML로 스프링 빈을 설정하는 방법과, 자바 코드·XML 같은 다양한 설정 형식을 가능하게 하는 BeanDefinition 추상화와 BeanDefinitionReader의 역할을 정리합니다.
요청마다 new로 객체를 생성하던 AppConfig의 문제를 직접 구현한 싱글톤 패턴과 스프링 컨테이너로 각각 해결해 보고, 싱글톤 패턴의 문제점을 정리합니다.
싱글톤 빈은 여러 클라이언트가 하나의 객체를 공유하기 때문에 무상태로 설계해야 한다는 점을, 공유 필드 때문에 다른 사용자의 주문 금액이 조회되는 StatefulService 예제로 확인합니다.
AppConfig에서 memberRepository()가 여러 번 호출되는 것처럼 보여도 싱글톤이 보장되는 이유를 @Configuration과 CGLIB 바이트코드 조작으로 확인하고, @Bean만 사용할 때와 비교합니다.
설정 정보 없이 스프링 빈을 자동으로 등록하는 컴포넌트 스캔과 @Autowired 의존관계 자동 주입의 동작, 탐색 위치 지정과 기본 스캔 대상을 정리합니다.
수정자 주입 대신 생성자 주입을 권장하는 이유와, 롬복의 @RequiredArgsConstructor로 생성자 코드를 줄이는 방법을 정리합니다.
스프링에서 @Autowired로 조회한 빈이 2개 이상일 때 발생하는 충돌을 필드명 매칭, @Qualifier, @Primary로 해결하는 방법과 둘을 함께 쓸 때의 우선순위를 정리합니다.
문자열로 적는 @Qualifier는 오타가 나도 컴파일 시점에 잡히지 않습니다. 전용 애노테이션을 직접 만들어 의존관계를 주입하는 방법을 정리합니다.
스프링 빈을 자동 등록과 수동 등록 중 어떤 기준으로 선택해야 하는지, 업무 로직과 기술 지원 로직을 나누어 정리합니다.
스프링 빈의 생명주기와 초기화·소멸 콜백을 인터페이스, 설정 정보, @PostConstruct/@PreDestroy 세 가지 방식으로 비교해 정리합니다.
싱글톤과 프로토타입 빈 스코프의 차이를 살펴보고, 싱글톤 빈이 프로토타입 빈을 주입받을 때 발생하는 문제를 예제로 정리합니다.
싱글톤 빈이 프로토타입 빈을 매번 새로 받아 쓰지 못하는 문제를 ObjectProvider로 해결하는 방법을 정리합니다.
웹 스코프와 request 스코프의 동작 방식을 살펴보고, ObjectProvider와 CGLIB 프록시로 스코프 문제를 해결하는 방법을 정리합니다.