사용버전
스프링부트 버전 : 2.7.0 - mybatis
1. Board 테이블
CREATE TABLE t_board( `board_seq` int auto_increment primary key COMMENT 't_board 테이블 pk', `board_type` varchar(255) COMMENT '게시판 종류', `title` varchar(255) COMMENT '제목', `contents` text COMMENT '내용', `reg_date` timestamp NOT null default current_timestamp() COMMENT '등록일' )ENGINE=InnoDB DEFAULT CHARSET=utf8;
boardType.code 아니라 boardType 의 값으로 설정한다.
<insert id="save" parameterType="kr.so.songjava.mvc.domain.dto.BoardDTO" useGeneratedKeys="true" keyProperty="boardSeq">
INSERT INTO T_BOARD (BOARD_TYPE, TITLE, CONTENTS, REG_DATE )
VALUES(#{boardType}, #{title}, #{contents}, NOW())
</insert>
<update id="update" parameterType="kr.so.songjava.mvc.domain.dto.BoardDTO">
UPDATE T_BOARD
SET
BOARD_TYPE=#{boardType},
TITLE=#{title},
CONTENTS =#{contents}
WHERE BOARD_SEQ =#{boardSeq}
</update>
2. BaseCodeLabelEnum, BoardType enum class 생성
BaseCodeLabelEnum
/**
* 기본 CodeLabelEnum
*/
public interface BaseCodeLabelEnum {
/** 코드를 리턴 */
String code();
/** 라베를 리턴 */
String label();
}
BoardType
import lombok.AllArgsConstructor;
import lombok.Getter;
/**게시판 종류*/
public enum BoardType implements BaseCodeLabelEnum{
NOTICE("공지사항"),
FAQ("자주묻는질문"),
INQUIRY("1:1문의"),
;
private String code;
private String label;
BoardType(String label) {
this.code=name();
this.label=label;
}
@Override
public String code() {
return code;
}
@Override
public String label() {
return label;
}
}
3. BoardDTO boardType 변수 추가
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public class BoardDTO {
private int boardSeq;
private BoardType boardType;
private String title;
private String contents;
}
4. Board boardType 변수 추가
import java.util.Date;
import kr.so.songjava.mvc.domain.enums.BoardType;
import lombok.Data;
@Data
public class Board {
private int boardSeq;
private BoardType boardType;
private String title;
private String contents;
private Date regDate;
}
5. BaseCodeLabelEnumJsonSerializer 클래스 추가
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import kr.so.songjava.mvc.domain.enums.BaseCodeLabelEnum;
/**
*JSON 변환시 BaseCodeLabelEnum 클래스에 대한 변환을 동일하게 처리
*/
public class BaseCodeLabelEnumJsonSerializer extends JsonSerializer<BaseCodeLabelEnum>{
@Override
public void serialize(BaseCodeLabelEnum value, JsonGenerator jsonGenerator, SerializerProvider serializers)
throws IOException , JsonProcessingException {
Map<String, Object> map=new HashMap<>();
map.put("code", value.code());
map.put("label", value.label());
jsonGenerator.writeObject(map);
}
}
6. WebMvcConfig ObjectMapper, MappingJackson2JsonView Bean 등록
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper =new ObjectMapper();
SimpleModule simpleModule =new SimpleModule();
simpleModule.addSerializer(BaseCodeLabelEnum.class, new BaseCodeLabelEnumJsonSerializer());
objectMapper.registerModule(simpleModule);
return objectMapper;
}
@Bean
public MappingJackson2JsonView mappingJackson2JsonView() {
MappingJackson2JsonView jsonView=new MappingJackson2JsonView();
jsonView.setContentType(MediaType.APPLICATION_JSON_VALUE);
jsonView.setObjectMapper(objectMapper());
return jsonView;
}
출력값 :
{
"code": "SUCCESS",
"message": null,
"data": [
{
"boardSeq": 1,
"boardType": {
"code": "NOTICE",
"label": "공지사항"
},
"title": "spring",
"contents": null,
"regDate": "2022-06-25T17:53:52.000+00:00"
}
]
}
====================================>====================================>====================================>=======
BaseCodeLabelEnum 인터페이스 사용없이, 그리고
5~6번의 BaseCodeLabelEnumJsonSerializer 과 WebMvcConfig 에 빈 등록없이도 간단하게
다음과 같이 어노테이션 추가로 json 형식으로 목록을 불러 올수 있다.
그러나 등록/ 수정시 파라미터 객체 와 불러오기 시 객체를 다르게 설정해야 한다.
Enum 객체 전체 리턴
@JsonFormat(shape = Shape.OBJECT)
@AllArgsConstructor
@Getter
1. 유형 - 등록 및 수정시 BoardTypeInsert , BoardInsertDTO 를 사용
BaseCodeLabelEnum
a) BoardTypeInsert
/**게시판 등록/수정시 파라미터 enum*/
public enum BoardTypeInsert {
NOTICE("공지사항"),
FAQ("자주묻는질문"),
INQUIRY("1:1문의"),
;
private String code;
private String label;
BoardTypeInsert(String label) {
this.code=name();
this.label=label;
}
}
b) BoardInsertDTO
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/** 등록/수정시 파라미터 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public class BoardInsertDTO {
private int boardSeq;
private BoardTypeInsert boardType;
private String title;
private String contents;
private String keyword;
}
swagger

2. 유형 - 목록 불러올시 JSON 객체 포맷 (BoardType, BoardDTO, BoardSearchParameter)
BoardType
/**게시판 종류*/
@JsonFormat(shape = Shape.OBJECT) // 추가
@AllArgsConstructor
@Getter
public enum BoardType {
NOTICE("NOTICE", "공지사항"),
FAQ("FAQ" ,"자주묻는질문"),
INQUIRY("INQUIRY" ,"1:1문의")
;
//@JsonValue // 한개의 데이터만 가져올경우 @JsonFormat 제거후 해당 변수에 @JsonValue 어노테이션 추가
private String code;
private String label;
}
BoardDTO
/** 데이터를 가져올시 파라미터 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public class BoardDTO {
private int boardSeq;
private BoardType boardType;
private String title;
private String contents;
private String keyword;
}
==============================================================================================================================
3. 사용예
검색 처리 파라미터
파라미터 입력이 필요한 경우 1번 유형 BoardTypeInsert 를 사용하고, 반환 처리는 JSON 형식의 전환이 필요하므로 2번 유형을 사용한다.
BoardSearchParameter
@Data
public class BoardSearchParameter {
private String keyword;
private List<BoardTypeInsert> boardTypes; //배열로 다중 검색 처리를 위해 , NOTICE, FAQ,INQUIRY
}
컨트롤 사용 예
BoardApiController
/** 1.게시판 검색처리목록리턴 페이징 처리 x */
@GetMapping({"","/"})
@ApiOperation(value="목록조회", notes="1.게시판 검색처리목록리턴 페이징 처리 x")
public BaseResponse<List<BoardDTO>> getList(@ApiParam BoardSearchParameter boardSearchParameter) throws Exception{
return new BaseResponse<List<BoardDTO>>(boardService.getList(boardSearchParameter));
}
/**2.게시판 페이징 검색처리 목록리턴 - 페이징 검색처리 첫번째 방법 (WebMvcConfig 에 페이지 리졸버 등록 방식) */
@GetMapping({"/pageSearchList"})
@ApiOperation(value="목록조회 - WebMvcConfig 에 페이지 리졸버 등록 방식", notes="2.게시판 페이징 검색처리 목록리턴 ")
public BaseResponse<List<BoardDTO>> paginationSearchList(
@ApiParam MySQLPageRequest pageRequest,
@ApiParam BoardSearchParameter parameter
) throws Exception{
log.info("1.pageRequest :" , pageRequest);
PageRequestParameter<BoardSearchParameter> pageRequestParameter=new PageRequestParameter<BoardSearchParameter>(pageRequest, parameter);
log.info("2.pageRequestParameter :" , pageRequestParameter);
return new BaseResponse<List<BoardDTO>>(boardService.paginationSearchList(pageRequestParameter));
}
/** 3. 게시판 페이징 검색처리 목록리턴 - 페이징 검색처리 두번째방법 (전체 갯수 구함) */
@GetMapping({"/pageSearchList2"})
@ApiOperation(value="목록조회 - MysqlPageMaker 사용 ", notes="3.게시판 페이징 검색처리 목록리턴 ")
public BaseResponse<List<BoardDTO>> paginationSearchList2(
@ApiParam MysqlPageMaker pageMaker
) throws Exception{
int totalCount =boardService.getTotalCount(pageMaker);
pageMaker.setTotalCount(totalCount);
log.info("1.pageMaker : {} " , pageMaker);
log.info("2.totalCount : {}" , totalCount);
return new BaseResponse<List<BoardDTO>>(boardService.paginationSearchList2(pageMaker), pageMaker);
}
mybatis 에서 boardTypes 으로 사용
<select id="getList" resultType="kr.so.songjava.mvc.domain.entity.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
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>
검색 참조 :
스프링부트 검색 조건 추가 Mybatis Commons-Lang3 라이브러리 IsNotEmpty 사용으로 검색
=>출력 형식 예
{
"code": "SUCCESS",
"message": null,
"data": [
{
"boardSeq": 1,
"boardType": {
"code": "NOTICE",
"label": "공지사항"
},
"title": "spring",
"contents": null,
"regDate": "2022-06-25T17:53:52.000+00:00"
}
]
}페이징 처리 파라미터 추가
{
"code": "SUCCESS",
"message": null,
"pageMaker": {
"page": 1,
"perPageNum": 10,
"pageStart": 0,
"totalCount": 1001,
"startPage": 1,
"endPage": 6,
"prev": false,
"next": true,
"displayPageNum": 6,
"tempEndPage": 101,
"searchType": null,
"keyword": null
},
"displayPageNum": 0,
"data": [
{
"boardSeq": 256,
"boardType": {
"code": "FAQ",
"label": "자주묻는질문"
},
"title": "wJmTCEydrm",
"contents": null,
"regDate": "2022-06-26T03:38:59.000+00:00"
},
{
"boardSeq": 512,
"boardType": {
"code": "FAQ",
"label": "자주묻는질문"
},
"title": "JQvHGGREkU",
"contents": null,
"regDate": "2022-06-26T03:38:59.000+00:00"
},
{
"boardSeq": 768,
"boardType": {
"code": "FAQ",
"label": "자주묻는질문"
},
"title": "fPwypLLrpP",
"contents": null,
"regDate": "2022-06-26T03:38:59.000+00:00"
}
]
}
* @JsonValue 사용할 경우 경우
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**게시판 종류*/
//@JsonFormat(shape = Shape.OBJECT) // 추가
@AllArgsConstructor
@Getter
public enum BoardType {
NOTICE("NOTICE", "공지사항"),
FAQ("FAQ" ,"자주묻는질문"),
INQUIRY("INQUIRY" ,"1:1문의")
;
@JsonValue // 추가
private String code;
private String label;
}
=>출력 형식 예
{
"code": "SUCCESS",
"message": null,
"pageMaker": {
"page": 1,
"perPageNum": 10,
"pageStart": 0,
"totalCount": 1001,
"startPage": 1,
"endPage": 6,
"prev": false,
"next": true,
"displayPageNum": 6,
"tempEndPage": 101,
"searchType": null,
"keyword": null
},
"displayPageNum": 0,
"data": [
{
"boardSeq": 256,
"boardType": "FAQ",
"title": "wJmTCEydrm",
"contents": null,
"regDate": "2022-06-26T03:38:59.000+00:00"
},
{
"boardSeq": 512,
"boardType": "FAQ",
"title": "JQvHGGREkU",
"contents": null,
"regDate": "2022-06-26T03:38:59.000+00:00"
}
]
}
소스 :

















댓글 ( 4)
댓글 남기기