csv 파일로 된 공공데이터를 활용하는 방법이다.
새로운 프로젝트를 만들어 Dispatcher Servlet, Handler(Interface), lib의 파일 4개를 넣어주고, commands.properties 파일을 만든다.
공공데이터 다운/위치
공공데이터는 web-inf > files 폴더생성 후 그 안에 넣어준다.
공공데이터는 아래와 같은 사이트에서 다운로드가 가능하다. 이 외에도 더 다양한 사이트가 있으니 그건 나중에 포스팅할 예정이다.
csv 파일을 하나 골라 다운받아주고 폴더 위치에 맞게 넣어준다.
CSV Vo
package csv;
public class Vo {
private String arg1;
private String arg2;
private String arg3;
private String arg4;
private String arg5;
private String arg6;
private String arg7;
private String arg8;
private String arg9;
private String arg10;
private String arg11;
private String arg12;
public Vo(String arg1, String arg2, String arg3, String arg4, String arg5, String arg6, String arg7, String arg8,
String arg9, String arg10, String arg11, String arg12) {
super();
this.arg1 = arg1;
this.arg2 = arg2;
this.arg3 = arg3;
this.arg4 = arg4;
this.arg5 = arg5;
this.arg6 = arg6;
this.arg7 = arg7;
this.arg8 = arg8;
this.arg9 = arg9;
this.arg10 = arg10;
this.arg11 = arg11;
this.arg12 = arg12;
}
public String getArg1() {
return arg1;
}
public void setArg1(String arg1) {
this.arg1 = arg1;
}
public String getArg2() {
return arg2;
}
public void setArg2(String arg2) {
this.arg2 = arg2;
}
public String getArg3() {
return arg3;
}
public void setArg3(String arg3) {
this.arg3 = arg3;
}
public String getArg4() {
return arg4;
}
public void setArg4(String arg4) {
this.arg4 = arg4;
}
public String getArg5() {
return arg5;
}
public void setArg5(String arg5) {
this.arg5 = arg5;
}
public String getArg6() {
return arg6;
}
public void setArg6(String arg6) {
this.arg6 = arg6;
}
public String getArg7() {
return arg7;
}
public void setArg7(String arg7) {
this.arg7 = arg7;
}
public String getArg8() {
return arg8;
}
public void setArg8(String arg8) {
this.arg8 = arg8;
}
public String getArg9() {
return arg9;
}
public void setArg9(String arg9) {
this.arg9 = arg9;
}
public String getArg10() {
return arg10;
}
public void setArg10(String arg10) {
this.arg10 = arg10;
}
public String getArg11() {
return arg11;
}
public void setArg11(String arg11) {
this.arg11 = arg11;
}
public String getArg12() {
return arg12;
}
public void setArg12(String arg12) {
this.arg12 = arg12;
}
@Override
public String toString() {
return "Vo [arg1=" + arg1 + ", arg2=" + arg2 + ", arg3=" + arg3 + ", arg4=" + arg4 + ", arg5=" + arg5
+ ", arg6=" + arg6 + ", arg7=" + arg7 + ", arg8=" + arg8 + ", arg9=" + arg9 + ", arg10=" + arg10
+ ", arg11=" + arg11 + ", arg12=" + arg12 + "]";
}
}
[CsvHandler] CSV 핸들러 파일을 만든다
csvHandler 해설
csv 파일을 파싱해서 웹 페이지에 데이터를 출력하는 것이다.
- 웹에서 사용될 실제 주소를 연결해준다 (path)
- 문자 단위로 읽는 스프림을 생성하고 (FileReader)
- 파일에서 읽은 데이터를 저장할 배열을 생성한다. (buf)
- 읽어온 파일을 보여줘야 하기 때문에 buf에 담아 파일을 처리한다.
- buf 크기만큼 파일에서 읽어 buf에 저장한다. (fr.read(buf))
- 사진에서는 numbers에서 파일을 열어 이렇게 보이지만, 실제로 파일은 아래와 같은 방식으로 저장되어있다.
- 년월,요일,상_하행 ...
- 2022-01,금요일,상행
- 즉, 파일은 각 데이터는 열(\n), 속성은 (,) 로 나누어져있다.
- 사진에서는 numbers에서 파일을 열어 이렇게 보이지만, 실제로 파일은 아래와 같은 방식으로 저장되어있다.
- 파일을 자동으로 나눠 검색하기 위해 먼저 char타입보다 쓰기 쉬운 String 타입으로 변환해준다. (str)
- 엔터로 끊는 데이터를 배열 하나에 데이터 한 줄을 넣기 위해 str.split("\n") 을 이용해 끊어준다.
- data의 0번째 줄은 제목줄이다.
- 제목줄은 ,로 끊어 titles 에 담는다.
- 새로운 ArrayList를 생성한다.
- data의 길이까지 for문을 돌린다.
- ,로 나눈 속성의 데이터를 vals에 담는다. 이때, vals의 길이가 11까지일 때 계속한다는 조건을 건다.
- 조건을 거는 이유는, 마지막 문자에는 쉼표가 없는데 프로그램이 쉼표를 인식하지 못하면 에러가 나기 때문에 이러한 조건을 넣어준다.
- 만약 단위가 작지 않고 크다면 이 경우 title.length 를 넣어준다.title은 이미 1줄을 읽어 개수가 정해져 있기 때문에 title의 길이를 기준으로 한다.
- vals 는 계속 해서 읽기 때문에 쉼표가 없으면 에러가 나고, title은 한줄만 읽기 때문에 에러가 나지 않는다.
- list에 읽어온 값들을 넣는다.
- 결과로 titles 와 list 의 값이 나오게 된다. 이것을 setattribute담아 전송한다.
- 스트림을 닫아준다.
- /csv/list.jsp로 return해준다.
package handler;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import csv.Vo;
//csv 파일 파싱해서 웹 페이지에 데이터 출력
public class CsvHandler implements Handler {
@Override
public String process(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
//웹에서 사용될 실제 주소로 변경
String path = request.getServletContext().getRealPath("WEB-INF/files/a_utf8.csv");
try {
//문자단위로 읽는 스프림 생성
FileReader fr = new FileReader(path);
//파일에서 읽은 데이터 저장할 배열 생성
char[] buf = new char[1000];
//buf 크기만큼 파일에서 읽어서 buf에 저장
fr.read(buf);
//String 이 문자열 처리하는 api함수 많이 제공하기 때문에 String으로 변환
String str = new String(buf); //char[]을 String 으로 변환
//string을 줄별로 끊어야함
String[] data = str.split("\n"); //배열 하나에 한줄 (엔터로 끊음)
// data의 0번째 줄은 제목줄
String[] titles = data[0].split(","); //배열의 0번째 줄을 ,로 끊어서','로 쪼개서 titles배열에 담음
ArrayList<Vo> list = new ArrayList<>();
for(int i=1;i<data.length;i++) { //1번째 줄에서 끝줄까지
String[] vals = data[i].split(",");
if(vals.length<12) {
continue;
}
list.add(new Vo(vals[0],vals[1],vals[2],vals[3],vals[4],vals[5],vals[6]
,vals[7],vals[8],vals[9],vals[10],vals[11]));
}
request.setAttribute("titles", titles);
request.setAttribute("list", list);
fr.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "/csv/list.jsp";
}
}
list.jsp
이제 받아온 값들을 보여줄 list.jsp 뷰 페이지를 만들어준다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>대전 열차 시간표</h3>
<table border="1">
<tr>
<c:forEach var="t" items="${titles }">
<th>${t }</th>
</c:forEach>
</tr>
<c:forEach var="vo" items="${list }">
<tr>
<td>${vo.arg1 }</td><td>${vo.arg2 }</td><td>${vo.arg3 }</td><td>${vo.arg4 }</td><td>${vo.arg5 }</td>
<td>${vo.arg6 }</td><td>${vo.arg7 }</td><td>${vo.arg8 }</td><td>${vo.arg9 }</td><td>${vo.arg10 }</td>
<td>${vo.arg11 }</td><td>${vo.arg12 }</td>
</tr>
</c:forEach>
</table>
</body>
</html>