#토이 프로젝트

gisung2215·2020년 8월 27일
0
post-thumbnail

그동안의 학습내용을 바탕으로 작은 토이 프로젝트를 진행하는 시간을 가졌다. 이 글 통해 프로젝트를 회고해 보고자 작성한다. 프로젝트의 기본적인 뼈대는 제공되어졌으며, 해당 설계에 맞게 class 및 method를 구현하므로서 기능을 완성해 가는 작업을 진행했다.

💡 프로젝트 주제

  • 공공 데이터 포털에서 제공되는 아파트, 주택 정보등의 XML 데이터를 SAX Parser로 처리
  • 아파트, 주택 기본 정보 및 거래 정보 데이터를 바탕으로 검색 기능을 제공하여 해당 정보의 상세 정보를 제공
  • 화면은 Swing을 사용하며 Front End - Back End의 구조 이해

XML 개요

  • 각각의 SAX Handler는 Parse 된 거래 정보 전체를 저장하는 List houses를 멤버 변수로 가진다.
  • HouseSAXHandler 는 Map<String, HouseInfo> houses를 멤버변수로 가진다.
  • HouseSAXParser는 거래 관련 4개 List를 각각 다른 이름의 Map에 담는다.

AptDealHistory.xml

위 XML 파일을 다음과 같이 SAX 파싱을 통해 데이터를 처리한다.

  public class APTDealSAXHandler extends DefaultHandler {

	.....
	
	public void startElement(String uri, String localName, String qName, Attributes att){
		if(qName.equals("item")){
			house = new HouseDeal(HouseSaxParser.no++);
			house.setType(HouseDeal.APT_DEAL);
			houses.add(house);
		}
	}
	
	public void endElement(String uri, String localName, String qName){
		if(qName.equals("지역코드")) { 
			house.setCode(Integer.parseInt(temp));
		}else if(qName.equals("아파트")) { 
			house.setAptName(temp.trim());
		} 
  		......(생략)
	}
	
	public void characters(char[]ch, int start, int length){
		temp = new String(ch, start, length);
	}

처리한 데이터를 가지고 검색을 처리하는 로직을 구현했다.

	public List<HouseDeal> searchAll(HousePageBean bean){
		search.clear();
		List<HouseDeal> finds = new LinkedList<HouseDeal>();
		
		boolean[] type = bean.getSearchType();
		for (int i = 0, size=type.length; i < size; i++) {
			if(type[i]) {
				System.out.println(searchType[i]);
				search.addAll(deals.get(searchType[i]));>
			}
		}

		String dong = bean.getDong();
		String aptName = bean.getAptname();
		if (dong != null) {
			for (HouseDeal deal : search) {
				if (deal.getDong().contains(dong)) {
					finds.add(deal);
				}
			}
		}else if(aptName != null) {
			for (HouseDeal deal : search) {
				if(deal.getAptName().contains(aptName)) {
					finds.add(deal);
				}
			}
		}else {
			finds = search;
		}
		return finds;
	}

✔ 파라미터로 전달받은 검색조건과 일치하는 데이터들을 List로 전달하는 method 이다.

다음은 추가기능으로 구현한 종로구 환경 지도점검 내역 현황.csv 파일의 일부분을 발췌한 것으로 이는 XML 파일과 달리 TAG가 없어 프로젝트 당시 어떻게 처리할지 고민해야 했다.

private void loadData() {
// 환경 정보
// euc-kr
	List<List<String>> envAreaList = new ArrayList<>();

	String csvFileName = "res/서울시 종로구 환경 지도점검 내역 현황.csv";
	try (BufferedReader br = new BufferedReader(new FileReader(csvFileName))) {
	String line;

	while ((line = br.readLine()) != null) {
		String[] values = line.split(",");
				
		String name="";		//업체명
		String n="";		//인허가번호
		String codeNum=""; 	//업체코드
		String codeName="";	//업종명
		String date="";		//지도 점검 일자
		String check="";	//지도점검구분
		String checkPoint=""; 	//점검 사항
		String checkReslt=""; 	//점검 결과
		String address="";	//소재지 주소 
		for(int i = 0; i<values.length; i++) {
			switch(i) {
			case 0:
				name = values[i].substring(1,values[i].length()-1);
				break;
			case 2:
				codeNum = values[i].substring(1,values[i].length()-1);
				break;
			case 3:
				codeName = values[i].substring(1,values[i].length()-1);
				break;
			case 4:
				date = values[i].substring(1,values[i].length()-1);
				break;
			case 7:
				check = values[i].substring(1,values[i].length()-1);
				break;
			case 9:
				checkPoint = values[i].substring(1,values[i].length()-1);
				break;
			case 10:
				checkReslt = values[i].substring(1,values[i].length()-1);
				break;
			case 12:
				address = values[i].substring(1,values[i].length()-1);
				break;
					}
					
			values[i] = values[i].substring(1,values[i].length()-1);
		}
		list.add(new Environment(name, codeName, codeNum, date, check, checkPoint, checkReslt, address));
			}
	} catch (IOException e) {
		e.printStackTrace();
	}

}

✔ 그래서 선택한 방법은 데이터 입력 순서에 따른 index값을 가지고 필요 데이터만 추출하는 방법을 이용했다. 끼워 맞추는 방식으로 구현은 했으나 다른 방법을 고민해 봐야겠다.

구현 결과

📝후기

프로젝트 구조가 설계된 상태에서 특정 기능들만 구현하면 되었기에 쉬울거라 생각했으나 막상 프로젝트를 진행하며 크고 작은 어려움이 많았다. 먼저, 프로젝트를 구조를 이해하는 것이 어려웠다. DAO와 Parser, Service class를 들이 얽힌 관계를 이해하는데 오랜 시간이 걸렸다. 이는 프로젝트 설계에 대한 이해가 부족한 부분으로 앞으로 채워나가야 할 점이라 생각한다.

다음으로는 팀원과의 협업이 어려웠다. 이 프로젝트는 2인 1조가 되어 진행하는 Pair project였으나 협업 경험이 부족했던 우리는 어떻게 역할을 분담하고 협업해야 할지 몰랐다. 또한, 프로젝트의 branch를 나누고 병합하는 과정에서 불필요한 시간이 오래걸려 결국엔 대부분의 기능을 내가 구현하고 팀원이 화면 부분을 추가하는 것으로 프로젝트를 마무리했다.ㅠㅠ 이 또한 추가적인 공부가 필요할 것 같다.

0개의 댓글