5. public interface 옥수수{
}
@Repository
public class 찰옥수수 implements 옥수수 {
}
@Repository
public class 팝콘옥수수 implements 옥수수 {
}
@Service
public class 간디{
@Autowired 옥수수 찰옥수수;
}
간디는 대체
어떤 옥수수를
팔겠다는거지…
6. @Autowired 동작원리
• 해당 타입의 빈이 없을 때 BAD!
• 해당 타입의 빈이 1개일 때 GOOD!
• 해당 타입의 빈이 여러개 일 때
• 해당 멤버 변수랑 같은 이름의 빈이 있을 때 GOOD!
• 해당 멤버 변수랑 같은 이름의 빈이 없을 때 BAD!
• Whiteship’s 권장사항
• 같은 타입의 빈이 여러개 일땐 명시적으로 이름을 설정해 주세요.
• @Repository(“찰옥수수”), @Service(“찰옥수수 간디”)
• 같은 타입의 빈이 여러개 일땐 빈을 주입 받을 곳에서 @Autowired
대신 @Resource를 사용하세요.
• @Resource(“찰옥수수”)
7. @Repository
public class 찰옥수수 implements 옥수수 {
}
@Repository
public class 팝콘옥수수 implements 옥수수 {
}
@Service
public class 간디{
@Autowired 옥수수 찰옥수수;
}
근데 간디가
팝콘을 팔던데?
9. XML과 애노테이션 동작원리
• 컴포넌트 스캔으로 DI 한 다음 XML에서 DI 한 정보로
덮어씁니다.
• Whiteship’s 권장사항
• XML로 등록할 빈은 @Component를 사용하지 맙시다.
• DI 정보를 굳이 XML로 덮어써야 한다면 반드시 주석을 달아둡시다.
11. @Transactional
@Service
@Transactional
public class 간디 {
public 옥수수 거래(다이아 몬드) throws 유열사태 {
…
}
}
간디 클래스의 모든 public 메서드에
트랜잭션 처리 됨.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class 간디 테스트 {
@Autowired 간디 간디;
…
}
12. 인터페이스를 만들어 볼까…
@Service
@Transactional
public class 간디 implements 간디서비스 {
public 옥수수 거래(다이아 몬드) throws 유열사태 {
…
}
}
public interface 간디서비스 {
public 옥수수 거래(다이아 몬드) throws 유열사태;
}
엥.. 갑자기
간디테스트에서
에러가 나네요?
13. 간디 빈 구조
간디 간디 프록시
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class 간디 테스트 {
@Autowired 간디 간디;
…
}
14. 간디 인터페이스 도입시 빈 구조
간디 서비스
간디 간디 프록시
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class 간디 테스트 {
@Autowired 간디 간디;
…
}
15. 스프링 AOP 동작 원리
• <tx:annotation-driven /> 기본 설정 동작 원리
• 인터페이스가 있으면 JDK 프록시를 사용한다.
• 인터페이스가 없으면 CGLib 프록시를 사용한다.
• Whiteship’s 권장사항
• 인터페이스를 만들었다면 인터페이스를 사용할 것.
• 클래스기반으로 코딩하고 있다면 클래스 기반 프록시를 명시적으로
선언할 것.
• <tx:annotation-driven proxy-target-class=“true” />
16. 애플리케이션 컨텍스트 상속 구조
ApplicationContext
ApplicationContext
public AC createAC(AC parent) {
CAC cac = new ACAC();
cac.setParent(parent);
return cac;
}
ConfigurableApplicationContext
17. ApplicationContext 상속구조 동작원리
• 부모 App 컨텍스트는 자식 App 컨텍스트에 있는 빈에
접근할 수 없다.
• 자식 App 컨텍스트는 부모 App 컨텍스트에 있는 빈에
접근할 수 있다.
• 빈을 달라고 요청하면…
• 자기 자신이 가지고 있는 빈을 찾아 준다.
• 자기 자신한테 없으면 부모 애플리케이션 컨텍스트에서 찾아 준다.
20. 스프링 웹 애플리케이션 설정
• 부모 WAC
• 웹과 관련이 없는 빈 등록
• 예) Service, Dao
• 하위 WAC
• 웹과 관련이 있는 빈 등록
• 예) Controller
• Whiteship’s 권장사항
• 웹과 관련이 있는 것과 그렇치 않은 것을 패키지 레벨에서 잘 구분
할 것
• 패키지 레벨로 구분하기 힘들다면 @Component 애노테이션을
확장해서 사용할 것
• <context:component-scan>의 하위 엘리먼트인 <exclude>와
<include> 활용 할 것.
25. DispatcherServlet 동작원리
• 해당 전략 타입의 빈이 하나라도 등록되면 해당 전략의
기본 전략 빈들은 하나도 등록되지 않는다.
• 예) mygroups-servlet.xml에 BeanNameUrlHandleMapping을
등록하면.. DS의 기본 전략 중 하나인
DefaultAnnotationHandlerMapping은 자동으로 등록되지 않는다.
• Whiteship’s 권장사항
• 빈으로 등록할 전략에 대해서는 기본 전략에 의지하지 말 것.
• HandlerMapping, HandlerAdapter, ViewResolver,
HandlerExceptionResovler
• DispatcherServlet의 동작원리를 팀 내에 공유할 것.