## 36. 데이터의 등록, 조회, 수정, 삭제 기능을 캡슐화하기 : DAO 객체 도입
- XxxListener에서 데이터를 조작하는 코드를 캡슐화하여 별도의 클래스로 분리
- 인터페이스로 DAO 객체 사용법을 정의
데이터의 등록, 조회, 수정, 삭제 기능을 캡슐화하기 : DAO 객체 도입
ㄴ XxxListener에서 데이터를 조작하는 코드를 캡슐화하여 별도의 클래스로 분리
ㄴ 인터페이스로 DAO 객체 사용법을 정의
ㄴ dao 패키지 생성
ㄴ MemberDao 인터페이스 생성
MemberDao.java
ㄴ MemberDao 인터페이스 insert 메서드 작성
ㄴ Member 클래스 import
ㄴ MemberListDao 클래스 생성
MemberListDao.java
ㄴ MemberDao 인터페이스에 추가한 insert 메서드 구현
MemberListDao.java
ㄴ App 클래스에서 해당 코드 복사해오기
ㄴ memberList => list 로 코드 변경
MemberListDao.java
ㄴ App 클래스에서 loadJson, saveJson 메서드 복사해오기
MemberListDao.java
=>
MemberListDao.java
ㄴ 생성자 추가
ㄴ fileName 을 생성자에 받아와서 loadJson 메서드를 실행하도록 함
MemberListDao.java
ㄴ MemberAddListener 클래스에서 해당 코드 복사해옴
ㄴ m => member
MemberListDao.java
ㄴ MemberAddListener 클래스에서 해당 코드 복사해옴
ㄴ m => member
MemberListDao.java
ㄴ filename을 받아서 해당 파일에서 JSON 데이터를 읽어와 list에 저장하는 초기화할 수 있도록 코드 작성
MemberListDao.java
ㄴ floadJson 메서드에 filename 넘겨줄 필요가 없으므로 제거
MemberListDao.java
ㄴ insert 메서드에 saveJson 메서드 추가
MemberListDao.java
ㄴ 데이터를 등록할 때마다 즉시 파일에 저장
MemberAddListener.java
ㄴ MemberAddListener 클래스에서 MemberDao 타입의 memberDao 변수를 선언
MemberAddListener.java
ㄴ List<Member> list => MemberDao memberDao
ㄴ super(list) => super(null)
ㄴ memberDao는 MemberDao 타입의 인스턴스 변수로, 생성자의 매개변수로 전달받은 memberDao를 초기화하는 역할을 함
=> 이렇게 초기화된 memberDao는 MemberAddListener 클래스 내에서 사용될 수 있음
MemberAddListener.java
ㄴ m.setNo(Member.userId++) 는 memberDao 의 insert 메서드에서 해주므로 제거
ㄴ this.list.add(m) => memberDao.insert(m)
App.java
ㄴ MemberListDao 클래스는 MemberDao 인터페이스를 구현
ㄴ MemberListDao의 인스턴스를 MemberDao 타입으로 참조
ㄴ MemberDao 인터페이스에 선언된 메서드를 호출하여 MemberListDao의 구현
ㄴ MemberListDao 생성자의 매개변수로 "member.json"이 전달시키도록 함
App.java
ㄴ memberList => memberDao
App.java
ㄴ MemberListListener 는 memberDao 로 먼저 바꾸고 관련 코드 수정해보기
MemberListListener.java
ㄴ MemberDao 타입의 memberDao 변수를 선언
MemberListListener.java
ㄴ MemberAddListener 클래스와 비슷하게 수정
MemberListListener.java
ㄴ Iterator => List
ㄴ memberDao 에 list 메서드 추가할 예정
MemberListListener.java
ㄴ while 문 for 문으로 수정
MemberDao.java
ㄴ MemberDao 인터페이스에 MemberListListener 클래스에서 사용할 list 메서드 추가
MemberListDao.java
=>
MemberListDao.java
ㄴ MemberDao 인터페이스에 추가한 list 메서드 구현
=> list 에 있는 것을 그대로 리턴
App 클래스 실행
ㄴ 실행 시 파일 로드 잘 됨을 확인
데이터 추가
ㄴ 데이터 추가 등록 할 경우 잘 실행됨을 확인
ㄴ 강제 종료 후 App 클래스 재실행
ㄴ 강제 종료 시에도 저장되는지 확인
MemberDao.java
ㄴ 리턴타입이 Member 인 findBy 메서드 규칙 추가
MemberListDao.java
=>
ㄴ MemberDao 인터페이스에 있는 findBy 메서드 실제 구현
ㄴ AbstractMemberListener 클래스의 findBy 메서드에서 해당 코드 복사해오기
App.java
ㄴ memberList => memberDao
MemberDetailList.java
ㄴ MemberDao 이용하도록 코드 수정
MemberDetailList.java
ㄴ this => memberDao
ㄴ memberDao 에 있는 findBy 메서드 이용하기 위함
MemberUpdateList.java
ㄴ MemberDao 이용하도록 코드 수정
MemberUpdateList.java
ㄴ this => memberDao
ㄴ memberDao 에 있는 findBy 메서드 이용하기 위함
MemberDao.java
ㄴ update 메서드 규칙 추가
MemberListDao.java
=>
MemberListDao.java
ㄴ MemberDao 인터페이스의 update 메서드 구현
=>
MemberDao.java
ㄴ 리턴타입을 void => int 로 변경
=>
MemberListDao.java
ㄴ 리턴타입을 void => int 로 변경하여 제대로 수정되면 1, 그렇지 않으면 0이 리턴 되도록 코드 수정
MemberUpdateList.java
ㄴ memberDao 의 update 메서드 사용하도록 함
App.java
ㄴ memberList => memberDao
App.java
ㄴ memberList => memberDao 먼저 변경 후 인터페이스 규칙 추가 및 구현 예정
MemberDeleteListener.java
ㄴ AbstractMemberListener 사용하지 않아도 되므로 제거
=>
MemberDeleteListener.java
ㄴ MemberDao 사용하도록 코드 수정
MemberDeleteListener.java
ㄴ memberDao 에 delete 메서드 추가할 예정
MemberDao.java
ㄴ delete 메서드 추가
MemberListDao.java
ㄴ MemberDao 의 delete 메서드 구현
MemberDeleteListener.java
ㄴ ActionListener 인터페이스를 따르도록 함 (BreadcrumbPrompt 때문)
AbstractMemberListener.java
ㄴ 해당 코드 필요 없으므로 제거
MemberAddListener.java
ㄴ 이제 super 생성자 호출할 필요 없음
MemberListListener.java
ㄴ 이제 super 생성자 호출할 필요 없음
MemberUpdateListener.java
ㄴ 이제 super 생성자 호출할 필요 없음
AbstractMemberListener.java
ㄴ 해당 코드 복사해서 필요한 곳에 각각 넣어주기
=>
MemberListListener.java
MemberDetailListener.java
AbstractMember.java
ㄴ position == '0' ? "관리자" : "일반직원" 코드는 간단한 코드이므로 굳이 메서드로 만들지 않고 필요한 곳으로 다시 각각 넣어줌
AbstractMemberListener.java
ㄴ 이제 해당 코드들은 필요 없으므로 제거
MemberListListener.java
ㄴ inputPosition 메서드 사용하지 않으므로 ActionListener 만 상속해도 됨
MemberDetailListener.java
ㄴ inputPosition 메서드 사용하지 않으므로 ActionListener 만 상속해도 됨
AbstractMemberListener.java
ㄴ protected => static (public 생략)
=> 인스턴스 필드 없으므로 static 으로 해줘도 됨
ㄴ AbstractMemberListener => MemberActionListener 라는 이름의 인터페이스로 변경
=>
MemberActionListener.java
ㄴ AbstractMemberListener 라는 이름의 추상클래스 대신 MemberActionListener 라는 이름의 인터페이스로 변경
MemberAddListener.java
ㄴ 추상 클래스에서 인터페이스로 변경되었으므로 extends => implements 로 변경
ㄴ MemberActionListener 인터페이스에 inputPosition 은 static 으로 되어있으므로 해당 이름을 주면 됨
MemberUpdateListener.java
ㄴ MemberAddListener 클래스와 동일하게 수정
App.java
ㄴ 해당 코드들 제거해도 됨
MemberListDao.java
ㄴ saveJson(list) 를 해줌으로써 데이터를 등록할 때마다 즉시 파일에 저장
MemberListDao.java
ㄴ saveJson(list) 를 해줌으로써 데이터를 등록할 때마다 즉시 파일에 저장
=> Board, Item 도 동일하게 적용
Board, Member, Item 중복 코드 해결
ㄴ JsonDataHelper 클래스 생성
JsonDataHelper.java
ㄴ MemberListDao 에 있는 loadJson, saveJson 메서드 잘라내옴
JsonDataHelper.java
ㄴ private => public static
=>
JsonDataHelper.java
ㄴ 파라미터에 filename 다시 추가
JsonDataHelper.java
ㄴ private => public static
JsonDataHelper.java
ㄴ 파라미터에 filename 다시 추가
MemberListDao.java
ㄴ JsonDataHelper 의 loadJson 이용 => 파라미터에 filename 추가
MemberListDao.java
ㄴ JsonDataHelper 의 saveJson 이용 => 파라미터에 filename 추가
MemberListDao.java
ㄴ JsonDataHelper 의 saveJson 이용 => 파라미터에 filename 추가
MemberListDao.java
ㄴ JsonDataHelper 의 saveJson 이용 => 파라미터에 filename 추가
=> Board, Item 도 동일하게 적용
ㄴ BoardDetailListener 에서 service 메서드 마지막에 boardDao.update(board); 코드 추가해주기