Mybatis를 이용한 검색 조건 추가
- 키워드 검색을 위해 검색 조건에 null 체크, 공백 체크를 해주기
@를 사용해 Java static method에 접근해 검색 조건에 공백 체크해주기
isNotEmpty는 null 체크, 배열 길이가 0인지 체크해줌
...
<select id="getList" parameterType="com.example.examplespring.mvc.parameter.BoardSearchParameter" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
<where>
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
</where>
ORDER BY B.REG_DATE DESC
</select>
...
- 키워드로 리스트를 조회하기 위한 BoardSearchParameter 클래스 생성
public class BoardSearchParameter {
private String keyword;
public BoardSearchParameter() {
}
}
- Repository, Service, Controller 코드에 BoardSearchParameter 클래스 등록
@Repository
public interface BoardRepository {
List<Board> getList(BoardSearchParameter parameter); // 전체 조회
...
}
@Service
public class BoardService {
...
public List<Board> getList(BoardSearchParameter parameter) {
return boardRepository.getList(parameter);
}
...
}
public class BoardController {
...
@GetMapping
@ApiOperation(value = "목록 조회", notes = "게시글 목록 정보를 조회할 수 있습니다.")
public BaseResponse<List<Board>> getList(@ApiParam BoardSearchParameter parameter) {
// 로그 남기기
logger.info("getList");
return new BaseResponse<List<Board>>(boardService.getList(parameter));
}
...
}
- 결과
keyword가 없을 시에 전체 조회 가능, keyword에 3편 강좌 입력 시 관련 제목을 가진 리스트만 조회 가능


Mybatis를 이용한 배열(다중 값) 검색 조건 추가
- 게시판 종류를 조회하기 위한 BoardSearchParameter 클래스에 리스트 변수 생성
public class BoardSearchParameter {
private String keyword;
private List<BoardType> boardTypes;
public BoardSearchParameter() {
}
}
- 게시판 종류로 검색을 위해 검색 조건에 null 체크, 공백 체크를 해주기
IN 안에 추출하고 싶은 게시물 종류를 넣어주고 foreach를 사용해 게시물 종류를 반복하도록 하여 구분자 ,에 따라 검색을 반복
추출하고 싶은 게시글 종류로 여러 개를 검색할 수 있게 함
...
<mapper namespace="com.example.examplespring.mvc.repository.BoardRepository">
<select id="getList" parameterType="com.example.examplespring.mvc.parameter.BoardSearchParameter" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
<where>
<!-- 키워드 검색 -->
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
<!-- 게시판 종류 배열 검색 -->
<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(boardTypes)">
AND B.BOARD_TYPE IN (
<foreach collection="boardTypes" item="value" separator=",">
#{value}
</foreach>
</if>
</where>
ORDER BY B.REG_DATE DESC
</select>
...
- 결과
boardTypes에 입력한 값에 따라 boardType 게시판 종류 배열을 검색



목록 페이징 조건 추가
- MySQL 페이지 요청 정보 및 계산된 값이 들어가는 MySQLPageRequest 클래스 생성
public class MySQLPageRequest {
// page, size 정보로 자동으로 계산된 값이 limit과 offset에 들어가게 됨
private int page;
private int size;
@JsonIgnore
@ApiModelProperty(hidden = true)
private int limit;
@JsonIgnore
@ApiModelProperty(hidden = true)
private int offset;
public MySQLPageRequest(int page, int size, int limit, int offset) {
this.page = page;
this.size = size;
this.limit = limit;
this.offset = offset;
}
}
- 페이징 정보와 검색조건 정보를 담아서 Mybatis에 사용하기 위한 PageRequestParameter 클래스 생성
@Data
public class PageRequestParameter<T> {
private MySQLPageRequest pageRequest; // 페이징 정보
private T parameter; // 검색조건 정보
public PageRequestParameter(MySQLPageRequest pageRequest, T parameter) {
this.pageRequest = pageRequest;
this.parameter = parameter;
}
}
- MySQL 쿼리 페이징 LIMIT, OFFSET 값을 자동 계산하여 MySQLPageRequset 클래스에 담아서 컨트롤러에서 받을 수 있도록
MySQLPageRequestHandleMethodArgumentResolver 클래스 생성
public class MySQLRequestHandleMethodArgumentResolver implements HandlerMethodArgumentResolver {
final Logger logger = LoggerFactory.getLogger(getClass());
private static final String DEFAULT_PARAMETER_PAGE = "page";
private static final String DEFAULT_PARAMETER_SIZE = "size";
private static final int DEFAULT_SIZE = 20;
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
// 현재 페이지 정보
int page = NumberUtils.toInt(request.getParameter(DEFAULT_PARAMETER_PAGE), 1);
// 리스트 갯수 정보
int offset = NumberUtils.toInt(request.getParameter(DEFAULT_PARAMETER_SIZE), DEFAULT_SIZE);
// 시작 지점 계산
int limit = (offset * page) - offset;
logger.info("page : {}", page);
logger.info("limit : {}, offset : {}", limit, offset);
return new MySQLPageRequest(page, offset, limit, offset);
}
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return MySQLPageRequest.class.isAssignableFrom(methodParameter.getParameterType());
}
}
- WebConfiguration 클래스에 addArgumentResolvers 메소드를 override하고 위 클래스를 resolvers에 추가
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
...
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
// 페이지 리졸버 등록
resolvers.add(new MySQLRequestHandleMethodArgumentResolver());
}
}
- Repository, Service, Controller에 MySQLPageRequest를 추가
public interface BoardRepository {
List<Board> getList(BoardSearchParameter parameter); // 전체 조회
List<Board> getList(PageRequestParameter<BoardSearchParameter> pageRequestParameter); // 전체 페이징 조회
...
}
public class BoardService {
...
public List<Board> getList(PageRequestParameter<BoardSearchParameter> pageRequestParameter) {
return boardRepository.getList(pageRequestParameter);
}
...
public class BoardController {
...
@GetMapping
@ApiOperation(value = "목록 조회", notes = "게시글 목록 정보를 조회할 수 있습니다.")
public BaseResponse<List<Board>> getList(@ApiParam BoardSearchParameter parameter) {
@ApiParam BoardSearchParameter parameter,
@ApiParam MySQLPageRequest pageRequest) {
// 로그 남기기
logger.info("pageRequest : {}", pageRequest);
PageRequestParameter<BoardSearchParameter> pageRequestParameter = new PageRequestParameter<BoardSearchParameter>(pageRequest, parameter);
return new BaseResponse<List<Board>>(boardService.getList(pageRequestParameter));
}
...
}
- Board.xml의 getList 쿼리에 parameterType 변경 및 페이징 쿼리 추가와 기본 쿼리 수정
keyword, boardTypes → parameter.keyword, parameter.boardTypes
...
<mapper namespace="com.example.examplespring.mvc.repository.BoardRepository">
<select id="getList" parameterType="com.example.examplespring.framework.data.domain.PageRequestParameter" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
<where>
<!-- 키워드 검색 -->
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(parameter.keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
<!-- 게시판 종류 배열 검색 -->
<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(parameter.boardTypes)">
AND B.BOARD_TYPE IN (
<foreach collection="boardTypes" item="value" separator=",">
#{value}
</foreach>
</if>
</where>
ORDER BY B.REG_DATE DESC
<!-- 페이징 (예 : 1 페이지 20개 가져오기) -->
LIMIT #{pageRequest.limit}, #{pageRequest.offset}
</select>
...
- 결과
1페이지 20개 가져오기


'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
[자바 스프링부트 활용 웹개발 실무용] @PostConstruct로 로컬, 개발, 운영 설정값 프로퍼티 클래스 관리 (0) | 2022.08.17 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] HandleMethod로 공통 로그인 체크 (0) | 2022.08.16 |
[자바 스프링부트 활용 웹개발 실무용] Enum class를 활용해 DB 컬럼 값이 코드일 경우 in out 사용 방법 (0) | 2022.07.26 |
[자바 스프링부트 활용 웹개발 실무용] Mybatis와 Mysql 환경에서 대용량 빠르게 등록 (0) | 2022.07.21 |
[자바 스프링부트 활용 웹개발 실무용] Interceptor와 Logback (0) | 2022.07.20 |
Mybatis를 이용한 검색 조건 추가
- 키워드 검색을 위해 검색 조건에 null 체크, 공백 체크를 해주기
@를 사용해 Java static method에 접근해 검색 조건에 공백 체크해주기
isNotEmpty는 null 체크, 배열 길이가 0인지 체크해줌
...
<select id="getList" parameterType="com.example.examplespring.mvc.parameter.BoardSearchParameter" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
<where>
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
</where>
ORDER BY B.REG_DATE DESC
</select>
...
- 키워드로 리스트를 조회하기 위한 BoardSearchParameter 클래스 생성
public class BoardSearchParameter {
private String keyword;
public BoardSearchParameter() {
}
}
- Repository, Service, Controller 코드에 BoardSearchParameter 클래스 등록
@Repository
public interface BoardRepository {
List<Board> getList(BoardSearchParameter parameter); // 전체 조회
...
}
@Service
public class BoardService {
...
public List<Board> getList(BoardSearchParameter parameter) {
return boardRepository.getList(parameter);
}
...
}
public class BoardController {
...
@GetMapping
@ApiOperation(value = "목록 조회", notes = "게시글 목록 정보를 조회할 수 있습니다.")
public BaseResponse<List<Board>> getList(@ApiParam BoardSearchParameter parameter) {
// 로그 남기기
logger.info("getList");
return new BaseResponse<List<Board>>(boardService.getList(parameter));
}
...
}
- 결과
keyword가 없을 시에 전체 조회 가능, keyword에 3편 강좌 입력 시 관련 제목을 가진 리스트만 조회 가능


Mybatis를 이용한 배열(다중 값) 검색 조건 추가
- 게시판 종류를 조회하기 위한 BoardSearchParameter 클래스에 리스트 변수 생성
public class BoardSearchParameter {
private String keyword;
private List<BoardType> boardTypes;
public BoardSearchParameter() {
}
}
- 게시판 종류로 검색을 위해 검색 조건에 null 체크, 공백 체크를 해주기
IN 안에 추출하고 싶은 게시물 종류를 넣어주고 foreach를 사용해 게시물 종류를 반복하도록 하여 구분자 ,에 따라 검색을 반복
추출하고 싶은 게시글 종류로 여러 개를 검색할 수 있게 함
...
<mapper namespace="com.example.examplespring.mvc.repository.BoardRepository">
<select id="getList" parameterType="com.example.examplespring.mvc.parameter.BoardSearchParameter" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
<where>
<!-- 키워드 검색 -->
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
<!-- 게시판 종류 배열 검색 -->
<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(boardTypes)">
AND B.BOARD_TYPE IN (
<foreach collection="boardTypes" item="value" separator=",">
#{value}
</foreach>
</if>
</where>
ORDER BY B.REG_DATE DESC
</select>
...
- 결과
boardTypes에 입력한 값에 따라 boardType 게시판 종류 배열을 검색



목록 페이징 조건 추가
- MySQL 페이지 요청 정보 및 계산된 값이 들어가는 MySQLPageRequest 클래스 생성
public class MySQLPageRequest {
// page, size 정보로 자동으로 계산된 값이 limit과 offset에 들어가게 됨
private int page;
private int size;
@JsonIgnore
@ApiModelProperty(hidden = true)
private int limit;
@JsonIgnore
@ApiModelProperty(hidden = true)
private int offset;
public MySQLPageRequest(int page, int size, int limit, int offset) {
this.page = page;
this.size = size;
this.limit = limit;
this.offset = offset;
}
}
- 페이징 정보와 검색조건 정보를 담아서 Mybatis에 사용하기 위한 PageRequestParameter 클래스 생성
@Data
public class PageRequestParameter<T> {
private MySQLPageRequest pageRequest; // 페이징 정보
private T parameter; // 검색조건 정보
public PageRequestParameter(MySQLPageRequest pageRequest, T parameter) {
this.pageRequest = pageRequest;
this.parameter = parameter;
}
}
- MySQL 쿼리 페이징 LIMIT, OFFSET 값을 자동 계산하여 MySQLPageRequset 클래스에 담아서 컨트롤러에서 받을 수 있도록
MySQLPageRequestHandleMethodArgumentResolver 클래스 생성
public class MySQLRequestHandleMethodArgumentResolver implements HandlerMethodArgumentResolver {
final Logger logger = LoggerFactory.getLogger(getClass());
private static final String DEFAULT_PARAMETER_PAGE = "page";
private static final String DEFAULT_PARAMETER_SIZE = "size";
private static final int DEFAULT_SIZE = 20;
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
// 현재 페이지 정보
int page = NumberUtils.toInt(request.getParameter(DEFAULT_PARAMETER_PAGE), 1);
// 리스트 갯수 정보
int offset = NumberUtils.toInt(request.getParameter(DEFAULT_PARAMETER_SIZE), DEFAULT_SIZE);
// 시작 지점 계산
int limit = (offset * page) - offset;
logger.info("page : {}", page);
logger.info("limit : {}, offset : {}", limit, offset);
return new MySQLPageRequest(page, offset, limit, offset);
}
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return MySQLPageRequest.class.isAssignableFrom(methodParameter.getParameterType());
}
}
- WebConfiguration 클래스에 addArgumentResolvers 메소드를 override하고 위 클래스를 resolvers에 추가
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
...
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
// 페이지 리졸버 등록
resolvers.add(new MySQLRequestHandleMethodArgumentResolver());
}
}
- Repository, Service, Controller에 MySQLPageRequest를 추가
public interface BoardRepository {
List<Board> getList(BoardSearchParameter parameter); // 전체 조회
List<Board> getList(PageRequestParameter<BoardSearchParameter> pageRequestParameter); // 전체 페이징 조회
...
}
public class BoardService {
...
public List<Board> getList(PageRequestParameter<BoardSearchParameter> pageRequestParameter) {
return boardRepository.getList(pageRequestParameter);
}
...
public class BoardController {
...
@GetMapping
@ApiOperation(value = "목록 조회", notes = "게시글 목록 정보를 조회할 수 있습니다.")
public BaseResponse<List<Board>> getList(@ApiParam BoardSearchParameter parameter) {
@ApiParam BoardSearchParameter parameter,
@ApiParam MySQLPageRequest pageRequest) {
// 로그 남기기
logger.info("pageRequest : {}", pageRequest);
PageRequestParameter<BoardSearchParameter> pageRequestParameter = new PageRequestParameter<BoardSearchParameter>(pageRequest, parameter);
return new BaseResponse<List<Board>>(boardService.getList(pageRequestParameter));
}
...
}
- Board.xml의 getList 쿼리에 parameterType 변경 및 페이징 쿼리 추가와 기본 쿼리 수정
keyword, boardTypes → parameter.keyword, parameter.boardTypes
...
<mapper namespace="com.example.examplespring.mvc.repository.BoardRepository">
<select id="getList" parameterType="com.example.examplespring.framework.data.domain.PageRequestParameter" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE
FROM T_BOARD B
<where>
<!-- 키워드 검색 -->
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(parameter.keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
<!-- 게시판 종류 배열 검색 -->
<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(parameter.boardTypes)">
AND B.BOARD_TYPE IN (
<foreach collection="boardTypes" item="value" separator=",">
#{value}
</foreach>
</if>
</where>
ORDER BY B.REG_DATE DESC
<!-- 페이징 (예 : 1 페이지 20개 가져오기) -->
LIMIT #{pageRequest.limit}, #{pageRequest.offset}
</select>
...
- 결과
1페이지 20개 가져오기


'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
[자바 스프링부트 활용 웹개발 실무용] @PostConstruct로 로컬, 개발, 운영 설정값 프로퍼티 클래스 관리 (0) | 2022.08.17 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] HandleMethod로 공통 로그인 체크 (0) | 2022.08.16 |
[자바 스프링부트 활용 웹개발 실무용] Enum class를 활용해 DB 컬럼 값이 코드일 경우 in out 사용 방법 (0) | 2022.07.26 |
[자바 스프링부트 활용 웹개발 실무용] Mybatis와 Mysql 환경에서 대용량 빠르게 등록 (0) | 2022.07.21 |
[자바 스프링부트 활용 웹개발 실무용] Interceptor와 Logback (0) | 2022.07.20 |