DAO는 계속 new로 생성하게 되면 생성할 때마다 새로운 인스턴스를 생성하게돼서 공유할 수 없다.
그래서 Bean에 등록해놓고 Autowired로 끌어와서 사용하면 된다.
Autowired : 위에 ContextConfiguration에 써있는 링크에 있는 root-context.xml에 있는 Bean 객체를 끌고와서 사용할 수 있게 해주는 애.
순서
TDD했던 거 @Test들 빼고 다 복사해오기 ()
현재파일 interface화 하기 (우클릭 > Refactor > Extract Interface 클릭)
창 나오면 'Rename Original Class~~ ' 선택
클래스 이름 부분 '~Impl'으로 설정
하단 Member 부분에 public인 메서드들 체크하고 > Refactor 클릭
어노테이션
@Component가 최상위이고 아래 @Controller, @Repository, @service가 있다.
Spring에서 관리되는 객체임을 나타내는 어노테이션
@Component가 명시된 클래스들은 자동으로 스프링 빈으로 등록되고, 탐색 대상이 된다.
@Component가 최상위라 이걸로만 사용해도 되지만 그렇게되면 용량을 너무 많이 잡아먹어서 비효율적이다.
@Controller
web MVC 패턴에 사용되는 어노테이션
@xxxMapping 어노테이션을 해당 어노테이션 밑에서만 사용할 수 있음.
@Repository
퍼시트턴트 레이어, DB같은 파일 외부 I/O 작업을 처리함
이 어노테이션을 써야 @Autowired 에러 안난다.
TDD 에서도 이 DAO 파일을 끌어다 쓸 수 있다.
@Service
비즈니스 로직 함수에 사용된다.
환경설정
@Repository를 자동으로 Bean 객체로 등록할 수 있게 (auto scanning 할 수 있게)
servlet-context.xml의 맨 위 <bean 부분이랑, <context:component-scan base-package="com.bitstudy.app" /> 복사해서 root-context.xml에 넣기.
기존에 있던 bean 주석
servlet-context에 있던 bean 가져오기
beans:beans 써있던거 beans로 바꾸기
xmlns:beans 써있던거 xmlns로 바꾸기
servlet-context에 있던 context 가져오기
인식 순서
파일 리스트
DAO파일(인터페이스)
DAO파일(클래스)
컨트롤러
컨트롤러에 @Autowired로 Dao끌어오기
DAO 클래스 파일에 @Repository를 붙여놔서 컨트롤러에서 인식할 수 있게 함.
@Repository를 쓰면 @Autowired쓸 때 인식할 수 있다.
DAO파일이 인터페이스가 있고 클래스파일도 따로 있는 이유는 만약 DB를 mysql도 사용하고 oracle도 사용하는 등등 여러 db를 사용하게 된다면 인터페이스로 각각 메소드 이름을 규격화시켜놓고, DAO파일을 db 마다 만들어놓고 컨트롤러에서 다형성을 이용해 인터페이스로 불러오면 @Repository만 수정하면 유지보수하기 쉽기 때문이다.
추천 개발 순서
dto
boardMapping
dao
service
controller
흐름의 순서 반대로 하는 게 좋다.