직접 Controller 에서 DAO 를 쓰면 안되는 이유
1.첫번째 이유
지금까지 컨트롤라가 직접 DAO를 사용하여 기능을 수행하였지만 그렇게하면
DAO가 바뀔때 Controller의 모든 메소드를 수정해야한다 유지보수가 어려움
해결
그래서 interface Service를 구현한 serviceimpl을 controller에 사용하게 만든다
ServiceImpl 에
@Autoiwired
private BoardDAO boardDAO;
어노테이션으로 적용한다
2.두번째 이유
AOP 적용때문이다
모든 비즈니스 컴포넌트의 메소드에서 공통으로 사용할 기등들을 횡단관심, 즉
어드바이스로 구현했다
이 어드바이스가 적절한 시점에 동작할수있도록 XML이나 어노테이션으로 처리했다 .그러나 지금까지 어드바이스가 동작하지 않았다
횡단관심에 해당하는 어드바이스가 동작하려면 반드시
Service 구현 클래스 (BoardServiceImpl)의 비즈니스 메소드가 실행되어야한다.
스프링설정에 파일에서 포인트컷 설정부분은

<Adviser>를 이용한 트랜젝션 포인트컷 설정

<Aspect>를 이용한 빈객체로 AOP 설정 (지금은 필요없어서 주석처리)
중요한 것은 DAO클래스 메소드를 지정한것이 아니라
Service 인터페이스를 구현한 ServiceImpl 클래스의 메소드를 설정했다는 것이다
DAO클래스를 직접 호출하는 상황에서는 어느 어드바이스의 동작을 할수가없다
앞에서 예제에서 실행된 이유
기존 앞의 예제들에서는
//1. Spring 컨테이너를 구동
GenericXmlApplicationContext container
= new GenericXmlApplicationContext (”applicationContext.xml”);
//2.Spring 컨테이너로부터 BoardServiceImpl( 객체이름을 boardService로 변경해둠 ) 객체를 Lookup한다.
BoardService boardService =(BoardService)container.getBean(”boardService”);
으로 해결했었다
또다른 문제
그러나 controller에서
BoardService boardservice @Autowired로 의존성을 주입하려고 하면
BoardService 타입의 객체가 메모리에 없어서 의존성을 주입을 할 수없다는 에러가 뜬다 (메모리에 boardService가 올라가지 않는이유는 다음그림과 같다)

- 클라이언트로 “.do” 요청이 들어오면 서블릿 컨테이너는 DispatcherServlet을 생성한다 .
- DispatcherServlet은 스프링 설정 파일인 presentation-layer.xml 을 로딩하여
- 스프링 컨테이너를 구동한다
- 이때 BoardController 객체만 메모리에 생성되고 @Autowired로 의존성 주입할 BoardServiceImpl 객체는 생성되지 않는다
presentation-layer.xml 에설정된 범위에 Controller들 객체들만 컴포넌트 스캔하게 되어있다
그러므로 의존성 주입 대상이 되는 비즈니스 컴포넌트를 먼저 생성하려면 비즈니스 컴포넌트를 먼저 생성하는 또다른 스프링 컨테이너가 필요하다. 그리고 이컨테이너를 Controller를 메모리에 생성하기 전에 생성하면 된다.
2-Layered 아키텍쳐
일반적 웹프로젝트는 이런식이다

비즈니스 레이어에 해당하는 소스폴더의 설정파일
src/main/resources 폴더의 applicationContext.xml
프레젠테이션 레이어에 해당하는 설정파일
WEB-INF/config 폴더의 presentation-layer.xml
DispatcherServlet 이 생성되어 presentation-layer.xml 읽고 Controller 객체가 생성되기 전에 applicationContext.xml 파일을 읽어 컴포넌트를 메모리에 생성해야한다 .