본문 바로가기
Spring

2022-12-06 ServiceImpl, DAOImpl작성 시 주의할 점 + mapper.xml

by HTT 2022. 12. 8.
ServiceImpl

비즈니스 로직(데이터 생성 및 편집)처리, 트랜잭션 명령어 실행(CRUD), 롤백, 커밋

 

DAO

데이터베이스에 접근. DAOImpl에서 sql문 호출

 

 

현재 작업중인 것으로 예를 들어보자면,

내가 게시판, 문의하기, 기타사항 등 여러 개의 카테고리를 만들었고, 이 카테고리를 이용해 카테고리별 게시글의 목록을 보고 싶다. 이때 카테고리별 실행하는 메소드와 쿼리문은 두 가지 이상이기 때문에 if문을 이용해 알맞게 배치해야 할 것이다. 여기서 문제는 이 if문을 어디에 작성할 것인가인데, Controller는 클라이언트의 요청에 따라 데이터를 담는 역할을 한다. 그리고 DAO는 db관련 작업만 하는 것이 알맞다. 그렇다면 남은 한 곳은?? 바로 "ServiceImpl" 클래스이다.

ServiceImpl클래스는 DAO메소드를 실행하는 곳으로, 비즈니스의 로직을 처리하고 CRUD를 실행한다. 이곳에서 if문 코드를 짜주면 된다.

@Override
public List<BoardDTO> findByCategory(String category) {
	List<BoardDTO> list = null;
	if(category != null) {
		if(category.equals("all")) {
			list = dao.list();
		}else {
			list = dao.findByCategory(category);
		}
	}
	return list;
}

 

 

 

mapper작성

 

mapper작성 관련 내용도 지금 내가 작업 중인 게시판을 예로 들어보자.

"tag"과 "data"라는 변수를 가지고 목록별 검색기능을 구현하고 싶다. 이 때는 tag별 필요한 정보를 얻기 위해 2가지 이상의 쿼리문이 필요하다. 그렇다면 필요한 쿼리문 갯수만큼 <select>~~~~</select>, <select>~~~~</select>... 다 적어주면 될까? (아직은 감자로서 ...sysout을 남발하는 것처럼,.,, 된다면 그렇게 하고 싶지만 ..........) 아니... 개발자로서 더 나은 코드를 구현하기 위해 노력해야 한다. 마침 xml파일에서도 쿼리문의 조건을 적용할 수 있다.

 

<select id="search" resultType="hnboard" parameterType="Map">
	select * from hntable 
	<where>
		<if test="tag == '글번호' and data != ''">
			post_no = #{data} order by post_no desc
		</if>
		<if test="tag == '아이디' and data != ''">
			id like '%' || #{data} || '%' order by post_no desc
		</if>
		<if test="tag == '제목' and data != ''">
			title like '%' || #{data} || '%' order by post_no desc
		</if>
		<if test="tag == '내용' and data != ''">
			content like '%' || #{data} || '%' order by post_no desc
		</if>
		<if test="tag == '날짜' and data != ''">
			<![CDATA[
			regdate <= #{data} order by post_no desc
			]]>
		</if>
	</where>

<select>를 남발하는 것보다 간결하고 가독성있는 코드로 변했다! 하지만 복사 붙여넣기 할 때 실수할 가능성이 있으니 주의하도록...

 

 

 

** 날짜관련 검색기능을 구현할 때는 < CDATA >를 사용해보자.

쿼리문 전체에 사용하는 것은 아니고 조건에 사용하면 되는데 그 자체로 문자열로 인식하게 해주기 때문에 "invalid number"에러를 발생시키지 않는다.

 

 

 

참고

https://sseoui.tistory.com/97

댓글