스프링

 

사용버전 

스프링부트 버전 :  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"
    }

  ]
}

 

 

 

 

 

소스 :

 

https://github.com/braverokmc79/sprig_boot_2.7.0_mybatis_board_project/commit/9a15e66cb6cec807e7d2381a8bb8f37fbafcc394

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

사람은 누구나 친구의 고생을 동정할 수가 있다. 그러나 친구의 성공을 동정하려면 매우 훌륭한 본성이 필요하다. -오스카 와일드

댓글 ( 4)

댓글 남기기

작성