일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- vision document
- 이클립스 설정
- Database
- sequence diagram
- 데이터베이스
- Ecilpse
- 클래스
- 메소드
- jdk설치
- 설정
- network
- FIle
- srs
- js꼬리
- custom Tag
- System Requirement Specification
- java
- 게시판 제작
- 파일
- 게시판
- 자바
- analysis
- IO
- Eclipse
- workspace
- 제안서
- 네크워크
- 소켓
- mindmap
- jdbc
- Today
- Total
공적's life
2-3 문서 관리 (목록 보기) 본문
일단 우리가 해결해 할 문제는
// 저장되는 공간
int seq =0;
String title = null ;
String content = null;
Date registDate = null;
int hit =0 ;
이것을 어떻게 처리 하느냐 에 문제 입니다. 이것이 어떠한 문제 인가 하면
지금 까진 한 건 단위로 처리했지만, 이제는 한 건이 아닌 여러 건을 처리 해야
하기 때문에 저 데이터들을 묶어줄 필요성이 생긴 것입니다.
우리가 정의 할 문서는 저 위 내용을 모두 포함한 것이 한 문서가 되기 때문입니다.
그래서 어떻게 묶어 줄까 궁리를 했습니다. 첫 번째로 생각한 것은 배열이었습니다.
하지만 단점으로 같은 자료형으로 묶어야 한다는 단점과 크기가 제한 되어있다는 단점으로
인하여 실패 하였습니다. 그래서 이와 비슷하지만 크기에 제한이 없는 List형을 찾아 보았습니다.
역시나 같은 자료형을 기준으로 사용 되어져야 하기 때문에 불가능하다고 판단되었습니다.
아 List가 같은 자료형이 아니라도 들어가서 쓸 수 있다고요? 물론 제너릭을 제거하면 사용 가능하겠지만
어디까지 String형이고 어디까지 int고 어디까지 Date형을 써야 될까요? 정확히 맞춘다고 해도 실수로
캐스팅을 잘못하게 된다면 오류가 나올 것입니다. 안전하지 못하죠? 그래서 패스했습니다.
다음으로 사용되면 어떨까 하는 자료 구조는 바로 Set입니다. List와 유사하지만 중복이 제거되고 순서가 없다는 게 특징이네요.
역시 이것도 사용이 불가능합니다. 만약에 사용자가 제목에 '안녕하세요' 라고 입력하고 또 다른 사용자가 '안녕하세요'라고 했을 때
어떻게 처리 해야 할까요? 너무나도 힘드네요 bb
그래서 우리에게 마지막 나은 희망인 Map이 있습니다. Map은 키와 값으로 이루어진 자료구조네요 아
이러면 되겠군요. "문서번호"= "1", "문서제목"="안녕하세요" 이렇게 진행하면 어떨까요? 전부 문자로 캐스팅을 하고 나서
Map타입에 저장하고 나중에 활용할 때 다시 캐스팅해서 사용하면 되겠네요. 캐스팅 실수가 나올 수도 있겠지만
문서번호 int형, 등록일 Date형 이렇게 확실하니까 그나마 캐스팅에 실수는 줄어 들겠네요.
오케이 이로써 문제가 하나가 해결했네요. 그럼 이걸 적용한 상세보기를 다시 만들어 볼까요?
// 저장되는 공간
Map<String, String> documentSave = new HashMap<String, String>();
이렇게 변했고요. 다음 등록한 부분입니다.
// 9. 등록
documentSave.put("SEQ", String.valueOf(systemSeq));
documentSave.put("TITLE", userInputTitle);
documentSave.put("CONTENT", userInputContent);
documentSave.put("REGIST_DATE", systemDate.toString());
documentSave.put("HIT", String.valueOf(configHit));
이렇게 변했네요. 후후 그럼 출력을 해볼까요?
else if (userAction.equals("VD")) {
String tempSeq = documentSave.get("SEQ");
int seq = Integer.parseInt(tempSeq);
String title= documentSave.get("TITLE");
String content= documentSave.get("CONTENT");
String tempRegistDate = documentSave.get("REGIST_DATE");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.KOREA);
Date registDate = dateFormat.parse(tempRegistDate);
String tempHit = documentSave.get("HIT");
int hit = Integer.parseInt(tempHit);
System.out.println("글번호 : " + seq);
System.out.println("제목 : " + title);
System.out.println("등록일 : " + registDate);
System.out.println("조회수 : " + hit);
System.out.println("내용 : " + content);
}
상당히 변했네요 전에는 그냥 꺼내왔는데 지금은 조금 복잡하게 변했네요, Map에 특징이 get이란 메소드가 있는데
여기에 key값을 입력하면 전에 매칭해놨던 값이 튀어 나옵니다. 저 중간에 있는 SimpleDataFormat은 기존에 문자로 존재하던 날짜를
다시 Date로 변환해 주기 위해서 사용되었습니다. 물론 문자로 저장 할 때도 저렇게 했어요. SimpleDateFormat에 첫번째 인자값은
날짜에 패턴이고 두 번째 인자는 어디 나라인가 하는 것 입니다.
아 그런데 여기서 또 문제가 발생되는 군요. 우리가 원한 것은 문서들에 집합인데 이것도 역시 한 개의 문서밖에 처리를 못하네요.
왜 한 건밖에 처리를 못할까요? 그것은 Map 타입에 특성상 같은 키면 값에 다시 쓰기 때문입니다.
예를 들어서 키가 hi고 값이 안녕하세요 이거면, 다시 입력 할 때 키가 hi 고 값이 hello면 Map에 남아 있는 값은
키가 hi에 값 hello가 남아 있게 됩니다. 즉 키에 속한 값은 한 개만 유지 할 수 있다는 것이죠.
이제 이 문제를 어떻게 해결해야 할까요? 한가지 아이디어를 내자면 "SEQ"에 "+1"을 해주면 어떨까요?
아아 괜찮은 아이디어인 듯 했으나 키 조차 찾기 힘드니 이것은 안되겠네요.
그럼 발상에 전환을 해서 Map타입을 다른 타입에 넣어 보는 건 어떨까요?
Map타입에 Map을 넣는 것도 좋은 아이디어 이지만 역시나 찾기도 어렵고 Map에 또 하나에 특징은
순서가 없이 들어갑니다. (물론 순서 있는 Map타입도 있답니다)
그래서 우리는 순서 있는 타입인 List타입을 쓰기로 했습니다.
물론 지금 상태에서는 List안에 있는 것을 모조리 체크해서 일치하는 값만 빼와야 하는 단점이 있지만
지금은 이게 제일 베스트인 거 같네요. 그럼 코드 수정 해볼까요?
// 저장되는 공간
List<Map<String, String>> documentList = new ArrayList<Map<String,String>>();
이렇게 변했고요.
등록하는 부분이
Map<String, String> documentSave = new HashMap<String, String>();
// 9. 등록
documentSave.put("SEQ", String.valueOf(systemSeq));
documentSave.put("TITLE", userInputTitle);
documentSave.put("CONTENT", userInputContent);
documentSave.put("REGIST_DATE", sysDate);
documentSave.put("HIT", String.valueOf(configHit));
documentList.add(documentSave);
이렇게 변했습니다. 이제 다음 문서를 보여주는 부분!
//사용자가 입력한 문서 번호 가져오기
String userInputSeq = outputData[1];
//일치할경우 저장할 Map타입
Map<String, String> documentSave=null;
//검사
for(int indexI=0; indexI<documentList.size();indexI++){
Map<String, String>checkDocument = documentList.get(indexI);
if(userInputSeq.equals(checkDocument.get("SEQ"))){
documentSave = checkDocument;
break;
}
}
이렇게 변했습니다. 그리고 이전에 빼먹었던 부분인 조회수 증가를 넣어 보도록 하죠.
int updateHit = Integer.parseInt(documentSave.get("HIT")) + 1;
documentSave.put("HIT", String.valueOf(updateHit));
이렇게 하면 간단히 끝나네요. 잠깐 설명하자면 documentSave가 checkDocument로 복사가 되고
"HIT"값을 가지고 와서 증가 시킨 후 Map특징을 이용하여 중복된 키가 들어오면 제일 나중에 들어 온 값으로 대치
하기 때문에 이렇게 될 수가 있었네요.
간단히 설명하자면 문서들을 정리한 파일이 있었는데 거기서 필요한 부분을 찾아서 수정하고 다시 닫은 거 입니다.
자아 이제 마지막으로 리스트를 출력해볼까요?
for(int indexI=0; indexI< documentList.size(); indexI++){
Map<String,String> documentSave = documentList.get(indexI);
String tempSeq = documentSave.get("SEQ");
int seq = Integer.parseInt(tempSeq);
String title= documentSave.get("TITLE");
String content= documentSave.get("CONTENT");
String tempRegistDate = documentSave.get("REGIST_DATE");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.KOREA);
Date registDate = dateFormat.parse(tempRegistDate);
String tempHit = documentSave.get("HIT");
int hit = Integer.parseInt(tempHit);
System.out.println("글번호 : " + seq);
System.out.println("제목 : " + title);
System.out.println("등록일 : " + registDate);
System.out.println("조회수 : " + hit);
System.out.println("내용 : " + content);
}
간단하죠? 여기까지 너무 좋은 거 같았는데 또 문제가 있네요. 등록 부분에서
int systemSeq = 1;
요 부분 때문에 문서번호가 항상 1로 고정이 되네요 간단히 해결해보죠.
//문서번호
int systemSeq = 0;
이렇게 루프 바깥쪽으로 빼주고, 두 번째 실제로 등록 할 때는 값을 하나씩 증가 시켜주는 겁니다.
systemSeq =+ 1;
이렇게요! 이러면 완성입니다. 실제로 한번 돌려볼까요?
문서 등록 폼: ex) RF
문서 등록: ex) RD:제목:내용
문서 상세 보기: ex) VD:문서번호
문서 목록 보기: ex) VL
문서 삭제: ex) DD:문서번호
문서 수정폼: ex) EF:문서번호
문서 수정: ex) ED:제목:내용
RF
제목:
내용:
RD:안녕하세요:반가워요!!저는 !!
등록 완료
RF
제목:
내용:
RD:안녕하세요:반가워요!!저는 !!
등록 완료
VL
글번호 : 1
제목 : 안녕하세요
등록일 : Thu Jul 22 13:39:52 KST 2010
조회수 : 0
내용 : 반가워요!!저는 !!
글번호 : 2
제목 : 안녕하세요
등록일 : Thu Jul 22 13:40:00 KST 2010
조회수 : 0
내용 : 반가워요!!저는 !!
VD:2
글번호 : 2
제목 : 안녕하세요
등록일 : Thu Jul 22 13:40:00 KST 2010
조회수 : 1
내용 : 반가워요!!저는 !!
다행이 잘나오네요^^; 풀소스코드는 아래에 올려드릴게요^^;-
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; public class Board { public static void main(String[] args) throws IOException, ParseException { // 문서 등록 폼 Register Document Form // 문서 등록 Register Document // 문서 상세 보기 view Document // 문서 목록 보기 view Document List // 문서 삭제 Delete Document // 문서 수정 폼 Edit Document Form // 문서 수정 Edit Document // 1. 사용법 출력 System.out.println("문서 등록 폼: ex) RF"); System.out.println("문서 등록: ex) RD:제목:내용 "); System.out.println("문서 상세 보기: ex) VD:문서번호 "); System.out.println("문서 목록 보기: ex) VL "); System.out.println("문서 삭제: ex) DD:문서번호 "); System.out.println("문서 수정폼: ex) EF:문서번호 "); System.out.println("문서 수정: ex) ED:제목:내용 "); // 저장되는 공간 List
'Programing > Java programing' 카테고리의 다른 글
2-6 다음 진행을 위한 회고 (0) | 2010.07.23 |
---|---|
2-5 문서관리 (수정) (0) | 2010.07.22 |
2-4 문서관리 (삭제) (0) | 2010.07.22 |
2-2 문서 관리 (상세보기) (0) | 2010.07.20 |
2-1 문서 관리 (등록) (0) | 2010.07.13 |