PGR21.com
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다.
통합 규정을 준수해 주십시오. (2015.12.25.)
Date 2017/02/09 23:54:09
Name eosdtghjl
Subject [질문] java/jsp 다중테이블 결과 출력방법 질문
안녕하세요 초급개발자인데 도저히 궁금해서 질문드리게 되었습니다 ㅜㅜ

db에서 두개이상의 테이블을 join해서 얻은 select 결과 값을 테이블로 출력할때 일일이 VO클래스 만들지 않고 콜랙션 클래스로 간단히 출력하고 싶은데 어떻게 해야할지 모르곘습니다..

==============================
예를들어
A1VO 클래스에는 사번,이름,나이 라는 변수의 get,set매서드가 있고, (=게터,세터)
DB에는 A1 테이블에 사번(num),이름(name), 나이(age)라는 컬럼이 있으며 총 3개의 row 데이터가 있습니다.

그리고 B1VO 클래스에는 사번, 취미, 특기 라는 변수의 get,set 매서드가 있고,
DB에는 B1 테이블에 사번(num), 취미(hobby), 특기(skill)라는 컬럼이 있으며 총 3개의 row 데이터가 있습니다.

이때 jsp 화면에서 조회라는 버튼을 클릭했을때 아래에 html table로 (모든 데이터의) 이름,취미 2개 컬럼에 대한 값을 출력하고 싶습니다.
그래서 DAO 클래스의 쿼리문을 sql = "select a.name, b.hobby from A1 as a, B1 as b where a.num = b.num" 에 대한 결과 값을
while(rs.next()){  //rs는 rs = pstmt.executeQuery();

}
이런 반복문을 통해 변수에 담아서 return 시킨 뒤 컨트롤러(=액션단) 클래스에서 받아서 req.setAttribute("list", list);
이런식으로 리퀘스트 변수에 담아서 해당 url경로로 dispatcher.forward(req, resp); 이렇게 마무리하면

해당 url 경로의 jsp 에서 c:forEach var="list" items="${list}" varStatus="status" (=Expression Language)  이런식으로 반복시켜서
테이블 태그 td 사이에 ${list.name}, ${list.hobby} 이런식으로 하면 출력이 되는데요... (그러면 3줄(row) 데이터가 출력됨)

===================

문제는 이렇게 join결과를 출력할때마다 제 실력이 미천하여 일일이 VO클래스를 만들어주고 있습니다 ㅜㅜ
즉, 저위에 while문 마지막에 list에 담기전에
select 에서 나온 각 컬럼에 대한 값을 새로 생성했다고한 VO클래스 변수에 일일이 담은후 Arraylist 변수인 list에 add 시키고 있는데요..

이 방법으로 하니까 저런 다양한 테이블 조합에 대한 select문에 대한 출력을 할때마다 VO클래스를 만들어줘야 되더라고요..그게 너무 번거롭습니다..클래스 파일도 쓸데없이 많아지는것 같고요..
그래서 그거말고 hashmap이나 arraylist 같은 콜랙션클래스를 이용해서 바로 저장시키는 방법은 없을까요?
참고로 hashmap 변수를 만들어서 해보니까 한 key당 하나의 value만 저장가능해서 전부 덮어쓰기가 되더라고요..
hashmap이나 VO클래스 변수에 안담고 바로 Arraylist 변수에 담을수 없는 이유는 화면단에서 여러줄을 출력을 해야하므로 key, value 조합이 되어야 하기 때문이죠. (한줄만 출력할거면 Arraylist 변수에 담아도 상관없겠지만요;)

만약 제 실력이 미천하여 설명이 부족한 부분이 있다면 다시 설명드리겠습니다. 댓글 및 조언좀 부탁드립니다 OTL
감사합니다.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
17/02/10 00:25
수정 아이콘
ArrayList<HashMap<String, Object>> 이렇게 사용해보세요. ArrayList 안에 hashMap 넣으시면 됩니다.
아니면 같은 내용이라면 VO 한 개에 다 넣으셔도 됩니다.
eosdtghjl
17/02/10 08:16
수정 아이콘
오호 콜랙션 클래스 안에 콜랙션 제너릭을 쓰면 되는군요? 감사합니다~!
그런데 VO 한개에 다 넣으라는 말이 뭔말이지 이해가 안갔는데 아래 Unikys님 댓글의 2번에 대한 내용인가 보군요 저게 객체지향방법이라고 하니까 한번 시도해보겠습니다. 감사합니다!!
17/02/10 04:25
수정 아이콘
1. Spring 프레임워크를 사용하시면 관계 정의만 하시면 아주 쉽게 해결 가능합니다.
2. 객체지향을 고려한다면 A1용 HashMap 또는 ArrayList 따로, B1 HashMap 또는 ArrayList 따로하는 것은 좋지 않습니다. (물론 가능은 합니다.) 일반적으로는 A1VO의 HashMap 또는 ArrayList만 생성하고 A1VO 클래스 안에 ArrayList 멤버변수를 정의하여 해당 B1의 값들을 A1VO의 멤버로 넣는 것이 맞습니다. (Spring은 이것을 쉽게 해줍니다.)
3. 이렇게 할 수 없고 굳이 A1/B1 따로따로 두개의 HashMap/ArrayList를 두어야 한다면 HashMap<Key, List<B1VO>>로 하시는게 좋습니다. Key로 검색하면 여러 개의 B1V0가 있는 List를 받아서 순서대로 출력해주면 됩니다. 하지만 참고로 이렇게 개발하는 것은 15년전에나 하던 개발방식입니다.

아무리 급해도 객체지향 방식을 공부하시고 활용하시길 권하고 JSP를 쓴다면 아직 개발 초기단계면 Spring 프레임워크의 도입을 고민하셔도 좋을 것 같습니다. 요즘 JSP 개발자라면 Spring은 기본으로 하는게 좋은 것 같더라고요.
eosdtghjl
17/02/10 08:27
수정 아이콘
댓글과 조언 정말 진심으로 감사드립니다!
3번은 위에 길치님 댓글과 같은 방법이군요. 방금 간단히 흉내내봤는데 역시나 잘 될것같습니다. (사실 제가 초급개발자라 원했던 답은 이거였고요)

2번에 대한 내용은 충격적이네요 심지어 그게 객체지향적 개발이라고 하니까 더 충격이네여.. 왜냐하면 이전직장이 대기업 계약직이었는데 대규모 사이트를 Struts2로 개발했는데 단 한번도 겟셋전용 클래스에서 언젠가 쓰일지 모르는 임의의 Arraylist나 Hashmap 같은 콜렉션클래스 변수를 만들어 두는것을 진짜 듣도보도 못했거든요. 실제로 사용하는것을 본적도 없고요.

하긴 거기서는 자체개발한 API라는 것을 통해 지정된 API코드에 인자값을 (where절에 들어갈 값) 넣으면 알아서 select결과를 여러 row를 가진 XML 태그를 뱉어줘서 그걸 documnet.getElement 이런 클래스, 메서드를 통해 담아서 웹전송하고,
화면단에서는 그것을 받아 XPath로 원하는 엘리먼트의 값을 찾아 반복시켜 출력하고 뭐 그랬었거든요.
(사실 정확히 이해는 못하고 SM 유지보수업무라서 기존소스 그대로 가져다 썼었어요..)

그리고 지금 중소기업으로 이직해서 jsp로 개발하고 있는데요. Spring은 기왕이면 기본 spring말고 바로그냥 HRD재직자교육과정으로 전자정부표준프레임워크 Spring 3.x 교육을 여름이후에 들을 생각이에요.(spring 4.x는 전자정부표준 교육과정이 없어서 패스) 이후 제가 만든 이 프로그램에 도입할 예정이고요. (그러면 DAO가 빠지고 mybatis를 쓰게되겠죠)

----------- 여기까지는 중요한 내용이 아니고 주절주절해본거라 스킵하셔도 되구요 ---------------------------

뭐여튼 Unikys님 말씀대로 [일일이 콜렉션클래스(Arraylist나 Hashmap) 변수를 만들지 말고,
A1VO 클래스 또는 B1VO 클래스 등에 무조건 콜렉션클래스를 임의로 하나 만들어서 필요할때(여러table join) 거기에 값들을 집어넣어서 출력시켜보겠습니다.]


지금 출근해서 개발시작하니까 오늘 오후나 저녁에 결과가 어떠했는지 다시 댓글로 달겠습니다.
감사합니다~! ^^
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
97825 [질문] [LOL] 2월11일 kt vs samsung 직관방법이 있을까요 [7] Jarvis3260 17/02/10 3260
97824 [질문] 음악을 찾습니다(링크 有). [2] The Silent Force2670 17/02/10 2670
97823 [질문] 아파트 실내 LED등 교체해보신 분 계신가요??? [11] honestjsh4102 17/02/10 4102
97822 [질문] 왁싱하신분들 샵 추천좀 부탁드릴게요! +얼굴제모 [2] 럭키루이4214 17/02/10 4214
97821 [질문] 인터넷뱅킹, 스마트폰 뱅킹 앱이 가장 잘 된 은행은 어디인가요? [9] ComeAgain3304 17/02/10 3304
97820 [질문] 서울 지갑 수선 및 시계 줄 교체업체 추천부탁드립니다. [3] 듣는사람3261 17/02/10 3261
97819 [질문] ps2 중고구매시 팁이있다면? [3] 피자알볼로3431 17/02/10 3431
97818 [질문] 해외 여행지 추천 부탁드립니다 [1] 물어보지마세요3133 17/02/10 3133
97817 [질문] 방금 비행기 놓쳤는데 당장내일날짜출발예약 [11] 삭제됨3989 17/02/10 3989
97816 [질문] 연말정산 1차 결과 나왔는데 46만원 뱉으라네요 [14] 칼퇴추구자5670 17/02/10 5670
97815 [질문] 노트북이 부팅이 안 됩니다. (해결) [8] 홍승식17598 17/02/10 17598
97814 [질문] (완료) 신라면세점 적립금 3천원 필요하신 분 드릴게요 [5] 눈물보다빨리2234 17/02/10 2234
97813 [질문] [LOL] LSPL 스트리밍 안 끊기는 곳 없나요 아마존장인4773 17/02/10 4773
97812 [질문] 방송에 아이돌덕후들 생방으로 찍히는걸 뭐라하죠? [2] 무민2834 17/02/10 2834
97811 [질문] MRI에는 이상이 없는데 통증이 계속될 경우 [13] 트리티3616 17/02/10 3616
97810 [질문] 아프리카 방송 잘아시는분 계시나요 이재인2436 17/02/10 2436
97809 [질문] 기계식 키보드 재질문입니다. [23] wilen5212 17/02/10 5212
97808 [질문] LOL용 키보드 OR 스타2 키보드와 마우스 추천 받을 수 있을까요? [4] 물리쟁이3872 17/02/10 3872
97807 [질문] 포아너 오버워치처럼 pvp가 전부인가요? [3] 오즈s3210 17/02/10 3210
97806 [질문] [포켓몬] 한판, 일판 두개있을 때 포켓몬 교환 할 수 있나요? [4] 삭제됨3352 17/02/09 3352
97805 [질문] java/jsp 다중테이블 결과 출력방법 질문 [4] eosdtghjl14210 17/02/09 14210
97804 [질문] 짤방, 움짤이 정말 늦게 뜹니다 [9] 생선가게 고양이4350 17/02/09 4350
97802 [질문] 소니 헤드폰 MDR시리즈 어떠신가요? [11] 이선빈4292 17/02/09 4292
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로