spring-god-study / spring-basic

김영한님 스프링 기본 강의를 듣고 서로 인증하고 힘을 내며 잇쌰잇쌰하는 프로젝트
0 stars 3 forks source link

2021.07.29 (목) 인증 #27

Open kyupid opened 3 years ago

dnjsrud3407 commented 3 years ago

강의 : 스프링 MVC 1편 강의 회차 <서블릿> <서블릿, JSP, MVC 패턴> <MVC 프레임워크 만들기>

cxz5309 commented 3 years ago

7. 의존관계 자동 주입

생성자 주입을 선택해라!

불변

누락 생성자 주입을 사용하면 주입 데이터를 누락 했을 때 컴파일 오류가 발생한다.

final 키워드

정리

롬복과 최신 트랜드

조회 빈이 2개 이상 - 문제

@Autowired 필드 명, @Qualifier, @Primary

조회 대상 빈이 2개 이상일 때 해결 방법

  1. @Autowired 필드 명 매칭
    • @Autowired 는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다
      1. 타입 매칭
      2. 타입 매칭의 결과가 2개 이상일 때 필드 명, 파라미터 명으로 빈 이름 매칭
        @Autowired
        public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy **rateDiscountPolicy**) {
        this.memberRepository = memberRepository;
        this.discountPolicy = **rateDiscountPolicy**;
        }
  2. @Qualifier @Qualifier끼리 매칭 빈 이름 매칭
    • @Qualifier 는 추가 구분자를 붙여주는 방법이다. 주입시 추가적인 방법을 제공하는 것이지 빈 이름을 변경하는 것은 아니다.
      1. @Qualifier끼리 매칭
      2. 빈 이름 매칭
      3. NoSuchBeanDefinitionException 예외 발생
        @Autowired
        public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
        }
  3. @Primary 사용
    • @Primary 는 우선순위를 정하는 방법이다. @Autowired 시에 여러 빈이 매칭되면 @Primary 가 우선권을 가진다

@Primary, @Qualifier 활용

애노테이션 직접 만들기

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}

조회한 빈이 모두 필요할 때, List, Map

자동, 수동의 올바른 실무 운영 기준

  1. 편리한 자동 기능을 기본으로 사용하자
    • 스프링은 @Component 뿐만 아니라 @Controller , @Service , @Repository 처럼 계층에 맞추어 일반적인 애플리케이션 로직을 자동으로 스캔할 수 있도록 지원한다.
    • 거기에 더해서 최근 스프링 부트는 컴포넌트 스캔을 기본으로 사용하고, 스프링 부트의 다양한 스프링 빈들도 조건이 맞으면 자동으로 등록하도록 설계했다
  2. 그러면 수동 빈 등록은 언제 사용하면 좋을까?
    • 애플리케이션은 크게 업무 로직과 기술 지원 로직으로 나눌 수 있다.
    • 업무 로직 빈: 웹을 지원하는 컨트롤러, 핵심 비즈니스 로직이 있는 서비스, 데이터 계층의 로직을 처리하는 리포지토리등이 모두 업무 로직이다. 보통 비즈니스 요구사항을 개발할 때 추가되거나 변경된다.
    • 기술 지원 빈: 기술적인 문제나 공통 관심사(AOP)를 처리할 때 주로 사용된다. 데이터베이스 연결이나, 공통 로그 처리 처럼 업무 로직을 지원하기 위한 하부 기술이나 공통 기술들이다
    • 기술 지원 로직은 업무 로직과 비교해서 그 수가 매우 적고, 보통 애플리케이션 전반에 걸쳐서 광범위하게 영향을 미친다. 그리고 업무 로직은 문제가 발생했을 때 어디가 문제인지 명확하게 잘 드러나지만, 기술 지원 로직은 적용이 잘 되고 있는지 아닌지 조차 파악하기 어려운 경우가 많다. 그래서 이런 기술 지원 로직들은 가급적 수동 빈 등록을 사용해서 명확하게 드러내는 것이 좋다
    • 비즈니스 로직 중에서 다형성을 적극 활용할 때

정리

arangeblue commented 3 years ago

강의명 : 스프링 MVC 1편 수강회차 : 스프링 MVC 섹션 5 마무리

image

스프링 MVC 구조 ( 오른쪽이 스프링)

동작순서

  1. 핸들러 조회(컨트롤러 조회) : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러를 조회
  2. 핸들러 어댑터 조회 : 핸들러를 실제로 실행할 수 있는 어댑터를 조회
  3. 핸들러 어댑터 실행 : 핸들러에 맞는 어댑터가 존재한다면, 실행 -> 실제 핸들러(컨트롤러) 실행
  4. 핸들러 실행
  5. ModelAndView 반환 : 핸들러 실행 결과로 반환된 정보를 받아 핸들러 어댑터는 ModelAndView로 변환하여 반환한다.
  6. viewResolver 호출 : 반환된 ModelAndView를 뷰 리졸버에 넣고 실행
    • JSP의 경우 InternalResourceViewResolver가 자동 등록되고 사용
  7. view 반환 : 뷰 리졸버는 뷰의 논리이름을 물리 이름으로 바꿔주고 렌더링 역할을 담당하는 뷰 객체를 반환한다.
  8. 뷰 렌더링 : 뷰를 통해 뷰를 렌더링한다.

구현완료