Dao는 원래 데이터베이스에 접근하는 객체? 정도로 생각하면 돼. 근데 우리는 아직 데이터베이스를 다루지 않으니까 DB 역할을 하고 있는 ArrayLis들을 여기에 대신 담을거야.
public class ArticleDao {
public List<Article> articles;
public ArticleDao() {
articles = new ArrayList<>();
}
}
public class MemberDao {
public List<Member> members;
public MemberDao() {
members = new ArrayList<>();
}
}
그래서 Article이랑 Member List를 여기에 저장하자.
그리고 Container클래스를 추가 해 줄건데, Container 클래스의 역할은 패키지 내에서 뭔가 공용으로 사용하려고 만들었어 그래서 Dao들을 공용으로 사용하기 위해 컨테이너에 넣어보자. 또..또 정리하는 세분화 하는 시간이다..
package org.example.ArticleManager;
import org.example.dao.ArticleDao;
import org.example.dao.MemberDao;
public class Container {
public static ArticleDao articleDao;
public static MemberDao memberDao;
static {
articleDao = new ArticleDao();
memberDao = new MemberDao();
}
}
Container 클래스에 dao들을 넣었는데 staic으로 객체를 생성하도록 할거야.
그러면 프로그램이 실행되는 동시에? dao객체들이 만들어지겠지?
그러면 Dao에 있는 생성자들은 static에서 new 하면서 객체가 생성될 때 Dao생성자들이 실행되면서 List가 만들어 지는거야! 뭔말알!?!??전혀 전혀 모르겠어요.. 하하하
이제 controller쪽에서 얘네들을 가져올 때도 생각을 다시 해봐야해. 어떻게 하면 좋을까?
-> 그냥 타고타고 이동하는거야
public ArticleController(Scanner sc) {
this.sc = sc;
articles = Container.articleDao.articles;
}
이렇게 그냥 articleDao는 Container안에 있으니까 Container->articleDao->articles이렇게 가져오면 된다!!
저번에 작성자의 정보가 보이도록 구현 했으니까 이제 그거를 이름이 보이도록 구현 해보자.
String writerName = null;
System.out.println(" 번호 / 날짜 / 작성자 / 제목 / 내용 ");
for (int i = forPrintArticles.size() - 1; i >= 0; i--) {
Article article = forPrintArticles.get(i);
for (Member member : members) {
if (article.getMemberId() == member.getId()) {
writerName = member.getName();
break;
}
}
일단 wrtierName이라고 변수를 만들어서 여기에 작성자를 저장하자.
그리고 forprintArticles를 for문으로 돌아서 artilce에 저장하자.
작성자 아이디를 찾아야 하니까 member를 순회 하면서 작성자 Id랑 member의 Id값이랑 같으면 writerName변수에 member의 Name을 저장하면 이름을 알 수 있을거야.
그리고 이제 출력할 때 번호, 제목, id 이런식으로 가져오잖아? 여기에 getName()까지 추가하면 작성자 까지 보이겠지??
if (Util.getNowStr().split(" ")[0].equals(article.getRegDate().split(" ")[0])) {
System.out.printf(" %d / %s / %s / %s / %s \n", article.getId(), article.getRegDate().split(" ")[1], writerName, article.getTitle(), article.getBody());
} else {
System.out.printf(" %d / %s / %s / %s / %s \n", article.getId(), article.getRegDate().split(" ")[0], writerName, article.getTitle(), article.getBody());
예를들어 이렇게!
일단 Service 클래스를 왜 만드는지를 알아야 해.

이게 프로그램의 구조라고 할 수 있는데 지금 우리가 Service부분 말고는 다 구현을 해놨지?
근데 지금 우리의 문제점이 사진이랑은 다르게 controller에서 Service를 통해 Dao랑 연결되는게 아니라 지금 상태는 다이렉트로 Dao랑 연결되어있어. 그래서 우리가 해야할 일은 Serice를 만들어 연결다리 역할을 해줘야 한다!! 이해했지??네니요?....
MemberService부터 살펴보자.
public class MemberService {
private MemberDao memberDao;
public MemberService() {
memberDao = Container.memberDao;
}
public List<Member> getMembers() {
return memberDao.members;
}
}
ArticleService는 어떻게 될까?
public class ArticleService {
private ArticleDao articleDao;
public ArticleService() {
articleDao = Container.articleDao;
}
public List<Article> getArticles() {
return articleDao.getArticles();
}
public void add(Article article) {
articleDao.add(article);
}
public int getSize() {
return articleDao.getSize();
}
public List<Article> getForPrintArticles(String searchKeyword) {
List<Article> forPrintArticles = new ArrayList<>();
if (searchKeyword.length() > 0 || searchKeyword != null) {
System.out.println("검색어 : " + searchKeyword);
for (Article article : articleDao.getArticles()) {
if (article.getTitle().contains(searchKeyword)) {
forPrintArticles.add(article);
}
}
if (forPrintArticles.size() == 0) {
System.out.println("검색 결과 없음");
return forPrintArticles;
}
}
return forPrintArticles;
}
public Article getArticleById(int id) {
return articleDao.getArticleById(id);
}
public void remove(Article article) {
articleDao.remove(article);
}
public void updateArticle(Article article, String newTitle, String newBody) {
articleDao.updateArticle(article, newTitle, newBody, Util.getNowStr());
}
}
Controller에서 했던 일들을 Service클래스로 옮겨왔어. add, remove, update, Id가져오는거, Size도 가져오는거, 검색하는 기능들 . 이렇게 controller에서 직접적으로 Dao한테 연결 하지 않고 Service가 Dao한테 필요한거 달라고 요청하는 이런 흐름이야.
그럼 Dao 부분도 조금 수정을 해 줄 필요가 있어.
좀 복잡하겠지만 그래도 흐름을 조금 잡고 가야할 필요가 있는것 같아.
이제 Container 부분도 한번 보면
public class Container {
public static ArticleDao articleDao;
public static MemberDao memberDao;
public static ArticleService articleService;
public static MemberService memberService;
public static void init() {
articleDao = new ArticleDao();
memberDao = new MemberDao();
memberService = new MemberService();
articleService = new ArticleService();
}
}
Container에 init()함수를 만들고 init함수를 main클래스에서 프로그램 실행하자 마자 함수도 실행 하도록 만들어주고 , Service 분도 Container에서 다루도록 설계 할거야.
느낀점
마지막에 복잡한 부분을 다루고 역할분담을 했지만.. 아직까지 혼자 생각하면서 만들기는 아직 힘든 부분인것 같다.. 얼른 공부 열심히 해서 내 생각대로 역할분담도 시키고 코드도 짜는 사람이 되고싶다