화면 테이블 내 forEach를 함께 돌지않는 합계 row 별도로 추가하기
[화면설명]
- 기존에 존재하는 조회 화면이 있는데 '연도별로 고정된 월별 12개의 Row 만을 출력'한다.
- 이 12개의 줄 바로 아래에 각 열의 수를 합한 13번째 합계 row를 한줄 추가하는 것이었다.
- 기본 페이지는 로드되지마자 데이터가 조회되지않고 [조회]를 누르면 그제야 select 문을 돌며 데이터를 가져오는 식이다.
- 최대한 자바단이나 sql 단을 건들이지 않고 jsp 내에서 자바스트립트와 jstl로 해결해야하는 상황이었다.
- sql을 건들어도 됐다면 시간이 좀 더 단축됐겠지만 jsp 내에서 해결해야하니 시간이 약 하루 정도 걸렸다.
[할일]
- 1. 지식베이스 현황 페이지에서 고정되어 출력되는 12개의 row바로 아래 13번째 row 한줄 추가
- 2. 페이징 처리는 없음
- 3. jsp 내에서만 처리
[문제]
- 1. <forEach>를 도는 반복 내에 뿌려지는 <tr> 속에 합계 <tr>을 추가하면 같이돌아 버린다. 즉, 매 row 마다 바로 아래에 합계 row가 생겨버린다.
- 2. 그러나 내가 원하는것은 기존대로 forEach가 돌고, '마지막에 row 하나를 추가'하는 것이다.
- 3.조회버튼을 누를때마다 새로 forEach가 돌기때문에 이와 무관하게 돌지않는 row 한줄을 추가해야 했다.
[실행]
- 이를 9번, 10번 줄 처럼 tr을 forEach 밖으로 빼주니 생성됐다.
<tbody>
...
<c:forEach>
<tr>
</tr>
</c: forEach>
<tr>
</tr>
</tbody>
[다음 문제]
- 1. tr를 밖으로 빼어서 forEach와는 별개로 출력되는, 그러면서 오로지 jsp 단을 건들여 만들 수 있는 row는 생성됐다.
- 문제는 이 row가 화면이 로드 됨과 동시에 혼자 덩그러니 떠 있는 것이었다.
- 2. 조회 버튼을 누르지도않았는데 혼자 합계가 떠있는 상황인데, 따로 처리를 해주지않았으므로 당연했다.
[의문]
- tr에 아이디를 부여하여 자바스크립트 단에서 화면이 로드될때 보이지 않도록 처리했다.
- 그전에 우선 tr에 id를 부여해서 컨트롤해도 되는지부터 궁금했다.
[답변]
- 챗gpt에 질문했더니 다음과같은 답변을 얻었다.

[다음문제]
- 1. 클릭 이벤트가 일어나면 해당 tr 요소를 보이도록 id.style.display="table-row" 설정했다.
- 2. 문제는 페이지가 로드되면 깜빡이며 나타났다 사라진다는 점이었다.
- 3. 왜그런가 살펴보니, 조회가 끝나면 곧바로 페이지가 재 로드 된다는 점에 있었다.
$(document).ready(function(){
let isClick = false;
if(isClick) {
합계rowId.style.display = "table-row"; // 클릭시 true 설정후 보이도록
} else {
합계rowId.style.display = "none"; // 클릭전엔 안보이도록
}
$('button[id=조회버튼]').click(function() {
//클릭하자마자
isClick = true;
LoadMaskShow('center');
$("#조회버튼").val("Y");
var frm = ducument.테이블조회폼;
frm.action = "<%=webRoot>/.../.../.../...";
frm.method = "post";
frm.submit;
});
});
- 5. 그러니까 아무리 클릭 이벤트 메소드 안에서 isClick = true; 처리해도
- 6. 페이지가 새로고침되기에 갱신되어 다시 처음 기본값인 isClick = false;로 자꾸만 되돌아 가는 것이었다.
[해결]
- 1. 기준을 임의로 설정한 변수가 아니라, 조회 전과 후에 달라지는 변수값으로 해서 if문을 태웠다.
- 2. 그중 조회버튼 클릭 전과 후로 달라지는 대상이 두개있었는데, 1. 조회해오는 리스트 2. searchYn (검색여부)였다.
- 3. 값 존재 여부에 따라 혹은 y,n값에 따라 if문을 태워보기로 했다.
- 4.. 테이블 List 존재 여부에 따라 하려고 조회 값인 list를 받자마자 List 목록이 한꺼번에 스크립트 단으로 넘어와 log가 지저분해지고 페이지가 육안으로 느려졌다. -> 포기
- 5. searchYn의 y 혹은 n 값으로 if문을 태웠더니 적절했다.
- 5-1. 조회버튼 클릭전엔 해당값이 N이라 display = "none"으로 설정하면 되고
- 5-2. 조회버튼 클릭후엔 해당값이 Y로설정되어 display = "table-row"로 설정해주었다.
[실행]
다음과같이 코드를 수정했다.
$(document).ready(function(){
var searchYn = "${searchYn}";
if(searchYn == "Y") {
합계rowId.style.display = "table-row"; // 클릭시 true 설정후 보이도록
} else {
합계rowId.style.display = "none"; // 클릭전엔 안보이도록
}
$('button[id=조회버튼]').click(function() {
//클릭하자마자
isClick = true;
LoadMaskShow('center');
$("#조회버튼").val("Y");
var frm = ducument.테이블조회폼;
frm.action = "<%=webRoot>/.../.../.../...";
frm.method = "post";
frm.submit;
});
});
[추가]
문자를 비교하느라 [작성2]같이 썼는데 에러가 발생했다.
[작성1]로 작성하니 문제가 없었다.
왜그런가 보니 equals는 자바의 문자열 비교시 사용되는 문법이고 자바스크립트에서는 JavaScript에서 문자열을 비교할 때는 .equals() 메서드 대신 === 연산자나 == 연산자를 사용해야 한다.
<script> 내부이므로 자바스크립트 문법을 사용해야 맞았는데 혼동했다.
[작성1]
$(document).ready(function(){
var searchYn = "${searchYn}";
if(searchYn == "Y") {
합계rowId.style.display = "table-row"; // 클릭시 true 설정후 보이도록
} else {
합계rowId.style.display = "none"; // 클릭전엔 안보이도록
}
});
[작성2]
$(document).ready(function(){
var searchYn = "${searchYn}";
if(searchYn.equals("Y")) {
합계rowId.style.display = "table-row"; // 클릭시 true 설정후 보이도록
} else {
합계rowId.style.display = "none"; // 클릭전엔 안보이도록
}
});
