사용버전
스프링부트 버전 : 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)
댓글 남기기