본문 바로가기

Spring Framework 개발 일지/Spring으로 게시판 만들기

FirstSpringBoard#6-2] 검색 기능 비즈니스 로직 구현

반응형

안녕하세요. 저번 시간에는 페이징 처리를 했었죠.

아마 완벽하게 되지 않아서 찝찝하게 느껴지시는 분들도 계실거에요.

제가 프로젝트를하면서 느끼는 것은 한번에 완벽하게 되는 것 없다는 거에요.

일단 기능을 구현하고 문제점을 찾아서 고치는 사이클이 이상적인거 같아요.

누구도 한번에 이상적인 기능을 구현할 수는 없어요.

시행착오가 있을 뿐이죠.

한번에 완성된 기능을 딱 보여주는게 아닌 문제점을 발견하고 고치는 과정을 거쳐야 실력이 업그레이드됩니다.

단순한 코더나 타이퍼? 타이피스트가 될 수는 없잖아요. 우리는 개발자가 되어야합니다.


검색 기능에 대해서 생각해봅시다.

우선 우리는 작성자와 내용에 대한 검색 기능을 구현할 거에요.

아래는 검색기능에 해당하는 HTML 태그입니다.

구현된 화면도 같이 보시죠.

셀렉트 박스에서 검색 조건을 선택하고 검색 버튼을 누르게 되면 그 조건이 Controller로 전송됩니다.

작성자의 경우에는 writer이 submit되고요.

내용의 경우에는 content가 전송됩니다.

그러면 DB에서 데이터를 가져오는 select 문는 select * from board였는데.

여기서 where 조건이 붙게 되겠죠.

select *from board where name like #{writer}
select *from board where content like #{content}

이런 식으로요.


우선 위의 두 쿼리문에 맞게 테스트 코드를 작성해보겠습니다.

우선 Mapper.xml 파일에 mapper 구문을 추가해줘야합니다.




매퍼 인터페이스인 BoardMapper.java 에 mapper와 대응되는 메소드를 추가해주세요.


BoardDAO, BoardService, BoardServiceImpl에도 메소드를 추가해주세요.

따로 소스코드는 올리지 않겠습니다.

그리고 테스트 코드를 작성해서 테스트를 해볼게요.

테스트 코드는 아래와 같아요.

우선 로직이 맞는지 조건에 맞게 결과가 조회되는지 확인해주세요.



일단 우리가 목표했던 기능을 구현했습니다.

하지만 검색에 해당하는 메소드가 두개나 생겨서 사용할 때 코드량이 늘어나겠네요.

그리고 클라이언트에서 전송되는 검색 조건이 무엇이냐에 따라서 메소드를 호출해야하고요.

코드가 상당히 길어지고 복잡해지겠네요.

그리고 전체 글 목록을 조회하는 메소드와 검색 결과 목록을 조회하는 메소드가 분리되어 있어서 어떻게 view와 Controller를 구현할지도 복잡하네요.

마이바티스의 동적SQL을 이용해서 메소드를 하나만 사용해서 전체 글 목록, 검색 결과 목록을 조회할 수 있게 바꿔보겠습니다.

마이바티스 동적SQL에 대해서 자세히 알고 싶으신 분들은 아래 링크에서 학습해보세요. 책도 좋습니다.

http://www.mybatis.org/mybatis-3/ko/dynamic-sql.html



마이바티스에서 동적 SQL은 들어오는 파라미터의 값의 조건에 따라서 실행하는 매퍼구문을 변경할 수 있습니다.

조건문을 사용해서 DB에 전송되는 SQL이 취사선택되는 것이죠.

아래 코드를 보면 바로 이해하실 수 있을거에요.

<where> 엘리먼트는 조건 분기에 따라서 where을 문장 앞에 붙여줍니다.

그리고 뒤의 문장같이 AND나 OR이 붙었을 경우에는 AND와 OR을 없애고 그 자리에 Where을 붙여줘요.

만약 사용자가 셀렉트 박스에서 작성자를 선택했다면

select *from board where name like #{writer} order by id desc가 해당 엘리먼트에서 전송하는 sql이 될겁니다.

그리고 내용을 셀렉트 박스에서 선택했다면
select *from board where content like #{content} order by id desc가 최종 결과가 됩니다.

만약 둘 다 조건이 맞다면
select *from board where name like #{writer} AND name like #{writer} order by id desc

만약 사용자가 검색을 하지 않았다면
select *from board order by id desc가 DB로 보내집니다.




동적SQL을 사용하니 코드를 따로 작성할 필요없이 간단하게 복잡한 로직이 처리됩니다.

세가지 경우에 대해서 mapper.xml 설정 하나로 끝 났습니다.

바뀐 mapper 구문에 맞게 매퍼 인터페이스도 변경해주세요.

파라미터 타입이 HashMap입니다.

writer나 content가 key가 되고요. 실제 검색할 내용이 value가 되겠죠.

비즈니스 로직 수정하시고 테스트 코드도 수정해서 동적 SQL을 사용한 매퍼 구문이 동작하는지 확인해보세요.


다음 시간에는 저번 시간에 발생했던 페이징 처리의 오류를 없애볼게요.

row보다 게시물 숫자가 적은 마지막 페이지에 대한 처리를 추가해줄겁니다.


반응형