Spring/Spring 핵심 원리

@ComponetScan컴포넌트 스캔 실습 코드 AppConfig에서 `@Bean`으로 모두 등록해주었다. 빈으로 등록해야한게 수백만개가 된다면 일일이 등록하기 너무 귀찮고, 설정 정보도 커지게 된다.`@ComponetScan` 을 설정 정보에 붙여주면 된다.AutoAppConfig파일 구조는 다음과 같다프로젝트 최상단에 AutoappConfig.java가 있으므로 프로젝트에서 컴포넌트로 등록해준 것을 다 빈으로 등록한다.@Configuration//@ComponentScan: 스프링 빈을 다 끌어다가 자동으로 스프링 빈으로 끌어올리는..@ComponentScan( //스프링 빈 등록에서 제외할 것 excludeFilters = @ComponentScan.Filter(type =..
싱글톤 패턴애플리케이션을 개발하면 여러 고객이 동시에 요청을 보내게 된다.스프링 없이 AppConfig를 사용해서 컨테이너를 생성하게 되면 매 요청마다 객체를 생성하게 된다.고객 트래픽이 초당 100이 나오면 초당 100 개 객체가 생성되고 소멸된다. -> 메모리 낭비싱글톤 패턴을 적용한 코드는 아래와 같다.public class SingletonService { //1. static 영역에 객체를 딱 1개만 생성해둔다. private static final SingletonService instance = new SingletonService(); //2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다. public static SingletonS..
제어의 역전 IoC (Inversion of Control)AppConfig에서 구현체를 생성하고 주입해주는 역할을 한다.-> 프로그램의 제어의 흐름은 AppConfig가 가져간다.OrderServiceIml 은 필요한 인터페이스들을 호출하지만 어떤 구현객체가 실행될지 모른다. 이렇듯 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)이라 한다.해당 포스팅은 프레임워크와 라이브러리를 비교하며 제어의 역전을 설명하고 있다. 의존관계 주입 DI (Dependency Injection)의존관계는 정적 클래스 의존 관계와, 런타임에 결정되는 동적 객체(인스턴스) 의존관계 둘을 분리해서 생각해야한다.해당 포스팅에서 DI 에 대해 설명하고 있다.정적 클래스 의존 관계클래스..
역할과  구현 분리역할과 구현을 분리해서 자유롭게 구현 객체를 조립할 수 있도록 설계한 클래스 다이어그램회원을 메모리에서 조회하고, 정액 할인 정책(고정 금액)을 지원해도 주문 서비스를 변경하지 않아도 된다. public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository = newMemoryMemberRepository(); private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); @Override public Order createOrder(Long memberId, String itemName, int item..
데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애 플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다 스프링을 통해 이러한 초기화 작업과 종료 작업을 어떻게 진행하는지 예제로 알아보자. 이 NetworkClient 는 애플리케이션 시작 시점에 connect() 를 호출해서 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disConnect() 를 호출해서 연결을 끊어야 한다. public class NetworkClient{ private String url; //접속해야하는 서버 url public NetworkClient() { System.out.println("생성자 호출, url = " + u..
자동 빈 등록을 기본으로 사용하자 어떤 경우에 컴포넌트 스캔과 자동 주입을 사용하고, 어떤 경우에 설정 정보를 통해서 수동으로 빈을 등록하고, 의존관계도 수동으로 주입해야할까 → 자동을 선호하는 추세 스프링은 @Component뿐만 아니라 @Controller , @Service , @Repository 처럼 계층에 맞추어 일반적인 애플 리케이션 로직을 자동으로 스캔할 수 있도록 지원한다. 자동 빈 등록을 사용해도 OCP, DIP를 지킬 수 있다 설정 정보를 기반으로 애플리케이션을 구성하는 부분과 실제 동작하는 부분을 명확하게 나누는 것이 이상적 이지만, 개발자 입장에서 스프링 빈을 하나 등록할 때 @Component 만 넣어주면 끝나는 일을 @Configuration 설정 정보에 가서 @Bean 을 적..
할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정해보자. 스프링을 사용하면 소위 말하는 전략 패턴을 매우 간단하게 구현할 수 있다 public class AllBeanTest { @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); Member member = new Member(1L, "userA", Grade.VIP); int discountPric..
@Autowired 는 타입(Type)으로 조회한다. 타입으로 조회하기 때문에, 마치 다음 코드와 유사하게 동작한다. ac.getBean(DiscountPolicy.class) 타입으로 조회하면 선택된 빈이 2개 이상일 때 문제가 발생한다 예를 들어서 DiscountPolicy 타입의 빈 2개가 등록되고 DiscountPolicy 타입의 빈을 주입받으려고 한다고 하자 @Component public class FixDiscountPolicy implements DiscountPolicy {} @Component public class RateDiscountPolicy implements DiscountPolicy {} @Autowired private DiscountPolicy discountPolicy..
생성자 주입을 하게 되면 필드에 fnal 키워드를 사용하고, 생성자 만들고 주입받을 값을 대입하는 코드를 만들어야한다. @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this...