spring20 [SpringCore 핵심원리] 컴포넌트스캔 1. 컴포넌트스캔과 의존관계 자동 주입 - 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트스캔 기능을 제공한다. - @ComponentScan 은 @Component가 붙은 애들을 자동으로 빈에 등록한다. - @Component 애너테이션을 이제 붙여주면 스프링 빈에 자동으로 등록된다. - 그럼 DI는 어떻게하나 ? 원래는 AppConfig에서 하나씩 의존관계를 주입해주었지만, 이제는 - 생성자 위에 @Autowired 기능을 이용하면 클래스의 인터페이스에 맞는 의존성을 알아서 주입해준다. (여러 의존관계도 한번에 된당) - 알아서 등록하는 스프링 빈의 기본 이름은 클래스명을 사용하면서, 카멜케이스로 변경 (직접 지정도 가능) - 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다. .. 2024. 2. 17. [SpringCore 핵심원리] @Configuration 1. @Configuration - 싱글톤을 위해서 존재하는 놈이다 - Appconfig에서 MemoryMemberRepository는 new 생성자로 두번 호출이 될 수 밖에 없는데 - 테스트를 해보면, - @Configuration 이 붙으면 바이트코드 라이브러리를 사용해서 다른 클래스를 만들어서 조작한 그 놈을 스프링 빈으로 등록한다. - 스프링 빈이 있으면 그대로 반환, 없으면 생성해서 등록하는 로직이 있을 것이다. 어쨌든 싱글톤을 만족하게 해준다. - @Bean 만 적용하면 @Configuration 이 적용이 안된다. 스프링 빈은 등록이 되지만, 여러번 중복 호출한다. (싱글톤 깨진다) - 설정파일에는 무조건 넣으세요 2024. 2. 17. [SpringCore 핵심원리] 빈 설정과 싱글톤 1. 스프링 빈 설정 메타정보 : BeanDefinition - XML 이던, 뭐든간에 결국 BeanDefinition을 만들어버리면 스프링컨테이너는 이거만 알면 된다. - 즉, 스프링컨테이너는 BeanDefinition 에만 의존한다. (BeanDefinition 추상화에만 의존하도록 설계한거당) - 직접 스프링컨테이너에 등록할 수도 있다. 하지만 실무에선 안씀 2. 웹앱과 Singleton - 고객요청이 많은 웹앱에서 순수Java로된 DI컨테이너를 만들게되면 객체를 미친듯이 많이 생성하게 됨(메모리 낭비) - 해당 객체가 1개만 생성되고, 공유하도록 설계하면 된다. (싱글톤) - 싱글톤은 클래스 인스턴스가 딱 1개만 생성되도록 보장하는 패턴이다. - private 생성자를 이용해서 외부에서 임의로 n.. 2024. 2. 17. [SpringCore 핵심원리] IoC, DI, Container 1. IoC(제어의 역전) - 프로그램흐름의 제어를 구현객체가 아닌 외부에서 담당한다. - AppConfig에서 @Configuration 애너테이션 밑에 @Bean 애너테이션을 달면 스프링Bean으로 등록이 가능하다. - 아래처럼 ApplicationContext를 이용하면 스프링컨테이너에 빈으로 등록이 가능하다 - ApplicationContext 는 스프링컨테이너다. (인터페이스다) - 스프링컨테이너는 @Configuration이 붙은 애를 설정(구성) 정보로 사용한다. @Bean이라 적인 메서드를 모두 호출해서 반환된 객체를 스프링컨테이너에 스프링빈으로 등록한다. - @Bean 이름이 붙은 메서드의 이름을 사용한다(변경 가능하긴함) - applicationContext.getBean()으로 스프링.. 2024. 2. 17. [SpringCore 핵심원리] Config 1. OrderApp 실행 보면서 역할과 책임의 분리 확인하기 - MemberService에서는 Member관리 - OrderService에서는 Order관리를 해야지 - OrderService에서 할인 관련한건 createOrder할 때 할인정책을 정하는 객체한테 가서 해달라고 하면 됨 2. 만약 할인정책을 업데이트하게되면 ? - DiscountPolicy Interface의 구현체를 바꾸면 되는군! - DiscountPolicy의 구현체 생성 - 근데 할인정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야한다(OCP 위반) - 클라이언트가 직접 구현체의 선택까지 해야하는가 ? - 실제 클라이언트는 구현체 또한 의존을 하고있다!(DIP 위반) - 이러면 안되는딩! 3. 해결 방안.. 2024. 2. 16. [SpringCore 핵심원리] 설계 1. 비즈니스 요구사항 - 회원 : 회원을 가입하고 조회할 수 있따. : 회원에는 일반과 VIP 두가지 등급이 있다. : 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다(TBD) - 주문과 할인 정책 : 회원은 상품을 주문할 수 있다. : 회원 등급에 따라 할인 정책을 적용할 수 있다. : VIP는 1000원 할인해주는 고정 금액 할인을 적용(TBD) : 할인정책은 변경 가능성이 높다. 2. 설계 - 회원 도메인 : 클라이언트 -> 회원서비스 -> 회원저장소(interface) - 인터페이스 설계가 핵심 - Service에서 MemberRepository memberRepository = new MemoryMemberRepository(); - new ~ 부분이 DIP 위반이다.. 2024. 2. 16. [SpringCore 핵심원리] 시작 1. 스프링의 탄생 - 기술의 핵심 컨셉 : 객체지향언어 Java의 특징을 살려낸다. : 객체 지향 프로그래밍의 적용 - 다형성 : 역할(interface)과 구현(클래스/인스턴스)으로 분리 : 단순해지고 유연해지며, 변경이 편리해짐 : 사용자는 interface만 알면 됨. : 구현 대상의 내부 구조를 몰라도 된다 : 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다. : 인터페이스만 동일하다면 대상 자체를 변경해도 영향을 받지 않는다. : 구현보다 인터페이스가 중요하다. - 객체의 협력과 관계 : 수 많은 객체 클라이언트와 객체 서버는 서로 협력 관계를 가지게 된다. : 클라이언트에 영향을 주지 않는 변경이 가능 : 덕분에 확장이 가능한 설계가 가능 : 핵심은 interface의 안정적 설계 .. 2024. 2. 14. [Spring 김영한] 기본예제 만들어보기 (서비스) 1. 서비스 만들기 - 디렉토리를 자주 만들어야하는 특성 상 나는 shift + command + P 를 사용해서 만들어야지! - /service/MemberService 를 만들어준다 - 참고 : command + option + V 누르면 알아서 리턴으로 바꿔준다 개꿀 - 위와같이 작성해준 후 이런 경우 method로 뽑아내는 것이 좋다 - 참고 : Command + Option + M 누르면 메서드 추출이 가능하다. - MemberService 전체를 다음과 같이 정리한다. 2. 회원 서비스 테스트 - 클래스에서 커맨드 + . 누르고 테스트 생성을 통해 편하게 생성할 수 있다. - 꿀팁 : 테스트케이스는 그냥 한글로 해도 상관 없다. 이거 좋네 - given - when - then 문법 사용하기 .. 2023. 11. 21. 이전 1 2 3 다음