[TIL] Day35 - 세션 데이터 상수화 / count 통계페이지 구현

JIONY·2022년 10월 9일
0

TIL - Web BE - Spring Boot

목록 보기
11/20
post-thumbnail

마이페이지에 추가 기능을 만들고, 관리자용 페이지를 만들었음. 통계 페이지 만드는 게 제법 재밌었음 ㅎㅎ 기능이 많으면 어드민을 따로 만드는 게 나을 듯한데 세미프로젝트에서는 어떻게 할 지 고민됨


세션 데이터 상수화

session에서 loginId, loginGrade를 계속 조회하므로 constant 패키지에 SessionConstant 인터페이스를 생성해 상수화를 진행함
인터페이스는 원래 다중 상속용 클래스라 객체를 생성할 수 없고, 상수만 만들 수 있으므로 public static final 키워드를 생략함
앞으로 SessionConstant.ID 와 같은 형태로 호출 가능

//세션에서 자주 사용하는 값들의 이름을 보관
public interface SessionConstant {
	String ID = "loginId";
    String GRADE = "loginGrade";
}



찾아 바꾸기

지금까지 백엔드에서 쓴 “loginID”를 모두 상수로 변경함
프로젝트 전체 범위에 대해 찾기를 하려면 Ctrl+H > File Search에서 검색어를 입력

  • 검색결과에서 바꾸기를 하면 됨


count 통계 페이지

SQL 구문에 GROUP BY 써서 통계를 내는 기능들을 추가할 수 있음

  • DTO만으로 해결이 안되는 경우들이 있으므로 내 편의에 맞게 컬럼을 개조할 수 있는 VO 클래스를 작성
  • count 결과를 조회하는 것이므로 RowMapper도 VO에 맞게 새로 작성해야 함

(아래 코드 예시: 포켓몬 등록 현황 조회)

VO 생성

포켓몬 테이블에 번호 / 이름 / 타입을 등록할 수 있음. 포켓몬 등록 현황 페이지에서 타입별 포켓몬 수를 조회하려고 함. DB에서 type과 cnt 컬럼만으로 이루어진 테이블을 조회할 예정이므로 VO에 변수 type과 cnt 선언

//PocketMonsterCountVO.java



DAO, DaoImpl 수정

DAO

통계 조회용 함수 추가
List<PocketMonsterCountVO> selectCountList();



DaoImpl

위에서 생성한 VO에 대한 RowMapper와 통계 조회용 함수 구현

//PocketMonsterDaoImpl.java
//PocketMonsterCountVo에 대한 RowMapper
private RowMapper<PocketMonsterCountVO> countMapper = (rs, idx) -> {
	PocketMonsterCountVO vo = new PocketMonsterCountVO();
	vo.setType(rs.getString("type"));
	vo.setCnt(rs.getInt("cnt"));
	return vo;
};

//Count 조회
@Override
public List<PocketMonsterCountVO> selectCountList() {
	String sql = "select type, count(*) cnt "
    		+ "from pocket_monster group by type";
	return jdbcTemplate.query(sql, countMapper);
}



화면 구현

컨트롤러에서 model에 조회 결과 리스트를 첨부하고, 해당 모델을 jsp에서 반복문을 이용해 출력



varStatus

varStatus를 사용하면 반복문의 상태를 알 수 있음

  • count: 출력 중인 데이터의 순서(1부터 시작)
  • index: 출력 중인 데이터의 위치(0부터 시작)
  • first: 처음인지 여부를 반환(조건 써서 강조 등의 효과 부여 가능)
  • last: 마지막인지 여부를 반환

<table border="1" width="300">
	<thead>
		<tr>
			<th>순위</th>
			<th>속성</th>
			<th>개체 수</th>
		</tr>
	</thead>
	<tbody align="center">
	
	<c:forEach var="vo" items="${list}" varStatus="status">
		<tr>
			<td>${status.count}</td>
			<td>${vo.type}</td>
			<td>${vo.cnt}</td>
		</tr>
		</c:forEach>
	</tbody>
</table>

0개의 댓글