본문 바로가기

Dev.BackEnd/Servlet&JSP

#미니 MVC FrameWork 만들기 두번째 단계, DAO 조작

미니 MVC Framework 만들기 두번째 단계,

MemberDao Interface를 통한 다형성 핸들링,
Dao를 외부로부터 주입받아 의존성을 주입하자.

문제점 착안,
현재까지는 MemberDao를 ContextLoaderListener에서 생성하여
ServletContext에 보관한 다음에,
각각의 서블릿에서 꺼내 사용하였다.
이렇게 되면 각각의 서블릿에서 중복되는 코드가 발생하며 유지보수성이 떨어지게 된다.

그리고 MemberDao 클래스에 작성된 쿼리문들은 Mysql기반으로 작성되어 있다.
만약에, 서비스를 구축하고 있는 데이터베이스의 종류가 변경된다면,
쿼리문 뿐만 아니라, MemberDao에 관련된 코드들을 모두 수정해야하는 상황이 발생한다.


해결방안,
각각의 페이지 컨트롤러에는 MemberDao를 주입받을 수 있는 set 메소드를 준비하고,
ContextLoaderListener에서 주입시켜준다.
이 때 페이지 컨트롤러도 ContextLoaderListener에서 생성하자.
이렇게 되면 MemberDao객체는 별도로 꺼내서 사용할 일이 없기 때문에 ServletContext에 저장하지 않게 된다.
Chaing을 통해, 페이지 컨트롤러 인스턴스 형성과 MemberDao 주입을 한 코드에 모두 할 수 있다.

인터페이스를 이용하여 다형성으로 MemberDao를 핸들링하게 되면, 유지보수성을 높일 수 있다.
MemberDao 라는 Interface를 기준으로, MysqlMemberDao와
(예를 들면 oracle DB) OracleMemberDao를 구축하면,
인터페이스 타입으로 두 가지의 클래스를 모두 핸들링할 수 있으므로 그만큼 유지보수성이 높아지게 되는 것이다.


구체화,
1
2
3
4
5
6
sc.setAttribute("/auth/login.do"new LogInController().setMemberDao(memberDao));
sc.setAttribute("/auth/logout.do"new LogOutController());
sc.setAttribute("/member/list.do"new MemberListController().setMemberDao(memberDao));
sc.setAttribute("/member/add.do"new MemberAddController().setMemberDao(memberDao));
sc.setAttribute("/member/update.do"new MemberUpdateController().setMemberDao(memberDao));
sc.setAttribute("/member/delete.do"new MemberDeleteController().setMemberDao(memberDao));
cs

1
MemberDao memberDao = new MySqlMemberDao();
cs

MysqlMemberDao는 MemberDao라는 Interface를 구현하고 있다.



End