🍏 개발일기

MVC연습하기 - 7. 종족으로 주민검색

보배 진 2025. 10. 28. 15:45

 

 

 

🍨 7.종족으로 주민검색 전체코드

else if(command == 7) {
    PersonDTO personDTO = new PersonDTO();
    personDTO.setCondition("MENU");
    ArrayList<PersonDTO> datas = model.selectAll(personDTO);

    // 종족으로 검색어 입력받고
    String keyword = view.getType(datas); 

    // 해당 검색어를 가진 데이터를 뽑아서
    personDTO = new PersonDTO();
    personDTO.setCondition("TYPE");
    personDTO.setKeyword(keyword);
    datas = model.selectAll(personDTO);

    view.printDatas(datas);
}

 

 

종족 별로 주민을 검색하여 출력하고자 합니다

ex) 강아지 개구리 햄스터

코딩을 하는 사람에게 크게 선택지가 두 가지 있는데

1. View에서 강아지/개구리/햄스터를 전부 다 보여준다

2. Model에서 종족배열을 뽑아서 Controller에게 전달하고, 

그걸 다시 View에게 전달한다

 

방식별 장단점

1번방식은 간편하다

2번방식은 확장성, 유지보수성이 좋다

 

 

 

 

크게 보면 무조건 2번이 좋기 때문에 2번 방식으로 코딩을 시작

 

 


 

ArrayList<PersonDTO> datas = model.selectAll(personDTO);

ArrayList를 만들어 model에서 DB 데이터를 가져옵니다

 

PersonDTO personDTO = new PersonDTO();

매개변수로 personDTO 객체를 넘기기 때문에 생성하고

 

personDTO.setCondition("MENU");

selectAll 메서드는 분기판단용 변수 condition 값이 필요하기 때문에 

"MENU"를 넘겨줍니다

 

 

 

 

메뉴 번호에 7을 입력하면 

햄스터 고양이 강아지가 보이는 부분이었습니다

 

 

 


 

 

getType() 메서드 전체코드

public String getType(ArrayList<PersonDTO> datas) { // 높은 응집도***
    for(int i=0; i<datas.size(); i++) {
        System.out.println((i+1) +". " + datas.get(i).getType());
    }
    /*
    결합도가 높았고 데이터에 관련된 일을 View에서 하면 좋은 코드는 아니라고 생각한다
    ArrayList<String> al = new ArrayList<>();
    al.add("고양이");
    al.add("개구리");
    al.add("햄스터");
    for(int i=0; i<al.size(); i++) {
        System.out.println((i+1) + ". " + al.get(i));
    }
    */
    int num;
    while(true) {
        System.out.print("종족입력 >> ");
        num = scanner.nextInt();
        if(1<=num && num <=datas.size()) {
            break;
        }
        System.out.println("범위에 맞게 입력해주세요!");
    }
    return datas.get(num-1).getType();
}

getType() 메서드로 종족으로 검색어를 입력받습니다

String keyword = view.getType(datas);

 

view에서 사용자에게 입력받은 data를 ex)햄스터를

keyword에 할당시킨다

 

 

 

 

 

datas = model.selectAll(personDTO);

data에 해당 검색어를 가진 데이터를 뽑아 select해야 합니다

 

 

personDTO = new PersonDTO();

personDTO.setCondition("TYPE");

personDTO 객체를 만들고

seCondition에TYPE를 넘겨줍니다 -> 분기판단용 변수 condition은 TYPE을 갖게 됩니다

 

 

personDTO.setKeyword(keyword);

getType으로 얻은 햄스터 keyword도 넘겨줍니다

 

 

 

personDTO 객체에는 내가 TYPE 상태, 내가 검색할 키워드는 햄스터 라는 것을 알고 있게 됩니다

selectAll 메서드에서 

else if(personDTO.getCondition().equals("TYPE")) {
    for(int i=0; i<this.datas.size(); i++) {
        if(this.datas.get(i).getType().contains(personDTO.getKeyword())) {
            int num = this.datas.get(i).getNum();
            String name = this.datas.get(i).getName();
            String type = this.datas.get(i).getType();

            PersonDTO data = new PersonDTO();
            data.setNum(num);
            data.setName(name);
            data.setType(type);
            datas.add(data);
        }
    }
}

현재 상태 TYPE이므로 if 조건문에 걸리게 되고

현재 가지고 있는 데이터의 번호, 이름, 타입을 datas를 add 시킵니다

 

 

 

 

view.printDatas(datas);

view에 햄스터인 data를 출력합니다