Framework/Spring Framework

(22.12.27)Spring ํ”„๋ ˆ์ž„์›Œํฌ: Mybatis๋กœ Spring๊ณผ Oracle ์—ฐ๋™ํ•˜์—ฌ ๊ฒŒ์‹œํŒ ์ƒ์„ธ๋ณด๊ธฐ, ์ฒจ๋ถ€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2022. 12. 27.

โ—โ—Mybatis๋กœ Spring๊ณผ Oracle ์—ฐ๋™ํ•˜์—ฌ ๊ฒŒ์‹œํŒ ์ƒ์„ธ๋ณด๊ธฐ, ์ฒจ๋ถ€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐโ—โ—

 

VOํด๋ž˜์Šค๋Š” (22.12.26)๊ฒŒ์‹œ๋ฌผ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ด์šฉํ•œ๋‹ค.

 

 

BoardMapper.xml

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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ezen.spring.web.mapper.BoardMapper">
 
    <insert id="saveBoard"
       parameterType="com.ezen.spring.web.vo.BoardVO">
       <!-- Board.num ์— ์‹œํ€€์Šค ๊ฐ’์„ ๋ณด๊ด€ํ•ด์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ...
      <selectKey keyProperty="num" resultType="integer" order="BEFORE">
          SELECT BOARD_SEQ.NEXTVAL FROM DUAL
      </selectKey>
       -->
      INSERT INTO board(boardid, title, contents, author)
      VALUES(BOARD_SEQ.NEXTVAL, #{title,jdbcType=VARCHAR}, #{contents,jdbcType=VARCHAR}, #{author,jdbcType=VARCHAR})
 
    </insert>
    
     <update id="saveAttach" parameterType="list">
       INSERT INTO attach (attachid,boardid , fname, fsize)
       SELECT ATTACH_SEQ.NEXTVAL AS attachid, t.* FROM
       (
           <foreach collection="list" item="item" index="index" separator="union all">
           <!-- ์œ ๋‹ˆ์–ธ ์˜ฌ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๊ฐ’ ํ•œํ–‰ ํ•œํ–‰์„ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.-->
                SELECT (SELECT MAX(boardid) FROM board) AS boardid, #{item.fname}, #{item.fsize} FROM DUAL
           </foreach>
       ) t
   </update>
   <select id="getList" 
         resultType="map">
         SELECT b.boardid, b.title, b.author,
        LISTAGG(a.attachid||','||a.fname||','||a.fsize,'/')
        WITHIN GROUP (ORDER BY a.attachid) fnames
        FROM board b LEFT OUTER JOIN attach a
        ON b.boardid=a.boardid
        GROUP BY  b.boardid, b.title, b.author
        ORDER BY b.boardid DESC
   </select>
    <select id="detailBoard" 
       parameterType="Integer"
       resultType="map">
        SELECT b.boardid, b.title, b.author, b.contents,a.attachid, a.fname, a.fsize 
        FROM board b LEFT OUTER JOIN  attach a  
        ON a.boardid=b.boardid
        WHERE b.boardid=#{boardid}
    </select>
</mapper>
cs

 

 

 

BoardMapper.java

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import com.ezen.spring.web.vo.AttachVO;
import com.ezen.spring.web.vo.BoardVO;
 
@Mapper
public interface BoardMapper {
    void saveAttach(List<AttachVO> list);
    void saveBoard(BoardVO board);
    List<Map<String,Object>> getList();
    List<Map<String,Object>> detailBoard(int boardid);
}
cs

 

 

 

BoardController.java

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
import java.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
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.multipart.MultipartFile;
import com.ezen.spring.web.service.BoardService;
import com.ezen.spring.web.vo.AttachVO;
import com.ezen.spring.web.vo.BoardVO;
import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServletRequest;
 
@Controller
@RequestMapping("/board")
public class BoardController {
    @Autowired
    ResourceLoader resourceLoader;
 
    @Autowired
    private BoardService svc;
 
    @GetMapping("/add")
    public String getForm() {
        return "board/boardAdd";
    }
 
    @PostMapping("/add")
    @ResponseBody
    @Transactional
    public String upload(@RequestParam("files") MultipartFile[] mfiles, HttpServletRequest request, BoardVO board) {
        if (svc.saveBoardandAttach(mfiles, request, board)) {
            String msg = String.format("ํŒŒ์ผ(%d)๊ฐœ ์ €์žฅ์„ฑ๊ณต(์ž‘์„ฑ์ž:%s)", mfiles.length, board.getAuthor().toString());
            return msg;
        } else
            return "ํŒŒ์ผ ์ €์žฅ ์‹คํŒจ:";
    }
 
    @GetMapping("/detailBoard/{boardid}")
    public String getDetail(@PathVariable int boardid, Model m) {
        m.addAttribute("board", svc.detail(boardid));
        return "/board/boardDetail";
    }
 
    @GetMapping("/download/{filename}")
    public ResponseEntity<Resource> download(@PathVariable String filename, HttpServletRequest request) {
        return svc.download(request, filename);
    }
 
    @GetMapping("/page/{pageNum}/{rowNum}")
    public String getPage(@PathVariable("pageNum"int a, @PathVariable("rowNum"int b, Model m) {
        Map<String, Object> map = svc.getPage(a, b);
        m.addAttribute("pageInfo", map.get("pageInfo"));
        m.addAttribute("blist", map.get("blist"));
 
        return "board/boardList";
    }
}
cs

 

 

 

BoardService.java

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
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.multipart.MultipartFile;
import com.ezen.spring.web.mapper.BoardMapper;
import com.ezen.spring.web.vo.AttachVO;
import com.ezen.spring.web.vo.BoardVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
 
import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
 
@Service
@Slf4j
public class BoardService {
 
    @Autowired
    ResourceLoader resourceLoader;
 
    @Autowired
    BoardMapper dao;
 
    public boolean saveBoardandAttach(MultipartFile[] mfiles, HttpServletRequest request, BoardVO board) {
        ServletContext context = request.getServletContext();
        String savePath = context.getRealPath("/WEB-INF/files");
 
        dao.saveBoard(board);
        List<AttachVO> list = new ArrayList();
        try {
            for (int i = 0; i < mfiles.length; i++) {
                if (mfiles[0].getSize() == 0)
                    continue;
                mfiles[i].transferTo(new File(savePath + "/" + mfiles[i].getOriginalFilename()));
                String fname = mfiles[i].getOriginalFilename();
                long fsize = mfiles[i].getSize();
                
                AttachVO att = new AttachVO();
                att.setFname(fname);
                att.setFsize(fsize);
                list.add(att);
                dao.saveAttach(list);
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
 
    public BoardVO detail(int boardid) {
        List<Map<String, Object>> mlist = dao.detailBoard(boardid);
        BoardVO board = new BoardVO();
        Map<String, Object> map = mlist.get(0);
        BigDecimal big = (java.math.BigDecimal) map.get("BOARDID");
        board.setBoardid(big.intValue());
        board.setTitle((String) map.get("TITLE"));
        board.setAuthor((String) map.get("AUTHOR"));
        board.setContents((String) map.get("CONTENTS"));
 
        for (int i = 0; i < mlist.size(); i++) {
            AttachVO att = new AttachVO();
            Map<String, Object> rowMap = mlist.get(i);
            String fname = (String) rowMap.get("FNAME");
            if (fname == null)
                continue;
            att.setFname(fname);
            big = (java.math.BigDecimal) rowMap.get("ATTACHID");
            att.setAttachid(big.intValue());
            big = (java.math.BigDecimal) rowMap.get("FSIZE");
            att.setFsize(big.intValue());
            board.getAttList().add(att);
        }
        return board;
    }
 
    public ResponseEntity<Resource> download(HttpServletRequest request, String filename) {
        Resource resource = resourceLoader.getResource("WEB-INF/files/" + filename);
        System.out.println("ํŒŒ์ผ๋ช…:" + resource.getFilename());
        String contentType = null;
        try {
            contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        if (contentType == null) {
            contentType = "application/octet-stream"// http ํ”„๋กœํ† ์ฝœ ์•ฝ์†
        }
        try {
            filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return ResponseEntity.ok().contentType(MediaType.parseMediaType(contentType))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                .body(resource);
    }
 
    public Map<String, Object> getPage(int a, int b) {
        PageHelper.startPage(a, b);
        PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(dao.getList());
        List<Map<String, Object>> mlist = pageInfo.getList();
        List<BoardVO> blist = new ArrayList<>();
        for (int i = 0; i < mlist.size(); i++) {
            Map<String, Object> m = mlist.get(i);
            BigDecimal big = (java.math.BigDecimal) m.get("BOARDID");
            BoardVO board = new BoardVO(big.intValue());
            boolean found = false;
            if (blist.contains(board)) {
                board = blist.get(blist.indexOf(board));
                found = true;
            }
            board.setTitle((String) m.get("TITLE"));
            board.setAuthor((String) m.get("AUTHOR"));
 
            
            String fileNames = (String)m.get("FNAMES");
            if (fileNames.length()<=2 ) {
                if (!found)
                    blist.add(board);
                continue;
            }else {
                String[] file = fileNames.split("/");
                for (int y = 0; y < file.length; y++) {
                    AttachVO att = new AttachVO(file[y]);
                    board.getAttList().add(att);
                }
            }
            blist.add(board);
        }
        Map<String, Object> map = new HashMap<>();
        map.put("pageInfo", pageInfo);
        map.put("blist", blist);
        return map;
    }
}
cs

 

 

 

boardDetail.jsp

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ๋ณด๊ธฐ</title>
</head>
<body>
<h3> ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ </h3>
<table>
 
๊ธ€ ๋ฒˆํ˜ธ ${board.boardid} <br>
๊ธ€์“ด์ด ${board.author} <br>
๊ธ€์ œ๋ชฉ ${board.title} <br>
๊ธ€๋‚ด์šฉ ${board.contents} <br>
   <c:forEach var="line" items="${board.attList}">
   <a href="/board/download/${line.fname}">${line.fname}</a> 
   ${line.fsize} byte <br>
   </c:forEach>
   
</table>
</body>
</html>
cs

 

 

 

 

์‹คํ–‰๊ฒฐ๊ณผ : 

 

์ƒ์„ธ๋ณด๊ธฐ

 

 

์ฒจ๋ถ€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

๋Œ“๊ธ€