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) 거기에 값들을 집어넣어서 출력시켜보겠습니다.]


지금 출근해서 개발시작하니까 오늘 오후나 저녁에 결과가 어떠했는지 다시 댓글로 달겠습니다.
감사합니다~! ^^
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
99597 [질문] 최근 주말에 하남 스타필드 다녀오신 분 계신가요? [7] 은빛사막3646 17/03/17 3646
99596 [질문] 서울 서남쪽에선 왜 버스를 뒷문에서 타나요?? [24] 피지알중재위원장4275 17/03/17 4275
99595 [질문] 밑에 주일 글 보고 궁금한데 조선시대에는 언제 쉬었나요? [4] dk793264 17/03/17 3264
99594 [질문]  벅스나 멜론은 맥북에서는 못듣나요? [12] 아끼자4113 17/03/17 4113
99593 [질문] 빔프로젝터 추천좀 부탁드립니다! [1] 고양사람2335 17/03/17 2335
99592 [질문] 제주도 항공권 예매 관련 질문입니다. [10] 원스3977 17/03/17 3977
99591 [질문] 전공분야 관련 위키 만들고 싶은데요. [4] 1llionaire3749 17/03/17 3749
99590 [질문] 인터넷뱅킹 때문에 vmware 에 윈도우 설치후 정품인증해서 쓰고 있는데요... 마르키아르3059 17/03/17 3059
99589 [질문] '주일'이란 말이 상식으로 알아야하는 말인가요? [102] 리나시타5672 17/03/17 5672
99588 [질문] 휴대폰 변경 문의 (다른폰에 현재 유심 옮기기) [6] spike665261 17/03/17 5261
99587 [질문] [연애]서로 이해 못하는 부분을 어떻게 해결해야 할까요? [69] Secundo6310 17/03/17 6310
99586 [질문] 통영 도다리 쑥국 맛집 추천 부탁드립니다. [1] 마산아이돌나스타3066 17/03/17 3066
99585 [질문] 샤오미 보조배터리 AS 가능한가요? [6] 지포스25034 17/03/17 5034
99583 [질문] 엑셀 잘다루시는 분들께 질문드립니다. [1] 딱총새우2167 17/03/17 2167
99582 [질문] G430 헤드셋 사용하시는 분들께 설정 질문드립니다. [3] Eis7874 17/03/17 7874
99581 [질문] 혹시 신촌에 사이비 비슷한 단체 있나요? [7] 종종종그그미3848 17/03/16 3848
99580 [질문] 출퇴근시간이 길어져서 퇴직할때... [3] Paul Pogba3534 17/03/16 3534
99579 [질문] ps4 시스템 소프트웨어 업데이트 오류 [6] 삭제됨7981 17/03/16 7981
99578 [질문] 아이폰 와이파이 연결할때 비밀번호를 입력해서 연결하고 싶은데 도와주세요!! [2] 부폰3358 17/03/16 3358
99577 [질문] SQL 문자열 컬럼에서 이럴경우 어떻게 정렬해야할까요? [7] eosdtghjl4385 17/03/16 4385
99576 [질문] 위쳐 3 구매 관련 문의입니다. (위처 3... 음 Witcher 3) [8] 이슬먹고살죠3661 17/03/16 3661
99575 [질문] [게임] 호라이즌 제로 던 시디로사나 디지털 구입이나 차이없나요?? [10] BJ장어의심장3247 17/03/16 3247
99574 [질문] 근데 헌법재판소 8인 결정은 위헌 아닌가요? [34] 탐브레디8089 17/03/16 8089
목록 이전 다음
댓글

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