ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 게시판 만들기(22) - MDC(Mapped Diagnostic Context) 설정
    Spring/4.3.x - 게시판 만들기 2019. 11. 24. 13:37
    반응형

    MDC를 설정하는 이유는 웹 요청에 대한 로그인 정보나 세션 정보를 추적할 수 있기 때문입니다. 현재 샘플에서는 로그인 정보나 세션 정보가 없기 때문에 BOARD_SEQ 값을 추가하였습니다.

     

    1.logback.xml 수정

    key에 대한 value 값만 노출하고 싶다면 패턴에 %X{ID}로 추가한 MDC에 key값을 ID로 정의하면 되고('ID'는 임의로 정의한 값), key_value 패턴으로 key와 value 값을 모두 노출하고 싶다면 %X로 추가하면 됩니다. (%X은 로깅이 발생한 Thread와 관련된 MDC에 정보를 출력합니다.)

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>  
        
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d [%thread] %-5level %logger - [%X{ID}]:%msg%n</pattern>
              </layout>
        </appender>
      
          <logger name="org.springframework" level="info" additivity="false">
            <appender-ref ref="console"/>
        </logger>
      
          <logger name="com.spring.board" level="debug" additivity="false">
            <appender-ref ref="console"/>
        </logger>
        
          <root level="info">
            <appender-ref ref="console"/>
        </root>
      
    </configuration>
    cs

     

    2. BoardController.java에 MDC 추가

    MDC.put(key, value), MDC.remove(key)을 설정하세요.

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    package com.spring.board.controller;
     
    import java.util.HashMap;
    import java.util.Map;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.slf4j.MDC;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.servlet.ModelAndView;
     
    import com.spring.board.common.ResultUtil;
    import com.spring.board.dto.BoardDto;
    import com.spring.board.form.BoardForm;
    import com.spring.board.service.BoardService;
     
    @Controller
    @RequestMapping(value = "/board")
    public class BoardController {
     
        @Autowired
        private BoardService boardService;
     
        /** 게시판 - 목록 페이지 이동 */
        @RequestMapping(value = "/boardList")
        public String boardList(HttpServletRequest request, HttpServletResponse response) throws Exception {
     
            return "board/boardList";
        }
     
        /** 게시판 - 목록 조회 */
        @RequestMapping(value = "/getBoardList")
        @ResponseBody
        public ResultUtil getBoardList(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception {
     
            ResultUtil resultUtils = boardService.getBoardList(boardForm);
     
            return resultUtils;
        }
     
        /** 게시판 - 상세 페이지 이동 */
        @RequestMapping(value = "/boardDetail")
        public String boardDetail(HttpServletRequest request, HttpServletResponse response) throws Exception {
     
            return "board/boardDetail";
        }
     
        /** 게시판 - 상세 조회 */
        @RequestMapping(value = "/getBoardDetail")
        @ResponseBody
        public BoardDto getBoardDetail(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception {
     
            MDC.put("ID"String.valueOf(boardForm.getBoard_seq()));
            
            BoardDto boardDto = boardService.getBoardDetail(boardForm);
            
            MDC.remove("ID");
     
            return boardDto;
        }
     
        /** 게시판 - 작성 페이지 이동 */
        @RequestMapping(value = "/boardWrite")
        public String boardWrite(HttpServletRequest request, HttpServletResponse response) throws Exception {
     
            return "board/boardWrite";
        }
     
        /** 게시판 - 등록 */
        @RequestMapping(value = "/insertBoard")
        @ResponseBody
        public BoardDto insertBoard(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception {
                        
            BoardDto boardDto = boardService.insertBoard(boardForm);
     
            return boardDto;
        }
     
        /** 게시판 - 삭제 */
        @RequestMapping(value = "/deleteBoard")
        @ResponseBody
        public BoardDto deleteBoard(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception {
     
            BoardDto boardDto = boardService.deleteBoard(boardForm);
     
            return boardDto;
        }
     
        /** 게시판 - 수정 페이지 이동 */
        @RequestMapping(value = "/boardUpdate")
        public String boardUpdate(HttpServletRequest request, HttpServletResponse response) throws Exception {
     
            return "board/boardUpdate";
        }
     
        /** 게시판 - 수정 */
        @RequestMapping(value = "/updateBoard")
        @ResponseBody
        public BoardDto updateBoard(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception {
     
            BoardDto boardDto = boardService.updateBoard(boardForm);
     
            return boardDto;
        }
     
        /** 게시판 - 답글 페이지 이동 */
        @RequestMapping(value = "/boardReply")
        public String boardReply(HttpServletRequest request, HttpServletResponse response) throws Exception {
     
            return "board/boardReply";
        }
     
        /** 게시판 - 답글 등록 */
        @RequestMapping(value = "/insertBoardReply")
        @ResponseBody
        public BoardDto insertBoardReply(HttpServletRequest request, HttpServletResponse response, BoardForm boardForm) throws Exception {
     
            BoardDto boardDto = boardService.insertBoardReply(boardForm);
     
            return boardDto;
        }
        
        /** 게시판 - 첨부파일 다운로드 */
        @RequestMapping("/fileDownload")                      
        public ModelAndView fileDownload(@RequestParam("fileNameKey"String fileNameKey
                                        ,@RequestParam("fileName"String fileName
                                        ,@RequestParam("filePath"String filePath) throws Exception {
              
            /** 첨부파일 정보 조회 */
            Map<String, Object> fileInfo = new HashMap<String, Object>();
            fileInfo.put("fileNameKey", fileNameKey);
            fileInfo.put("fileName", fileName);
            fileInfo.put("filePath", filePath);
         
            return new ModelAndView("fileDownloadUtil""fileInfo", fileInfo);
        }
    }
    cs

     

    3. BoardService.java에 logger 추가

    logger 정보를 추가하세요.

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    package com.spring.board.service;
     
    import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.UUID;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.multipart.MultipartFile;
     
    import com.spring.board.common.PagingUtil;
    import com.spring.board.common.ResultUtil;
    import com.spring.board.dao.BoardDao;
    import com.spring.board.dto.BoardDto;
    import com.spring.board.dto.CommonDto;
    import com.spring.board.form.BoardFileForm;
    import com.spring.board.form.BoardForm;
    import com.spring.board.form.CommonForm;
     
    @Service
    public class BoardService {
     
        protected final Logger logger = LoggerFactory.getLogger(BoardService.class);
        
        @Autowired
        private BoardDao boardDao;
     
        /** 게시판 - 목록 조회 */
        public ResultUtil getBoardList(BoardForm boardForm) throws Exception {
     
            ResultUtil resultUtil = new ResultUtil();
     
            CommonDto commonDto = new CommonDto();
     
            int totalCount = boardDao.getBoardCnt(boardForm);
            if (totalCount != 0) {
                CommonForm commonForm = new CommonForm();
                commonForm.setFunction_name(boardForm.getFunction_name());
                commonForm.setCurrent_page_no(boardForm.getCurrent_page_no());
                commonForm.setCount_per_page(10);
                commonForm.setCount_per_list(10);
                commonForm.setTatal_list_count(totalCount);
                commonDto = PagingUtil.setPageUtil(commonForm);
            }
     
            boardForm.setLimit(commonDto.getLimit());
            boardForm.setOffset(commonDto.getOffset());
     
            List<BoardDto> list = boardDao.getBoardList(boardForm);
     
            HashMap<String, Object> resultMap = new HashMap<String, Object>();
            resultMap.put("list", list);
            resultMap.put("totalCount", totalCount);
            resultMap.put("pagination", commonDto.getPagination());
     
            resultUtil.setData(resultMap);
            resultUtil.setState("SUCCESS");
     
            return resultUtil;
        }
     
        /** 게시판 - 목록 조회 */
        /*
         * public List<BoardDto> getBoardList(BoardForm boardForm) throws Exception {
         * 
         * return boardDao.getBoardList(boardForm); }
         */
     
        /** 게시판 - 상세 조회 */
        public BoardDto getBoardDetail(BoardForm boardForm) throws Exception {
     
            logger.debug("==================== getBoardDetail START ====================");
            
            BoardDto boardDto = new BoardDto();
     
            String searchType = boardForm.getSearch_type();
     
            if ("S".equals(searchType)) {
     
                int updateCnt = boardDao.updateBoardHits(boardForm);
     
                if (updateCnt > 0) {
                    boardDto = boardDao.getBoardDetail(boardForm);
                }
     
            } else {
     
                boardDto = boardDao.getBoardDetail(boardForm);
            }
            
            BoardFileForm boardFileForm = new BoardFileForm();
            boardFileForm.setBoard_seq(boardForm.getBoard_seq());
     
            boardDto.setFiles(boardDao.getBoardFileList(boardFileForm));
     
            logger.debug("==================== getBoardDetail END ====================");
            
            return boardDto;
        }
     
        /** 게시판 - 등록 */
        public BoardDto insertBoard(BoardForm boardForm) throws Exception {
     
            BoardDto boardDto = new BoardDto();
     
            int insertCnt = 0;
     
            int boardReRef = boardDao.getBoardReRef(boardForm);
            boardForm.setBoard_re_ref(boardReRef);
     
            insertCnt = boardDao.insertBoard(boardForm);
     
            List<BoardFileForm> boardFileList = getBoardFileInfo(boardForm); 
            for (BoardFileForm boardFileForm : boardFileList) {
                boardDao.insertBoardFile(boardFileForm);
            }
     
            if (insertCnt > 0) {
                boardDto.setResult("SUCCESS");
            } else {
                boardDto.setResult("FAIL");
            }
     
            return boardDto;
        }
     
        /** 게시판 - 첨부파일 정보 조회 */
        public List<BoardFileForm> getBoardFileInfo(BoardForm boardForm) throws Exception {
     
            List<MultipartFile> files = boardForm.getFiles();
     
            List<BoardFileForm> boardFileList = new ArrayList<BoardFileForm>();
     
            BoardFileForm boardFileForm = new BoardFileForm();
     
            int boardSeq = boardForm.getBoard_seq();
            String fileName = null;
            String fileExt = null;
            String fileNameKey = null;
            String fileSize = null;
            // 파일이 저장될 Path 설정
            String filePath = "C:\\board\\file";
            
            if (files != null && files.size() > 0) {
     
                File file = new File(filePath);
                
                // 디렉토리가 없으면 생성
                if (file.exists() == false) {
                    file.mkdirs();
                }
     
                for (MultipartFile multipartFile : files) {
     
                    fileName = multipartFile.getOriginalFilename();
                    fileExt = fileName.substring(fileName.lastIndexOf("."));
                    // 파일명 변경(uuid로 암호화) + 확장자
                    fileNameKey = getRandomString() + fileExt;
                    fileSize = String.valueOf(multipartFile.getSize());
     
                    // 설정한 Path에 파일 저장
                    file = new File(filePath + "/" + fileNameKey);
     
                    multipartFile.transferTo(file);
     
                    boardFileForm = new BoardFileForm();
                    boardFileForm.setBoard_seq(boardSeq);
                    boardFileForm.setFile_name(fileName);
                    boardFileForm.setFile_name_key(fileNameKey);
                    boardFileForm.setFile_path(filePath);
                    boardFileForm.setFile_size(fileSize);
                    boardFileList.add(boardFileForm);
                }
            }
     
            return boardFileList;
        }
     
        /** 게시판 - 삭제 */
        public BoardDto deleteBoard(BoardForm boardForm) throws Exception {
     
            BoardDto boardDto = new BoardDto();
     
            int deleteCnt = boardDao.deleteBoard(boardForm);
     
            if (deleteCnt > 0) {
                boardDto.setResult("SUCCESS");
            } else {
                boardDto.setResult("FAIL");
            }
     
            return boardDto;
        }
     
        /** 게시판 - 수정 */
        public BoardDto updateBoard(BoardForm boardForm) throws Exception {
     
            BoardDto boardDto = new BoardDto();
     
            int updateCnt = boardDao.updateBoard(boardForm);
     
            String deleteFile = boardForm.getDelete_file();
            if (!"".equals(deleteFile)) {
     
                String[] deleteFileInfo = deleteFile.split("!");
     
                int boardSeq = Integer.parseInt(deleteFileInfo[0]);
                int fileNo = Integer.parseInt(deleteFileInfo[1]);
     
                BoardFileForm deleteBoardFileForm = new BoardFileForm();
                deleteBoardFileForm.setBoard_seq(boardSeq);
                deleteBoardFileForm.setFile_no(fileNo);
     
                boardDao.deleteBoardFile(deleteBoardFileForm);
            }
     
            List<BoardFileForm> boardFileList = getBoardFileInfo(boardForm);
            for (BoardFileForm boardFileForm : boardFileList) {
                boardDao.insertBoardFile(boardFileForm);
            }
     
            if (updateCnt > 0) {
                boardDto.setResult("SUCCESS");
            } else {
                boardDto.setResult("FAIL");
            }
     
            return boardDto;
        }
     
        /** 게시판 - 답글 등록 */
        public BoardDto insertBoardReply(BoardForm boardForm) throws Exception {
     
            BoardDto boardDto = new BoardDto();
     
            BoardDto boardReplayInfo = boardDao.getBoardReplyInfo(boardForm);
     
            boardForm.setBoard_seq(boardReplayInfo.getBoard_seq());
            boardForm.setBoard_re_lev(boardReplayInfo.getBoard_re_lev());
            boardForm.setBoard_re_ref(boardReplayInfo.getBoard_re_ref());
            boardForm.setBoard_re_seq(boardReplayInfo.getBoard_re_seq());
     
            int insertCnt = 0;
     
            insertCnt += boardDao.updateBoardReSeq(boardForm);
     
            insertCnt += boardDao.insertBoardReply(boardForm);
     
            if (insertCnt > 0) {
                boardDto.setResult("SUCCESS");
            } else {
                boardDto.setResult("FAIL");
            }
     
            return boardDto;
        }
     
        /** 32글자의 랜덤한 문자열(숫자포함) 생성 */
        public static String getRandomString() {
     
            return UUID.randomUUID().toString().replaceAll("-""");
        }
    }
    cs

     

    4. MDC 확인

    로그에서 설정한 MDC 정보가 출력되는지 확인하세요.

     

    소스 코드는 Github Repository - https://github.com/tychejin1218/board_v1 (branch : section22) 를 참조하세요.
    Github에서 프로젝트 가져오기 - https://tychejin.tistory.com/33

     

     

    반응형

    댓글

Designed by Tistory.