스프링 핵심 원리 이해 - 예제 만들기 , 객체지향 원리 적용
( 커밋박은 코드 기준으로 복습함 )
1. 인텔리제이로 강의 세팅
2. 회원 도메인 개발
MemberServiceImpl 에서 직접
private final MemberRepository memberRepository = new MemoryMemberRepository();
3. 순수 java로 코드 테스트 ( main메소드 이용 )
public static void main( String[] args ) { ~ }
4. spring 이용 테스트
src / test / java 에 테스트코드 작성
( 메소드에 @Test 붙여서 )
5. 주문과 할인 도메인 개발
OrderServiceImpl 에서 직접
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
6. 테스트 코드 작성
순수 java로( main 메소드 이용 )
spring으로( src / test / java , 메소드에 @Test 붙여서 )
직접 선언
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
7. 새로운 할인정책 개발
8. 할인정책 바꿀때 DIP, OCP에 위반됨
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
9. 객체를 생성하고 연결하는 역할과( AppConfig ) 실행하는 역할의( ServiceImpl )분리
원래는 ServiceImpl 에서 직접 구체적 구현체인 Repository 를 생성해서 썻었는데
private final MemberRepository memberRepository;
이렇게 인터페이스로 선언만 하고, 생성자로 파라미터로 받게끔 받게끔 바꿔고
AppConfig에서 구체적 구현체인 ServiceImpl 을 생성( 구체적 Repository를 생성해서 생성자에 끼워서 )해서 뱉어내도록 함
AppConfig를 통해 ServiceImpl 를 생성하고, 비지니스 로직이 진행됨
10. 역할 분명해지게 AppConfig 리팩토링
ServiceImpl 에서 사용할 구체적 객체Repository 를 생성하는 부분을 메소드로 따로 뽑아냄
그러면
메소드 반환타입 : 인터페이스Service , 인터페이스Repository
메소드 반환 객체 : 구현클레스ServiceImpl , 구현클래스Repository
이렇게 깔끔하게 떨어짐
11. 할인정책 변화
할인정책 변화가 있을땐
메소드에서 반환 객체만 해당 정책 클래스로 바꾸면 됨
반환 타입은 인터페이스로 변화 없고
, 나머지 코드도 변화 없음
12. 스프링으로 전환( 스프링 컨테이너 사용 )
AppConfig에서
클래스에 @Configuration 붙이고, 메소드에 @Bean 붙여줌
ApplicationContext ac = new AnnotationConfigApplicationContext( AppConfig.class );
위 코드를 통해
AppConfig를 구성정보로 해서 스프링 컨테이너가 생성되고
, @Bean이 붙은 메서드를 모두 호출해서 반환된 객체가 스프링 컨테이너에 스프링 빈으로 등록된다.
MemberService memberService = ac.getBean("memberService", MemberService.class);
와 같이 ac.getBean( 빈이름 , 빈타입 ); 으로
스프링컨테이너에 등록된 ServiceImpl 을 꺼내와, 비지니스로직을 전개
빈이름 = @Bean 붙은 메소드 이름
빈타입 = @Bean 붙은 메소드 반환 타입
'김영한님 인강듣고 > 스프링 핵심원리-기본' 카테고리의 다른 글
| 코드 복습( 섹션 5 ) (0) | 2024.02.22 |
|---|---|
| @Configuration( 바이트코드 조작 ) 그리고 싱글톤 (0) | 2024.02.22 |
| 코드 복습( 섹션 4 ) (0) | 2024.02.21 |
| 웹 애플리케이션과 싱글톤 , 스프링 컨테이너 (0) | 2024.02.19 |
| 스프링빈 설정 메타정보 - BeanDefinition (0) | 2024.02.19 |