본문 바로가기
김영한님 인강듣고/스프링 핵심원리-기본

코드 복습( 처음 ~ 섹션 3까지 )

by doriver 2024. 2. 21.

스프링 핵심 원리 이해 - 예제 만들기 , 객체지향 원리 적용

( 커밋박은 코드 기준으로 복습함 )

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 붙은 메소드 반환 타입