인프런/스프링핵심원리(기본)17 끝)bean 생명주기 콜백 3가지방법,빈 스코프,웹 스코프,스코프와 프록시 인터페이스 InitializingBean, DisposableBean 방법 NetworkClient 수정 public class NetworkClient implements InitializingBean, DisposableBean { //InitializingBean 구현 -> 초기화 콜백관련 DisposableBean 소멸 콜백관련 private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url); } public void setUrl(String url) { this.url = url; } //서비스 시작시 호출 public void connect() { System.out.println("connect : .. 인프런/스프링핵심원리(기본) 2023. 1. 11. 16 ★★★ (의존관계주입시)조회한 빈이 모두 필요할때, (의존관계주입)자동, 수동의 올바른 실무 운영 기준 , 빈 생명주기 콜백 조회한 빈이 모두 필요할때 List , Map 실무적 예를 들면) 할인 서비스를 제공하는데 클라이언트가 할인의 종류를 선택할 수 있을때를 가정해보자. 스프링을 사용하면 소위 말하는 전략패턴을 매우 간단하게 구현할 수 있다. 빈들 Map,List로 가져오기 테스트 public class AllBeanTest { @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); //전달인자로 넣은것은 빈으로 등록된다.(DiscountService는 스프링컨테이너 생성할때 전달인자로 넣어서 직접 빈 등록해준거다.) // 전달인자 클래스중.. 인프런/스프링핵심원리(기본) 2022. 12. 30. 15) ★★★ 다양한 의존관계 주입방법,옵션처리,생성자 주입 선택,final 키워드,롬복과 최신 키워드, 조회할 빈이 2개이상(문제발생)(@Autowired,@Qualfier,@Primary), 어노테이션 직접 만들기 의존관계 주입은 크게 4가지 방법이 있다. 1. 생성자 주입 2. 수정자 주입(== setter 주입) 3. 필드 주입 4. 일반 메서드 주입 생성자 주입 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this... 인프런/스프링핵심원리(기본) 2022. 12. 28. 14)★★★컴포넌트 스캔과 의존관계 자동주입(@ComponentScan,@Autowired), 탐색위치와 기본 스캔 대상(@Service~) , 스캔필터링 , 중복 등록과 충돌 AppConfig라는 구성설정 파일을 만들어서 스프링빈을 등록했고 등록하는 과정에서 자동으로 의존관계도 주입되었다. 하지만 등록해야하는 스프링빈이 많아지면 설정 정보도 커지고 누락하는 문제가 발생한다. ( + 귀찮음) 그래서 스프링에서는 설정정보 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔을 제공한다. 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. 공부를 위해 원래있던 AppConfig는 냅두고 새로 AutoAppConfig를 생성한다. @ComponentScan을 사용하면 @Component 어노테이션이 붙은 모든 클래스를 찾아서 자동으로 스프링빈으로 등록해준다. AutoAppConfig.java @Configuration // 설정정보 파일이니까 @Configuration.. 인프런/스프링핵심원리(기본) 2022. 12. 28. 13)★★싱글톤이 필요한 이유,싱글톤 패턴, 싱글톤 컨테이너,싱글톤 방식의 주의점 ,@Configuration과 싱글톤,@Configuration과 바이트코드 조작의 마법,@Configuration의 역할 웹 어플리케이션과 싱글톤이 필요한 이유 보통 여러 클라이언트가 동시에 요청을 하게된다. DI 컨테이너 (의존성 주입 컨테이너) ==> 우리가 만든 AppConfig 만약에 스프링이 없다면 위의 그림과 같이 3명이 동시에 memberService를 요청했을때 멤버서비스가 3개가 생성될것이다. public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { AppConfig appConfig = new AppConfig(); //1. 조회: 호출할 때 마다 객체를 생성 MemberService memberService1 = appConfig.memberService(); //2. 조회: 호출할 때 마다 객체.. 인프런/스프링핵심원리(기본) 2022. 12. 27. 12)BeanFactory, ApplicationContext ,다양한 설정 형식 지원(자바코드, XML) , 스프링 빈 설정 메타정보(BeanDefinition) 상속받은 인터페이스를 구현하는 AnnotationConfigApplicationContext(구현 클래스,구현체) BeanFactory (빈 팩토리) - 스프링 컨테이너 최상위 인터페이스 - 스프링빈을 관리하고 조회하는 역할 담당 - 이전 시간에 썼던 getBean()과 같이 사용했던 대부분의 기능은 빈팩토리에서 제공하는 기능이였다. ApplicationContext - 빈팩토리를 상속하는 인터페이스이므로 빈팩토리의 기능을 모두 상속받아서 제공한다. - 빈팩토리와 차이는 뭘까? -> 빈을 관리하고 조회하는 기능(빈팩토리)은 물론이고 수많은 부가기능이 필요하기 때문에 다른 인터페이스도 상속하고있다. 다양한 설정 형식 지원 (자바코드 , XML) 이전에 AppConfig.class로 설정정보를 줘서 스프링컨.. 인프런/스프링핵심원리(기본) 2022. 12. 27. 11)컨테이너에 등록된 모든 빈 조회,내가 등록한 빈 조회, 스프링 빈 조회(기본), 스프링 빈 조회(동일한 타입이 둘 이상), 스프링 빈 조회(상속 관계) 테스트 코드를 생성해서 등록된 빈 조회해보기 ApplicationContextInfoTest.java class ApplicationContextInfoTest { // junit5부터는 public이 없어도 된다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("모든 빈 출력하기") void findAllBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); //컨테이너에 등록된 빈 이름들 배열을 가져온다. for (String beanDefinitionName : beanDe.. 인프런/스프링핵심원리(기본) 2022. 12. 27. ★★10) 스프링으로 전환하기, ApplicationContext ,@Configuration,@Bean , 스프링 컨테이너, 스프링 빈 , 스프링컨테이너 생성과정 AppConfig.java 수정 @Configuration을 클래스 앞에 붙여서 앱의 구성정보,설정정보 파일임을 명시해준다. @Bean 어노테이션을 각 메서드에 붙여준다. -> 각 객체들이 스프링컨테이너에 등록된다. @Configuration public class AppConfig { //프로젝트의 객체 생성,구성,주입 환경설정을 하는 중요 역할 @Bean public MemberService memberService() { return new MemberServiceImpl(MemberRepository()); } @Bean public MemberRepository MemberRepository() { return new MemoryMemberRepository(); } @Bean public Or.. 인프런/스프링핵심원리(기본) 2022. 12. 15. 9) 좋은 객체지향 설계의 5가지 원칙의 적용 , IoC(Inversion of Control == 제어의 역전), DI(의존관계주입,의존성주입) , 컨테이너(IoC 컨테이너, DI 컨테이너) 지금까지 공부한 코드에서는 SRP, DIP, OCP가 적용되어있다. SRP 단일 책임 원칙 클라이언트 객체 == 구현 객체 초기에 멤버서비스임플과 같은 구현 객체(클라이언트 객체) 에서 직접 구현 객체(메모리멤버리포지토리객체)를 생성하고 ,연결하는 등 다양한 책임을 가지고 있었다. 하지만 AppConfig를 생성하면서 클라이언트 객체는 실행하는 책임만 담당한다. DIP 의존관계 역전 원칙 OCP 다형성을 사용하고 클라이언트가 DIP를 잘 지키면 OCP가 적용될 가능성이 열린다. IoC( Inversion of Control, 제어의 역전) 보통은 개발자가 원하는 객체를 생성하고 그 객체안에서 다른 객체도 생성하면서 직접 컨트롤하면서 개발을 하는데 -> ex) 멤버서비스임플 구현체의 코드를 짜면서 그 안에.. 인프런/스프링핵심원리(기본) 2022. 12. 9. 8)★ AppConfig 리팩토링 , 할인정책 변경(구현클래스 변경) , DIP 준수 , OCP 준수 , 배웠던거 전체 흐름 정리 AppConfig 리팩토링 기대하는그림 수정전 AppConfig public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } public OrderService orderService() { return new OrderServiceImpl(new MemoryMemberRepository(), new RateDiscountPolicy()); } } 구현이 잘 안보이고(메모리멤버리포지토리) 오더서비스 구현체 만들때, 멤버서비스 구현체 만들때 메모리멤버리포지토리 생성이 중복이 된다. 그리고 만약 멤버리포지토리 구현체가 바뀌게 된다면 멤버리포지토리.. 인프런/스프링핵심원리(기본) 2022. 12. 9. 7) ★ 관심사의 분리, AppConfig(리팩토링 전) , 생성자 주입,의존성 주입(의존관계 주입) AppConfig.class 어플리케이션의 전체 동작 방식을 구성(config -> configuration -> 구성,환경설정)하기 위해 , 구현 객체를 생성하고, 연결하는 책임을 가지는 클래스 이전에는 오더서비스구현체클래스 안에서 public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); 다음과 같이 구현체를 생성하고 적용해줬는데 이것은 구현체를 의존하는것이므로 위의 배우 예시를 들면 배우(오.. 인프런/스프링핵심원리(기본) 2022. 12. 9. 6)새로운 할인 정책 개발 , 적용과 문제점 , 문제점 해결 (의존성 주입) 할인정책을 바꾼다고 했을때? 할인에 대한 역할과 구현을 나눠서 개발하지않았다면 기획의 대한 변화는 골치가 아팠을것이다. 하지만 할인에 대한 역할(인터페이스)를 만들어놓았고, 그것에 대한 구현(구현체)를 지금 FixDiscountPolicy로 구현해놓은상태이고 기획자가 원하는대로 새로운 할인정책인 RateDiscountPolicy 라는 구현체를 만들어서 적용해주자. RateDiscountPolicy.java (구현체) public class RateDiscountPolicy implements DiscountPolicy { private int discountPercent = 10; @Override public int discount(Member member, int price) { //할인금액이 얼마인.. 인프런/스프링핵심원리(기본) 2022. 12. 9. 이전 1 2 다음