From bfbe92016f8c6be9435412beead5bef0a997eed0 Mon Sep 17 00:00:00 2001 From: khj0414 Date: Fri, 10 Jan 2025 10:55:38 +0900 Subject: [PATCH 01/72] =?UTF-8?q?=EC=9A=A9=EC=96=B4=EC=A7=91=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/worddictController.java | 11 ++ .../localhost/mapper/worddictyMapper.java | 2 + .../localhost/service/worddictyService.java | 6 +- src/main/resources/mapper/worddictyMapper.xml | 135 +++++++++++++++++- 4 files changed, 151 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/common/worddictController.java b/src/main/java/io/company/localhost/controller/common/worddictController.java index 25e84f3..b8f2b84 100644 --- a/src/main/java/io/company/localhost/controller/common/worddictController.java +++ b/src/main/java/io/company/localhost/controller/common/worddictController.java @@ -70,6 +70,17 @@ public class worddictController { List WordCategoryList = commoncodservice.getWordCategory(); return ApiResponse.ok(WordCategoryList); } + /** + * 용어집 상세 조회 + * @param WRDDICSEQ 용어 번호 + * @return + */ + @Member + @ParameterCheck + @GetMapping("getWordDetail") + public ApiResponse getWordDetail(@ReqMap MapDto map) { + return ApiResponse.ok( worddictyservice.getWordDetail(map)); + } /** * 용어집 카테고리 등록 * @param CMNCODNAM 용어집 등록 카테고리 이름 diff --git a/src/main/java/io/company/localhost/mapper/worddictyMapper.java b/src/main/java/io/company/localhost/mapper/worddictyMapper.java index f373ebf..77ee375 100644 --- a/src/main/java/io/company/localhost/mapper/worddictyMapper.java +++ b/src/main/java/io/company/localhost/mapper/worddictyMapper.java @@ -29,6 +29,8 @@ public interface worddictyMapper { Long updateWord(MapDto map); + MapDto getWordDetail(MapDto map); + diff --git a/src/main/java/io/company/localhost/service/worddictyService.java b/src/main/java/io/company/localhost/service/worddictyService.java index 826c0f9..ad8a8fc 100644 --- a/src/main/java/io/company/localhost/service/worddictyService.java +++ b/src/main/java/io/company/localhost/service/worddictyService.java @@ -32,7 +32,7 @@ public class worddictyService { private final worddictyMapper worddictymapper; public PageInfo getWordList(MapDto map) { - int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; + int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; PageHelper.startPage(page, 10); return PageUtil.redefineNavigation(new PageInfo<>(worddictymapper.getWordList(map),10)); } @@ -45,6 +45,10 @@ public class worddictyService { return worddictymapper.updateWord(map); } + public MapDto getWordDetail(MapDto map) { + return worddictymapper.getWordDetail(map); + } + diff --git a/src/main/resources/mapper/worddictyMapper.xml b/src/main/resources/mapper/worddictyMapper.xml index bfa6335..25645ea 100644 --- a/src/main/resources/mapper/worddictyMapper.xml +++ b/src/main/resources/mapper/worddictyMapper.xml @@ -5,6 +5,7 @@ select w.* ,DATE_FORMAT(w.WRDDICRDT,'%y.%m.%d %H:%i') AS formatWRDDICRDT + ,DATE_FORMAT(w.WRDDICUDT,'%y.%m.%d %H:%i') AS formatWRDDICRDT ,c.CMNCODNAM category from worddicty w @@ -21,8 +22,131 @@ - and w.WRDDICTTL like CONCAT(#{indexKeyword}, '%') - + + + + and w.WRDDICTTL BETWEEN '가' AND '깋' + + + and w.WRDDICTTL BETWEEN '나' AND '닣' + + + and w.WRDDICTTL BETWEEN '다' AND '딷' + + + and w.WRDDICTTL BETWEEN '라' AND '릿' + + + and w.WRDDICTTL BETWEEN '마' AND '맇' + + + and w.WRDDICTTL BETWEEN '바' AND '빟' + + + and w.WRDDICTTL BETWEEN '사' AND '싷' + + + and w.WRDDICTTL BETWEEN '아' AND '잏' + + + and w.WRDDICTTL BETWEEN '자' AND '짛' + + + and w.WRDDICTTL BETWEEN '차' AND '칳' + + + and w.WRDDICTTL BETWEEN '카' AND '킿' + + + and w.WRDDICTTL BETWEEN '타' AND '틷' + + + and w.WRDDICTTL BETWEEN '파' AND '핗' + + + and w.WRDDICTTL BETWEEN '하' AND '힣' + + + + and w.WRDDICTTL like "a%" + + + and w.WRDDICTTL like "b%" + + + and w.WRDDICTTL like "c%" + + + and w.WRDDICTTL like "d%" + + + and w.WRDDICTTL like "e%" + + + and w.WRDDICTTL like "f%" + + + and w.WRDDICTTL like "g%" + + + and w.WRDDICTTL like "h%" + + + and w.WRDDICTTL like "i%" + + + and w.WRDDICTTL like "j%" + + + and w.WRDDICTTL like "k%" + + + and w.WRDDICTTL like "l%" + + + and w.WRDDICTTL like "m%" + + + and w.WRDDICTTL like "n%" + + + and w.WRDDICTTL like "o%" + + + and w.WRDDICTTL like "p%" + + + and w.WRDDICTTL like "q%" + + + and w.WRDDICTTL like "r%" + + + and w.WRDDICTTL like "s%" + + + and w.WRDDICTTL like "t%" + + + and w.WRDDICTTL like "u%" + + + and w.WRDDICTTL like "v%" + + + and w.WRDDICTTL like "w%" + + + and w.WRDDICTTL like "x%" + + + and w.WRDDICTTL like "y%" + + + and w.WRDDICTTL like "z%" + + + and w.WRDDICCAT = #{category} @@ -72,4 +196,11 @@ where WRDDICSEQ = #{WRDDICSEQ} + From 135d0a9a7f25d7cf3e5e1672004706e4377b19c5 Mon Sep 17 00:00:00 2001 From: khj0414 Date: Fri, 10 Jan 2025 13:11:23 +0900 Subject: [PATCH 02/72] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{common => api}/worddictController.java | 18 +++++++++++------- src/main/resources/mapper/worddictyMapper.xml | 2 -- 2 files changed, 11 insertions(+), 9 deletions(-) rename src/main/java/io/company/localhost/controller/{common => api}/worddictController.java (90%) diff --git a/src/main/java/io/company/localhost/controller/common/worddictController.java b/src/main/java/io/company/localhost/controller/api/worddictController.java similarity index 90% rename from src/main/java/io/company/localhost/controller/common/worddictController.java rename to src/main/java/io/company/localhost/controller/api/worddictController.java index b8f2b84..d99daed 100644 --- a/src/main/java/io/company/localhost/controller/common/worddictController.java +++ b/src/main/java/io/company/localhost/controller/api/worddictController.java @@ -1,6 +1,6 @@ /************************************************************ * - * @packageName : io.company.localhost.controller.common + * @packageName : io.company.localhost.controller.api * @fileName : worddictController.java * @author : 공현지 * @date : 25.01.07 @@ -12,7 +12,7 @@ * 24.12.06 공현지 최초 생성 * *************************************************************/ -package io.company.localhost.controller.common; +package io.company.localhost.controller.api; import java.util.List; @@ -95,7 +95,7 @@ public class worddictController { } /** * 용어 등록 - * @param WRDDICCAT 카테고리,WRDDICTTL 용어,WRDDICCON 내용 ,WRDDICRIK 링크 + * @param WRDDICCAT 카테고리 코드값 ,WRDDICTTL 용어,WRDDICCON 내용 ,WRDDICRIK 링크 * @return */ @Member @@ -105,9 +105,11 @@ public class worddictController { //userId Long userId = AuthUtil.getUser().getId(); - map.put("userId", userId); + //map.put("userId", userId); + /////////로그인 미개발 ->임시 + map.put("userId", 1); Long result = worddictyservice.insertWord(map); - + return ApiResponse.ok(result); } /** @@ -122,9 +124,11 @@ public class worddictController { //userId Long userId = AuthUtil.getUser().getId(); - map.put("userId", userId); + //map.put("userId", userId); + ////////로그인 미개발 ->임시 + map.put("userId", 1); Long result = worddictyservice.updateWord(map); - + return ApiResponse.ok(result); } diff --git a/src/main/resources/mapper/worddictyMapper.xml b/src/main/resources/mapper/worddictyMapper.xml index 25645ea..7aa13e2 100644 --- a/src/main/resources/mapper/worddictyMapper.xml +++ b/src/main/resources/mapper/worddictyMapper.xml @@ -4,8 +4,6 @@ SELECT - b.LOCBRDSEQ, - b.LOCBRDTTL, - b.LOCBRDCON, - b.LOCBRDRDT, - b.LOCBRDTYP, - a.FILE_PATH, - a.FILE_NAME, - a.FILE_TYPE - FROM localbord b - LEFT JOIN attachments a ON b.LOCBRDSEQ = a.LOCBRDSEQ + LOCBRDSEQ, + LOCBRDTTL, + LOCBRDCON, + LOCBRDRDT, + LOCBRDTYP, + FROM localbord WHERE b.LOCBRDTYP = 'N' - ORDER BY b.LOCBRDRDT DESC + ORDER BY b.LOCBRDRDT DESC @@ -32,16 +28,23 @@ - - INSERT INTO localbord (LOCBRDTTL, LOCBRDCON, LOCBRDCAT, MEMBERSEQ, LOCBRDCNT, LOCBRDRDT, LOCBRDUDT, LOCBRDPWD, LOCBRDTYP) - VALUES (#{LOCBRDTTL}, #{LOCBRDCON}, #{LOCBRDCAT}, #{MEMBERSEQ}, 0, NOW(), NOW(), #{LOCBRDPWD}, #{LOCBRDTYP}) - + + INSERT INTO localbord (LOCBRDTTL, LOCBRDCON, LOCBRDCAT, MEMBERSEQ, LOCBRDCNT, LOCBRDRDT, LOCBRDUDT, LOCBRDPWD, LOCBRDTYP) + VALUES (#{LOCBRDTTL}, #{LOCBRDCON}, #{LOCBRDCAT}, #{MEMBERSEQ}, 0, NOW(), NOW(), #{LOCBRDPWD}, #{LOCBRDTYP}) + + - - INSERT INTO commonfil (CMNBRDSEQ, CMNFLEPAT, CMNFLENAM, CMNFLEORG, CMNFLEEXT, CMNFLESIZ, CMNFLEREG, CMNFLERDT) - VALUES (#{CMNBRDSEQ}, #{CMNFLEPAT}, #{CMNFLENAM}, #{CMNFLEORG}, #{CMNFLEEXT}, #{CMNFLESIZ}, #{CMNFLEREG}, NOW()) + + INSERT INTO commonfil ( + CMNBRDSEQ,CMNFLENAM,CMNFLEORG,CMNFLEPAT, + CMNFLEEXT,CMNFLESIZ,CMNFLEREG,CMNFLERDT + ) VALUES ( + #{CMNBRDSEQ},#{CMNFLENAM},#{CMNFLEORG},#{CMNFLEPAT}, + #{CMNFLEEXT},#{CMNFLESIZ},#{CMNFLEREG},#{CMNFLERDT} + ) + From d5f9e7242f009a79717e29a7f44738b9b88c91eb Mon Sep 17 00:00:00 2001 From: khj0414 Date: Mon, 13 Jan 2025 13:14:47 +0900 Subject: [PATCH 04/72] =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=95=20=EC=97=86?= =?UTF-8?q?=EC=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/worddictController.java | 20 +++++++---- .../localhost/mapper/worddictyMapper.java | 2 ++ .../localhost/service/worddictyService.java | 13 ++++--- src/main/resources/mapper/worddictyMapper.xml | 36 +++++++++++-------- 4 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/worddictController.java b/src/main/java/io/company/localhost/controller/api/worddictController.java index d99daed..9918bde 100644 --- a/src/main/java/io/company/localhost/controller/api/worddictController.java +++ b/src/main/java/io/company/localhost/controller/api/worddictController.java @@ -14,7 +14,9 @@ *************************************************************/ package io.company.localhost.controller.api; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; @@ -54,10 +56,17 @@ public class worddictController { @Member @ParameterCheck @GetMapping("getWordList") - public ApiResponse> getWordList(@ReqMap MapDto map) { - PageInfo WordList = worddictyservice.getWordList(map); - return ApiResponse.ok(WordList); - } + public ApiResponse getWordList(@ReqMap MapDto map) { + int total = worddictyservice.getTotal(map); + List wordList = worddictyservice.getWordList(map); + + MapDto OutData = new MapDto(); + OutData.put("total", total); + OutData.put("data", wordList); + + return ApiResponse.ok(OutData); + } + /** * 용어집 카테고리 목록 * @param @@ -105,6 +114,7 @@ public class worddictController { //userId Long userId = AuthUtil.getUser().getId(); + String content = map.getString("content"); // content 추출 //map.put("userId", userId); /////////로그인 미개발 ->임시 map.put("userId", 1); @@ -131,6 +141,4 @@ public class worddictController { return ApiResponse.ok(result); } - - } diff --git a/src/main/java/io/company/localhost/mapper/worddictyMapper.java b/src/main/java/io/company/localhost/mapper/worddictyMapper.java index 77ee375..369be30 100644 --- a/src/main/java/io/company/localhost/mapper/worddictyMapper.java +++ b/src/main/java/io/company/localhost/mapper/worddictyMapper.java @@ -31,6 +31,8 @@ public interface worddictyMapper { MapDto getWordDetail(MapDto map); + int getTotal(MapDto map); + diff --git a/src/main/java/io/company/localhost/service/worddictyService.java b/src/main/java/io/company/localhost/service/worddictyService.java index ad8a8fc..ffe3ea8 100644 --- a/src/main/java/io/company/localhost/service/worddictyService.java +++ b/src/main/java/io/company/localhost/service/worddictyService.java @@ -15,6 +15,8 @@ package io.company.localhost.service; +import java.util.List; + import org.springframework.stereotype.Service; import com.github.pagehelper.PageHelper; @@ -31,10 +33,9 @@ public class worddictyService { private final worddictyMapper worddictymapper; - public PageInfo getWordList(MapDto map) { - int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; - PageHelper.startPage(page, 10); - return PageUtil.redefineNavigation(new PageInfo<>(worddictymapper.getWordList(map),10)); + public List getWordList(MapDto map) { + + return (worddictymapper.getWordList(map)); } public Long insertWord(MapDto map) { @@ -49,6 +50,10 @@ public class worddictyService { return worddictymapper.getWordDetail(map); } + public int getTotal(MapDto map) { + return worddictymapper.getTotal(map); + } + diff --git a/src/main/resources/mapper/worddictyMapper.xml b/src/main/resources/mapper/worddictyMapper.xml index 7aa13e2..6de1b79 100644 --- a/src/main/resources/mapper/worddictyMapper.xml +++ b/src/main/resources/mapper/worddictyMapper.xml @@ -1,22 +1,11 @@ - + select + w.* + ,c.CMNCODNAM category + from + worddicty w + left join + commoncod c + on + w.WRDDICCAT = c.CMNCODVAL + where + 1=1 + order by w.WRDDICRDT desc + insert into worddicty ( From 5a1e5a1f33f2f844b49f59c26ac49da8755e0c93 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 13 Jan 2025 13:57:35 +0900 Subject: [PATCH 05/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 40 +++++++++++++++---- .../localhost/mapper/LocalBordMapper.java | 6 +++ .../localhost/service/LocalBordService.java | 9 +++++ src/main/resources/mapper/LocalBordMapper.xml | 18 +++++++++ 4 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 0b13f60..6be5861 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -68,14 +68,14 @@ public class BoardController { // 첨부파일 추가 @PostMapping("/{boardId}/attachments") public ApiResponse uploadAttachment( - @PathVariable("boardId") Long boardId, - @RequestParam("file") MultipartFile file, - @RequestParam("CMNFLEPAT") String filePath, - @RequestParam("CMNFLEORG") String originalFileName, - @RequestParam("CMNFLEEXT") String fileExtension, - @RequestParam("CMNFLESIZ") Long fileSize, - @RequestParam("CMNFLEREG") Long registrantId, - @RequestParam("CMNFLENAM") String fileName + @PathVariable("boardId") Long boardId, + @RequestParam(name = "file") MultipartFile file, + @RequestParam(name = "CMNFLEPAT") String filePath, + @RequestParam(name = "CMNFLEORG") String originalFileName, + @RequestParam(name = "CMNFLEEXT") String fileExtension, + @RequestParam(name = "CMNFLESIZ") Long fileSize, + @RequestParam(name = "CMNFLEREG") Long registrantId, + @RequestParam(name = "CMNFLENAM") String fileName ) { // 데이터 준비 MapDto fileData = new MapDto(); @@ -95,6 +95,30 @@ public class BoardController { return ApiResponse.ok("첨부파일이 저장되었습니다."); } + + // 게시물 상세보기 + @GetMapping("/{boardId}") + public ApiResponse> getBoardDetail(@PathVariable Long boardId) { + log.info("Fetching details for board ID: {}", boardId); + + // 게시물 상세정보 조회 + MapDto boardDetail = boardService.getBoardDetail(boardId); + + // 첨부파일 목록 조회 + List attachments = boardService.getAttachments(boardId); + + // 댓글 목록 조회 + List comments = boardService.getComments(boardId.intValue()); + + // 결과 조합 + Map result = new HashMap<>(); + result.put("boardDetail", boardDetail); + result.put("attachments", attachments); + result.put("comments", comments); + + return ApiResponse.ok(result); + } + // 게시물 삭제 @DeleteMapping("/{boardId}") diff --git a/src/main/java/io/company/localhost/mapper/LocalBordMapper.java b/src/main/java/io/company/localhost/mapper/LocalBordMapper.java index 4be4d47..b0943f3 100644 --- a/src/main/java/io/company/localhost/mapper/LocalBordMapper.java +++ b/src/main/java/io/company/localhost/mapper/LocalBordMapper.java @@ -51,5 +51,11 @@ public interface LocalBordMapper { // 비밀 게시판 여부 확인 boolean isSecretBoard(Long boardId); + + // 게시물 상세보기 + MapDto selectBoardDetail(Long boardId); + + // 첨부파일 가져오기 + List selectAttachments(Long boardId); } diff --git a/src/main/java/io/company/localhost/service/LocalBordService.java b/src/main/java/io/company/localhost/service/LocalBordService.java index 8e1ee8c..2aca545 100644 --- a/src/main/java/io/company/localhost/service/LocalBordService.java +++ b/src/main/java/io/company/localhost/service/LocalBordService.java @@ -32,6 +32,15 @@ public class LocalBordService { boardMapper.addAttachment(map); } + public MapDto getBoardDetail(Long boardId) { + return boardMapper.selectBoardDetail(boardId); + } + + public List getAttachments(Long boardId) { + return boardMapper.selectAttachments(boardId); + } + + public void deleteBoard(MapDto map) { boardMapper.deleteBoard(map); } diff --git a/src/main/resources/mapper/LocalBordMapper.xml b/src/main/resources/mapper/LocalBordMapper.xml index ca1cd6d..f6f3920 100644 --- a/src/main/resources/mapper/LocalBordMapper.xml +++ b/src/main/resources/mapper/LocalBordMapper.xml @@ -45,6 +45,24 @@ ) + + + + + + + + From b64f203a93e694789b663515b39b4d2e2877275b Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 13 Jan 2025 16:14:21 +0900 Subject: [PATCH 06/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 37 ++++++++++++------- src/main/resources/mapper/LocalBordMapper.xml | 13 +++---- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 6be5861..19603ab 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -37,7 +37,19 @@ public class BoardController { //공지사항 @GetMapping("/notices") public ApiResponse> getNotices() { - return ApiResponse.ok(boardService.getNotices()); + List posts = boardService.getNotices(); + for (Map post : posts) { + Object content = post.get("content"); + if (content instanceof Blob) { + Blob blob = (Blob) content; + try { + post.put("content", new String(blob.getBytes(1, (int) blob.length()), StandardCharsets.UTF_8)); + } catch (Exception e) { + post.put("content", ""); // 변환 실패 시 기본 값 설정 + } + } + } + return ApiResponse.ok(posts); } //비밀,자유게시판 @GetMapping("/general") @@ -68,14 +80,14 @@ public class BoardController { // 첨부파일 추가 @PostMapping("/{boardId}/attachments") public ApiResponse uploadAttachment( - @PathVariable("boardId") Long boardId, - @RequestParam(name = "file") MultipartFile file, - @RequestParam(name = "CMNFLEPAT") String filePath, - @RequestParam(name = "CMNFLEORG") String originalFileName, - @RequestParam(name = "CMNFLEEXT") String fileExtension, - @RequestParam(name = "CMNFLESIZ") Long fileSize, - @RequestParam(name = "CMNFLEREG") Long registrantId, - @RequestParam(name = "CMNFLENAM") String fileName + @PathVariable("boardId") Long boardId, + @RequestParam("file") MultipartFile file, + @RequestParam("CMNFLEPAT") String filePath, + @RequestParam("CMNFLEORG") String originalFileName, + @RequestParam("CMNFLEEXT") String fileExtension, + @RequestParam("CMNFLESIZ") Long fileSize, + @RequestParam("CMNFLEREG") Long registrantId, + @RequestParam("CMNFLENAM") String fileName ) { // 데이터 준비 MapDto fileData = new MapDto(); @@ -95,10 +107,9 @@ public class BoardController { return ApiResponse.ok("첨부파일이 저장되었습니다."); } - // 게시물 상세보기 @GetMapping("/{boardId}") - public ApiResponse> getBoardDetail(@PathVariable Long boardId) { + public ApiResponse> getBoardDetail(@PathVariable("boardId") Long boardId) { log.info("Fetching details for board ID: {}", boardId); // 게시물 상세정보 조회 @@ -118,8 +129,6 @@ public class BoardController { return ApiResponse.ok(result); } - - // 게시물 삭제 @DeleteMapping("/{boardId}") public ApiResponse deleteBoard(@PathVariable Long boardId, @ReqMap MapDto map) { @@ -179,7 +188,7 @@ public class BoardController { map.put("LOCBRDSEQ", boardId); return ApiResponse.ok(boardService.checkBoardPassword(map)); } - // 비밀게시판 여부 확인 + // 비밀게시판 여부 확인 @GetMapping("/{boardId}/isSecret") public ApiResponse isSecretBoard(@PathVariable Long boardId) { log.info("Checking if board ID {} is secret", boardId); diff --git a/src/main/resources/mapper/LocalBordMapper.xml b/src/main/resources/mapper/LocalBordMapper.xml index f6f3920..0088287 100644 --- a/src/main/resources/mapper/LocalBordMapper.xml +++ b/src/main/resources/mapper/LocalBordMapper.xml @@ -3,20 +3,19 @@ - SELECT - LOCBRDSEQ, - LOCBRDTTL, - LOCBRDCON, - LOCBRDRDT, - LOCBRDTYP, + LOCBRDSEQ AS id, + LOCBRDTTL AS title, + LOCBRDCON AS content, + LOCBRDRDT AS date FROM localbord WHERE b.LOCBRDTYP = 'N' ORDER BY b.LOCBRDRDT DESC - SELECT LOCBRDSEQ AS id, LOCBRDTTL AS title, From cef01c7c824f843c85336e13c6492f66473198a9 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Tue, 14 Jan 2025 10:05:26 +0900 Subject: [PATCH 07/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 22 ++++++++++++++----- src/main/resources/mapper/LocalBordMapper.xml | 14 ++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 19603ab..e338029 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -109,20 +109,32 @@ public class BoardController { } // 게시물 상세보기 @GetMapping("/{boardId}") - public ApiResponse> getBoardDetail(@PathVariable("boardId") Long boardId) { + public ApiResponse getBoardDetail(@PathVariable("boardId") Long boardId) { log.info("Fetching details for board ID: {}", boardId); // 게시물 상세정보 조회 MapDto boardDetail = boardService.getBoardDetail(boardId); + if (boardDetail == null) { + throw new IllegalArgumentException("Board not found for ID: " + boardId); + } - // 첨부파일 목록 조회 + // Blob 데이터를 문자열로 변환 + if (boardDetail.get("content") instanceof Blob) { + try { + Blob blob = (Blob) boardDetail.get("content"); + String contentString = new String(blob.getBytes(1, (int) blob.length()), StandardCharsets.UTF_8); + boardDetail.put("content", contentString); + } catch (Exception e) { + throw new RuntimeException("Failed to process Blob content", e); + } + } + + // 첨부파일 및 댓글 조회 List attachments = boardService.getAttachments(boardId); - - // 댓글 목록 조회 List comments = boardService.getComments(boardId.intValue()); // 결과 조합 - Map result = new HashMap<>(); + MapDto result = new MapDto(); result.put("boardDetail", boardDetail); result.put("attachments", attachments); result.put("comments", comments); diff --git a/src/main/resources/mapper/LocalBordMapper.xml b/src/main/resources/mapper/LocalBordMapper.xml index 0088287..4d4a0c4 100644 --- a/src/main/resources/mapper/LocalBordMapper.xml +++ b/src/main/resources/mapper/LocalBordMapper.xml @@ -46,7 +46,7 @@ - SELECT LOCBRDSEQ AS id, LOCBRDTTL AS title, LOCBRDCON AS content, LOCBRDRDT AS date, LOCBRDTYP AS type FROM localbord WHERE LOCBRDSEQ = #{boardId} @@ -54,7 +54,7 @@ - SELECT CMNFLESEQ AS id, CMNFLEORG AS originalName, CMNFLENAM AS fileName, CMNFLEPAT AS path, CMNFLEEXT AS extension, CMNFLESIZ AS size, CMNFLERDT AS uploadDate FROM commonfil @@ -85,27 +85,27 @@ - INSERT INTO loccomt (LOCBRDSEQ, LOCCMTRPY, LOCCMTPWD, LOCCMTRDT, LOCCMTPNT) + INSERT INTO localcomt (LOCBRDSEQ, LOCCMTRPY, LOCCMTPWD, LOCCMTRDT, LOCCMTPNT) VALUES (#{LOCBRDSEQ}, #{LOCCMTRPY}, #{LOCCMTPWD}, NOW(), #{LOCCMTPNT}) - UPDATE loccomt + UPDATE localcomt SET LOCCMTRPY = #{LOCCMTRPY}, LOCCMTUDT = NOW() WHERE LOCCMTSEQ = #{LOCCMTSEQ} AND LOCCMTPWD = #{LOCCMTPWD} - DELETE FROM loccomt + DELETE FROM localcomt WHERE LOCCMTSEQ = #{LOCCMTSEQ} AND LOCCMTPWD = #{LOCCMTPWD} @@ -116,7 +116,7 @@ From ec9b80f5b0dd45e4513d8195a4975a1e6217403d Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Tue, 14 Jan 2025 11:08:15 +0900 Subject: [PATCH 08/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index e338029..27f534b 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -143,66 +143,66 @@ public class BoardController { } // 게시물 삭제 @DeleteMapping("/{boardId}") - public ApiResponse deleteBoard(@PathVariable Long boardId, @ReqMap MapDto map) { + public ApiResponse deleteBoard(@PathVariable("boardId") Long boardId, @ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); log.info("Deleting board with ID: {}", boardId); boardService.deleteBoard(map); return ApiResponse.ok("게시물이 삭제되었습니다."); } //게시물 수정 - @PutMapping + @PutMapping("/{boardId}") public ApiResponse updateBoard(@ReqMap MapDto map) { boardService.updateBoard(map); return ApiResponse.ok("게시물이 수정되었습니다."); } //게시물과 댓글에 좋아요/싫어요 추가 @PostMapping("/{boardId}/reaction") - public ApiResponse reactToBoard(@PathVariable Long boardId, @ReqMap MapDto map) { + public ApiResponse reactToBoard(@PathVariable("boardId") Long boardId, @ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); boardService.reactToBoard(map); return ApiResponse.ok("반응이 추가되었습니다."); } //댓글/대댓글 조회 @GetMapping("/{boardId}/comments") - public ApiResponse> getComments(@PathVariable int boardId) { + public ApiResponse> getComments(@PathVariable("boardId") int boardId) { return ApiResponse.ok(boardService.getComments(boardId)); } //댓글/대댓글 작성 @PostMapping("/{boardId}/comment") - public ApiResponse addCommentOrReply(@PathVariable int boardId, @ReqMap MapDto map) { + public ApiResponse addCommentOrReply(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); boardService.addCommentOrReply(map); return ApiResponse.ok("댓글 또는 대댓글이 작성되었습니다."); } //댓글/대댓글 수정 @PutMapping("/comment/{commentId}") - public ApiResponse updateComment(@PathVariable int commentId, @ReqMap MapDto map) { + public ApiResponse updateComment(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { map.put("LOCCMTSEQ", commentId); boardService.updateComment(map); return ApiResponse.ok("댓글이 수정되었습니다."); } //댓글/대댓글 삭제 @DeleteMapping("/comment/{commentId}") - public ApiResponse deleteComment(@PathVariable int commentId, @ReqMap MapDto map) { + public ApiResponse deleteComment(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { map.put("LOCCMTSEQ", commentId); boardService.deleteComment(map); return ApiResponse.ok("댓글이 삭제되었습니다."); } //비밀번호 확인 (게시물) @PostMapping("/comment/{commentId}/password") - public ApiResponse checkCommentPassword(@PathVariable int commentId, @ReqMap MapDto map) { + public ApiResponse checkCommentPassword(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { map.put("LOCCMTSEQ", commentId); return ApiResponse.ok(boardService.checkCommentPassword(map)); } //비밀번호 확인 (댓글) @PostMapping("/{boardId}/password") - public ApiResponse checkBoardPassword(@PathVariable int boardId, @ReqMap MapDto map) { + public ApiResponse checkBoardPassword(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); return ApiResponse.ok(boardService.checkBoardPassword(map)); } // 비밀게시판 여부 확인 @GetMapping("/{boardId}/isSecret") - public ApiResponse isSecretBoard(@PathVariable Long boardId) { + public ApiResponse isSecretBoard(@PathVariable("boardId") Long boardId) { log.info("Checking if board ID {} is secret", boardId); return ApiResponse.ok(boardService.isSecretBoard(boardId)); } From 7fbb3a2a871ea9855687a029cb238d15424d6ba1 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Tue, 14 Jan 2025 13:35:19 +0900 Subject: [PATCH 09/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/company/localhost/controller/api/BoardController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 27f534b..a09e794 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -151,7 +151,8 @@ public class BoardController { } //게시물 수정 @PutMapping("/{boardId}") - public ApiResponse updateBoard(@ReqMap MapDto map) { + public ApiResponse updateBoard(@PathVariable("boardId") Long boardId,@ReqMap MapDto map) { + map.put("LOCBRDSEQ", boardId); boardService.updateBoard(map); return ApiResponse.ok("게시물이 수정되었습니다."); } From 5d91c2d46a096d9949fe8988d598b328fc822b25 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Thu, 16 Jan 2025 11:06:38 +0900 Subject: [PATCH 10/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EB=B0=B1?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 263 +++++++++++++++--- .../localhost/mapper/LocalBordMapper.java | 10 +- .../localhost/service/LocalBordService.java | 25 +- src/main/resources/mapper/LocalBordMapper.xml | 71 +++-- 4 files changed, 303 insertions(+), 66 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index a09e794..32dfcfa 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -1,8 +1,24 @@ +/************************************************************ + * + * @packageName : io.company.localhost.controller.api + * @fileName : BoardController.java + * @author : 서지희 + * @date : 25.01.07 + * @description : 게시판 + * + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 24.01.02 서지희 최초 생성 + * + *************************************************************/ + package io.company.localhost.controller.api; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.sql.Blob; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -20,6 +36,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import com.github.pagehelper.PageInfo; +import com.github.pagehelper.PageSerializable; + import io.company.localhost.common.annotation.ReqMap; import io.company.localhost.common.dto.ApiResponse; import io.company.localhost.common.dto.MapDto; @@ -34,41 +53,77 @@ import lombok.extern.slf4j.Slf4j; public class BoardController { private final LocalBordService boardService; - //공지사항 + /** + * 공지사항 목록 조회 + * @ReqMap map 요청 파라미터 (searchKeyword) + * @return 페이징된 공지사항 목록 + */ @GetMapping("/notices") - public ApiResponse> getNotices() { - List posts = boardService.getNotices(); - for (Map post : posts) { + public ApiResponse> getNotices(@ReqMap MapDto map) { + List posts = boardService.getNotices(map); + + // Blob 데이터를 처리 (문자열로 변환) + for (MapDto post : posts) { Object content = post.get("content"); if (content instanceof Blob) { Blob blob = (Blob) content; - try { - post.put("content", new String(blob.getBytes(1, (int) blob.length()), StandardCharsets.UTF_8)); - } catch (Exception e) { - post.put("content", ""); // 변환 실패 시 기본 값 설정 - } + post.put("content", safeBlobToString(blob)); } } + return ApiResponse.ok(posts); } - //비밀,자유게시판 + + /** + * 자유/익명 게시판 목록 조회 + * @ReqMap map 요청 파라미터 (page, size, searchKeyword 포함) + * @return 페이징된 자유/익명 게시판 목록 + */ @GetMapping("/general") - public ApiResponse> getGeneralPosts() { - List posts = boardService.getGeneralPosts(); - for (Map post : posts) { + public ApiResponse> getGeneralPosts(@ReqMap MapDto map) { + PageInfo posts = boardService.getGeneralPosts(map); + + // Blob 데이터를 처리 (문자열로 변환) + for (MapDto post : posts.getList()) { Object content = post.get("content"); if (content instanceof Blob) { Blob blob = (Blob) content; - try { - post.put("content", new String(blob.getBytes(1, (int) blob.length()), StandardCharsets.UTF_8)); - } catch (Exception e) { - post.put("content", ""); // 변환 실패 시 기본 값 설정 - } + post.put("content", safeBlobToString(blob)); } } + return ApiResponse.ok(posts); } - //게시물 작성 + + /** + * 안전하게 Blob 데이터를 문자열로 변환하는 메서드 + * @ReqMap + * @return 변환된 문자열 또는 null + */ + private String safeBlobToString(Blob blob) { + if (blob == null) { + return null; // Blob이 null이면 null 반환 + } + + try { + long blobLength = blob.length(); + if (blobLength > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Blob is too large to process."); + } + + return new String(blob.getBytes(1, (int) blobLength), StandardCharsets.UTF_8); + } catch (Exception e) { + System.err.println("Failed to convert Blob to String: " + e.getMessage()); + e.printStackTrace(); + return null; // 변환 실패 시 null 반환 + } + } + + /** + * 게시물 작성 + * @ReqMap map 요청 파라미터 (page, size, searchKeyword 포함) + * @return 작성된 게시물의 ID + */ @PostMapping public ApiResponse createBoard(@ReqMap MapDto map) { BigInteger createdIdx = boardService.createBoard(map); // 작성된 게시물의 idx를 반환 @@ -77,7 +132,19 @@ public class BoardController { responseData.put("message", "게시물이 작성되었습니다."); return ApiResponse.ok(responseData); } - // 첨부파일 추가 + + /** + * 첨부파일 추가 + * @param boardId 게시물 ID + * @param file 업로드된 파일 + * @param filePath 파일 저장 경로 + * @param originalFileName 원본 파일명 + * @param fileExtension 파일 확장자 + * @param fileSize 파일 크기 + * @param registrantId 등록자 ID + * @param fileName 저장될 파일명 + * @return 첨부파일 저장 결과 메시지 + */ @PostMapping("/{boardId}/attachments") public ApiResponse uploadAttachment( @PathVariable("boardId") Long boardId, @@ -107,7 +174,12 @@ public class BoardController { return ApiResponse.ok("첨부파일이 저장되었습니다."); } - // 게시물 상세보기 + + /** + * 게시물 상세보기 + * @param boardId 게시물 ID + * @return 게시물 상세정보, 첨부파일 목록, 댓글 목록 + */ @GetMapping("/{boardId}") public ApiResponse getBoardDetail(@PathVariable("boardId") Long boardId) { log.info("Fetching details for board ID: {}", boardId); @@ -141,7 +213,12 @@ public class BoardController { return ApiResponse.ok(result); } - // 게시물 삭제 + + /** + * 게시물 삭제 + * @param boardId 게시물 ID + * @return 삭제 결과 메시지 + */ @DeleteMapping("/{boardId}") public ApiResponse deleteBoard(@PathVariable("boardId") Long boardId, @ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); @@ -149,62 +226,176 @@ public class BoardController { boardService.deleteBoard(map); return ApiResponse.ok("게시물이 삭제되었습니다."); } - //게시물 수정 + + /** + * 게시물 수정 + * @param boardId 게시물 ID + * @ReqMap map 수정 데이터 (제목, 내용 등) + * @return 수정 결과 메시지 + */ @PutMapping("/{boardId}") public ApiResponse updateBoard(@PathVariable("boardId") Long boardId,@ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); boardService.updateBoard(map); return ApiResponse.ok("게시물이 수정되었습니다."); } - //게시물과 댓글에 좋아요/싫어요 추가 + + /** + * 게시물 좋아요/싫어요 추가 + * @param boardId 게시물 ID + * @ReqMap map 좋아요/싫어요 데이터 + * @return 반응 추가 결과 메시지 + */ @PostMapping("/{boardId}/reaction") public ApiResponse reactToBoard(@PathVariable("boardId") Long boardId, @ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); boardService.reactToBoard(map); return ApiResponse.ok("반응이 추가되었습니다."); } - //댓글/대댓글 조회 + + /** + * 댓글/대댓글 조회 + * @param boardId 게시물 ID + * @return 댓글과 대댓글의 계층 구조 데이터 + */ @GetMapping("/{boardId}/comments") - public ApiResponse> getComments(@PathVariable("boardId") int boardId) { - return ApiResponse.ok(boardService.getComments(boardId)); + public ApiResponse>> getComments(@PathVariable("boardId") int boardId) { + // 모든 댓글과 대댓글 조회 + List comments = boardService.getComments(boardId); + + // 댓글과 대댓글을 계층 구조로 정렬 + Map> commentMap = new HashMap<>(); + for (MapDto comment : comments) { + int commentId = (int) comment.get("LOCCMTSEQ"); + Integer parentId = (Integer) comment.get("LOCCMTRPY"); + + Map commentData = new HashMap<>(comment); + commentData.put("replies", new ArrayList<>()); // 대댓글 리스트 초기화 + + if (parentId == null) { + // 댓글인 경우 + commentMap.put(commentId, commentData); + } else { + // 대댓글인 경우, 부모 댓글의 "replies"에 추가 + Map parentComment = commentMap.get(parentId); + if (parentComment != null) { + List> replies = (List>) parentComment.get("replies"); + replies.add(commentData); + } + } + } + + // 최상위 댓글 리스트 반환 + List> result = new ArrayList<>(commentMap.values()); + return ApiResponse.ok(result); } - //댓글/대댓글 작성 + + /** + * 댓글/대댓글 작성 + * @param boardId 게시물 ID + * @ReqMap map 댓글 데이터 (내용, 부모 ID 등) + * @return 작성 결과 메시지 + */ @PostMapping("/{boardId}/comment") public ApiResponse addCommentOrReply(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { - map.put("LOCBRDSEQ", boardId); + map.put("LOCBRDSEQ", boardId); + + // 부모 댓글 확인 + Integer parentCommentId = (Integer) map.get("LOCCMTRPY"); + if (parentCommentId != null) { + MapDto parentComment = boardService.getCommentById(parentCommentId); + if (parentComment == null) { + throw new IllegalArgumentException("Invalid parent comment ID: " + parentCommentId); + } + } + boardService.addCommentOrReply(map); return ApiResponse.ok("댓글 또는 대댓글이 작성되었습니다."); } - //댓글/대댓글 수정 + + /** + * 댓글/대댓글 수정 + * @param commentId 댓글 ID + * @ReqMap map 수정 데이터 (내용, 비밀번호 등) + * @return 수정 결과 메시지 + */ @PutMapping("/comment/{commentId}") public ApiResponse updateComment(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { - map.put("LOCCMTSEQ", commentId); + // 기존 댓글 조회 + MapDto existingComment = boardService.getCommentById(commentId); + if (existingComment == null) { + throw new IllegalArgumentException("Comment not found for ID: " + commentId); + } + + // 부모 댓글 ID는 수정 불가 + map.remove("LOCCMTRPY"); + + map.put("LOCCMTSEQ", commentId); boardService.updateComment(map); + return ApiResponse.ok("댓글이 수정되었습니다."); } - //댓글/대댓글 삭제 + + /** + * 댓글/대댓글 삭제 + * @param commentId 댓글 ID + * @ReqMap map 요청 데이터 (비밀번호 등) + * @return 삭제 결과 메시지 + */ @DeleteMapping("/comment/{commentId}") public ApiResponse deleteComment(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { - map.put("LOCCMTSEQ", commentId); + map.put("LOCCMTSEQ", commentId); boardService.deleteComment(map); + return ApiResponse.ok("댓글이 삭제되었습니다."); } - //비밀번호 확인 (게시물) + + /** + * 댓글 비밀번호 확인 + * @param commentId 댓글 ID + * @ReqMap map 비밀번호 데이터 + * @return 비밀번호 확인 결과 + */ @PostMapping("/comment/{commentId}/password") public ApiResponse checkCommentPassword(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { map.put("LOCCMTSEQ", commentId); return ApiResponse.ok(boardService.checkCommentPassword(map)); } - //비밀번호 확인 (댓글) + + /** + * 게시물 비밀번호 확인 + * @param boardId 게시물 ID + * @ReqMap map 비밀번호 데이터 + * @return 비밀번호 확인 결과 + */ @PostMapping("/{boardId}/password") public ApiResponse checkBoardPassword(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); return ApiResponse.ok(boardService.checkBoardPassword(map)); } - // 비밀게시판 여부 확인 + + /** + * 비밀게시판 여부 확인 + * @param boardId 게시물 ID + * @return 비밀게시판 여부 + */ @GetMapping("/{boardId}/isSecret") public ApiResponse isSecretBoard(@PathVariable("boardId") Long boardId) { log.info("Checking if board ID {} is secret", boardId); return ApiResponse.ok(boardService.isSecretBoard(boardId)); } + + /** + * 댓글 좋아요/싫어요 추가 + * @param commentId 댓글 ID + * @ReqMap map 좋아요/싫어요 데이터 + * @return 반응 추가 결과 메시지 + */ + @PostMapping("/comment/{commentId}/reaction") + public ApiResponse reactToComment(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { + map.put("LOCCMTSEQ", commentId); + boardService.reactToComment(map); + return ApiResponse.ok("Comment reaction added."); + } + } diff --git a/src/main/java/io/company/localhost/mapper/LocalBordMapper.java b/src/main/java/io/company/localhost/mapper/LocalBordMapper.java index b0943f3..347ec07 100644 --- a/src/main/java/io/company/localhost/mapper/LocalBordMapper.java +++ b/src/main/java/io/company/localhost/mapper/LocalBordMapper.java @@ -11,10 +11,10 @@ import io.company.localhost.common.dto.MapDto; @Mapper public interface LocalBordMapper { // 공지사항 조회 - List getNotices(); + List getNotices(MapDto map); // 자유/비밀 게시판 조회 - List getGeneralPosts(); + List getGeneralPosts(MapDto map); // 게시물 작성 void createBoard(MapDto map); @@ -57,5 +57,11 @@ public interface LocalBordMapper { // 첨부파일 가져오기 List selectAttachments(Long boardId); + + //댓글 좋아요/싫어요추가 + void reactToComment(MapDto map); + + //댓글id 확인 + MapDto getCommentById(int commentId); } diff --git a/src/main/java/io/company/localhost/service/LocalBordService.java b/src/main/java/io/company/localhost/service/LocalBordService.java index 2aca545..330555e 100644 --- a/src/main/java/io/company/localhost/service/LocalBordService.java +++ b/src/main/java/io/company/localhost/service/LocalBordService.java @@ -6,8 +6,12 @@ import java.util.Map; import org.springframework.stereotype.Service; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; + import io.company.localhost.common.dto.MapDto; import io.company.localhost.mapper.LocalBordMapper; +import io.company.localhost.utils.PageUtil; import lombok.RequiredArgsConstructor; @Service @@ -15,12 +19,15 @@ import lombok.RequiredArgsConstructor; public class LocalBordService { private final LocalBordMapper boardMapper; - public List getNotices() { - return boardMapper.getNotices(); + public List getNotices(MapDto map) { + return boardMapper.getNotices(map); } - public List getGeneralPosts() { - return boardMapper.getGeneralPosts(); + public PageInfo getGeneralPosts(MapDto map) { + int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; + int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 10; + PageHelper.startPage(page, size); + return PageUtil.redefineNavigation(new PageInfo<>(boardMapper.getGeneralPosts(map), size)); } public BigInteger createBoard(MapDto map) { @@ -61,6 +68,7 @@ public class LocalBordService { boardMapper.addCommentOrReply(map); } + public void updateComment(MapDto map) { boardMapper.updateComment(map); } @@ -81,6 +89,15 @@ public class LocalBordService { public boolean isSecretBoard(Long boardId) { return boardMapper.isSecretBoard(boardId); } + + public void reactToComment(MapDto map) { + boardMapper.reactToComment(map); + } + + public MapDto getCommentById(int commentId) { + return boardMapper.getCommentById(commentId); + } + } diff --git a/src/main/resources/mapper/LocalBordMapper.xml b/src/main/resources/mapper/LocalBordMapper.xml index 4d4a0c4..c471d50 100644 --- a/src/main/resources/mapper/LocalBordMapper.xml +++ b/src/main/resources/mapper/LocalBordMapper.xml @@ -3,29 +3,36 @@ - - - - + SELECT LOCBRDSEQ AS id, LOCBRDTTL AS title, LOCBRDCON AS content, LOCBRDRDT AS date FROM localbord - WHERE LOCBRDTYP IN ('F', 'S') - ORDER BY LOCBRDRDT DESC + WHERE LOCBRDTYP = 'N' + + AND LOCBRDTTL LIKE CONCAT('%', #{searchKeyword}, '%') + + ORDER BY LOCBRDRDT DESC + + + + + INSERT INTO localbord (LOCBRDTTL, LOCBRDCON, LOCBRDCAT, MEMBERSEQ, LOCBRDCNT, LOCBRDRDT, LOCBRDUDT, LOCBRDPWD, LOCBRDTYP) @@ -83,12 +90,14 @@ - + @@ -125,6 +134,20 @@ FROM localbord WHERE LOCBRDSEQ = #{LOCBRDSEQ} - - + + + + INSERT INTO localcomt (LOCCMTSEQ, MEMBERSEQ, LOCGORGOD, LOCGORBAD) + VALUES (#{LOCCMTSEQ}, #{MEMBERSEQ}, #{LOCGORGOD}, #{LOCGORBAD}) + ON DUPLICATE KEY UPDATE LOCGORGOD = #{LOCGORGOD}, LOCGORBAD = #{LOCGORBAD} + + + + + + From 02fc88e85ab2492bb9f1501cc2cf62687aa45e8e Mon Sep 17 00:00:00 2001 From: khj0414 Date: Thu, 16 Jan 2025 13:23:00 +0900 Subject: [PATCH 11/72] =?UTF-8?q?=ED=80=BC=20=EC=97=90=EB=94=94=ED=84=B0?= =?UTF-8?q?=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=93=B1=EB=A1=9D=20/?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/common/config/WebMvcConfig.java | 18 +++++ .../controller/api/worddictController.java | 8 +-- .../common/ImageUploadController.java | 69 +++++++++++++++++++ .../localhost/service/worddictyService.java | 4 -- src/main/resources/application.yml | 7 ++ 5 files changed, 95 insertions(+), 11 deletions(-) create mode 100644 src/main/java/io/company/localhost/controller/common/ImageUploadController.java diff --git a/src/main/java/io/company/localhost/common/config/WebMvcConfig.java b/src/main/java/io/company/localhost/common/config/WebMvcConfig.java index 90c28f2..28acccc 100644 --- a/src/main/java/io/company/localhost/common/config/WebMvcConfig.java +++ b/src/main/java/io/company/localhost/common/config/WebMvcConfig.java @@ -15,10 +15,14 @@ package io.company.localhost.common.config; import io.company.localhost.common.resolver.RequestToMapArgumentResolver; + +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.multipart.MultipartResolver; +import org.springframework.web.multipart.support.StandardServletMultipartResolver; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; @@ -35,6 +39,9 @@ public class WebMvcConfig implements WebMvcConfigurer { public static final String WILD_CARD = "/**"; + @Value("${filePath.boardfile}") + private String boardFilePath; + @Override public void addInterceptors(InterceptorRegistry registry) { // 여기서 인터셉터를 추가할 수 있음 @@ -47,6 +54,10 @@ public class WebMvcConfig implements WebMvcConfigurer { registry .addResourceHandler("/index.html") .addResourceLocations("classpath:/static/index.html", "/index.html"); + + //게시판 에디터 안 이미지 업로드 경로 + registry.addResourceHandler("/upload/img/board/**") + .addResourceLocations("file:" + boardFilePath); } // Controller의 파라미터를 처리할 Resolver 등록 @@ -82,4 +93,11 @@ public class WebMvcConfig implements WebMvcConfigurer { return localeResolver; } + + @Bean + public MultipartResolver multipartResolver() { + return new StandardServletMultipartResolver(); + } + + } diff --git a/src/main/java/io/company/localhost/controller/api/worddictController.java b/src/main/java/io/company/localhost/controller/api/worddictController.java index 9918bde..13071ea 100644 --- a/src/main/java/io/company/localhost/controller/api/worddictController.java +++ b/src/main/java/io/company/localhost/controller/api/worddictController.java @@ -14,9 +14,7 @@ *************************************************************/ package io.company.localhost.controller.api; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; @@ -25,8 +23,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.github.pagehelper.PageInfo; - import io.company.localhost.common.annotation.Member; import io.company.localhost.common.annotation.ParameterCheck; import io.company.localhost.common.annotation.ReqMap; @@ -108,13 +104,11 @@ public class worddictController { * @return */ @Member - @ParameterCheck @PostMapping("insertWord") public ApiResponse insertWord(@AuthenticationPrincipal MemberVo memberVo,@ReqMap MapDto map) { //userId - Long userId = AuthUtil.getUser().getId(); - String content = map.getString("content"); // content 추출 + //Long userId = AuthUtil.getUser().getId(); //map.put("userId", userId); /////////로그인 미개발 ->임시 map.put("userId", 1); diff --git a/src/main/java/io/company/localhost/controller/common/ImageUploadController.java b/src/main/java/io/company/localhost/controller/common/ImageUploadController.java new file mode 100644 index 0000000..abc7789 --- /dev/null +++ b/src/main/java/io/company/localhost/controller/common/ImageUploadController.java @@ -0,0 +1,69 @@ +/************************************************************ + * + * @packageName : io.company.localhost.controller.common + * @fileName : ImageUploadController.java + * @author : 공현지 + * @date : 25.01.16 + * @description : + * + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 25.01.16 공현지 최초 생성 + * + *************************************************************/ +package io.company.localhost.controller.common; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpStatus; +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.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.company.localhost.common.annotation.ParameterCheck; +import io.company.localhost.common.dto.ApiResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequestMapping("/api/img") +@RequiredArgsConstructor +public class ImageUploadController { + + @Value("${filePath.boardfile}") + private String boardFilePath; + + @ParameterCheck + @PostMapping("/upload") + public ApiResponse uploadImage(@RequestParam("file") MultipartFile file) throws IOException { + + if (file.isEmpty()) { + return ApiResponse.error(HttpStatus.BAD_REQUEST, "File is empty"); + } + String originalFileName = file.getOriginalFilename(); + String fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".")); + String fileName = UUID.randomUUID().toString() + fileExtension; + Path filePath = Paths.get(boardFilePath, fileName); + + Files.createDirectories(filePath.getParent()); + Files.write(filePath, file.getBytes()); + + String fileUrl = "upload/img/board/" + fileName; + + return ApiResponse.ok(fileUrl); + } + +} diff --git a/src/main/java/io/company/localhost/service/worddictyService.java b/src/main/java/io/company/localhost/service/worddictyService.java index ffe3ea8..e0b533b 100644 --- a/src/main/java/io/company/localhost/service/worddictyService.java +++ b/src/main/java/io/company/localhost/service/worddictyService.java @@ -19,12 +19,8 @@ import java.util.List; import org.springframework.stereotype.Service; -import com.github.pagehelper.PageHelper; -import com.github.pagehelper.PageInfo; - import io.company.localhost.common.dto.MapDto; import io.company.localhost.mapper.worddictyMapper; -import io.company.localhost.utils.PageUtil; import lombok.RequiredArgsConstructor; @Service diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e5a0087..e5a5e81 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -77,6 +77,9 @@ server: http-only: true secure: true same-site: NONE + multipart: + max-file-size: 10MB + max-request-size: 10MB logging: level: @@ -89,3 +92,7 @@ logging: connection: off io.company: DEBUG io.company.localhost.mapper: off + + +filePath: + boardfile: C:\localhost-back\upload\img\board\ \ No newline at end of file From d99799f140567b63f55e751d67dc9ec3cacf4513 Mon Sep 17 00:00:00 2001 From: khj0414 Date: Thu, 16 Jan 2025 15:18:25 +0900 Subject: [PATCH 12/72] =?UTF-8?q?=EC=BF=BC=EB=A6=AC=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/worddictController.java | 1 + .../localhost/mapper/worddictyMapper.java | 3 +- .../localhost/service/worddictyService.java | 30 +++++++++++- src/main/resources/mapper/worddictyMapper.xml | 47 +++++++++++++++---- 4 files changed, 68 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/worddictController.java b/src/main/java/io/company/localhost/controller/api/worddictController.java index 13071ea..8e390ec 100644 --- a/src/main/java/io/company/localhost/controller/api/worddictController.java +++ b/src/main/java/io/company/localhost/controller/api/worddictController.java @@ -54,6 +54,7 @@ public class worddictController { @GetMapping("getWordList") public ApiResponse getWordList(@ReqMap MapDto map) { int total = worddictyservice.getTotal(map); + List wordList = worddictyservice.getWordList(map); MapDto OutData = new MapDto(); diff --git a/src/main/java/io/company/localhost/mapper/worddictyMapper.java b/src/main/java/io/company/localhost/mapper/worddictyMapper.java index 369be30..bf48d4c 100644 --- a/src/main/java/io/company/localhost/mapper/worddictyMapper.java +++ b/src/main/java/io/company/localhost/mapper/worddictyMapper.java @@ -15,6 +15,7 @@ package io.company.localhost.mapper; import java.util.List; +import java.util.Map; import org.apache.ibatis.annotations.Mapper; @@ -23,7 +24,7 @@ import io.company.localhost.common.dto.MapDto; @Mapper public interface worddictyMapper { - List getWordList(MapDto map); + List getWordList(Map map); Long insertWord(MapDto map); diff --git a/src/main/java/io/company/localhost/service/worddictyService.java b/src/main/java/io/company/localhost/service/worddictyService.java index e0b533b..fd81034 100644 --- a/src/main/java/io/company/localhost/service/worddictyService.java +++ b/src/main/java/io/company/localhost/service/worddictyService.java @@ -15,7 +15,10 @@ package io.company.localhost.service; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.springframework.stereotype.Service; @@ -29,11 +32,34 @@ public class worddictyService { private final worddictyMapper worddictymapper; - public List getWordList(MapDto map) { + public List> getWordList(Map map) { + List wordList = worddictymapper.getWordList(map); + List> processedList = new ArrayList<>(); - return (worddictymapper.getWordList(map)); + //데이터 가공 + for (Map dto : wordList) { + Map author = new HashMap<>(); + author.put("profileImage", dto.remove("REGPRF")); + author.put("name", dto.remove("REGNAME")); + author.put("color", dto.remove("REGCOLOR")); + author.put("createdAt", dto.remove("REGRDT")); + + Map lastEditor = new HashMap<>(); + lastEditor.put("profileImage", dto.remove("UPDPRF")); + lastEditor.put("name", dto.remove("UPDNAME")); + lastEditor.put("color", dto.remove("UPDCOLOR")); + lastEditor.put("updatedAt", dto.remove("UPDUDT")); + + dto.put("author", author); + dto.put("lastEditor", lastEditor); + + processedList.add(dto); + } + return processedList; } + + public Long insertWord(MapDto map) { return worddictymapper.insertWord(map); } diff --git a/src/main/resources/mapper/worddictyMapper.xml b/src/main/resources/mapper/worddictyMapper.xml index 6de1b79..0bea471 100644 --- a/src/main/resources/mapper/worddictyMapper.xml +++ b/src/main/resources/mapper/worddictyMapper.xml @@ -141,16 +141,43 @@ From 83c60f98eb91fdaf50c5280904982602a1d134a8 Mon Sep 17 00:00:00 2001 From: khj0414 Date: Thu, 16 Jan 2025 15:18:38 +0900 Subject: [PATCH 13/72] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/controller/common/ImageUploadController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/io/company/localhost/controller/common/ImageUploadController.java b/src/main/java/io/company/localhost/controller/common/ImageUploadController.java index abc7789..2fa8a72 100644 --- a/src/main/java/io/company/localhost/controller/common/ImageUploadController.java +++ b/src/main/java/io/company/localhost/controller/common/ImageUploadController.java @@ -46,6 +46,11 @@ public class ImageUploadController { @Value("${filePath.boardfile}") private String boardFilePath; + /** + * 에디터 내 이미지 업로드 + * @form-data file 업로드할 파일실제경로/파일이름 + * @return + */ @ParameterCheck @PostMapping("/upload") public ApiResponse uploadImage(@RequestParam("file") MultipartFile file) throws IOException { From 712561ffbcb989e5c98de90356d7778b927db7be Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Thu, 16 Jan 2025 15:34:55 +0900 Subject: [PATCH 14/72] =?UTF-8?q?=EB=8B=AC=EB=A0=A5=20=EC=9D=B8=EC=84=9C?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 4 +- .../controller/api/VacationController.java | 48 +++++++++++++++++++ ...alBordMapper.java => localbordMapper.java} | 2 +- .../localhost/mapper/localvacaMapper.java | 14 ++++++ ...BordService.java => localbordService.java} | 6 +-- .../localhost/service/localvacaService.java | 21 ++++++++ ...ocalBordMapper.xml => localbordMapper.xml} | 2 +- src/main/resources/mapper/localvacaMapper.xml | 11 +++++ 8 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 src/main/java/io/company/localhost/controller/api/VacationController.java rename src/main/java/io/company/localhost/mapper/{LocalBordMapper.java => localbordMapper.java} (97%) create mode 100644 src/main/java/io/company/localhost/mapper/localvacaMapper.java rename src/main/java/io/company/localhost/service/{LocalBordService.java => localbordService.java} (95%) create mode 100644 src/main/java/io/company/localhost/service/localvacaService.java rename src/main/resources/mapper/{LocalBordMapper.xml => localbordMapper.xml} (98%) create mode 100644 src/main/resources/mapper/localvacaMapper.xml diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 32dfcfa..387bb23 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -42,7 +42,7 @@ import com.github.pagehelper.PageSerializable; import io.company.localhost.common.annotation.ReqMap; import io.company.localhost.common.dto.ApiResponse; import io.company.localhost.common.dto.MapDto; -import io.company.localhost.service.LocalBordService; +import io.company.localhost.service.localbordService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -51,7 +51,7 @@ import lombok.extern.slf4j.Slf4j; @RequiredArgsConstructor @Slf4j public class BoardController { - private final LocalBordService boardService; + private final localbordService boardService; /** * 공지사항 목록 조회 diff --git a/src/main/java/io/company/localhost/controller/api/VacationController.java b/src/main/java/io/company/localhost/controller/api/VacationController.java new file mode 100644 index 0000000..4ae99f3 --- /dev/null +++ b/src/main/java/io/company/localhost/controller/api/VacationController.java @@ -0,0 +1,48 @@ +package io.company.localhost.controller.api; +import java.util.List; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import io.company.localhost.common.annotation.ReqMap; +import io.company.localhost.common.dto.ApiResponse; +import io.company.localhost.common.dto.MapDto; +import io.company.localhost.service.localvacaService; // 서비스 클래스 경로 수정 +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/api/vacation") +public class VacationController { + + private final localvacaService localVacaService; + + @PostMapping + public ApiResponse saveVacations(@RequestBody List vacationRequests) { + // 요청 데이터 유효성 검사 + if (vacationRequests == null || vacationRequests.isEmpty()) { + throw new IllegalArgumentException("휴가 요청 데이터가 비어 있습니다."); + } + + for (MapDto request : vacationRequests) { + // 각 요청 데이터의 필수 값 검증 + Integer employeeId = (Integer) request.get("employeeId"); + String date = request.getString("date"); + String type = request.getString("type"); + + if (employeeId == null || date == null || type == null) { + throw new IllegalArgumentException("요청 데이터에 누락된 값이 있습니다: " + request); + } + + // 데이터 저장 + localVacaService.insertVacation(request); + } + + // 성공적으로 저장된 경우 응답 반환 + return ApiResponse.ok("모든 휴가가 성공적으로 저장되었습니다."); + } +} diff --git a/src/main/java/io/company/localhost/mapper/LocalBordMapper.java b/src/main/java/io/company/localhost/mapper/localbordMapper.java similarity index 97% rename from src/main/java/io/company/localhost/mapper/LocalBordMapper.java rename to src/main/java/io/company/localhost/mapper/localbordMapper.java index 347ec07..eae03d2 100644 --- a/src/main/java/io/company/localhost/mapper/LocalBordMapper.java +++ b/src/main/java/io/company/localhost/mapper/localbordMapper.java @@ -9,7 +9,7 @@ import org.apache.ibatis.annotations.Param; import io.company.localhost.common.dto.MapDto; @Mapper -public interface LocalBordMapper { +public interface localbordMapper { // 공지사항 조회 List getNotices(MapDto map); diff --git a/src/main/java/io/company/localhost/mapper/localvacaMapper.java b/src/main/java/io/company/localhost/mapper/localvacaMapper.java new file mode 100644 index 0000000..f639c4b --- /dev/null +++ b/src/main/java/io/company/localhost/mapper/localvacaMapper.java @@ -0,0 +1,14 @@ +package io.company.localhost.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import io.company.localhost.common.dto.MapDto; + + +@Mapper +public interface localvacaMapper { + void insertVacation(MapDto vacationRequest); +} + + + diff --git a/src/main/java/io/company/localhost/service/LocalBordService.java b/src/main/java/io/company/localhost/service/localbordService.java similarity index 95% rename from src/main/java/io/company/localhost/service/LocalBordService.java rename to src/main/java/io/company/localhost/service/localbordService.java index 330555e..b584c0d 100644 --- a/src/main/java/io/company/localhost/service/LocalBordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -10,14 +10,14 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import io.company.localhost.common.dto.MapDto; -import io.company.localhost.mapper.LocalBordMapper; +import io.company.localhost.mapper.localbordMapper; import io.company.localhost.utils.PageUtil; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor -public class LocalBordService { - private final LocalBordMapper boardMapper; +public class localbordService { + private final localbordMapper boardMapper; public List getNotices(MapDto map) { return boardMapper.getNotices(map); diff --git a/src/main/java/io/company/localhost/service/localvacaService.java b/src/main/java/io/company/localhost/service/localvacaService.java new file mode 100644 index 0000000..0a65289 --- /dev/null +++ b/src/main/java/io/company/localhost/service/localvacaService.java @@ -0,0 +1,21 @@ +package io.company.localhost.service; + +import java.util.List; + +import org.springframework.stereotype.Service; + +import io.company.localhost.common.dto.MapDto; +import io.company.localhost.mapper.localvacaMapper; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class localvacaService { + private final localvacaMapper localvacaMapper; + + + public void insertVacation(MapDto vacationRequest) { + localvacaMapper.insertVacation(vacationRequest); + } + +} diff --git a/src/main/resources/mapper/LocalBordMapper.xml b/src/main/resources/mapper/localbordMapper.xml similarity index 98% rename from src/main/resources/mapper/LocalBordMapper.xml rename to src/main/resources/mapper/localbordMapper.xml index c471d50..3a50be3 100644 --- a/src/main/resources/mapper/LocalBordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -1,6 +1,6 @@ - + @@ -29,7 +29,7 @@ AND LOCBRDTTL LIKE CONCAT('%', #{searchKeyword}, '%') - ORDER BY LOCBRDRDT DESC + ORDER BY LOCBRDUDT DESC @@ -47,7 +47,7 @@ CMNFLEEXT,CMNFLESIZ,CMNFLEREG,CMNFLERDT ) VALUES ( #{CMNBRDSEQ},#{CMNFLENAM},#{CMNFLEORG},#{CMNFLEPAT}, - #{CMNFLEEXT},#{CMNFLESIZ},#{CMNFLEREG},#{CMNFLERDT} + #{CMNFLEEXT},#{CMNFLESIZ},#{CMNFLEREG},NOW() ) @@ -96,26 +96,26 @@ LOCCMTUDT,LOCCMTPWD,LOCCMTRDT,LOCCMTPNT FROM localcomt WHERE LOCBRDSEQ = #{boardId} - ORDER BY LOCCMTPNT ASC, LOCCMTRDT ASC + ORDER BY LOCCMTPNT ASC, LOCCMTUDT ASC - INSERT INTO localcomt (LOCBRDSEQ, LOCCMTRPY, LOCCMTPWD, LOCCMTRDT, LOCCMTPNT) - VALUES (#{LOCBRDSEQ}, #{LOCCMTRPY}, #{LOCCMTPWD}, NOW(), #{LOCCMTPNT}) + INSERT INTO localcomt (LOCBRDSEQ, LOCCMTRPY, LOCCMTPWD, LOCCMTRDT, LOCCMTUDT, LOCCMTPNT, MEMBERSEQ) + VALUES (#{LOCBRDSEQ}, #{LOCCMTRPY}, #{LOCCMTPWD}, NOW(), NOW() , #{LOCCMTPNT}, #{MEMBERSEQ}) UPDATE localcomt SET LOCCMTRPY = #{LOCCMTRPY}, LOCCMTUDT = NOW() - WHERE LOCCMTSEQ = #{LOCCMTSEQ} AND LOCCMTPWD = #{LOCCMTPWD} + WHERE LOCCMTSEQ = #{LOCCMTSEQ} DELETE FROM localcomt - WHERE LOCCMTSEQ = #{LOCCMTSEQ} AND LOCCMTPWD = #{LOCCMTPWD} + WHERE LOCCMTSEQ = #{LOCCMTSEQ} @@ -132,15 +132,8 @@ - - - - INSERT INTO localcomt (LOCCMTSEQ, MEMBERSEQ, LOCGORGOD, LOCGORBAD) - VALUES (#{LOCCMTSEQ}, #{MEMBERSEQ}, #{LOCGORGOD}, #{LOCGORBAD}) - ON DUPLICATE KEY UPDATE LOCGORGOD = #{LOCGORGOD}, LOCGORBAD = #{LOCGORBAD} - + SELECT + MEMBERSEQ + LOCVACUDT, + LOCVACTYP + FROM + localvaca + \ No newline at end of file From a3ebdc3c6597a24ab1d3565ade36795750e73507 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 17 Jan 2025 13:12:14 +0900 Subject: [PATCH 16/72] =?UTF-8?q?=E3=84=B4=E3=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 9cb7c40..a707f0a 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -298,17 +298,27 @@ public class BoardController { return ApiResponse.ok(boardService.checkCommentPassword(map)); } -// /** -// * 게시물 비밀번호 확인 -// * @param boardId 게시물 ID -// * @ReqMap map 비밀번호 데이터 -// * @return 비밀번호 확인 결과 -// */ -// @PostMapping("/{boardId}/password") -// public ApiResponse checkBoardPassword(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { -// map.put("LOCBRDSEQ", boardId); -// return ApiResponse.ok(boardService.checkBoardPassword(map)); -// } + /** + * 게시물 비밀번호 확인 + * @param boardId 게시물 ID + * @ReqMap map 비밀번호 데이터 + * @return 비밀번호 확인 결과 + */ + @PostMapping("/{boardId}/password") + public ApiResponse checkBoardPassword(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { + map.put("LOCBRDSEQ", boardId); + return ApiResponse.ok(boardService.checkBoardPassword(map)); + } +// /** +// * 비밀게시판 여부 확인 +// * @param boardId 게시물 ID +// * @return 비밀게시판 여부 +// */ +// @GetMapping("/{boardId}/isSecret") +// public ApiResponse isSecretBoard(@PathVariable("boardId") Long boardId) { +// log.info("Checking if board ID {} is secret", boardId); +// return ApiResponse.ok(boardService.isSecretBoard(boardId)); +// } } From cd81956d7c518c7668bd2f060d80aac255aea5a4 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 17 Jan 2025 13:29:19 +0900 Subject: [PATCH 17/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=95=94?= =?UTF-8?q?=ED=98=B8=ED=99=94=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 47 ++++++++++++++----- .../localhost/mapper/localbordMapper.java | 10 ++-- .../localhost/service/localbordService.java | 21 ++++----- src/main/resources/mapper/localbordMapper.xml | 16 ++++--- 4 files changed, 58 insertions(+), 36 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index a707f0a..3bfd031 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import org.springframework.http.ResponseEntity; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -53,6 +54,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class BoardController { private final localbordService boardService; + private final PasswordEncoder passwordEncoder; /** * 공지사항 목록 조회 @@ -128,11 +130,18 @@ public class BoardController { */ @PostMapping public ApiResponse createBoard(@ReqMap MapDto map) { - BigInteger createdIdx = boardService.createBoard(map); // 작성된 게시물의 idx를 반환 - Map responseData = new HashMap<>(); - responseData.put("CMNBRDSEQ", createdIdx); - responseData.put("message", "게시물이 작성되었습니다."); - return ApiResponse.ok(responseData); + // 비밀번호 암호화 (익명 게시판 등 비밀번호가 필요한 경우) + if (map.containsKey("LOCBRDPWD")) { + String rawPassword = map.getString("LOCBRDPWD"); + String encodedPassword = passwordEncoder.encode(rawPassword); + map.put("LOCBRDPWD", encodedPassword); + } + + BigInteger createdIdx = boardService.createBoard(map); // 작성된 게시물의 idx를 반환 + Map responseData = new HashMap<>(); + responseData.put("CMNBRDSEQ", createdIdx); + responseData.put("message", "게시물이 작성되었습니다."); + return ApiResponse.ok(responseData); } /** @@ -246,8 +255,12 @@ public class BoardController { */ @PostMapping("/{LOCBRDSEQ}/comment") public ApiResponse addCommentOrReply(@ReqMap MapDto map) { - // 부모 댓글 확인 - + // 비밀번호 암호화 (비밀번호가 있는 경우에만) + if (map.containsKey("LOCCMTPWD")) { + String rawPassword = map.getString("LOCCMTPWD"); + String encodedPassword = passwordEncoder.encode(rawPassword); + map.put("LOCCMTPWD", encodedPassword); + } boardService.addCommentOrReply(map); return ApiResponse.ok("댓글 또는 대댓글이 작성되었습니다."); @@ -294,10 +307,15 @@ public class BoardController { */ @PostMapping("/comment/{commentId}/password") public ApiResponse checkCommentPassword(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { - map.put("LOCCMTSEQ", commentId); - return ApiResponse.ok(boardService.checkCommentPassword(map)); + // DB에서 암호화된 비밀번호 조회 + String storedPassword = boardService.getCommentPassword(commentId); + String rawPassword = map.getString("LOCCMTPWD"); + + // 비밀번호 검증 + boolean isMatch = passwordEncoder.matches(rawPassword, storedPassword); + return ApiResponse.ok(isMatch); } - + /** * 게시물 비밀번호 확인 * @param boardId 게시물 ID @@ -306,8 +324,13 @@ public class BoardController { */ @PostMapping("/{boardId}/password") public ApiResponse checkBoardPassword(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { - map.put("LOCBRDSEQ", boardId); - return ApiResponse.ok(boardService.checkBoardPassword(map)); + // DB에서 암호화된 비밀번호 조회 + String storedPassword = boardService.getBoardPassword(boardId); + String rawPassword = map.getString("LOCBRDPWD"); + + // 비밀번호 검증 + boolean isMatch = passwordEncoder.matches(rawPassword, storedPassword); + return ApiResponse.ok(isMatch); } // /** diff --git a/src/main/java/io/company/localhost/mapper/localbordMapper.java b/src/main/java/io/company/localhost/mapper/localbordMapper.java index eae03d2..0bf37d3 100644 --- a/src/main/java/io/company/localhost/mapper/localbordMapper.java +++ b/src/main/java/io/company/localhost/mapper/localbordMapper.java @@ -42,12 +42,12 @@ public interface localbordMapper { // 댓글/대댓글 삭제 void deleteComment(MapDto map); + + // 게시물 비밀번호 조회 + String selectCommentPassword(int commentId); - // 게시물 비밀번호 확인 - boolean checkBoardPassword(MapDto map); - - // 댓글 비밀번호 확인 - boolean checkCommentPassword(MapDto map); + // 댓글 비밀번호 조회 + String selectBoardPassword(int boardId); // 비밀 게시판 여부 확인 boolean isSecretBoard(Long boardId); diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index b584c0d..c8225cd 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -77,21 +77,16 @@ public class localbordService { boardMapper.deleteComment(map); } - public boolean checkBoardPassword(MapDto map) { - return boardMapper.checkBoardPassword(map); - } - - public boolean checkCommentPassword(MapDto map) { - return boardMapper.checkCommentPassword(map); - } - - - public boolean isSecretBoard(Long boardId) { - return boardMapper.isSecretBoard(boardId); + public String getCommentPassword(int commentId) { + return boardMapper.selectCommentPassword(commentId); } - public void reactToComment(MapDto map) { - boardMapper.reactToComment(map); + public String getBoardPassword(int boardId) { + return boardMapper.selectBoardPassword(boardId); + } + + public boolean isSecretBoard(Long boardId) { + return boardMapper.isSecretBoard(boardId); } public MapDto getCommentById(int commentId) { diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index bb20a33..eb2ac08 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -118,14 +118,18 @@ WHERE LOCCMTSEQ = #{LOCCMTSEQ} - - + SELECT LOCCMTPWD + FROM localcomt + WHERE LOCCMTSEQ = #{commentId} - - + SELECT LOCBRDPWD + FROM localbord + WHERE LOCBRDSEQ = #{boardId} From 77730be07f5dff7c6c2258a2923de13229c06754 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 17 Jan 2025 15:25:42 +0900 Subject: [PATCH 18/72] =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=B2=A8?= =?UTF-8?q?=EB=B6=80=ED=8C=8C=EC=9D=BC=EC=9C=A0=EB=AC=B4,=EB=8C=93?= =?UTF-8?q?=EA=B8=80=EA=B0=AF=EC=88=98,=EC=A2=8B=EC=95=84=EC=9A=94/?= =?UTF-8?q?=EC=8B=AB=EC=96=B4=EC=9A=94=20=EA=B0=AF=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 37 ++++++++++++++++++- .../localhost/mapper/localbordMapper.java | 17 +++++++-- .../localhost/service/localbordService.java | 18 +++++++++ src/main/resources/mapper/localbordMapper.xml | 35 ++++++++++++++++++ 4 files changed, 103 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 3bfd031..b67a73a 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -72,6 +72,12 @@ public class BoardController { Blob blob = (Blob) content; post.put("content", safeBlobToString(blob)); } + + // "id" 값을 Number로 받고 longValue()로 변환 + Object idObject = post.get("id"); + long postId = ((Number) idObject).longValue(); + post.put("hasAttachment", boardService.hasAttachments(postId)); + } return ApiResponse.ok(posts); @@ -93,6 +99,19 @@ public class BoardController { Blob blob = (Blob) content; post.put("content", safeBlobToString(blob)); } + + // "id" 값을 Number로 받고 longValue()로 변환 + Object idObject = post.get("id"); + if (idObject instanceof Number) { + long postId = ((Number) idObject).longValue(); + post.put("commentCount", boardService.getCommentCount(postId)); + post.put("hasAttachment", boardService.hasAttachments(postId)); + MapDto reactions = boardService.getBoardReactions(postId); + post.put("likeCount", reactions.getOrDefault("likeCount", 0)); + post.put("dislikeCount", reactions.getOrDefault("dislikeCount", 0)); + } else { + post.put("commentCount", 0); // id가 없거나 잘못된 경우 기본값 설정 + } } return ApiResponse.ok(posts); @@ -182,16 +201,32 @@ public class BoardController { throw new RuntimeException("Failed to process Blob content", e); } } + + MapDto reactions = boardService.getBoardReactions(boardId); + boardDetail.put("likeCount", reactions.getOrDefault("likeCount", 0)); + boardDetail.put("dislikeCount", reactions.getOrDefault("dislikeCount", 0)); - // 첨부파일 및 댓글 조회 List attachments = boardService.getAttachments(boardId); List comments = boardService.getComments(boardId.intValue()); + List commentReactions = boardService.getCommentReactions(boardId); + for (MapDto comment : comments) { + Integer commentId = (Integer) comment.get("LOCCMTSEQ"); + for (MapDto reaction : commentReactions) { + if (reaction.get("LOCCMTSEQ").equals(commentId)) { + comment.put("likeCount", reaction.getOrDefault("likeCount", 0)); + comment.put("dislikeCount", reaction.getOrDefault("dislikeCount", 0)); + } + } + } + // 결과 조합 MapDto result = new MapDto(); result.put("boardDetail", boardDetail); result.put("attachments", attachments); result.put("comments", comments); + result.put("commentCount", boardService.getCommentCount(boardId)); + result.put("hasAttachment", boardService.hasAttachments(boardId)); return ApiResponse.ok(result); } diff --git a/src/main/java/io/company/localhost/mapper/localbordMapper.java b/src/main/java/io/company/localhost/mapper/localbordMapper.java index 0bf37d3..cc40a1f 100644 --- a/src/main/java/io/company/localhost/mapper/localbordMapper.java +++ b/src/main/java/io/company/localhost/mapper/localbordMapper.java @@ -55,13 +55,24 @@ public interface localbordMapper { // 게시물 상세보기 MapDto selectBoardDetail(Long boardId); + // 댓글 갯수 + int countComments(Long boardId); + + // 첨부파일 유무 + int countAttachments(Long boardId); + + // 게시물 좋아요/싫어요 개수 + MapDto getBoardReactions(Long boardId); + + // 댓글 좋아요/싫어요 개수 + List getCommentReactions(Long boardId); + // 첨부파일 가져오기 List selectAttachments(Long boardId); - //댓글 좋아요/싫어요추가 - void reactToComment(MapDto map); - //댓글id 확인 MapDto getCommentById(int commentId); + + } diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index c8225cd..11de3a1 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -92,6 +92,24 @@ public class localbordService { public MapDto getCommentById(int commentId) { return boardMapper.getCommentById(commentId); } + + public int getCommentCount(Long boardId) { + return boardMapper.countComments(boardId); + } + + public boolean hasAttachments(Long boardId) { + int count = boardMapper.countAttachments(boardId); + return count > 0; // 첨부파일 개수가 0보다 크면 true 반환 + } + + public MapDto getBoardReactions(Long boardId) { + return boardMapper.getBoardReactions(boardId); + } + + public List getCommentReactions(Long boardId) { + return boardMapper.getCommentReactions(boardId); + } + } diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index eb2ac08..8abc715 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -146,5 +146,40 @@ WHERE LOCCMTSEQ = #{commentId} + + + + + + + + + + + + From 6a110d799ecfc0a931beb7ad8621bcc0ce66d3cd Mon Sep 17 00:00:00 2001 From: khj0414 Date: Fri, 17 Jan 2025 15:52:03 +0900 Subject: [PATCH 19/72] =?UTF-8?q?=ED=80=BC=20=EA=B2=BD=EB=A1=9C=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/ImageUploadController.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/common/ImageUploadController.java b/src/main/java/io/company/localhost/controller/common/ImageUploadController.java index 2fa8a72..f722dce 100644 --- a/src/main/java/io/company/localhost/controller/common/ImageUploadController.java +++ b/src/main/java/io/company/localhost/controller/common/ImageUploadController.java @@ -21,11 +21,7 @@ import java.nio.file.Paths; import java.util.UUID; import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; -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; @@ -39,7 +35,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @RestController -@RequestMapping("/api/img") +@RequestMapping("/api/quilleditor") @RequiredArgsConstructor public class ImageUploadController { @@ -47,9 +43,9 @@ public class ImageUploadController { private String boardFilePath; /** - * 에디터 내 이미지 업로드 - * @form-data file 업로드할 파일실제경로/파일이름 - * @return + * quilleditor 안에서 삽입된 이미지를 서버에 저장하는 메소드 + * @form-data 서버에 저장된 이미지 경로와 이름 + * @return */ @ParameterCheck @PostMapping("/upload") From aaa172c50ddeff9dcf66e90f6c18d6757e898a00 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 20 Jan 2025 11:05:41 +0900 Subject: [PATCH 20/72] =?UTF-8?q?=EC=A2=8B=EC=95=84=EC=9A=A7/=EC=8B=AB?= =?UTF-8?q?=EC=96=B4=EC=9A=94,=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C,=EB=8C=93=EA=B8=80=EC=82=AD=EC=A0=9C=EC=99=80=20?= =?UTF-8?q?=EB=8C=80=EB=8C=93=EA=B8=80=20=EC=82=AD=EC=A0=9C=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 3 +- .../localhost/mapper/localbordMapper.java | 27 ++++++- .../localhost/service/localbordService.java | 34 +++++++- src/main/resources/mapper/localbordMapper.xml | 79 ++++++++++++++++--- 4 files changed, 127 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index b67a73a..0384760 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -265,8 +265,9 @@ public class BoardController { @PostMapping("/{LOCBRDSEQ}/{LOCCMTSEQ}/reaction") public ApiResponse reactToBoard(@ReqMap MapDto map) { boardService.reactToBoard(map); - return ApiResponse.ok("반응이 추가되었습니다."); + return ApiResponse.ok("반응이 성공적으로 처리되었습니다."); } + /** * 댓글/대댓글 조회 diff --git a/src/main/java/io/company/localhost/mapper/localbordMapper.java b/src/main/java/io/company/localhost/mapper/localbordMapper.java index cc40a1f..e9291ab 100644 --- a/src/main/java/io/company/localhost/mapper/localbordMapper.java +++ b/src/main/java/io/company/localhost/mapper/localbordMapper.java @@ -24,12 +24,21 @@ public interface localbordMapper { // 게시물 삭제 void deleteBoard(MapDto map); + + // 게시물 삭제시 댓글/대댓글 삭제 + void deleteCommentsByBoardId(MapDto map); // 게시물 수정 void updateBoard(MapDto map); + + // 기존 반응 조회 + MapDto findReaction(MapDto map); - // 게시물 좋아요/싫어요 추가 - void reactToBoard(MapDto map); + // 새 반응 삽입 + void insertReaction(MapDto map); + + // 기존 반응 업데이트 + void updateReaction(MapDto map); // 댓글 조회 List getComments(int boardSeq); @@ -40,8 +49,20 @@ public interface localbordMapper { // 댓글/대댓글 수정 void updateComment(MapDto map); - // 댓글/대댓글 삭제 + // 대댓글인지 확인 + boolean isReply(MapDto map); + + // 댓글에 대댓글이 있는지 확인 + boolean hasReplies(MapDto map); + + // 댓글 내용만 삭제 처리 (대댓글 유지) + void softDeleteComment(MapDto map); + + // 댓글 삭제 (대댓글 없음) void deleteComment(MapDto map); + + // 대댓글 삭제 + void deleteReply(MapDto map); // 게시물 비밀번호 조회 String selectCommentPassword(int commentId); diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 11de3a1..97b738e 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -49,6 +49,7 @@ public class localbordService { public void deleteBoard(MapDto map) { + boardMapper.deleteCommentsByBoardId(map); boardMapper.deleteBoard(map); } @@ -57,7 +58,16 @@ public class localbordService { } public void reactToBoard(MapDto map) { - boardMapper.reactToBoard(map); + // 기존 반응 확인 + MapDto existingReaction = boardMapper.findReaction(map); + + if (existingReaction != null) { + // 기존 반응이 있는 경우 업데이트 + boardMapper.updateReaction(map); + } else { + // 기존 반응이 없는 경우 새로 삽입 + boardMapper.insertReaction(map); + } } public List getComments(int boardSeq) { @@ -65,6 +75,9 @@ public class localbordService { } public void addCommentOrReply(MapDto map) { + if (map.get("LOCCMTPNT") == null) { + map.put("LOCCMTPNT", null); // 부모 ID가 없는 경우 null 처리 + } boardMapper.addCommentOrReply(map); } @@ -74,7 +87,24 @@ public class localbordService { } public void deleteComment(MapDto map) { - boardMapper.deleteComment(map); + // 댓글인지 대댓글인지 확인 + boolean isReply = boardMapper.isReply(map); + + if (isReply) { + // 대댓글 삭제 + boardMapper.deleteReply(map); + } else { + // 댓글인 경우 + boolean hasReplies = boardMapper.hasReplies(map); + + if (hasReplies) { + // 대댓글이 있는 경우 내용 업데이트 + boardMapper.softDeleteComment(map); + } else { + // 대댓글이 없는 경우 댓글 삭제 + boardMapper.deleteComment(map); + } + } } public String getCommentPassword(int commentId) { diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index 8abc715..9483650 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -74,6 +74,12 @@ DELETE FROM localbord WHERE LOCBRDSEQ = #{LOCBRDSEQ} + + + + DELETE FROM localcomt + WHERE LOCBRDSEQ = #{LOCBRDSEQ} + @@ -81,13 +87,35 @@ SET LOCBRDTTL = #{LOCBRDTTL}, LOCBRDCON = #{LOCBRDCON}, LOCBRDUDT = NOW() WHERE LOCBRDSEQ = #{LOCBRDSEQ} + + + - - - INSERT INTO localgorb (LOCBRDSEQ, LOCCMTSEQ, MEMBERSEQ, LOCGOBGOD, LOCGOBBAD ) + + + + + UPDATE localgorb + SET LOCGOBGOD = #{LOCGOBGOD}, LOCGOBBAD = #{LOCGOBBAD} + WHERE (LOCBRDSEQ = #{LOCBRDSEQ} OR (#{LOCBRDSEQ} IS NULL AND LOCBRDSEQ IS NULL)) + AND (LOCCMTSEQ = #{LOCCMTSEQ} OR (#{LOCCMTSEQ} IS NULL AND LOCCMTSEQ IS NULL)) + AND MEMBERSEQ = #{MEMBERSEQ} + + + + + + + INSERT INTO localgorb (LOCBRDSEQ, LOCCMTSEQ, MEMBERSEQ, LOCGOBGOD, LOCGOBBAD) VALUES (#{LOCBRDSEQ}, #{LOCCMTSEQ}, #{MEMBERSEQ}, #{LOCGOBGOD}, #{LOCGOBBAD}) - ON DUPLICATE KEY UPDATE LOCGOBGOD = #{LOCGOBGOD}, LOCGOBBAD = #{LOCGOBBAD} + + SELECT COUNT(1) > 0 FROM localcomt + WHERE LOCCMTSEQ = #{LOCCMTSEQ} AND LOCCMTPNT IS NOT NULL + + + + + + INSERT INTO localbord (LOCBRDTTL, LOCBRDCON, LOCBRDCAT, MEMBERSEQ, LOCBRDCNT, LOCBRDRDT, LOCBRDUDT, LOCBRDPWD, LOCBRDTYP) From 67551b54b017c2888e3dad250f07a4feabbb4956 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 20 Jan 2025 14:07:44 +0900 Subject: [PATCH 22/72] =?UTF-8?q?=EC=93=B8=EB=8D=B0=EC=97=86=EB=8A=94?= =?UTF-8?q?=EA=B1=B0=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 50 +++++++++++-------- .../localhost/mapper/localbordMapper.java | 3 -- .../localhost/service/localbordService.java | 4 -- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 0384760..1cc4f87 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -18,29 +18,22 @@ package io.company.localhost.controller.api; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.sql.Blob; -import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - -import org.springframework.http.ResponseEntity; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.DeleteMapping; 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.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; import com.github.pagehelper.PageInfo; -import com.github.pagehelper.PageSerializable; +import io.company.localhost.common.annotation.Member; +import io.company.localhost.common.annotation.ParameterCheck; import io.company.localhost.common.annotation.ReqMap; import io.company.localhost.common.dto.ApiResponse; import io.company.localhost.common.dto.MapDto; @@ -61,6 +54,8 @@ public class BoardController { * @ReqMap map 요청 파라미터 (searchKeyword) * @return 전체 공지사항 목록 */ + @Member + @ParameterCheck @GetMapping("/notices") public ApiResponse> getNotices(@ReqMap MapDto map) { List posts = boardService.getNotices(map); @@ -88,6 +83,8 @@ public class BoardController { * @ReqMap map 요청 파라미터 (page, searchKeyword) * @return 페이징된 자유/익명 게시판 목록 */ + @Member + @ParameterCheck @GetMapping("/general") public ApiResponse> getGeneralPosts(@ReqMap MapDto map) { PageInfo posts = boardService.getGeneralPosts(map); @@ -147,6 +144,8 @@ public class BoardController { * LOCBRDPWD(익명일떄에만), LOCBRDCAT(지식커뮤니티만)) * @return 작성된 게시물의 ID */ + @Member + @ParameterCheck @PostMapping public ApiResponse createBoard(@ReqMap MapDto map) { // 비밀번호 암호화 (익명 게시판 등 비밀번호가 필요한 경우) @@ -168,6 +167,8 @@ public class BoardController { * @ReqMap map 요청 파라미터 (CMNFLEREG, CMNFLESIZ, CMNFLEEXT, CMNFLEORG, CMNFLENAM, CMNFLEPAT, CMNBRDSEQ) * @return 첨부파일 저장 결과 메시지 */ + @Member + @ParameterCheck @PostMapping("/{CMNBRDSEQ}/attachments") public ApiResponse uploadAttachment(@ReqMap MapDto map) { // 파일 데이터 저장 @@ -181,6 +182,8 @@ public class BoardController { * @param boardId 게시물 ID * @return 게시물 상세정보, 첨부파일 목록, 댓글 목록 */ + @Member + @ParameterCheck @GetMapping("/{boardId}") public ApiResponse getBoardDetail(@PathVariable("boardId") Long boardId) { log.info("Fetching details for board ID: {}", boardId); @@ -236,6 +239,8 @@ public class BoardController { * @param boardId 게시물 ID * @return 삭제 결과 메시지 */ + @Member + @ParameterCheck @DeleteMapping("/{boardId}") public ApiResponse deleteBoard(@PathVariable("boardId") Long boardId, @ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); @@ -250,6 +255,8 @@ public class BoardController { * @ReqMap map 수정 데이터 (LOCBRDTTL, LOCBRDCON) * @return 수정 결과 메시지 */ + @Member + @ParameterCheck @PutMapping("/{boardId}") public ApiResponse updateBoard(@PathVariable("boardId") Long boardId,@ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); @@ -262,6 +269,8 @@ public class BoardController { * @ReqMap map 데이터 (LOCCMTSEQ, MEMBERSEQ, LOCGOBGOD, LOCGOBBAD, LOCBRDSEQ) * @return 반응 추가 결과 메시지 */ + @Member + @ParameterCheck @PostMapping("/{LOCBRDSEQ}/{LOCCMTSEQ}/reaction") public ApiResponse reactToBoard(@ReqMap MapDto map) { boardService.reactToBoard(map); @@ -274,6 +283,8 @@ public class BoardController { * @param boardId 게시물 ID * @return 댓글과 대댓글의 계층 구조 데이터 */ + @Member + @ParameterCheck @GetMapping("/{boardId}/comments") public ApiResponse> getComments(@PathVariable("boardId") int boardId) { // 모든 댓글과 대댓글 조회 @@ -289,6 +300,8 @@ public class BoardController { * @ReqMap map 댓글 데이터 (LOCBRDSEQ, LOCCMTRPY, LOCCMTPNT, LOCCMTPWD, MEMBERSEQ 등) * @return 작성 결과 메시지 */ + @Member + @ParameterCheck @PostMapping("/{LOCBRDSEQ}/comment") public ApiResponse addCommentOrReply(@ReqMap MapDto map) { // 비밀번호 암호화 (비밀번호가 있는 경우에만) @@ -308,6 +321,8 @@ public class BoardController { * @ReqMap map 수정 데이터 (LOCCMTSEQ, LOCCMTRPY ) * @return 수정 결과 메시지 */ + @Member + @ParameterCheck @PutMapping("/comment/{commentId}") public ApiResponse updateComment(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { // 기존 댓글 조회 @@ -327,6 +342,8 @@ public class BoardController { * @param commentId 댓글 ID * @return 삭제 결과 메시지 */ + @Member + @ParameterCheck @DeleteMapping("/comment/{commentId}") public ApiResponse deleteComment(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { map.put("LOCCMTSEQ", commentId); @@ -341,6 +358,8 @@ public class BoardController { * @ReqMap map 비밀번호 데이터 * @return 비밀번호 확인 결과 */ + @Member + @ParameterCheck @PostMapping("/comment/{commentId}/password") public ApiResponse checkCommentPassword(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { // DB에서 암호화된 비밀번호 조회 @@ -358,6 +377,8 @@ public class BoardController { * @ReqMap map 비밀번호 데이터 * @return 비밀번호 확인 결과 */ + @Member + @ParameterCheck @PostMapping("/{boardId}/password") public ApiResponse checkBoardPassword(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { // DB에서 암호화된 비밀번호 조회 @@ -368,16 +389,5 @@ public class BoardController { boolean isMatch = passwordEncoder.matches(rawPassword, storedPassword); return ApiResponse.ok(isMatch); } - -// /** -// * 비밀게시판 여부 확인 -// * @param boardId 게시물 ID -// * @return 비밀게시판 여부 -// */ -// @GetMapping("/{boardId}/isSecret") -// public ApiResponse isSecretBoard(@PathVariable("boardId") Long boardId) { -// log.info("Checking if board ID {} is secret", boardId); -// return ApiResponse.ok(boardService.isSecretBoard(boardId)); -// } } diff --git a/src/main/java/io/company/localhost/mapper/localbordMapper.java b/src/main/java/io/company/localhost/mapper/localbordMapper.java index e9291ab..ac4a2d1 100644 --- a/src/main/java/io/company/localhost/mapper/localbordMapper.java +++ b/src/main/java/io/company/localhost/mapper/localbordMapper.java @@ -69,9 +69,6 @@ public interface localbordMapper { // 댓글 비밀번호 조회 String selectBoardPassword(int boardId); - - // 비밀 게시판 여부 확인 - boolean isSecretBoard(Long boardId); // 게시물 상세보기 MapDto selectBoardDetail(Long boardId); diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index f3a405f..01bdcc7 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -119,10 +119,6 @@ public class localbordService { public String getBoardPassword(int boardId) { return boardMapper.selectBoardPassword(boardId); } - - public boolean isSecretBoard(Long boardId) { - return boardMapper.isSecretBoard(boardId); - } public MapDto getCommentById(int commentId) { return boardMapper.getCommentById(commentId); From 1312ac6b5d63ce815f5a85ac90e13d53d9932942 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 20 Jan 2025 14:24:01 +0900 Subject: [PATCH 23/72] =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EC=88=98=20=EC=A6=9D?= =?UTF-8?q?=EA=B0=80=20,=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/controller/api/BoardController.java | 5 ++++- .../company/localhost/mapper/localbordMapper.java | 5 ++++- .../localhost/service/localbordService.java | 6 +++++- src/main/resources/mapper/localbordMapper.xml | 14 +++++++++----- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 1cc4f87..d0b0fa9 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -187,7 +187,10 @@ public class BoardController { @GetMapping("/{boardId}") public ApiResponse getBoardDetail(@PathVariable("boardId") Long boardId) { log.info("Fetching details for board ID: {}", boardId); - + + // 조회수 증가 + boardService.incrementViewCount(boardId); + // 게시물 상세정보 조회 MapDto boardDetail = boardService.getBoardDetail(boardId); if (boardDetail == null) { diff --git a/src/main/java/io/company/localhost/mapper/localbordMapper.java b/src/main/java/io/company/localhost/mapper/localbordMapper.java index ac4a2d1..56c2875 100644 --- a/src/main/java/io/company/localhost/mapper/localbordMapper.java +++ b/src/main/java/io/company/localhost/mapper/localbordMapper.java @@ -15,7 +15,10 @@ public interface localbordMapper { // 자유/비밀 게시판 조회 List getGeneralPosts(MapDto map); - + + // 조회수 증가 + void incrementViewCount(Long boardId); + // 게시물 작성 void createBoard(MapDto map); diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 01bdcc7..93019ee 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -33,7 +33,11 @@ public class localbordService { return PageUtil.redefineNavigation(new PageInfo<>(result, size)); } - + + // 게시글 조회수 증가 + public void incrementViewCount(Long boardId) { + boardMapper.incrementViewCount(boardId); + } public BigInteger createBoard(MapDto map) { boardMapper.createBoard(map); // 게시물 작성 diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index e16a7b1..0a1d129 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -8,7 +8,8 @@ LOCBRDSEQ AS id, LOCBRDTTL AS title, LOCBRDCON AS content, - LOCBRDRDT AS date + LOCBRDUDT AS date, + LOCBRDCNT AS cnt FROM localbord WHERE LOCBRDTYP = 'N' @@ -23,7 +24,8 @@ LOCBRDSEQ AS id, LOCBRDTTL AS title, LOCBRDCON AS content, - LOCBRDRDT AS date + LOCBRDUDT AS date, + LOCBRDCNT AS cnt FROM localbord WHERE LOCBRDTYP IN ('F', 'S') @@ -31,9 +33,11 @@ ORDER BY LOCBRDUDT DESC - - - + + + UPDATE localbord SET LOCBRDCNT = LOCBRDCNT + 1 WHERE LOCBRDSEQ = #{LOCBRDSEQ} + + INSERT INTO localbord (LOCBRDTTL, LOCBRDCON, LOCBRDCAT, MEMBERSEQ, LOCBRDCNT, LOCBRDRDT, LOCBRDUDT, LOCBRDPWD, LOCBRDTYP) From b2999ffd51e14f7a684e9ff12c917f9afb2512f0 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 20 Jan 2025 14:37:20 +0900 Subject: [PATCH 24/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=ED=95=84=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/localhost/controller/api/BoardController.java | 2 +- .../java/io/company/localhost/service/localbordService.java | 5 +++++ src/main/resources/mapper/localbordMapper.xml | 6 +++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index d0b0fa9..e0e092e 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -80,7 +80,7 @@ public class BoardController { /** * 자유/익명 게시판 목록 조회 - * @ReqMap map 요청 파라미터 (page, searchKeyword) + * @ReqMap map 요청 파라미터 (page, searchKeyword, orderBy) * @return 페이징된 자유/익명 게시판 목록 */ @Member diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 93019ee..3b881e7 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -26,6 +26,11 @@ public class localbordService { public PageInfo getGeneralPosts(MapDto map) { int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 10; + + String orderBy = map.getString("orderBy"); + if (orderBy == null || (!orderBy.equals("date") && !orderBy.equals("views"))) { + map.put("orderBy", "date"); // 기본 정렬은 날짜 기준 + } PageHelper.startPage(page, size); diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index 0a1d129..fee88af 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -31,7 +31,11 @@ AND LOCBRDTTL LIKE CONCAT('%', #{searchKeyword}, '%') - ORDER BY LOCBRDUDT DESC + ORDER BY + + LOCBRDUDT DESC + LOCBRDCNT DESC + From 2c23644ebd1da20f89d64a72f6aff51cae17cacd Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 20 Jan 2025 15:14:24 +0900 Subject: [PATCH 25/72] . --- src/main/resources/mapper/localbordMapper.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index fee88af..eedc526 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -63,7 +63,7 @@ @@ -106,8 +106,6 @@ AND MEMBERSEQ = #{MEMBERSEQ} - - UPDATE localgorb @@ -117,15 +115,12 @@ AND MEMBERSEQ = #{MEMBERSEQ} - - INSERT INTO localgorb (LOCBRDSEQ, LOCCMTSEQ, MEMBERSEQ, LOCGOBGOD, LOCGOBBAD) VALUES (#{LOCBRDSEQ}, #{LOCCMTSEQ}, #{MEMBERSEQ}, #{LOCGOBGOD}, #{LOCGOBBAD}) - - From e12bcd15bdf658b821a09680e0741c5422e53574 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 20 Jan 2025 15:20:07 +0900 Subject: [PATCH 26/72] =?UTF-8?q?=EB=A9=A4=EC=96=B4ID=20=EC=9E=84=EC=8B=9C?= =?UTF-8?q?=EB=A1=9C=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/localhost/controller/api/BoardController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index e0e092e..895bf70 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -158,6 +158,8 @@ public class BoardController { BigInteger createdIdx = boardService.createBoard(map); // 작성된 게시물의 idx를 반환 Map responseData = new HashMap<>(); responseData.put("CMNBRDSEQ", createdIdx); + //로그인 미개발 ->임시 + map.put("MEMBERSEQ", 1); responseData.put("message", "게시물이 작성되었습니다."); return ApiResponse.ok(responseData); } @@ -276,6 +278,8 @@ public class BoardController { @ParameterCheck @PostMapping("/{LOCBRDSEQ}/{LOCCMTSEQ}/reaction") public ApiResponse reactToBoard(@ReqMap MapDto map) { + //로그인 미개발 ->임시 + map.put("MEMBERSEQ", 1); boardService.reactToBoard(map); return ApiResponse.ok("반응이 성공적으로 처리되었습니다."); } @@ -307,6 +311,9 @@ public class BoardController { @ParameterCheck @PostMapping("/{LOCBRDSEQ}/comment") public ApiResponse addCommentOrReply(@ReqMap MapDto map) { + //로그인 미개발 ->임시 + map.put("MEMBERSEQ", 1); + // 비밀번호 암호화 (비밀번호가 있는 경우에만) if (map.containsKey("LOCCMTPWD")) { String rawPassword = map.getString("LOCCMTPWD"); From a3ce5ade180e7ce8db2ff8328c0d5cabf8ccbb14 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Tue, 21 Jan 2025 10:29:46 +0900 Subject: [PATCH 27/72] =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=95=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84/=EB=8B=A4=EC=9D=8C=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=9C=A0=EB=AC=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/company/localhost/utils/PageUtil.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/io/company/localhost/utils/PageUtil.java b/src/main/java/io/company/localhost/utils/PageUtil.java index 8d92f10..cf7333a 100644 --- a/src/main/java/io/company/localhost/utils/PageUtil.java +++ b/src/main/java/io/company/localhost/utils/PageUtil.java @@ -57,6 +57,18 @@ public class PageUtil { list.setNavigateFirstPage(nav2[0]); list.setNavigateLastPage(nav2[nav2.length -1]); } + + // 페이지 그룹 크기 (예: 10개씩) + int groupSize = list.getNavigatePages(); + int totalPages = list.getPages(); + + // 현재 페이지 그룹 계산 + int currentGroup = (int) Math.ceil((double) currentPage / groupSize); + int totalGroups = (int) Math.ceil((double) totalPages / groupSize); + + // 이전/다음 그룹 존재 여부 설정 + list.setHasPreviousPage(currentGroup > 1); // 이전 그룹 존재 + list.setHasNextPage(currentGroup < totalGroups); // 다음 그룹 존재 return list; } From 5ad352da9b8d30114f065ff1a0ea026f6e7e8b7e Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Tue, 21 Jan 2025 13:17:01 +0900 Subject: [PATCH 28/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EC=82=AC=EC=9B=90id=20=EC=9E=84=EC=8B=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 895bf70..99347f4 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -21,6 +21,8 @@ import java.sql.Blob; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; + import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -30,7 +32,9 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageInfo; +import com.github.pagehelper.PageSerializable; import io.company.localhost.common.annotation.Member; import io.company.localhost.common.annotation.ParameterCheck; @@ -146,23 +150,34 @@ public class BoardController { */ @Member @ParameterCheck - @PostMapping - public ApiResponse createBoard(@ReqMap MapDto map) { - // 비밀번호 암호화 (익명 게시판 등 비밀번호가 필요한 경우) - if (map.containsKey("LOCBRDPWD")) { - String rawPassword = map.getString("LOCBRDPWD"); - String encodedPassword = passwordEncoder.encode(rawPassword); - map.put("LOCBRDPWD", encodedPassword); - } + @PostMapping + public ApiResponse createBoard(@ReqMap MapDto map) { + // 비밀번호 암호화 + if (map.containsKey("LOCBRDPWD")) { + String rawPassword = map.getString("LOCBRDPWD"); + String encodedPassword = passwordEncoder.encode(rawPassword); + map.put("LOCBRDPWD", encodedPassword); + } - BigInteger createdIdx = boardService.createBoard(map); // 작성된 게시물의 idx를 반환 - Map responseData = new HashMap<>(); - responseData.put("CMNBRDSEQ", createdIdx); - //로그인 미개발 ->임시 - map.put("MEMBERSEQ", 1); - responseData.put("message", "게시물이 작성되었습니다."); - return ApiResponse.ok(responseData); - } + // LOCBRDCON 필드를 JSON 문자열로 변환 + ObjectMapper objectMapper = new ObjectMapper(); + if (map.containsKey("LOCBRDCON")) { + try { + String jsonContent = objectMapper.writeValueAsString(map.get("LOCBRDCON")); + map.put("LOCBRDCON", jsonContent); // JSON 문자열로 변환된 값 설정 + } catch (Exception e) { + throw new RuntimeException("Error serializing LOCBRDCON field", e); + } + } + //로그인 미개발 ->임시 + map.put("MEMBERSEQ", 1); + + BigInteger createdIdx = boardService.createBoard(map); // 작성된 게시물의 idx를 반환 + Map responseData = new HashMap<>(); + responseData.put("CMNBRDSEQ", createdIdx); + responseData.put("message", "게시물이 작성되었습니다."); + return ApiResponse.ok(responseData); + } /** * 첨부파일 추가 @@ -173,6 +188,9 @@ public class BoardController { @ParameterCheck @PostMapping("/{CMNBRDSEQ}/attachments") public ApiResponse uploadAttachment(@ReqMap MapDto map) { + String filename = UUID.randomUUID().toString(); + map.put("CMNFLENAM", filename); + map.put("CMNFLEREG", 1); // 파일 데이터 저장 boardService.addAttachment(map); From ddefb2c3dc284054ccd8b4218f62042ae239fe14 Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 21 Jan 2025 15:11:27 +0900 Subject: [PATCH 29/72] =?UTF-8?q?filePath=20profile=20=EA=B2=BD=EB=A1=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e5a5e81..0138235 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -95,4 +95,7 @@ logging: filePath: - boardfile: C:\localhost-back\upload\img\board\ \ No newline at end of file + boardfile: C:\\localhost-back\\upload\\img\\board\\ + profile: C:\\localhost-back\\upload\\img\\profile\\ + + From e7c4984c534498690f143ba214e3ba595ccc25df Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 21 Jan 2025 15:12:14 +0900 Subject: [PATCH 30/72] =?UTF-8?q?color,=20mbti,=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EC=8B=A0=EC=B2=AD=20=EC=8B=9C=20=EC=82=AC=EC=9A=A9=ED=95=9C=20?= =?UTF-8?q?color=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/mapper/commoncodMapper.java | 7 +++- .../localhost/service/commoncodService.java | 9 +++++ src/main/resources/mapper/commoncodMapper.xml | 34 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/company/localhost/mapper/commoncodMapper.java b/src/main/java/io/company/localhost/mapper/commoncodMapper.java index 9d560b8..46255a6 100644 --- a/src/main/java/io/company/localhost/mapper/commoncodMapper.java +++ b/src/main/java/io/company/localhost/mapper/commoncodMapper.java @@ -26,5 +26,10 @@ public interface commoncodMapper { List getWordCategory(); Long insertCategory(MapDto map); - + + List getColorList(); + + List getMbtiList(); + + int updateColorYon(String color); } diff --git a/src/main/java/io/company/localhost/service/commoncodService.java b/src/main/java/io/company/localhost/service/commoncodService.java index c016993..2db79e1 100644 --- a/src/main/java/io/company/localhost/service/commoncodService.java +++ b/src/main/java/io/company/localhost/service/commoncodService.java @@ -35,5 +35,14 @@ public class commoncodService { public Long insertCategory(MapDto map) { return commoncodmapper.insertCategory(map); } + + public List getColorList() { + return commoncodmapper.getColorList(); + } + + public List getMbtiList() { + return commoncodmapper.getMbtiList(); + } + } diff --git a/src/main/resources/mapper/commoncodMapper.xml b/src/main/resources/mapper/commoncodMapper.xml index c4325e5..710c47e 100644 --- a/src/main/resources/mapper/commoncodMapper.xml +++ b/src/main/resources/mapper/commoncodMapper.xml @@ -29,4 +29,38 @@ WHERE CMNCODLV1 = 600; + + + + + + + UPDATE commoncod + SET CMNCODYON = 1 + WHERE CMNCODVAL = #{color}; + + + From a03c94985309161dac2869a23910c8968b826454 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Tue, 21 Jan 2025 15:43:11 +0900 Subject: [PATCH 31/72] =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/localhost/mapper/localbordMapper.java | 1 - .../localhost/service/localbordService.java | 15 +++++---------- src/main/resources/mapper/localbordMapper.xml | 13 +++++-------- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/main/java/io/company/localhost/mapper/localbordMapper.java b/src/main/java/io/company/localhost/mapper/localbordMapper.java index 56c2875..7190ee7 100644 --- a/src/main/java/io/company/localhost/mapper/localbordMapper.java +++ b/src/main/java/io/company/localhost/mapper/localbordMapper.java @@ -94,6 +94,5 @@ public interface localbordMapper { //댓글id 확인 MapDto getCommentById(int commentId); - } diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 3b881e7..b74afea 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -29,7 +29,7 @@ public class localbordService { String orderBy = map.getString("orderBy"); if (orderBy == null || (!orderBy.equals("date") && !orderBy.equals("views"))) { - map.put("orderBy", "date"); // 기본 정렬은 날짜 기준 + map.put("orderBy", "date"); } PageHelper.startPage(page, size); @@ -39,13 +39,12 @@ public class localbordService { return PageUtil.redefineNavigation(new PageInfo<>(result, size)); } - // 게시글 조회수 증가 public void incrementViewCount(Long boardId) { boardMapper.incrementViewCount(boardId); } public BigInteger createBoard(MapDto map) { - boardMapper.createBoard(map); // 게시물 작성 + boardMapper.createBoard(map); return (BigInteger) map.get("LOCBRDSEQ"); // Mapper에서 자동 생성된 key를 가져옴 } @@ -60,8 +59,7 @@ public class localbordService { public List getAttachments(Long boardId) { return boardMapper.selectAttachments(boardId); } - - + public void deleteBoard(MapDto map) { boardMapper.deleteCommentsByBoardId(map); boardMapper.deleteBoard(map); @@ -90,12 +88,11 @@ public class localbordService { public void addCommentOrReply(MapDto map) { if (map.get("LOCCMTPNT") == null) { - map.put("LOCCMTPNT", null); // 부모 ID가 없는 경우 null 처리 + map.put("LOCCMTPNT", null); } boardMapper.addCommentOrReply(map); } - public void updateComment(MapDto map) { boardMapper.updateComment(map); } @@ -139,7 +136,7 @@ public class localbordService { public boolean hasAttachments(Long boardId) { int count = boardMapper.countAttachments(boardId); - return count > 0; // 첨부파일 개수가 0보다 크면 true 반환 + return count > 0; } public MapDto getBoardReactions(Long boardId) { @@ -150,8 +147,6 @@ public class localbordService { return boardMapper.getCommentReactions(boardId); } - - } diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index eedc526..7d451c4 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -38,6 +38,7 @@ + UPDATE localbord SET LOCBRDCNT = LOCBRDCNT + 1 WHERE LOCBRDSEQ = #{LOCBRDSEQ} @@ -47,8 +48,7 @@ INSERT INTO localbord (LOCBRDTTL, LOCBRDCON, LOCBRDCAT, MEMBERSEQ, LOCBRDCNT, LOCBRDRDT, LOCBRDUDT, LOCBRDPWD, LOCBRDTYP) VALUES (#{LOCBRDTTL}, #{LOCBRDCON}, #{LOCBRDCAT}, #{MEMBERSEQ}, 0, NOW(), NOW(), #{LOCBRDPWD}, #{LOCBRDTYP}) - - + INSERT INTO commonfil ( @@ -60,7 +60,6 @@ ) - - - + @@ -237,8 +234,8 @@ - SELECT - MEMBER_ID AS id - , MEMBER_LOGIN_ID AS loginId - , MEMBER_ROLE AS role - , MEMBER_NAME AS name - , MEMBER_PASSWORD AS password - , MEMBER_EMAIL AS email - , IS_USED AS isUsed - , IS_DEL AS isDel - , ISRT_DATE AS isrtDate - , UPDT_DATE AS updtDate - , #{remember} as remember - FROM - MEMBER_TB - WHERE - MEMBER_LOGIN_ID = #{id} - - - diff --git a/src/main/resources/mapper/netmemberMapper.xml b/src/main/resources/mapper/netmemberMapper.xml new file mode 100644 index 0000000..bdebbb8 --- /dev/null +++ b/src/main/resources/mapper/netmemberMapper.xml @@ -0,0 +1,85 @@ + + + + + + + + + INSERT INTO netmember ( + MEMBERIDS, + MEMBERROL, + MEMBERTKN, + MEMBERPRF, + MEMBERNAM, + MEMBERPWD, + MEMBERPWH, + MEMBERPWR, + MEMBERPOS, + MEMBERARR, + MEMBERZIP, + MEMBERTEL, + MEMBERRDT, + MEMBERCDT, + MEMBERPRM, + MEMBERDEL, + MEMBERLEA, + MEMBERCOL, + MEMBERMBT + ) VALUES ( + #{memberIds}, + #{memberRol}, + #{memberTkn}, + #{memberPrf}, + #{memberNam}, + #{memberPwd}, + #{memberPwh}, + #{memberPwr}, + #{memberPos}, + #{memberArr}, + #{memberZip}, + #{memberTel}, + #{memberRdt}, + #{memberCdt}, + #{memberPrm}, + #{memberDel}, + #{memberLea}, + #{memberCol}, + #{memberMbt} + ) + + + + + + From 1973322cbf692c98fd0646864772cc3a09f3d008 Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 21 Jan 2025 20:35:43 +0900 Subject: [PATCH 33/72] member -> netmember --- .../common/security/service/MemberPrincipalDetailService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java b/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java index 1239c37..288e35e 100644 --- a/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java +++ b/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java @@ -21,14 +21,14 @@ import org.springframework.stereotype.Service; import io.company.localhost.common.security.details.MemberPrincipalDetails; import io.company.localhost.vo.MemberVo; -import io.company.localhost.mapper.MemberMapper; +import io.company.localhost.mapper.NetmemberMapper; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor public class MemberPrincipalDetailService implements UserDetailsService { - private final MemberMapper memberMapper; + private final NetmemberMapper memberMapper; @Override public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException { From 379fef86e051d68da9953f4fe76abc406b268b6a Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 21 Jan 2025 20:45:18 +0900 Subject: [PATCH 34/72] =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/service/FileService.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/main/java/io/company/localhost/service/FileService.java diff --git a/src/main/java/io/company/localhost/service/FileService.java b/src/main/java/io/company/localhost/service/FileService.java new file mode 100644 index 0000000..abb6708 --- /dev/null +++ b/src/main/java/io/company/localhost/service/FileService.java @@ -0,0 +1,69 @@ +/************************************************************ + * + * @packageName : io.company.localhost.FileService + * @fileName : FileService.java + * @author : 박지윤 + * @date : 25.01.17 + * @description : + * + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 24.01.17 박지윤 최초 생성 + * + *************************************************************/ +package io.company.localhost.service; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.UUID; +import org.apache.commons.io.FilenameUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class FileService { + + + @Value("${filePath.profile}") + private String uploadPath; + + /** + * 파일 업로드 + * + * @param file + * @param directory + * @return + * @throws RuntimeException + */ + public String uploadFile(MultipartFile file, String directory) { + try { + // 원본 파일명 + String originalFilename = file.getOriginalFilename(); + // 파일 확장자 + String extension = FilenameUtils.getExtension(originalFilename); + // UUID를 사용하여 고유한 파일명 생성 + String newFilename = UUID.randomUUID().toString() + "." + extension; + + // 최종 저장 경로 생성 (기본경로 + 하위디렉토리 + 파일명) + Path targetPath = Paths.get(uploadPath, directory, newFilename); + // 저장될 디렉토리가 없는 경우 생성 + Files.createDirectories(targetPath.getParent()); + + // 동일 파일명이 있을 경우 덮어쓰기 + Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING); + + // 저장된 파일의 상대 경로 반환 + return directory + "/" + newFilename; + + } catch (IOException e) { + throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); + } + } +} \ No newline at end of file From a70de1f6928202bfac07c5c8803bc82344f3c696 Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 21 Jan 2025 20:45:47 +0900 Subject: [PATCH 35/72] =?UTF-8?q?=EC=BB=AC=EB=9F=BC=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/company/localhost/vo/MemberVo.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/company/localhost/vo/MemberVo.java b/src/main/java/io/company/localhost/vo/MemberVo.java index e063757..1b8449e 100644 --- a/src/main/java/io/company/localhost/vo/MemberVo.java +++ b/src/main/java/io/company/localhost/vo/MemberVo.java @@ -25,16 +25,26 @@ import java.util.Date; @AllArgsConstructor @ToString public class MemberVo { - private Long id; - private String loginId; - private String role; - private String name; - private String password; - private String email; - private String isUsed; - private String isDel; - private Date isrtDate; - private Date updtDate; - private Boolean remember; + private String loginId; // 사용자 아이디 + private String role; // 권한 + private String token; // 토큰 + private String profile; // 프로필사진 + private String name; // 이름 + private String password; // 비밀번호 + private String passwordhint;// 비밀번호힌트 + private String passwordRes; // 비밀번호힌트답변 + private int position; // 직급 + private String address; // 주소 + private String zipcode; // 우편번호 + private String phone; // 전화번호 + private Date regist; // 가입요청일 + private Date isCdt; // 입사일 + private String isUsed; // 허가여부 + private String isDel; // 퇴사여부 + private String isLea; // 휴직여부 + private int color; // 색상 + private int mbit; // MBTI + private Boolean remember; // 로그인 유지 } + From bb9553a0339574dd7a607eb67ab08b35812c2de5 Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 21 Jan 2025 20:46:05 +0900 Subject: [PATCH 36/72] =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EC=8B=A0=EC=B2=AD?= =?UTF-8?q?=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC,=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/RegisterController.java | 97 +++++++++++++++++++ .../localhost/service/RegisterService.java | 82 ++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 src/main/java/io/company/localhost/controller/api/RegisterController.java create mode 100644 src/main/java/io/company/localhost/service/RegisterService.java diff --git a/src/main/java/io/company/localhost/controller/api/RegisterController.java b/src/main/java/io/company/localhost/controller/api/RegisterController.java new file mode 100644 index 0000000..7afcc98 --- /dev/null +++ b/src/main/java/io/company/localhost/controller/api/RegisterController.java @@ -0,0 +1,97 @@ +/************************************************************ + * + * @packageName : io.company.localhost.controller.api + * @fileName : RegisterController.java + * @author : 박지윤 + * @date : 25.01.17 + * @description : 등록신청 + * + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 24.01.17 박지윤 최초 생성 + * + *************************************************************/ + +package io.company.localhost.controller.api; + +import java.util.List; + +import org.springframework.web.bind.annotation.GetMapping; +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.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.company.localhost.common.annotation.ParameterCheck; +import io.company.localhost.common.annotation.ReqMap; +import io.company.localhost.common.dto.ApiResponse; +import io.company.localhost.common.dto.MapDto; +import io.company.localhost.service.RegisterService; +import io.company.localhost.service.commoncodService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequestMapping("/api/register") +@RestController +@RequiredArgsConstructor +public class RegisterController { + + private final commoncodService commoncodservice; + private final RegisterService registerService; + + /** + * 사용 가능 색상 조회 + * + * @return ApiResponse> + * + */ + @ParameterCheck + @GetMapping("/color") + public ApiResponse> getColorList() { + List ColorList = commoncodservice.getColorList(); + return ApiResponse.ok(ColorList); + } + + /** + * MBTI 목록 조회 + * + * @return ApiResponse> + * + */ + @ParameterCheck + @GetMapping("/mbti") + public ApiResponse> getMbtiList() { + List MbtiList = commoncodservice.getMbtiList(); + return ApiResponse.ok(MbtiList); + } + + /** + * 회원가입 + * + * @param profile + * @param map + * @return ApiResponse + * @throws RuntimeException 파일 업로드 실패 시 + */ + @PostMapping("/join") + public ApiResponse register(@RequestParam("profile") MultipartFile profile, @ReqMap MapDto map) { + int member = registerService.register(profile, map); + return ApiResponse.ok(member); + } + + /** + * 아이디 중복 체크 + * + * @param memberIds + * @return ApiResponse + * @throws IllegalArgumentException + */ + @GetMapping("/checkId") + public ApiResponse selectCheckId(@RequestParam String memberIds) { + boolean isDuplicate = registerService.selectCheckId(memberIds); + return ApiResponse.ok(!isDuplicate); + } +} diff --git a/src/main/java/io/company/localhost/service/RegisterService.java b/src/main/java/io/company/localhost/service/RegisterService.java new file mode 100644 index 0000000..abe74f6 --- /dev/null +++ b/src/main/java/io/company/localhost/service/RegisterService.java @@ -0,0 +1,82 @@ +/************************************************************ + * + * @packageName : io.company.localhost.RegisterService + * @fileName : RegisterService.java + * @author : 박지윤 + * @date : 25.01.17 + * @description : + * + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 24.01.17 박지윤 최초 생성 + * + *************************************************************/ +package io.company.localhost.service; + +import java.time.LocalDateTime; + +import org.springframework.security.crypto.password.DelegatingPasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import io.company.localhost.common.dto.MapDto; +import io.company.localhost.mapper.NetmemberMapper; +import io.company.localhost.mapper.commoncodMapper; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class RegisterService { + private final NetmemberMapper memberMapper; + private final commoncodMapper commoncodMapper; + private final DelegatingPasswordEncoder passwordEncoder; + private final FileService fileService; + + /** + * 회원 가입 + * + * @param profile + * @param map + * @return + */ + public int register(MultipartFile profile, MapDto map) { + // 프로필 이미지 저장, 저장된 경로 가져옴 + String profilePath = fileService.uploadFile(profile, "profiles"); + map.put("memberPrf", profilePath); + + // 비밀번호 암호화 및 저장 + String encodedPassword = passwordEncoder.encode(map.getString("memberPwd")); + map.put("memberPwd", encodedPassword); + + // 회원 기본 정보 설정 + map.put("memberRol", "ROLE_MEMBER"); + map.put("memberPos", 500107); + map.put("memberTkn", "Null"); + map.put("memberPrm", "N"); + map.put("memberDel", "N"); + map.put("memberLea", "N"); + map.put("memberRdt", LocalDateTime.now()); + map.put("memberCdt", LocalDateTime.now()); + + // 회원 정보 저장 + int result = memberMapper.insertMember(map); + + // 선택한 색상 코드 사용 처리 + String color = map.getString("memberCol"); + commoncodMapper.updateColorYon(color); + + return result; + } + + /** + * 아이디 중복 체크 + * + * @param memberIds + * @return + */ + public boolean selectCheckId(String memberIds) { + return memberMapper.selectCheckId(memberIds) > 0; + } + +} From f065991a4136669fbb44aab341148e2cb5f059e8 Mon Sep 17 00:00:00 2001 From: ckx6954 Date: Tue, 21 Jan 2025 21:41:35 +0900 Subject: [PATCH 37/72] =?UTF-8?q?rememberMe=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/security/handler/MemberAuthSuccessHandler.java | 5 ----- .../common/security/service/CustomRememberMeServices.java | 6 ++++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java b/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java index 8642552..430814d 100644 --- a/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java +++ b/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java @@ -44,11 +44,6 @@ public class MemberAuthSuccessHandler implements AuthenticationSuccessHandler{ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { ObjectMapper mapper = new ObjectMapper(); - Boolean rememberMe = (Boolean) request.getAttribute("remember"); - if (rememberMe != null && rememberMe) { - rememberMeServices.loginSuccess(request, response, authentication); - } - MemberVo member = (MemberVo) authentication.getPrincipal(); response.setStatus(HttpStatus.OK.value()); response.setContentType(MediaType.APPLICATION_JSON_VALUE); diff --git a/src/main/java/io/company/localhost/common/security/service/CustomRememberMeServices.java b/src/main/java/io/company/localhost/common/security/service/CustomRememberMeServices.java index 1d0a57f..724c266 100644 --- a/src/main/java/io/company/localhost/common/security/service/CustomRememberMeServices.java +++ b/src/main/java/io/company/localhost/common/security/service/CustomRememberMeServices.java @@ -92,6 +92,12 @@ public class CustomRememberMeServices implements RememberMeServices { @Override public void loginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) { + Boolean rememberMe = (Boolean) request.getAttribute("remember"); + + if(!rememberMe){ + return; + } + Object principal = successfulAuthentication.getPrincipal(); if (!(principal instanceof MemberVo member)) { return; From d7ceef7d70d1fa182ae83fd514ccd93674d2a955 Mon Sep 17 00:00:00 2001 From: ckx6954 Date: Tue, 21 Jan 2025 22:51:50 +0900 Subject: [PATCH 38/72] =?UTF-8?q?handler=20return=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/exception/code/CommonErrorCode.java | 11 ++++++++--- .../common/exception/code/UserErrorCode.java | 14 ++++++++++++-- .../common/security/config/SecurityConfig.java | 3 +-- .../handler/MemberAuthFailureHandler.java | 16 ++++++++++++---- .../handler/MemberAuthSuccessHandler.java | 12 ++---------- .../service/MemberPrincipalDetailService.java | 6 +++--- 6 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/main/java/io/company/localhost/common/exception/code/CommonErrorCode.java b/src/main/java/io/company/localhost/common/exception/code/CommonErrorCode.java index 49a45a5..5d99fd4 100644 --- a/src/main/java/io/company/localhost/common/exception/code/CommonErrorCode.java +++ b/src/main/java/io/company/localhost/common/exception/code/CommonErrorCode.java @@ -23,13 +23,18 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public enum CommonErrorCode implements ErrorCode { - INVALID_PARAMETER(HttpStatus.BAD_REQUEST.value(),HttpStatus.BAD_REQUEST,"잘못된 매개변수가 포함되었습니다."), - RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND.value(),HttpStatus.NOT_FOUND,"리소스가 존재하지 않습니다"), - INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR.value(),HttpStatus.INTERNAL_SERVER_ERROR,"내부 서버 오류"), + INVALID_PARAMETER(HttpStatus.BAD_REQUEST,"잘못된 매개변수가 포함되었습니다."), + RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND,"리소스가 존재하지 않습니다"), + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR,"내부 서버 오류"), ; private final long code; private final HttpStatus httpStatus; private final String message; + CommonErrorCode(HttpStatus httpStatus, String message) { + this.code = httpStatus.value(); + this.httpStatus = httpStatus; + this.message = message; + } } diff --git a/src/main/java/io/company/localhost/common/exception/code/UserErrorCode.java b/src/main/java/io/company/localhost/common/exception/code/UserErrorCode.java index d9ebbdf..c7a4be5 100644 --- a/src/main/java/io/company/localhost/common/exception/code/UserErrorCode.java +++ b/src/main/java/io/company/localhost/common/exception/code/UserErrorCode.java @@ -24,13 +24,23 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public enum UserErrorCode implements ErrorCode { - NOT_AUTH_USER(HttpStatus.UNAUTHORIZED.value(),HttpStatus.UNAUTHORIZED ,"로그인이 필요합니다."), - INACTIVE_USER(HttpStatus.FORBIDDEN.value(),HttpStatus.FORBIDDEN,"권한이 필요합니다."); + NOT_AUTH_USER(HttpStatus.UNAUTHORIZED ,"로그인이 필요합니다."), + INACTIVE_USER(HttpStatus.FORBIDDEN,"권한이 필요합니다."), + USER_NOT_FOUND(HttpStatus.UNAUTHORIZED,"아이디 혹은 비밀번호가 틀렸습니다."), + NOT_AUTHORIZED(HttpStatus.UNAUTHORIZED,"비인가 계정입니다."), + EXIT_USER(HttpStatus.UNAUTHORIZED,"탈퇴한 계정입니다."), + BAD_CREDENTIAL(HttpStatus.UNAUTHORIZED, "아이디 혹은 비밀번호 문제") + ; private final long code; private final HttpStatus httpStatus; private final String message; + UserErrorCode(HttpStatus httpStatus, String message) { + this.code = httpStatus.value(); + this.httpStatus = httpStatus; + this.message = message; + } public ApiResponse getApiResponse() { return ApiResponse.error(this.getHttpStatus() , this.getMessage()); diff --git a/src/main/java/io/company/localhost/common/security/config/SecurityConfig.java b/src/main/java/io/company/localhost/common/security/config/SecurityConfig.java index ae11f31..e8e6819 100644 --- a/src/main/java/io/company/localhost/common/security/config/SecurityConfig.java +++ b/src/main/java/io/company/localhost/common/security/config/SecurityConfig.java @@ -50,6 +50,7 @@ public class SecurityConfig { // 의존성 주입 private final AuthenticationProvider memberAuthenticatorProvider; private final MemberPrincipalDetailService userDetailsService; + private final MemberAuthSuccessHandler successHandler; private final MemberAuthFailureHandler failureHandler; private final AuthorizationManager authorizationManager; @@ -71,8 +72,6 @@ public class SecurityConfig { .authenticationProvider(memberAuthenticatorProvider) .build(); - MemberAuthSuccessHandler successHandler = new MemberAuthSuccessHandler(rememberMeServices()); - http .securityMatcher("/api/**") // '/api/**' 경로에 대해서만 보안 적용 .authorizeHttpRequests(auth -> diff --git a/src/main/java/io/company/localhost/common/security/handler/MemberAuthFailureHandler.java b/src/main/java/io/company/localhost/common/security/handler/MemberAuthFailureHandler.java index 4ef6488..3acbd4d 100644 --- a/src/main/java/io/company/localhost/common/security/handler/MemberAuthFailureHandler.java +++ b/src/main/java/io/company/localhost/common/security/handler/MemberAuthFailureHandler.java @@ -15,10 +15,11 @@ package io.company.localhost.common.security.handler; import com.fasterxml.jackson.databind.ObjectMapper; +import io.company.localhost.common.dto.ApiResponse; +import io.company.localhost.common.exception.code.UserErrorCode; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.MediaType; -import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.stereotype.Component; @@ -35,10 +36,17 @@ public class MemberAuthFailureHandler implements AuthenticationFailureHandler { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setContentType(MediaType.APPLICATION_JSON_VALUE); - if (exception instanceof BadCredentialsException) { - mapper.writeValue(response.getWriter(),"아이디 혹은 비밀번호 문제"); + ApiResponse res = UserErrorCode.BAD_CREDENTIAL.getApiResponse(); + String message = exception.getMessage(); + + if (message.startsWith("NOT_FOUND")) { + res = UserErrorCode.USER_NOT_FOUND.getApiResponse(); + } else if (message.startsWith("NOT_AUTHORIZED")) { + res = UserErrorCode.NOT_AUTHORIZED.getApiResponse(); + } else if (message.startsWith("EXIT")) { + res = UserErrorCode.EXIT_USER.getApiResponse(); } - mapper.writeValue(response.getWriter(), "인증 실패"); + response.getWriter().write(mapper.writeValueAsString(res)); } } diff --git a/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java b/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java index 430814d..e125983 100644 --- a/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java +++ b/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java @@ -15,7 +15,7 @@ package io.company.localhost.common.security.handler; import com.fasterxml.jackson.databind.ObjectMapper; -import io.company.localhost.vo.MemberVo; +import io.company.localhost.common.dto.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; @@ -25,7 +25,6 @@ import org.springframework.http.MediaType; import org.springframework.security.core.Authentication; import org.springframework.security.web.WebAttributes; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; -import org.springframework.security.web.authentication.RememberMeServices; import org.springframework.stereotype.Component; import java.io.IOException; @@ -34,21 +33,14 @@ import java.io.IOException; @Component("successHandler") public class MemberAuthSuccessHandler implements AuthenticationSuccessHandler{ - private final RememberMeServices rememberMeServices; - - public MemberAuthSuccessHandler(RememberMeServices rememberMeServices) { - this.rememberMeServices = rememberMeServices; - } - @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { ObjectMapper mapper = new ObjectMapper(); - MemberVo member = (MemberVo) authentication.getPrincipal(); response.setStatus(HttpStatus.OK.value()); response.setContentType(MediaType.APPLICATION_JSON_VALUE); - mapper.writeValue(response.getWriter(), member); + response.getWriter().write(mapper.writeValueAsString(ApiResponse.ok("Success"))); clearAuthenticationAttributes(request); } diff --git a/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java b/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java index 288e35e..3a6b9b4 100644 --- a/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java +++ b/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java @@ -36,13 +36,13 @@ public class MemberPrincipalDetailService implements UserDetailsService { // 없을경우 에러 발생 if(member == null) - throw new UsernameNotFoundException(id + "을 찾을 수 없습니다."); + throw new UsernameNotFoundException("NOT_FOUND"); if(!"Y".equals(member.getIsUsed())) - throw new UsernameNotFoundException("사용할 수 없는 계정입니다."); + throw new UsernameNotFoundException("NOT_AUTHORIZED"); if(!"N".equals(member.getIsDel())) - throw new UsernameNotFoundException("삭제된 계정입니다."); + throw new UsernameNotFoundException("EXIT"); // MemberPrincipalDetails 에 Member 객체를 넘겨줌 return new MemberPrincipalDetails(member); From 83a62afc8da58bd93f0807e03a9dded550b459b3 Mon Sep 17 00:00:00 2001 From: ckx6954 Date: Wed, 22 Jan 2025 18:57:47 +0900 Subject: [PATCH 39/72] =?UTF-8?q?handler=20Error=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/security/handler/MemberAuthFailureHandler.java | 3 ++- .../common/security/service/MemberPrincipalDetailService.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/company/localhost/common/security/handler/MemberAuthFailureHandler.java b/src/main/java/io/company/localhost/common/security/handler/MemberAuthFailureHandler.java index 3acbd4d..b978aaa 100644 --- a/src/main/java/io/company/localhost/common/security/handler/MemberAuthFailureHandler.java +++ b/src/main/java/io/company/localhost/common/security/handler/MemberAuthFailureHandler.java @@ -20,6 +20,7 @@ import io.company.localhost.common.exception.code.UserErrorCode; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.MediaType; +import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.stereotype.Component; @@ -39,7 +40,7 @@ public class MemberAuthFailureHandler implements AuthenticationFailureHandler { ApiResponse res = UserErrorCode.BAD_CREDENTIAL.getApiResponse(); String message = exception.getMessage(); - if (message.startsWith("NOT_FOUND")) { + if (exception instanceof BadCredentialsException || message.startsWith("NOT_FOUND")) { res = UserErrorCode.USER_NOT_FOUND.getApiResponse(); } else if (message.startsWith("NOT_AUTHORIZED")) { res = UserErrorCode.NOT_AUTHORIZED.getApiResponse(); diff --git a/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java b/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java index 3a6b9b4..07e1171 100644 --- a/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java +++ b/src/main/java/io/company/localhost/common/security/service/MemberPrincipalDetailService.java @@ -34,7 +34,7 @@ public class MemberPrincipalDetailService implements UserDetailsService { public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException { MemberVo member = memberMapper.findByLoginId(id); - // 없을경우 에러 발생 + //FailHandler 에서 처리 if(member == null) throw new UsernameNotFoundException("NOT_FOUND"); From 69f3b46a4911c2c874d33e81e32b34fede680c9f Mon Sep 17 00:00:00 2001 From: yoon Date: Thu, 23 Jan 2025 09:51:54 +0900 Subject: [PATCH 40/72] =?UTF-8?q?server.servlet.murtipart=20->=20Spring.se?= =?UTF-8?q?rvlet.murtipart=20db=EC=A0=95=EB=B3=B4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0138235..f683a96 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,11 +4,6 @@ project: time-zone: Asia/Seoul spring: - datasource: - url: jdbc:mariadb://192.168.0.251:3306/localnet - username: root - password: host1234 - driver-class-name: org.mariadb.jdbc.Driver devtools: livereload: enabled: true @@ -23,6 +18,10 @@ spring: web: resources: add-mappings: false + servlet: + multipart: + max-file-size: 10MB + max-request-size: 10MB mybatis: mapper-locations: classpath:mapper/**/*.xml @@ -77,9 +76,6 @@ server: http-only: true secure: true same-site: NONE - multipart: - max-file-size: 10MB - max-request-size: 10MB logging: level: From aa91b4191c747d50c03272c1217116d79b56e7c9 Mon Sep 17 00:00:00 2001 From: yoon Date: Thu, 23 Jan 2025 09:52:25 +0900 Subject: [PATCH 41/72] =?UTF-8?q?userController=EC=97=90=20RegisterControl?= =?UTF-8?q?ler=20=ED=95=A9=EC=B9=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/RegisterController.java | 97 ------------------- .../controller/common/UserController.java | 70 ++++++++++++- 2 files changed, 68 insertions(+), 99 deletions(-) delete mode 100644 src/main/java/io/company/localhost/controller/api/RegisterController.java diff --git a/src/main/java/io/company/localhost/controller/api/RegisterController.java b/src/main/java/io/company/localhost/controller/api/RegisterController.java deleted file mode 100644 index 7afcc98..0000000 --- a/src/main/java/io/company/localhost/controller/api/RegisterController.java +++ /dev/null @@ -1,97 +0,0 @@ -/************************************************************ - * - * @packageName : io.company.localhost.controller.api - * @fileName : RegisterController.java - * @author : 박지윤 - * @date : 25.01.17 - * @description : 등록신청 - * - * =========================================================== - * DATE AUTHOR NOTE - * ----------------------------------------------------------- - * 24.01.17 박지윤 최초 생성 - * - *************************************************************/ - -package io.company.localhost.controller.api; - -import java.util.List; - -import org.springframework.web.bind.annotation.GetMapping; -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.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.company.localhost.common.annotation.ParameterCheck; -import io.company.localhost.common.annotation.ReqMap; -import io.company.localhost.common.dto.ApiResponse; -import io.company.localhost.common.dto.MapDto; -import io.company.localhost.service.RegisterService; -import io.company.localhost.service.commoncodService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RequestMapping("/api/register") -@RestController -@RequiredArgsConstructor -public class RegisterController { - - private final commoncodService commoncodservice; - private final RegisterService registerService; - - /** - * 사용 가능 색상 조회 - * - * @return ApiResponse> - * - */ - @ParameterCheck - @GetMapping("/color") - public ApiResponse> getColorList() { - List ColorList = commoncodservice.getColorList(); - return ApiResponse.ok(ColorList); - } - - /** - * MBTI 목록 조회 - * - * @return ApiResponse> - * - */ - @ParameterCheck - @GetMapping("/mbti") - public ApiResponse> getMbtiList() { - List MbtiList = commoncodservice.getMbtiList(); - return ApiResponse.ok(MbtiList); - } - - /** - * 회원가입 - * - * @param profile - * @param map - * @return ApiResponse - * @throws RuntimeException 파일 업로드 실패 시 - */ - @PostMapping("/join") - public ApiResponse register(@RequestParam("profile") MultipartFile profile, @ReqMap MapDto map) { - int member = registerService.register(profile, map); - return ApiResponse.ok(member); - } - - /** - * 아이디 중복 체크 - * - * @param memberIds - * @return ApiResponse - * @throws IllegalArgumentException - */ - @GetMapping("/checkId") - public ApiResponse selectCheckId(@RequestParam String memberIds) { - boolean isDuplicate = registerService.selectCheckId(memberIds); - return ApiResponse.ok(!isDuplicate); - } -} diff --git a/src/main/java/io/company/localhost/controller/common/UserController.java b/src/main/java/io/company/localhost/controller/common/UserController.java index 9c526dd..7926f89 100644 --- a/src/main/java/io/company/localhost/controller/common/UserController.java +++ b/src/main/java/io/company/localhost/controller/common/UserController.java @@ -10,6 +10,7 @@ * DATE AUTHOR NOTE * ----------------------------------------------------------- * 24.12.06 조인제 최초 생성 + * 24.01.17 박지윤 Register 합침 * *************************************************************/ package io.company.localhost.controller.common; @@ -17,7 +18,12 @@ package io.company.localhost.controller.common; import io.company.localhost.common.annotation.Admin; import io.company.localhost.common.annotation.Guest; import io.company.localhost.common.annotation.Member; +import io.company.localhost.common.annotation.ParameterCheck; +import io.company.localhost.common.annotation.ReqMap; import io.company.localhost.common.dto.ApiResponse; +import io.company.localhost.common.dto.MapDto; +import io.company.localhost.service.RegisterService; +import io.company.localhost.service.commoncodService; import io.company.localhost.utils.AuthUtil; import io.company.localhost.utils.SessionListener; import io.company.localhost.vo.MemberVo; @@ -35,10 +41,14 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolderStrategy; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.web.bind.annotation.GetMapping; +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.RestController; +import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; +import java.util.List; import java.util.Map; import static org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY; @@ -48,7 +58,63 @@ import static org.springframework.security.web.authentication.rememberme.Abstrac @RequestMapping("/api/user") @RequiredArgsConstructor public class UserController { - + + private final commoncodService commoncodservice; + private final RegisterService registerService; + + /** + * 사용 가능 색상 조회 + * + * @return ApiResponse> + * + */ + @ParameterCheck + @GetMapping("/color") + public ApiResponse> getColorList() { + List ColorList = commoncodservice.getColorList(); + return ApiResponse.ok(ColorList); + } + + /** + * MBTI 목록 조회 + * + * @return ApiResponse> + * + */ + @ParameterCheck + @GetMapping("/mbti") + public ApiResponse> getMbtiList() { + List MbtiList = commoncodservice.getMbtiList(); + return ApiResponse.ok(MbtiList); + } + + /** + * 회원가입 + * + * @param profile + * @param map + * @return ApiResponse + * @throws RuntimeException 파일 업로드 실패 시 + */ + @PostMapping("/join") + public ApiResponse register(@RequestParam("profile") MultipartFile profile, @ReqMap MapDto map) { + int member = registerService.register(profile, map); + return ApiResponse.ok(member); + } + + /** + * 아이디 중복 체크 + * + * @param memberIds + * @return ApiResponse + * @throws IllegalArgumentException + */ + @GetMapping("/checkId") + public ApiResponse selectCheckId(@RequestParam String memberIds) { + boolean isDuplicate = registerService.selectCheckId(memberIds); + return ApiResponse.ok(!isDuplicate); + } + //security 인증 체크 @GetMapping("userInfo") @@ -132,7 +198,7 @@ public class UserController { return ApiResponse.ok(returnMessage); } - + @Guest @GetMapping("get1") From 9386b18ec4f987383cb1730b2489b54b35e74835 Mon Sep 17 00:00:00 2001 From: khj0414 Date: Thu, 23 Jan 2025 12:35:18 +0900 Subject: [PATCH 42/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 99347f4..e7b3acf 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -159,16 +159,17 @@ public class BoardController { map.put("LOCBRDPWD", encodedPassword); } +// <--- 프론드 단에서 해줌 할필요 없음 삭제 ---> // LOCBRDCON 필드를 JSON 문자열로 변환 - ObjectMapper objectMapper = new ObjectMapper(); - if (map.containsKey("LOCBRDCON")) { - try { - String jsonContent = objectMapper.writeValueAsString(map.get("LOCBRDCON")); - map.put("LOCBRDCON", jsonContent); // JSON 문자열로 변환된 값 설정 - } catch (Exception e) { - throw new RuntimeException("Error serializing LOCBRDCON field", e); - } - } +// ObjectMapper objectMapper = new ObjectMapper(); +// if (map.containsKey("LOCBRDCON")) { +// try { +// String jsonContent = objectMapper.writeValueAsString(map.get("LOCBRDCON")); +// map.put("LOCBRDCON", jsonContent); // JSON 문자열로 변환된 값 설정 +// } catch (Exception e) { +// throw new RuntimeException("Error serializing LOCBRDCON field", e); +// } +// } //로그인 미개발 ->임시 map.put("MEMBERSEQ", 1); From 5e35130d3cd215f1d14301b0f28be746824b467e Mon Sep 17 00:00:00 2001 From: yoon Date: Fri, 24 Jan 2025 10:00:24 +0900 Subject: [PATCH 43/72] =?UTF-8?q?=EC=83=81=EC=84=B8=EC=A3=BC=EC=86=8C,=20?= =?UTF-8?q?=EC=83=9D=EB=85=84=EC=9B=94=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mapper/netmemberMapper.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/mapper/netmemberMapper.xml b/src/main/resources/mapper/netmemberMapper.xml index bdebbb8..abd6805 100644 --- a/src/main/resources/mapper/netmemberMapper.xml +++ b/src/main/resources/mapper/netmemberMapper.xml @@ -43,7 +43,9 @@ MEMBERPWR, MEMBERPOS, MEMBERARR, + MEMBERDTL, MEMBERZIP, + MEMBERBTH, MEMBERTEL, MEMBERRDT, MEMBERCDT, @@ -63,7 +65,9 @@ #{memberPwr}, #{memberPos}, #{memberArr}, + #{memberDtl}, #{memberZip}, + #{memberBth}, #{memberTel}, #{memberRdt}, #{memberCdt}, From a479a60449bcc1a25f77f89bbd98b3738a8dda20 Mon Sep 17 00:00:00 2001 From: yoon Date: Fri, 24 Jan 2025 10:00:41 +0900 Subject: [PATCH 44/72] =?UTF-8?q?file-size=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f683a96..5099504 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -20,8 +20,8 @@ spring: add-mappings: false servlet: multipart: - max-file-size: 10MB - max-request-size: 10MB + max-file-size: 5MB + max-request-size: 5MB mybatis: mapper-locations: classpath:mapper/**/*.xml From ea9870be561ea2b72ab738393b5d84db6c884437 Mon Sep 17 00:00:00 2001 From: yoon Date: Fri, 24 Jan 2025 10:00:53 +0900 Subject: [PATCH 45/72] =?UTF-8?q?file=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/localhost/controller/common/UserController.java | 4 ++-- .../java/io/company/localhost/service/RegisterService.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/common/UserController.java b/src/main/java/io/company/localhost/controller/common/UserController.java index 7926f89..c5849e3 100644 --- a/src/main/java/io/company/localhost/controller/common/UserController.java +++ b/src/main/java/io/company/localhost/controller/common/UserController.java @@ -97,8 +97,8 @@ public class UserController { * @throws RuntimeException 파일 업로드 실패 시 */ @PostMapping("/join") - public ApiResponse register(@RequestParam("profile") MultipartFile profile, @ReqMap MapDto map) { - int member = registerService.register(profile, map); + public ApiResponse register(@RequestParam("memberPrf") MultipartFile memberPrf, @ReqMap MapDto map) { + int member = registerService.register(memberPrf, map); return ApiResponse.ok(member); } diff --git a/src/main/java/io/company/localhost/service/RegisterService.java b/src/main/java/io/company/localhost/service/RegisterService.java index abe74f6..12269ee 100644 --- a/src/main/java/io/company/localhost/service/RegisterService.java +++ b/src/main/java/io/company/localhost/service/RegisterService.java @@ -40,9 +40,9 @@ public class RegisterService { * @param map * @return */ - public int register(MultipartFile profile, MapDto map) { + public int register(MultipartFile memberPrf, MapDto map) { // 프로필 이미지 저장, 저장된 경로 가져옴 - String profilePath = fileService.uploadFile(profile, "profiles"); + String profilePath = fileService.uploadFile(memberPrf, "profiles"); map.put("memberPrf", profilePath); // 비밀번호 암호화 및 저장 @@ -53,7 +53,7 @@ public class RegisterService { map.put("memberRol", "ROLE_MEMBER"); map.put("memberPos", 500107); map.put("memberTkn", "Null"); - map.put("memberPrm", "N"); + map.put("memberPrm", "Y"); map.put("memberDel", "N"); map.put("memberLea", "N"); map.put("memberRdt", LocalDateTime.now()); From dac68fc3ebc4e4429c9ae1b7508cdcd3ac2b6809 Mon Sep 17 00:00:00 2001 From: khj0414 Date: Fri, 24 Jan 2025 10:29:41 +0900 Subject: [PATCH 46/72] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/UserController.java | 23 +++++++++++++++---- .../localhost/mapper/NetmemberMapper.java | 4 ++++ ...sterService.java => netmemberService.java} | 18 +++++++++++---- src/main/resources/mapper/netmemberMapper.xml | 16 +++++++++---- 4 files changed, 48 insertions(+), 13 deletions(-) rename src/main/java/io/company/localhost/service/{RegisterService.java => netmemberService.java} (85%) diff --git a/src/main/java/io/company/localhost/controller/common/UserController.java b/src/main/java/io/company/localhost/controller/common/UserController.java index c5849e3..23a8e4e 100644 --- a/src/main/java/io/company/localhost/controller/common/UserController.java +++ b/src/main/java/io/company/localhost/controller/common/UserController.java @@ -22,7 +22,7 @@ import io.company.localhost.common.annotation.ParameterCheck; import io.company.localhost.common.annotation.ReqMap; import io.company.localhost.common.dto.ApiResponse; import io.company.localhost.common.dto.MapDto; -import io.company.localhost.service.RegisterService; +import io.company.localhost.service.netmemberService; import io.company.localhost.service.commoncodService; import io.company.localhost.utils.AuthUtil; import io.company.localhost.utils.SessionListener; @@ -60,7 +60,7 @@ import static org.springframework.security.web.authentication.rememberme.Abstrac public class UserController { private final commoncodService commoncodservice; - private final RegisterService registerService; + private final netmemberService netmemberservice; /** * 사용 가능 색상 조회 @@ -97,8 +97,8 @@ public class UserController { * @throws RuntimeException 파일 업로드 실패 시 */ @PostMapping("/join") - public ApiResponse register(@RequestParam("memberPrf") MultipartFile memberPrf, @ReqMap MapDto map) { - int member = registerService.register(memberPrf, map); + public ApiResponse register(@RequestParam("profile") MultipartFile profile, @ReqMap MapDto map) { + int member = netmemberservice.register(profile, map); return ApiResponse.ok(member); } @@ -111,7 +111,7 @@ public class UserController { */ @GetMapping("/checkId") public ApiResponse selectCheckId(@RequestParam String memberIds) { - boolean isDuplicate = registerService.selectCheckId(memberIds); + boolean isDuplicate = netmemberservice.selectCheckId(memberIds); return ApiResponse.ok(!isDuplicate); } @@ -198,6 +198,19 @@ public class UserController { return ApiResponse.ok(returnMessage); } + /** + * 사원 목록 전체 조회 + * + * + * + */ + @ParameterCheck + @GetMapping("/allUserList") + public ApiResponse> getallUserList() { + List allUserList = netmemberservice.getallUserList(); + return ApiResponse.ok(allUserList); + } + @Guest diff --git a/src/main/java/io/company/localhost/mapper/NetmemberMapper.java b/src/main/java/io/company/localhost/mapper/NetmemberMapper.java index 7366371..fcaf28f 100644 --- a/src/main/java/io/company/localhost/mapper/NetmemberMapper.java +++ b/src/main/java/io/company/localhost/mapper/NetmemberMapper.java @@ -14,6 +14,8 @@ *************************************************************/ package io.company.localhost.mapper; +import java.util.List; + import org.apache.ibatis.annotations.Mapper; import io.company.localhost.common.dto.MapDto; @@ -27,4 +29,6 @@ public interface NetmemberMapper { int insertMember(MapDto map); int selectCheckId(String memberIds); + + List getallUserList(); } diff --git a/src/main/java/io/company/localhost/service/RegisterService.java b/src/main/java/io/company/localhost/service/netmemberService.java similarity index 85% rename from src/main/java/io/company/localhost/service/RegisterService.java rename to src/main/java/io/company/localhost/service/netmemberService.java index 12269ee..a228ca3 100644 --- a/src/main/java/io/company/localhost/service/RegisterService.java +++ b/src/main/java/io/company/localhost/service/netmemberService.java @@ -15,6 +15,7 @@ package io.company.localhost.service; import java.time.LocalDateTime; +import java.util.List; import org.springframework.security.crypto.password.DelegatingPasswordEncoder; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor -public class RegisterService { +public class netmemberService { private final NetmemberMapper memberMapper; private final commoncodMapper commoncodMapper; private final DelegatingPasswordEncoder passwordEncoder; @@ -40,9 +41,9 @@ public class RegisterService { * @param map * @return */ - public int register(MultipartFile memberPrf, MapDto map) { + public int register(MultipartFile profile, MapDto map) { // 프로필 이미지 저장, 저장된 경로 가져옴 - String profilePath = fileService.uploadFile(memberPrf, "profiles"); + String profilePath = fileService.uploadFile(profile, "profiles"); map.put("memberPrf", profilePath); // 비밀번호 암호화 및 저장 @@ -53,7 +54,7 @@ public class RegisterService { map.put("memberRol", "ROLE_MEMBER"); map.put("memberPos", 500107); map.put("memberTkn", "Null"); - map.put("memberPrm", "Y"); + map.put("memberPrm", "N"); map.put("memberDel", "N"); map.put("memberLea", "N"); map.put("memberRdt", LocalDateTime.now()); @@ -78,5 +79,14 @@ public class RegisterService { public boolean selectCheckId(String memberIds) { return memberMapper.selectCheckId(memberIds) > 0; } + /** + * 사원 목록 전체 조회 + * + * @param + * @return + */ + public List getallUserList() { + return memberMapper.getallUserList(); + } } diff --git a/src/main/resources/mapper/netmemberMapper.xml b/src/main/resources/mapper/netmemberMapper.xml index abd6805..5473067 100644 --- a/src/main/resources/mapper/netmemberMapper.xml +++ b/src/main/resources/mapper/netmemberMapper.xml @@ -43,9 +43,7 @@ MEMBERPWR, MEMBERPOS, MEMBERARR, - MEMBERDTL, MEMBERZIP, - MEMBERBTH, MEMBERTEL, MEMBERRDT, MEMBERCDT, @@ -65,9 +63,7 @@ #{memberPwr}, #{memberPos}, #{memberArr}, - #{memberDtl}, #{memberZip}, - #{memberBth}, #{memberTel}, #{memberRdt}, #{memberCdt}, @@ -85,5 +81,17 @@ FROM netmember WHERE MEMBERIDS = #{memberIds} + + From 4795be774812f9a8d959049e6064e81bfeab429a Mon Sep 17 00:00:00 2001 From: yoon Date: Fri, 24 Jan 2025 10:56:33 +0900 Subject: [PATCH 47/72] =?UTF-8?q?file=20=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/localhost/controller/common/UserController.java | 4 ++-- .../java/io/company/localhost/service/netmemberService.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/common/UserController.java b/src/main/java/io/company/localhost/controller/common/UserController.java index 23a8e4e..8137021 100644 --- a/src/main/java/io/company/localhost/controller/common/UserController.java +++ b/src/main/java/io/company/localhost/controller/common/UserController.java @@ -97,8 +97,8 @@ public class UserController { * @throws RuntimeException 파일 업로드 실패 시 */ @PostMapping("/join") - public ApiResponse register(@RequestParam("profile") MultipartFile profile, @ReqMap MapDto map) { - int member = netmemberservice.register(profile, map); + public ApiResponse register(@RequestParam("memberPrf") MultipartFile memberPrf, @ReqMap MapDto map) { + int member = netmemberservice.register(memberPrf, map); return ApiResponse.ok(member); } diff --git a/src/main/java/io/company/localhost/service/netmemberService.java b/src/main/java/io/company/localhost/service/netmemberService.java index a228ca3..46e9612 100644 --- a/src/main/java/io/company/localhost/service/netmemberService.java +++ b/src/main/java/io/company/localhost/service/netmemberService.java @@ -41,9 +41,9 @@ public class netmemberService { * @param map * @return */ - public int register(MultipartFile profile, MapDto map) { + public int register(MultipartFile memberPrf, MapDto map) { // 프로필 이미지 저장, 저장된 경로 가져옴 - String profilePath = fileService.uploadFile(profile, "profiles"); + String profilePath = fileService.uploadFile(memberPrf, "profiles"); map.put("memberPrf", profilePath); // 비밀번호 암호화 및 저장 From 897222821364fc72899487b24720f92b4c36ef2a Mon Sep 17 00:00:00 2001 From: yoon Date: Fri, 24 Jan 2025 11:06:34 +0900 Subject: [PATCH 48/72] =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/company/localhost/vo/MemberVo.java | 42 ++++++++++--------- src/main/resources/mapper/netmemberMapper.xml | 6 +++ 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/main/java/io/company/localhost/vo/MemberVo.java b/src/main/java/io/company/localhost/vo/MemberVo.java index 1b8449e..f7960eb 100644 --- a/src/main/java/io/company/localhost/vo/MemberVo.java +++ b/src/main/java/io/company/localhost/vo/MemberVo.java @@ -26,25 +26,27 @@ import java.util.Date; @ToString public class MemberVo { private Long id; - private String loginId; // 사용자 아이디 - private String role; // 권한 - private String token; // 토큰 - private String profile; // 프로필사진 - private String name; // 이름 - private String password; // 비밀번호 - private String passwordhint;// 비밀번호힌트 - private String passwordRes; // 비밀번호힌트답변 - private int position; // 직급 - private String address; // 주소 - private String zipcode; // 우편번호 - private String phone; // 전화번호 - private Date regist; // 가입요청일 - private Date isCdt; // 입사일 - private String isUsed; // 허가여부 - private String isDel; // 퇴사여부 - private String isLea; // 휴직여부 - private int color; // 색상 - private int mbit; // MBTI - private Boolean remember; // 로그인 유지 + private String loginId; // 사용자 아이디 + private String role; // 권한 + private String token; // 토큰 + private String profile; // 프로필사진 + private String name; // 이름 + private String password; // 비밀번호 + private String passwordhint; // 비밀번호힌트 + private String passwordRes; // 비밀번호힌트답변 + private int position; // 직급 + private String address; // 주소 + private String addressDetail; // 상세주소 + private String zipcode; // 우편번호 + private Date birth; // 생년월일 + private String phone; // 전화번호 + private Date regist; // 가입요청일 + private Date isCdt; // 입사일 + private String isUsed; // 허가여부 + private String isDel; // 퇴사여부 + private String isLea; // 휴직여부 + private int color; // 색상 + private int mbit; // MBTI + private Boolean remember; // 로그인 유지 } diff --git a/src/main/resources/mapper/netmemberMapper.xml b/src/main/resources/mapper/netmemberMapper.xml index 5473067..1dea72a 100644 --- a/src/main/resources/mapper/netmemberMapper.xml +++ b/src/main/resources/mapper/netmemberMapper.xml @@ -15,7 +15,9 @@ , MEMBERPWR AS passwordRes , MEMBERPOS AS position , MEMBERARR AS address + , MEMBERDTL AS addressDetail , MEMBERZIP AS zipcode + , MEMBERBTH AS birth , MEMBERTEL AS phone , MEMBERRDT AS regist , MEMBERCDT AS isCdt @@ -43,7 +45,9 @@ MEMBERPWR, MEMBERPOS, MEMBERARR, + MEMBERDTL, MEMBERZIP, + MEMBERBTH, MEMBERTEL, MEMBERRDT, MEMBERCDT, @@ -63,7 +67,9 @@ #{memberPwr}, #{memberPos}, #{memberArr}, + #{memberDtl}, #{memberZip}, + #{memberBth}, #{memberTel}, #{memberRdt}, #{memberCdt}, From d42e4fa0ca0bbebe856a92e58018574cf836f1f6 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 24 Jan 2025 12:38:24 +0900 Subject: [PATCH 49/72] =?UTF-8?q?=EB=B3=B8=EB=AC=B8=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 337 ++++-------------- .../localhost/service/localbordService.java | 181 ++++++++-- 2 files changed, 223 insertions(+), 295 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index e7b3acf..e1bd221 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -16,25 +16,11 @@ package io.company.localhost.controller.api; import java.math.BigInteger; -import java.nio.charset.StandardCharsets; -import java.sql.Blob; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.UUID; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.web.bind.annotation.DeleteMapping; -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.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageInfo; -import com.github.pagehelper.PageSerializable; import io.company.localhost.common.annotation.Member; import io.company.localhost.common.annotation.ParameterCheck; @@ -50,36 +36,19 @@ import lombok.extern.slf4j.Slf4j; @RequiredArgsConstructor @Slf4j public class BoardController { + private final localbordService boardService; - private final PasswordEncoder passwordEncoder; - + /** * 공지사항 목록 조회 * @ReqMap map 요청 파라미터 (searchKeyword) * @return 전체 공지사항 목록 */ @Member - @ParameterCheck + @ParameterCheck @GetMapping("/notices") public ApiResponse> getNotices(@ReqMap MapDto map) { - List posts = boardService.getNotices(map); - - // Blob 데이터를 처리 (문자열로 변환) - for (MapDto post : posts) { - Object content = post.get("content"); - if (content instanceof Blob) { - Blob blob = (Blob) content; - post.put("content", safeBlobToString(blob)); - } - - // "id" 값을 Number로 받고 longValue()로 변환 - Object idObject = post.get("id"); - long postId = ((Number) idObject).longValue(); - post.put("hasAttachment", boardService.hasAttachments(postId)); - - } - - return ApiResponse.ok(posts); + return ApiResponse.ok(boardService.getNotices(map)); } /** @@ -88,335 +57,169 @@ public class BoardController { * @return 페이징된 자유/익명 게시판 목록 */ @Member - @ParameterCheck + @ParameterCheck @GetMapping("/general") public ApiResponse> getGeneralPosts(@ReqMap MapDto map) { - PageInfo posts = boardService.getGeneralPosts(map); - - // Blob 데이터를 처리 (문자열로 변환) - for (MapDto post : posts.getList()) { - Object content = post.get("content"); - if (content instanceof Blob) { - Blob blob = (Blob) content; - post.put("content", safeBlobToString(blob)); - } - - // "id" 값을 Number로 받고 longValue()로 변환 - Object idObject = post.get("id"); - if (idObject instanceof Number) { - long postId = ((Number) idObject).longValue(); - post.put("commentCount", boardService.getCommentCount(postId)); - post.put("hasAttachment", boardService.hasAttachments(postId)); - MapDto reactions = boardService.getBoardReactions(postId); - post.put("likeCount", reactions.getOrDefault("likeCount", 0)); - post.put("dislikeCount", reactions.getOrDefault("dislikeCount", 0)); - } else { - post.put("commentCount", 0); // id가 없거나 잘못된 경우 기본값 설정 - } - } - - return ApiResponse.ok(posts); + return ApiResponse.ok(boardService.getGeneralPosts(map)); } /** - * 안전하게 Blob 데이터를 문자열로 변환하는 메서드 - * @ReqMap - * @return 변환된 문자열 또는 null - */ - private String safeBlobToString(Blob blob) { - if (blob == null) { - return null; // Blob이 null이면 null 반환 - } - - try { - long blobLength = blob.length(); - if (blobLength > Integer.MAX_VALUE) { - throw new IllegalArgumentException("Blob is too large to process."); - } - - return new String(blob.getBytes(1, (int) blobLength), StandardCharsets.UTF_8); - } catch (Exception e) { - System.err.println("Failed to convert Blob to String: " + e.getMessage()); - e.printStackTrace(); - return null; // 변환 실패 시 null 반환 - } - } - - /** * 게시물 작성 * @ReqMap map 요청 파라미터 (LOCBRDTTL, LOCBRDCON, MEMBERSEQ, LOCBRDTYP, - * LOCBRDPWD(익명일떄에만), LOCBRDCAT(지식커뮤니티만)) + * LOCBRDPWD(익명일 때만), LOCBRDCAT(지식커뮤니티만)) * @return 작성된 게시물의 ID */ - @Member - @ParameterCheck - @PostMapping - public ApiResponse createBoard(@ReqMap MapDto map) { - // 비밀번호 암호화 - if (map.containsKey("LOCBRDPWD")) { - String rawPassword = map.getString("LOCBRDPWD"); - String encodedPassword = passwordEncoder.encode(rawPassword); - map.put("LOCBRDPWD", encodedPassword); - } - -// <--- 프론드 단에서 해줌 할필요 없음 삭제 ---> - // LOCBRDCON 필드를 JSON 문자열로 변환 -// ObjectMapper objectMapper = new ObjectMapper(); -// if (map.containsKey("LOCBRDCON")) { -// try { -// String jsonContent = objectMapper.writeValueAsString(map.get("LOCBRDCON")); -// map.put("LOCBRDCON", jsonContent); // JSON 문자열로 변환된 값 설정 -// } catch (Exception e) { -// throw new RuntimeException("Error serializing LOCBRDCON field", e); -// } -// } - //로그인 미개발 ->임시 - map.put("MEMBERSEQ", 1); - - BigInteger createdIdx = boardService.createBoard(map); // 작성된 게시물의 idx를 반환 - Map responseData = new HashMap<>(); - responseData.put("CMNBRDSEQ", createdIdx); - responseData.put("message", "게시물이 작성되었습니다."); - return ApiResponse.ok(responseData); - } - - /** - * 첨부파일 추가 - * @ReqMap map 요청 파라미터 (CMNFLEREG, CMNFLESIZ, CMNFLEEXT, CMNFLEORG, CMNFLENAM, CMNFLEPAT, CMNBRDSEQ) - * @return 첨부파일 저장 결과 메시지 - */ - @Member - @ParameterCheck - @PostMapping("/{CMNBRDSEQ}/attachments") - public ApiResponse uploadAttachment(@ReqMap MapDto map) { - String filename = UUID.randomUUID().toString(); - map.put("CMNFLENAM", filename); - map.put("CMNFLEREG", 1); - // 파일 데이터 저장 - boardService.addAttachment(map); - - return ApiResponse.ok("첨부파일이 저장되었습니다."); + @Member + @ParameterCheck + @PostMapping + public ApiResponse createBoard(@ReqMap MapDto map) { + return ApiResponse.ok(boardService.createBoard(map)); } - - /** + + /** * 게시물 상세보기 * @param boardId 게시물 ID - * @return 게시물 상세정보, 첨부파일 목록, 댓글 목록 + * @return 게시물 상세정보 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @GetMapping("/{boardId}") public ApiResponse getBoardDetail(@PathVariable("boardId") Long boardId) { - log.info("Fetching details for board ID: {}", boardId); - - // 조회수 증가 - boardService.incrementViewCount(boardId); - - // 게시물 상세정보 조회 - MapDto boardDetail = boardService.getBoardDetail(boardId); - if (boardDetail == null) { - throw new IllegalArgumentException("Board not found for ID: " + boardId); - } - - // Blob 데이터를 문자열로 변환 - if (boardDetail.get("content") instanceof Blob) { - try { - Blob blob = (Blob) boardDetail.get("content"); - String contentString = new String(blob.getBytes(1, (int) blob.length()), StandardCharsets.UTF_8); - boardDetail.put("content", contentString); - } catch (Exception e) { - throw new RuntimeException("Failed to process Blob content", e); - } - } - - MapDto reactions = boardService.getBoardReactions(boardId); - boardDetail.put("likeCount", reactions.getOrDefault("likeCount", 0)); - boardDetail.put("dislikeCount", reactions.getOrDefault("dislikeCount", 0)); - - List attachments = boardService.getAttachments(boardId); - List comments = boardService.getComments(boardId.intValue()); - - List commentReactions = boardService.getCommentReactions(boardId); - for (MapDto comment : comments) { - Integer commentId = (Integer) comment.get("LOCCMTSEQ"); - for (MapDto reaction : commentReactions) { - if (reaction.get("LOCCMTSEQ").equals(commentId)) { - comment.put("likeCount", reaction.getOrDefault("likeCount", 0)); - comment.put("dislikeCount", reaction.getOrDefault("dislikeCount", 0)); - } - } - } - - // 결과 조합 - MapDto result = new MapDto(); - result.put("boardDetail", boardDetail); - result.put("attachments", attachments); - result.put("comments", comments); - result.put("commentCount", boardService.getCommentCount(boardId)); - result.put("hasAttachment", boardService.hasAttachments(boardId)); - - return ApiResponse.ok(result); + return ApiResponse.ok(boardService.getBoardDetail(boardId)); } - - /** + + /** * 게시물 삭제 * @param boardId 게시물 ID * @return 삭제 결과 메시지 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @DeleteMapping("/{boardId}") public ApiResponse deleteBoard(@PathVariable("boardId") Long boardId, @ReqMap MapDto map) { map.put("LOCBRDSEQ", boardId); - log.info("Deleting board with ID: {}", boardId); boardService.deleteBoard(map); return ApiResponse.ok("게시물이 삭제되었습니다."); } - - /** + + /** * 게시물 수정 * @param boardId 게시물 ID * @ReqMap map 수정 데이터 (LOCBRDTTL, LOCBRDCON) * @return 수정 결과 메시지 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @PutMapping("/{boardId}") - public ApiResponse updateBoard(@PathVariable("boardId") Long boardId,@ReqMap MapDto map) { - map.put("LOCBRDSEQ", boardId); + public ApiResponse updateBoard(@PathVariable("boardId") Long boardId, @ReqMap MapDto map) { + map.put("LOCBRDSEQ", boardId); boardService.updateBoard(map); return ApiResponse.ok("게시물이 수정되었습니다."); } - - /** - * 게시물,댓글 좋아요/싫어요 추가 + + /** + * 첨부파일 추가 + * @ReqMap map 요청 파라미터 (CMNFLEREG, CMNFLESIZ, CMNFLEEXT, CMNFLEORG, CMNFLENAM, CMNFLEPAT, CMNBRDSEQ) + * @return 첨부파일 저장 결과 메시지 + */ + @Member + @ParameterCheck + @PostMapping("/{CMNBRDSEQ}/attachments") + public ApiResponse uploadAttachment(@ReqMap MapDto map) { + boardService.addAttachment(map); + return ApiResponse.ok("첨부파일이 저장되었습니다."); + } + + /** + * 게시물, 댓글 좋아요/싫어요 추가 * @ReqMap map 데이터 (LOCCMTSEQ, MEMBERSEQ, LOCGOBGOD, LOCGOBBAD, LOCBRDSEQ) * @return 반응 추가 결과 메시지 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @PostMapping("/{LOCBRDSEQ}/{LOCCMTSEQ}/reaction") public ApiResponse reactToBoard(@ReqMap MapDto map) { - //로그인 미개발 ->임시 - map.put("MEMBERSEQ", 1); boardService.reactToBoard(map); return ApiResponse.ok("반응이 성공적으로 처리되었습니다."); } - /** * 댓글/대댓글 조회 * @param boardId 게시물 ID * @return 댓글과 대댓글의 계층 구조 데이터 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @GetMapping("/{boardId}/comments") public ApiResponse> getComments(@PathVariable("boardId") int boardId) { - // 모든 댓글과 대댓글 조회 - List comments = boardService.getComments(boardId); - - return ApiResponse.ok(comments); + return ApiResponse.ok(boardService.getComments(boardId)); } - - /** + /** * 댓글/대댓글 작성 * @param boardId 게시물 ID * @ReqMap map 댓글 데이터 (LOCBRDSEQ, LOCCMTRPY, LOCCMTPNT, LOCCMTPWD, MEMBERSEQ 등) * @return 작성 결과 메시지 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @PostMapping("/{LOCBRDSEQ}/comment") public ApiResponse addCommentOrReply(@ReqMap MapDto map) { - //로그인 미개발 ->임시 - map.put("MEMBERSEQ", 1); - - // 비밀번호 암호화 (비밀번호가 있는 경우에만) - if (map.containsKey("LOCCMTPWD")) { - String rawPassword = map.getString("LOCCMTPWD"); - String encodedPassword = passwordEncoder.encode(rawPassword); - map.put("LOCCMTPWD", encodedPassword); - } - boardService.addCommentOrReply(map); return ApiResponse.ok("댓글 또는 대댓글이 작성되었습니다."); } - /** + /** * 댓글/대댓글 수정 * @param commentId 댓글 ID - * @ReqMap map 수정 데이터 (LOCCMTSEQ, LOCCMTRPY ) + * @ReqMap map 수정 데이터 (LOCCMTSEQ, LOCCMTRPY) * @return 수정 결과 메시지 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @PutMapping("/comment/{commentId}") public ApiResponse updateComment(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { - // 기존 댓글 조회 - MapDto existingComment = boardService.getCommentById(commentId); - if (existingComment == null) { - throw new IllegalArgumentException("Comment not found for ID: " + commentId); - } - - map.put("LOCCMTSEQ", commentId); boardService.updateComment(map); - return ApiResponse.ok("댓글이 수정되었습니다."); } - /** + /** * 댓글/대댓글 삭제 * @param commentId 댓글 ID + * @ReqMap map 삭제 데이터 * @return 삭제 결과 메시지 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @DeleteMapping("/comment/{commentId}") public ApiResponse deleteComment(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { - map.put("LOCCMTSEQ", commentId); boardService.deleteComment(map); - return ApiResponse.ok("댓글이 삭제되었습니다."); } - /** + /** * 댓글 비밀번호 확인 * @param commentId 댓글 ID * @ReqMap map 비밀번호 데이터 * @return 비밀번호 확인 결과 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @PostMapping("/comment/{commentId}/password") public ApiResponse checkCommentPassword(@PathVariable("commentId") int commentId, @ReqMap MapDto map) { - // DB에서 암호화된 비밀번호 조회 - String storedPassword = boardService.getCommentPassword(commentId); - String rawPassword = map.getString("LOCCMTPWD"); - - // 비밀번호 검증 - boolean isMatch = passwordEncoder.matches(rawPassword, storedPassword); - return ApiResponse.ok(isMatch); + return ApiResponse.ok(boardService.getCommentPassword(commentId).equals(map.getString("LOCCMTPWD"))); } - /** + /** * 게시물 비밀번호 확인 * @param boardId 게시물 ID * @ReqMap map 비밀번호 데이터 * @return 비밀번호 확인 결과 */ - @Member - @ParameterCheck + @Member + @ParameterCheck @PostMapping("/{boardId}/password") public ApiResponse checkBoardPassword(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { - // DB에서 암호화된 비밀번호 조회 - String storedPassword = boardService.getBoardPassword(boardId); - String rawPassword = map.getString("LOCBRDPWD"); - - // 비밀번호 검증 - boolean isMatch = passwordEncoder.matches(rawPassword, storedPassword); - return ApiResponse.ok(isMatch); + return ApiResponse.ok(boardService.getBoardPassword(boardId).equals(map.getString("LOCBRDPWD"))); } - -} +} \ No newline at end of file diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index b74afea..7a36ee2 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -1,11 +1,15 @@ package io.company.localhost.service; +import java.io.ByteArrayInputStream; import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; import org.springframework.stereotype.Service; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -20,13 +24,15 @@ public class localbordService { private final localbordMapper boardMapper; public List getNotices(MapDto map) { - return boardMapper.getNotices(map); + List posts = boardMapper.getNotices(map); + enrichPostsWithAdditionalData(posts); + return posts; } public PageInfo getGeneralPosts(MapDto map) { int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 10; - + String orderBy = map.getString("orderBy"); if (orderBy == null || (!orderBy.equals("date") && !orderBy.equals("views"))) { map.put("orderBy", "date"); @@ -35,33 +41,38 @@ public class localbordService { PageHelper.startPage(page, size); List result = boardMapper.getGeneralPosts(map); + enrichPostsWithAdditionalData(result); return PageUtil.redefineNavigation(new PageInfo<>(result, size)); } - + public void incrementViewCount(Long boardId) { boardMapper.incrementViewCount(boardId); } public BigInteger createBoard(MapDto map) { boardMapper.createBoard(map); - return (BigInteger) map.get("LOCBRDSEQ"); // Mapper에서 자동 생성된 key를 가져옴 + return (BigInteger) map.get("LOCBRDSEQ"); } - + public void addAttachment(MapDto map) { boardMapper.addAttachment(map); } - + public MapDto getBoardDetail(Long boardId) { - return boardMapper.selectBoardDetail(boardId); + MapDto boardDetail = boardMapper.selectBoardDetail(boardId); + if (boardDetail != null) { + enrichBoardDetail(boardDetail); + } + return boardDetail; } public List getAttachments(Long boardId) { return boardMapper.selectAttachments(boardId); } - + public void deleteBoard(MapDto map) { - boardMapper.deleteCommentsByBoardId(map); + boardMapper.deleteCommentsByBoardId(map); boardMapper.deleteBoard(map); } @@ -70,14 +81,11 @@ public class localbordService { } public void reactToBoard(MapDto map) { - // 기존 반응 확인 MapDto existingReaction = boardMapper.findReaction(map); if (existingReaction != null) { - // 기존 반응이 있는 경우 업데이트 boardMapper.updateReaction(map); } else { - // 기존 반응이 없는 경우 새로 삽입 boardMapper.insertReaction(map); } } @@ -87,8 +95,8 @@ public class localbordService { } public void addCommentOrReply(MapDto map) { - if (map.get("LOCCMTPNT") == null) { - map.put("LOCCMTPNT", null); + if (map.get("LOCCMTPNT") == null) { + map.put("LOCCMTPNT", null); } boardMapper.addCommentOrReply(map); } @@ -98,22 +106,17 @@ public class localbordService { } public void deleteComment(MapDto map) { - // 댓글인지 대댓글인지 확인 boolean isReply = boardMapper.isReply(map); if (isReply) { - // 대댓글 삭제 - boardMapper.deleteReply(map); + boardMapper.deleteReply(map); } else { - // 댓글인 경우 boolean hasReplies = boardMapper.hasReplies(map); if (hasReplies) { - // 대댓글이 있는 경우 내용 업데이트 - boardMapper.softDeleteComment(map); + boardMapper.softDeleteComment(map); } else { - // 대댓글이 없는 경우 댓글 삭제 - boardMapper.deleteComment(map); + boardMapper.deleteComment(map); } } } @@ -121,24 +124,24 @@ public class localbordService { public String getCommentPassword(int commentId) { return boardMapper.selectCommentPassword(commentId); } - + public String getBoardPassword(int boardId) { return boardMapper.selectBoardPassword(boardId); } - + public MapDto getCommentById(int commentId) { return boardMapper.getCommentById(commentId); } - + public int getCommentCount(Long boardId) { return boardMapper.countComments(boardId); } - + public boolean hasAttachments(Long boardId) { int count = boardMapper.countAttachments(boardId); return count > 0; } - + public MapDto getBoardReactions(Long boardId) { return boardMapper.getBoardReactions(boardId); } @@ -147,6 +150,128 @@ public class localbordService { return boardMapper.getCommentReactions(boardId); } -} + private void enrichBoardDetail(MapDto boardDetail) { + long boardId = ((Number) boardDetail.get("id")).longValue(); + boardDetail.put("hasAttachment", hasAttachments(boardId)); + boardDetail.put("commentCount", getCommentCount(boardId)); + MapDto reactions = getBoardReactions(boardId); + boardDetail.put("likeCount", reactions.getOrDefault("likeCount", 0)); + boardDetail.put("dislikeCount", reactions.getOrDefault("dislikeCount", 0)); + // Blob 데이터를 문자열로 변환 + Object content = boardDetail.get("content"); + if (content != null) { + String contentString = convertBlobToString(content); // Blob을 문자열로 변환 + boardDetail.put("content", contentString); // JSON 변환 가능 + } + } + private String convertBlobToString(Object blob) { + try { + if (blob instanceof String) { + return (String) blob; // 이미 문자열인 경우 반환 + } else if (blob instanceof java.sql.Blob) { + java.sql.Blob sqlBlob = (java.sql.Blob) blob; + long blobLength = sqlBlob.length(); + byte[] blobBytes = sqlBlob.getBytes(1, (int) blobLength); + return new String(blobBytes, StandardCharsets.UTF_8); + } else if (blob instanceof ByteArrayInputStream) { + ByteArrayInputStream inputStream = (ByteArrayInputStream) blob; + byte[] bytes = inputStream.readAllBytes(); + return new String(bytes, StandardCharsets.UTF_8); + } else { + System.err.println("Unsupported blob type: " + blob.getClass()); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Failed to convert Blob to String: " + e.getMessage(), e); + } + return null; + } + + private String extractFirstImageUrl(String jsonContent) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(jsonContent); + + if (!rootNode.isArray()) { + System.err.println("JSON content is not an array"); + return null; + } + + for (JsonNode node : rootNode) { + JsonNode insertNode = node.get("insert"); + if (insertNode != null && insertNode.has("image")) { + return insertNode.get("image").asText(); // 첫 번째 이미지 URL 반환 + } + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Failed to extract first image URL: " + e.getMessage(), e); + } + return null; // 이미지가 없는 경우 + } + + private String extractPlainTextFromJson(String jsonContent) { + StringBuilder plainTextBuilder = new StringBuilder(); + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(jsonContent); + + // JSON 배열인지 확인 + if (!rootNode.isArray()) { + System.err.println("JSON content is not an array"); + return ""; + } + + // JSON 노드 순회 + for (JsonNode node : rootNode) { + JsonNode insertNode = node.get("insert"); + + // insert 노드가 텍스트인지 확인 + if (insertNode != null && insertNode.isTextual()) { + String text = insertNode.asText(); + + // '\n' 제거하고 순수 텍스트만 추가 + if (!text.trim().isEmpty() && !text.trim().equals("\n")) { + plainTextBuilder.append(text.trim()); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Failed to extract plain text: " + e.getMessage(), e); + } + return plainTextBuilder.toString(); + } + + private void enrichPostsWithAdditionalData(List posts) { + for (MapDto post : posts) { + Object idObject = post.get("id"); + if (idObject instanceof Number) { + long postId = ((Number) idObject).longValue(); + post.put("commentCount", getCommentCount(postId)); + post.put("hasAttachment", hasAttachments(postId)); + MapDto reactions = getBoardReactions(postId); + post.put("likeCount", reactions.getOrDefault("likeCount", 0)); + post.put("dislikeCount", reactions.getOrDefault("dislikeCount", 0)); + + Object content = post.get("content"); + if (content != null) { + String contentString = convertBlobToString(content); + post.put("content", contentString); + + // 첫 번째 이미지 URL 및 순수 텍스트 추출 + String firstImageUrl = extractFirstImageUrl(contentString); + post.put("firstImageUrl", firstImageUrl); + + String plainContent = extractPlainTextFromJson(contentString); + post.put("plainContent", plainContent); + } + } else { + post.put("commentCount", 0); + } + } + } + +} \ No newline at end of file From e9a4cf12763b098aed10b33f6d9e4f8f7e610bd1 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 24 Jan 2025 12:51:05 +0900 Subject: [PATCH 50/72] =?UTF-8?q?=EB=B3=B4=EB=93=9C=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/service/localbordService.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 7a36ee2..de07c5d 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -191,14 +191,15 @@ public class localbordService { private String extractFirstImageUrl(String jsonContent) { try { + // JSON 유효성 검사 + if (!isValidJson(jsonContent)) { + throw new IllegalArgumentException("Invalid JSON content: " + jsonContent); + } + ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonContent); - if (!rootNode.isArray()) { - System.err.println("JSON content is not an array"); - return null; - } - + // JSON 배열 순회 for (JsonNode node : rootNode) { JsonNode insertNode = node.get("insert"); if (insertNode != null && insertNode.has("image")) { @@ -212,6 +213,16 @@ public class localbordService { return null; // 이미지가 없는 경우 } + private boolean isValidJson(String json) { + try { + final ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.readTree(json); // JSON 파싱 시도 + return true; // JSON이 유효하면 true 반환 + } catch (Exception e) { + return false; // 유효하지 않은 경우 false 반환 + } + } + private String extractPlainTextFromJson(String jsonContent) { StringBuilder plainTextBuilder = new StringBuilder(); try { @@ -257,20 +268,15 @@ public class localbordService { post.put("dislikeCount", reactions.getOrDefault("dislikeCount", 0)); Object content = post.get("content"); - if (content != null) { - String contentString = convertBlobToString(content); - post.put("content", contentString); + String contentString = convertBlobToString(content); + post.put("content", contentString); - // 첫 번째 이미지 URL 및 순수 텍스트 추출 - String firstImageUrl = extractFirstImageUrl(contentString); - post.put("firstImageUrl", firstImageUrl); + String firstImageUrl = extractFirstImageUrl(contentString); + post.put("firstImageUrl", firstImageUrl); - String plainContent = extractPlainTextFromJson(contentString); - post.put("plainContent", plainContent); + String plainContent = extractPlainTextFromJson(contentString); + post.put("plainContent", plainContent); } - } else { - post.put("commentCount", 0); - } } } From 165f9d7fd5001f0770b1b4fb197a7594bab67201 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 24 Jan 2025 12:54:54 +0900 Subject: [PATCH 51/72] =?UTF-8?q?=EC=82=AC=EC=9B=90id=20=EC=9E=84=EC=8B=9C?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/localhost/controller/api/BoardController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index e1bd221..75469c8 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -73,6 +73,8 @@ public class BoardController { @ParameterCheck @PostMapping public ApiResponse createBoard(@ReqMap MapDto map) { + //임시 + map.put("MEMBERSEQ", 1); return ApiResponse.ok(boardService.createBoard(map)); } @@ -139,6 +141,8 @@ public class BoardController { @ParameterCheck @PostMapping("/{LOCBRDSEQ}/{LOCCMTSEQ}/reaction") public ApiResponse reactToBoard(@ReqMap MapDto map) { + //임시 + map.put("MEMBERSEQ", 1); boardService.reactToBoard(map); return ApiResponse.ok("반응이 성공적으로 처리되었습니다."); } @@ -165,6 +169,8 @@ public class BoardController { @ParameterCheck @PostMapping("/{LOCBRDSEQ}/comment") public ApiResponse addCommentOrReply(@ReqMap MapDto map) { + //임시 + map.put("MEMBERSEQ", 1); boardService.addCommentOrReply(map); return ApiResponse.ok("댓글 또는 대댓글이 작성되었습니다."); } From 873463f538789ab20643268ae30fed2356842098 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 24 Jan 2025 13:36:40 +0900 Subject: [PATCH 52/72] =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EC=88=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/io/company/localhost/service/localbordService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index de07c5d..771451e 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -60,6 +60,7 @@ public class localbordService { } public MapDto getBoardDetail(Long boardId) { + incrementViewCount(boardId); MapDto boardDetail = boardMapper.selectBoardDetail(boardId); if (boardDetail != null) { enrichBoardDetail(boardDetail); From 9deed49a02648c686ce35bf4a4d263e16324d0dc Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 24 Jan 2025 13:53:00 +0900 Subject: [PATCH 53/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=B2=A8?= =?UTF-8?q?=EB=B6=80=ED=8C=8C=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/company/localhost/controller/api/BoardController.java | 2 ++ .../java/io/company/localhost/service/localbordService.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 75469c8..d545e55 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -128,6 +128,8 @@ public class BoardController { @ParameterCheck @PostMapping("/{CMNBRDSEQ}/attachments") public ApiResponse uploadAttachment(@ReqMap MapDto map) { + //임시 + map.put("CMNFLEREG", 1); boardService.addAttachment(map); return ApiResponse.ok("첨부파일이 저장되었습니다."); } diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 771451e..a06495d 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -5,6 +5,7 @@ import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; +import java.util.UUID; import org.springframework.stereotype.Service; @@ -56,6 +57,8 @@ public class localbordService { } public void addAttachment(MapDto map) { + String newFilename = UUID.randomUUID().toString(); + map.put("CMNFLENAM", newFilename); boardMapper.addAttachment(map); } From 237e60d1a778e2d88a559cd9cf30e8bcd8780571 Mon Sep 17 00:00:00 2001 From: yoon Date: Fri, 24 Jan 2025 14:25:57 +0900 Subject: [PATCH 54/72] =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EA=B2=BD=EB=A1=9C=20=EB=B3=80=EA=B2=BD,=20?= =?UTF-8?q?=ED=97=88=EA=B0=80=EC=97=AC=EB=B6=80=20Y?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/company/localhost/service/FileService.java | 7 +++---- .../io/company/localhost/service/netmemberService.java | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/company/localhost/service/FileService.java b/src/main/java/io/company/localhost/service/FileService.java index abb6708..d1662c6 100644 --- a/src/main/java/io/company/localhost/service/FileService.java +++ b/src/main/java/io/company/localhost/service/FileService.java @@ -38,11 +38,10 @@ public class FileService { * 파일 업로드 * * @param file - * @param directory * @return * @throws RuntimeException */ - public String uploadFile(MultipartFile file, String directory) { + public String uploadFile(MultipartFile file) { try { // 원본 파일명 String originalFilename = file.getOriginalFilename(); @@ -52,7 +51,7 @@ public class FileService { String newFilename = UUID.randomUUID().toString() + "." + extension; // 최종 저장 경로 생성 (기본경로 + 하위디렉토리 + 파일명) - Path targetPath = Paths.get(uploadPath, directory, newFilename); + Path targetPath = Paths.get(uploadPath, newFilename); // 저장될 디렉토리가 없는 경우 생성 Files.createDirectories(targetPath.getParent()); @@ -60,7 +59,7 @@ public class FileService { Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING); // 저장된 파일의 상대 경로 반환 - return directory + "/" + newFilename; + return newFilename; } catch (IOException e) { throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); diff --git a/src/main/java/io/company/localhost/service/netmemberService.java b/src/main/java/io/company/localhost/service/netmemberService.java index 46e9612..68baf89 100644 --- a/src/main/java/io/company/localhost/service/netmemberService.java +++ b/src/main/java/io/company/localhost/service/netmemberService.java @@ -43,7 +43,7 @@ public class netmemberService { */ public int register(MultipartFile memberPrf, MapDto map) { // 프로필 이미지 저장, 저장된 경로 가져옴 - String profilePath = fileService.uploadFile(memberPrf, "profiles"); + String profilePath = fileService.uploadFile(memberPrf); map.put("memberPrf", profilePath); // 비밀번호 암호화 및 저장 @@ -54,7 +54,7 @@ public class netmemberService { map.put("memberRol", "ROLE_MEMBER"); map.put("memberPos", 500107); map.put("memberTkn", "Null"); - map.put("memberPrm", "N"); + map.put("memberPrm", "Y"); map.put("memberDel", "N"); map.put("memberLea", "N"); map.put("memberRdt", LocalDateTime.now()); From 22afbcb0933e4efc77b1abac5b8d94852b638493 Mon Sep 17 00:00:00 2001 From: khj0414 Date: Fri, 24 Jan 2025 14:29:35 +0900 Subject: [PATCH 55/72] =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/company/localhost/common/config/WebMvcConfig.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/io/company/localhost/common/config/WebMvcConfig.java b/src/main/java/io/company/localhost/common/config/WebMvcConfig.java index 28acccc..2d8d0c5 100644 --- a/src/main/java/io/company/localhost/common/config/WebMvcConfig.java +++ b/src/main/java/io/company/localhost/common/config/WebMvcConfig.java @@ -41,6 +41,9 @@ public class WebMvcConfig implements WebMvcConfigurer { @Value("${filePath.boardfile}") private String boardFilePath; + + @Value("${filePath.profile}") + private String uploadPath; @Override public void addInterceptors(InterceptorRegistry registry) { @@ -58,6 +61,9 @@ public class WebMvcConfig implements WebMvcConfigurer { //게시판 에디터 안 이미지 업로드 경로 registry.addResourceHandler("/upload/img/board/**") .addResourceLocations("file:" + boardFilePath); + //프로필 이미지 업로드 경로 + registry.addResourceHandler("/upload/img/profile/**") + .addResourceLocations("file:" + uploadPath); } // Controller의 파라미터를 처리할 Resolver 등록 From dce245ab713ae0ae473f4816b12371e2e13af8e4 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 24 Jan 2025 14:44:47 +0900 Subject: [PATCH 56/72] =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=9A=A9=EB=9F=89?= =?UTF-8?q?=EC=A0=9C=ED=95=9C=EA=B2=80=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/service/localbordService.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index a06495d..71e4b77 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -23,6 +23,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class localbordService { private final localbordMapper boardMapper; + private static final long MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB public List getNotices(MapDto map) { List posts = boardMapper.getNotices(map); @@ -55,13 +56,28 @@ public class localbordService { boardMapper.createBoard(map); return (BigInteger) map.get("LOCBRDSEQ"); } + + public void addAttachment(MapDto map) { + String boardSeqStr = (String) map.get("CMNBRDSEQ"); + Long boardSeq = Long.parseLong(boardSeqStr); + map.put("CMNBRDSEQ", boardSeq); + + String newFilename = UUID.randomUUID().toString(); + map.put("CMNFLENAM", newFilename); - public void addAttachment(MapDto map) { - String newFilename = UUID.randomUUID().toString(); - map.put("CMNFLENAM", newFilename); boardMapper.addAttachment(map); } + public void validateAttachmentsSize(List attachments) { + long totalSize = attachments.stream() + .mapToLong(attachment -> (Long) attachment.get("size")) + .sum(); + + if (totalSize > MAX_FILE_SIZE) { + throw new IllegalArgumentException("첨부파일의 총 용량이 5MB를 초과합니다."); + } + } + public MapDto getBoardDetail(Long boardId) { incrementViewCount(boardId); MapDto boardDetail = boardMapper.selectBoardDetail(boardId); From 1d3f7d7ddc25c66eca561b1fbd4824354dd3873f Mon Sep 17 00:00:00 2001 From: yoon Date: Mon, 3 Feb 2025 14:43:38 +0900 Subject: [PATCH 57/72] login token --- .../security/config/SecurityConfig.java | 16 ++- .../handler/MemberAuthSuccessHandler.java | 60 ++++++--- .../service/CustomRememberMeServices.java | 72 +++-------- .../common/security/service/TokenService.java | 121 ++++++++++++++++++ .../localhost/mapper/NetmemberMapper.java | 2 + ...mberService.java => NetmemberService.java} | 9 +- src/main/resources/mapper/netmemberMapper.xml | 8 ++ 7 files changed, 219 insertions(+), 69 deletions(-) create mode 100644 src/main/java/io/company/localhost/common/security/service/TokenService.java rename src/main/java/io/company/localhost/service/{netmemberService.java => NetmemberService.java} (92%) diff --git a/src/main/java/io/company/localhost/common/security/config/SecurityConfig.java b/src/main/java/io/company/localhost/common/security/config/SecurityConfig.java index e8e6819..a0af78e 100644 --- a/src/main/java/io/company/localhost/common/security/config/SecurityConfig.java +++ b/src/main/java/io/company/localhost/common/security/config/SecurityConfig.java @@ -21,10 +21,14 @@ import io.company.localhost.common.security.handler.MemberAuthSuccessHandler; import io.company.localhost.common.security.handler.RestAccessDeniedHandler; import io.company.localhost.common.security.handler.RestAuthenticationEntryPointHandler; import io.company.localhost.common.security.service.CustomRememberMeServices; +import io.company.localhost.common.security.service.TokenService; import io.company.localhost.common.security.service.MemberPrincipalDetailService; import io.company.localhost.common.security.session.AuthenticationSessionControlStrategy; import io.company.localhost.common.security.session.CustomSessionRegistryImpl; +import io.company.localhost.service.NetmemberService; import lombok.RequiredArgsConstructor; + +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; @@ -52,6 +56,7 @@ public class SecurityConfig { private final MemberPrincipalDetailService userDetailsService; private final MemberAuthSuccessHandler successHandler; private final MemberAuthFailureHandler failureHandler; + private final NetmemberService netmemberService; private final AuthorizationManager authorizationManager; // 세션 관련 상수 설정 @@ -63,6 +68,9 @@ public class SecurityConfig { // API 경로 관련 상수 설정 final String SECURITY_BASE_URL = "/api/user"; final String LOGIN_URL = SECURITY_BASE_URL + "/login"; + + final String LOGIN_KEY = "loginSecretKey"; + // 보안 필터 체인 설정 @Bean @@ -115,9 +123,15 @@ public class SecurityConfig { @Bean public RememberMeServices rememberMeServices(){ - return new CustomRememberMeServices(REMEMBER_KEY , userDetailsService); + return new CustomRememberMeServices(tokenService(), userDetailsService); + } + + @Bean + public TokenService tokenService() { + return new TokenService(REMEMBER_KEY, LOGIN_KEY); } + // 세션 관리 protected ConcurrentSessionControlAuthenticationStrategy sessionControlStrategy() { AuthenticationSessionControlStrategy sessionControlStrategy = new AuthenticationSessionControlStrategy(sessionRegistry()); diff --git a/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java b/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java index e125983..d79fa78 100644 --- a/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java +++ b/src/main/java/io/company/localhost/common/security/handler/MemberAuthSuccessHandler.java @@ -16,10 +16,15 @@ package io.company.localhost.common.security.handler; import com.fasterxml.jackson.databind.ObjectMapper; import io.company.localhost.common.dto.ApiResponse; +import io.company.localhost.common.security.service.TokenService; +import io.company.localhost.service.NetmemberService; +import io.company.localhost.vo.MemberVo; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import lombok.extern.slf4j.Slf4j; + +import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.security.core.Authentication; @@ -31,25 +36,48 @@ import java.io.IOException; @Slf4j @Component("successHandler") -public class MemberAuthSuccessHandler implements AuthenticationSuccessHandler{ +public class MemberAuthSuccessHandler implements AuthenticationSuccessHandler { - @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { - ObjectMapper mapper = new ObjectMapper(); + private final TokenService tokenService; + private final NetmemberService netmemberService; - response.setStatus(HttpStatus.OK.value()); - response.setContentType(MediaType.APPLICATION_JSON_VALUE); + public MemberAuthSuccessHandler(@Lazy TokenService tokenService, NetmemberService netmemberService) { + this.tokenService = tokenService; + this.netmemberService = netmemberService; + } - response.getWriter().write(mapper.writeValueAsString(ApiResponse.ok("Success"))); - - clearAuthenticationAttributes(request); - } - - protected final void clearAuthenticationAttributes(HttpServletRequest request) { - HttpSession session = request.getSession(false); - if (session == null) { + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, + Authentication authentication) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + + // 로그인 성공한 사용자 가져오기 + Object principal = authentication.getPrincipal(); + if (!(principal instanceof MemberVo member)) { + response.setStatus(HttpStatus.UNAUTHORIZED.value()); return; } - session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); - } + + // 로그인 토큰 생성 + String username = member.getLoginId(); + String loginToken = tokenService.generateToken(username, "login"); + + // DB에 저장 + netmemberService.updateMemberToken(username, loginToken); + + response.setStatus(HttpStatus.OK.value()); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + + response.getWriter().write(mapper.writeValueAsString(ApiResponse.ok("Success"))); + + clearAuthenticationAttributes(request); + } + + protected final void clearAuthenticationAttributes(HttpServletRequest request) { + HttpSession session = request.getSession(false); + if (session == null) { + return; + } + session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); + } } diff --git a/src/main/java/io/company/localhost/common/security/service/CustomRememberMeServices.java b/src/main/java/io/company/localhost/common/security/service/CustomRememberMeServices.java index 724c266..4470c42 100644 --- a/src/main/java/io/company/localhost/common/security/service/CustomRememberMeServices.java +++ b/src/main/java/io/company/localhost/common/security/service/CustomRememberMeServices.java @@ -10,11 +10,12 @@ * DATE AUTHOR NOTE * ----------------------------------------------------------- * 24.12.06 조인제 최초 생성 - * + * 24.02.03 박지윤 토큰 로직 변경 *************************************************************/ package io.company.localhost.common.security.service; import io.company.localhost.common.security.details.MemberPrincipalDetails; +import io.company.localhost.service.NetmemberService; import io.company.localhost.vo.MemberVo; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; @@ -27,8 +28,6 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.authentication.RememberMeServices; -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -38,12 +37,13 @@ public class CustomRememberMeServices implements RememberMeServices { private static final String REMEMBER_ME_COOKIE_NAME = "remember-me"; private static final long TOKEN_VALIDITY_SECONDS = 60 * 60 * 24 * 365; // 1 year private static final String DELIMITER = ":"; + - private final String secretKey; + private final TokenService tokenService; private final UserDetailsService userDetailsService; - public CustomRememberMeServices(String secretKey, UserDetailsService userDetailsService) { - this.secretKey = secretKey; + public CustomRememberMeServices(TokenService tokenService, UserDetailsService userDetailsService) { + this.tokenService = tokenService; this.userDetailsService = userDetailsService; } @@ -55,33 +55,22 @@ public class CustomRememberMeServices implements RememberMeServices { return null; } - String[] tokenParts = decodeAndSplitCookie(rememberMeCookie.getValue()); - if (tokenParts == null || tokenParts.length != 3) { - return null; - } + String token = rememberMeCookie.getValue(); + + if (!tokenService.validateToken(token, "rememberme")) { + return null; + } - String username = tokenParts[0]; - long expiryTime; - try { - expiryTime = Long.parseLong(tokenParts[1]); - } catch (NumberFormatException e) { - return null; - } - - String signature = tokenParts[2]; - if (!isTokenValid(username, expiryTime, signature)) { - return null; - } - - if (System.currentTimeMillis() > expiryTime) { - return null; - } + String[] tokenParts = decodeAndSplitCookie(token); + String username = tokenParts[0]; UserDetails userDetails = userDetailsService.loadUserByUsername(username); if (userDetails != null) { MemberPrincipalDetails memberDetails = (MemberPrincipalDetails) userDetails; MemberVo memberVo = memberDetails.member(); - RememberMeAuthenticationToken auth = new RememberMeAuthenticationToken(secretKey, memberVo, userDetails.getAuthorities()); + + String rememberMeSecretKey = tokenService.getRememberMeSecretKey(); + RememberMeAuthenticationToken auth = new RememberMeAuthenticationToken(rememberMeSecretKey, memberVo, userDetails.getAuthorities()); auth.setAuthenticated(true); SecurityContextHolder.getContext().setAuthentication(auth); return auth; @@ -104,10 +93,11 @@ public class CustomRememberMeServices implements RememberMeServices { } String username = member.getLoginId(); - long expiryTime = System.currentTimeMillis() + (TOKEN_VALIDITY_SECONDS * 1000); - String signature = generateSignature(username, expiryTime); - String tokenValue = encodeToken(username, expiryTime, signature); + String tokenValue = tokenService.generateToken(username, "rememberme"); + String loginToken = tokenService.generateToken(username, "login"); + // DB에 저장 +// netmemberService.updateMemberToken(username, loginToken); SecurityContextHolder.getContext().setAuthentication(successfulAuthentication); @@ -148,25 +138,5 @@ public class CustomRememberMeServices implements RememberMeServices { return null; } } - - private String encodeToken(String username, long expiryTime, String signature) { - String tokenValue = username + DELIMITER + expiryTime + DELIMITER + signature; - return Base64.getEncoder().encodeToString(tokenValue.getBytes(StandardCharsets.UTF_8)); - } - - private boolean isTokenValid(String username, long expiryTime, String signature) { - String expectedSignature = generateSignature(username, expiryTime); - return expectedSignature.equals(signature); - } - - private String generateSignature(String username, long expiryTime) { - try { - String data = username + DELIMITER + expiryTime; - Mac mac = Mac.getInstance("HmacSHA256"); - mac.init(new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); - return Base64.getEncoder().encodeToString(mac.doFinal(data.getBytes(StandardCharsets.UTF_8))); - } catch (Exception e) { - throw new IllegalStateException("Failed to generate signature", e); - } - } + } diff --git a/src/main/java/io/company/localhost/common/security/service/TokenService.java b/src/main/java/io/company/localhost/common/security/service/TokenService.java new file mode 100644 index 0000000..165b0e8 --- /dev/null +++ b/src/main/java/io/company/localhost/common/security/service/TokenService.java @@ -0,0 +1,121 @@ +/************************************************************ + * + * @packageName : io.company.localhost.common.security.service + * @fileName : TokenService.java + * @author : 박지윤 + * @date : 24.01.24 + * @description : + * + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 24.01.24 박지윤 최초 생성 + *************************************************************/ +package io.company.localhost.common.security.service; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import org.springframework.stereotype.Service; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class TokenService { + private static final long REMBER_TOKEN_VALIDITY_SECONDS = 60 * 60 * 24 * 365; // 1년 + private static final long LOGIN_TOKEN_VALIDITY_SECONDS = 60 * 60 * 24 * 365; // 하루 + private static final String DELIMITER = ":"; + private final String rememberMeSecretKey; + private final String loginSecretKey; + + public TokenService(String rememberMeSecretKey, String loginSecretKey) { + this.rememberMeSecretKey = rememberMeSecretKey; + this.loginSecretKey = loginSecretKey; + } + + public String generateToken(String username, String tokenType) { + long expiryTime; + + // 토큰타입에 따라 만료기간 다르게 설정 + if ("rememberme".equals(tokenType)) { + expiryTime = System.currentTimeMillis() + (REMBER_TOKEN_VALIDITY_SECONDS * 1000); + } else if ("login".equals(tokenType)) { + expiryTime = System.currentTimeMillis() + (LOGIN_TOKEN_VALIDITY_SECONDS * 1000); + } else { + throw new IllegalArgumentException("Invalid token type"); + } + + String signature = generateSignature(username, expiryTime, tokenType); + return encodeToken(username, expiryTime, signature); + } + + public boolean validateToken(String token, String tokenType) { + try { + String[] tokenParts = decodeAndSplitToken(token); + if (tokenParts == null || tokenParts.length != 3) { + return false; + } + + String username = tokenParts[0]; + long expiryTime; + try { + expiryTime = Long.parseLong(tokenParts[1]); + } catch (NumberFormatException e) { + return false; + } + + String signature = tokenParts[2]; + if (!isTokenValid(username, expiryTime, signature, tokenType)) { + return false; + } + + return System.currentTimeMillis() <= expiryTime; + } catch (Exception e) { + return false; + } + } + + + private String generateSignature(String username, long expiryTime, String tokenType) { + try { + // tokenType에 따라 login 또는 remember secretKey 사용 + String secretKeyToUse = "rememberme".equals(tokenType) ? rememberMeSecretKey : loginSecretKey; + + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(secretKeyToUse.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); + String data = username + DELIMITER + expiryTime; + return Base64.getEncoder().encodeToString(mac.doFinal(data.getBytes(StandardCharsets.UTF_8))); + } catch (Exception e) { + throw new IllegalStateException("Failed to generate signature", e); + } + } + + + private String encodeToken(String username, long expiryTime, String signature) { + String tokenValue = username + DELIMITER + expiryTime + DELIMITER + signature; + return Base64.getEncoder().encodeToString(tokenValue.getBytes(StandardCharsets.UTF_8)); + } + + private String[] decodeAndSplitToken(String token) { + try { + String decodedValue = new String(Base64.getDecoder().decode(token), StandardCharsets.UTF_8); + return decodedValue.split(DELIMITER); + } catch (Exception e) { + return null; + } + } + + private boolean isTokenValid(String username, long expiryTime, String signature, String tokenType) { + String expectedSignature = generateSignature(username, expiryTime, tokenType); + return expectedSignature.equals(signature); + } + + public String getRememberMeSecretKey() { + return rememberMeSecretKey; + } + +} \ No newline at end of file diff --git a/src/main/java/io/company/localhost/mapper/NetmemberMapper.java b/src/main/java/io/company/localhost/mapper/NetmemberMapper.java index fcaf28f..3020353 100644 --- a/src/main/java/io/company/localhost/mapper/NetmemberMapper.java +++ b/src/main/java/io/company/localhost/mapper/NetmemberMapper.java @@ -26,6 +26,8 @@ public interface NetmemberMapper { MemberVo findByLoginId(String id); + int updateMemberToken(String id, String token); + int insertMember(MapDto map); int selectCheckId(String memberIds); diff --git a/src/main/java/io/company/localhost/service/netmemberService.java b/src/main/java/io/company/localhost/service/NetmemberService.java similarity index 92% rename from src/main/java/io/company/localhost/service/netmemberService.java rename to src/main/java/io/company/localhost/service/NetmemberService.java index 68baf89..e00f7df 100644 --- a/src/main/java/io/company/localhost/service/netmemberService.java +++ b/src/main/java/io/company/localhost/service/NetmemberService.java @@ -19,6 +19,7 @@ import java.util.List; import org.springframework.security.crypto.password.DelegatingPasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import io.company.localhost.common.dto.MapDto; @@ -28,7 +29,7 @@ import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor -public class netmemberService { +public class NetmemberService { private final NetmemberMapper memberMapper; private final commoncodMapper commoncodMapper; private final DelegatingPasswordEncoder passwordEncoder; @@ -79,6 +80,7 @@ public class netmemberService { public boolean selectCheckId(String memberIds) { return memberMapper.selectCheckId(memberIds) > 0; } + /** * 사원 목록 전체 조회 * @@ -89,4 +91,9 @@ public class netmemberService { return memberMapper.getallUserList(); } + + @Transactional + public void updateMemberToken(String id, String token) { + memberMapper.updateMemberToken(id, token); + } } diff --git a/src/main/resources/mapper/netmemberMapper.xml b/src/main/resources/mapper/netmemberMapper.xml index 1dea72a..e79edec 100644 --- a/src/main/resources/mapper/netmemberMapper.xml +++ b/src/main/resources/mapper/netmemberMapper.xml @@ -32,6 +32,13 @@ MEMBERIDS = #{id} + + UPDATE netmember + SET MEMBERTKN = #{token} + WHERE MEMBERIDS = #{id} + + + INSERT INTO netmember ( @@ -87,6 +94,7 @@ FROM netmember WHERE MEMBERIDS = #{memberIds} + - + From 849b99e475d26b3c63d7734b31920791491450a4 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 3 Feb 2025 15:33:02 +0900 Subject: [PATCH 61/72] =?UTF-8?q?=EB=B3=B4=EB=93=9C=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/controller/api/BoardController.java | 14 +++++++++++++- .../controller/api/VacationController.java | 12 ++++-------- .../company/localhost/mapper/commoncodMapper.java | 2 ++ .../company/localhost/mapper/localvacaMapper.java | 2 +- .../localhost/service/commoncodService.java | 5 ++++- .../localhost/service/localbordService.java | 2 +- .../localhost/service/localvacaService.java | 8 ++++---- src/main/resources/mapper/commoncodMapper.xml | 5 +++++ src/main/resources/mapper/localbordMapper.xml | 2 +- src/main/resources/mapper/localvacaMapper.xml | 2 +- 10 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index d545e55..3cb1643 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -27,6 +27,7 @@ import io.company.localhost.common.annotation.ParameterCheck; import io.company.localhost.common.annotation.ReqMap; import io.company.localhost.common.dto.ApiResponse; import io.company.localhost.common.dto.MapDto; +import io.company.localhost.service.commoncodService; import io.company.localhost.service.localbordService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -38,6 +39,7 @@ import lombok.extern.slf4j.Slf4j; public class BoardController { private final localbordService boardService; + private final commoncodService commoncodService; /** * 공지사항 목록 조회 @@ -74,7 +76,7 @@ public class BoardController { @PostMapping public ApiResponse createBoard(@ReqMap MapDto map) { //임시 - map.put("MEMBERSEQ", 1); + map.put("MEMBERSEQ", 1); return ApiResponse.ok(boardService.createBoard(map)); } @@ -230,4 +232,14 @@ public class BoardController { public ApiResponse checkBoardPassword(@PathVariable("boardId") int boardId, @ReqMap MapDto map) { return ApiResponse.ok(boardService.getBoardPassword(boardId).equals(map.getString("LOCBRDPWD"))); } + + /** + * 카테고리 목록 조회 + * @return 카테고리 리스트 + */ + @GetMapping("/categories") + public ApiResponse> getCategories() { + List categories = commoncodService.getCategoryList(); + return ApiResponse.ok(categories); + } } \ No newline at end of file diff --git a/src/main/java/io/company/localhost/controller/api/VacationController.java b/src/main/java/io/company/localhost/controller/api/VacationController.java index 60dda49..e8d110a 100644 --- a/src/main/java/io/company/localhost/controller/api/VacationController.java +++ b/src/main/java/io/company/localhost/controller/api/VacationController.java @@ -23,13 +23,9 @@ public class VacationController { private final localvacaService localVacaService; @PostMapping - public ApiResponse saveVacations(@RequestBody List vacationRequests) { - // 요청 데이터 유효성 검사 - if (vacationRequests == null || vacationRequests.isEmpty()) { - throw new IllegalArgumentException("휴가 요청 데이터가 비어 있습니다."); - } + public ApiResponse saveVacations(@RequestBody List map) { - for (MapDto request : vacationRequests) { + for (MapDto request : map) { // 각 요청 데이터의 필수 값 검증 Integer employeeId = (Integer) request.get("employeeId"); String date = request.getString("date"); @@ -51,10 +47,10 @@ public class VacationController { * 휴가 정보를 조회하여 프론트엔드로 전달 */ @GetMapping("/list") - public ApiResponse> getVacationList() { + public ApiResponse> getVacationList(@ReqMap MapDto map) { // 서비스 호출을 통해 데이터 조회 - List vacationList = localVacaService.getVacationList(); + List vacationList = localVacaService.getVacationList(map); return ApiResponse.ok(vacationList); } diff --git a/src/main/java/io/company/localhost/mapper/commoncodMapper.java b/src/main/java/io/company/localhost/mapper/commoncodMapper.java index 46255a6..daf7eea 100644 --- a/src/main/java/io/company/localhost/mapper/commoncodMapper.java +++ b/src/main/java/io/company/localhost/mapper/commoncodMapper.java @@ -32,4 +32,6 @@ public interface commoncodMapper { List getMbtiList(); int updateColorYon(String color); + + List getCategories(); } diff --git a/src/main/java/io/company/localhost/mapper/localvacaMapper.java b/src/main/java/io/company/localhost/mapper/localvacaMapper.java index b6bca47..21bb469 100644 --- a/src/main/java/io/company/localhost/mapper/localvacaMapper.java +++ b/src/main/java/io/company/localhost/mapper/localvacaMapper.java @@ -12,7 +12,7 @@ import io.company.localhost.common.dto.MapDto; public interface localvacaMapper { void insertVacation(MapDto map); - List findVacations(); + List findVacations(MapDto map); } diff --git a/src/main/java/io/company/localhost/service/commoncodService.java b/src/main/java/io/company/localhost/service/commoncodService.java index 2db79e1..2ea168b 100644 --- a/src/main/java/io/company/localhost/service/commoncodService.java +++ b/src/main/java/io/company/localhost/service/commoncodService.java @@ -43,6 +43,9 @@ public class commoncodService { public List getMbtiList() { return commoncodmapper.getMbtiList(); } - + + public List getCategoryList() { + return commoncodmapper.getCategories(); + } } diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 71e4b77..5e28d64 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -33,7 +33,7 @@ public class localbordService { public PageInfo getGeneralPosts(MapDto map) { int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; - int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 10; + int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 12; String orderBy = map.getString("orderBy"); if (orderBy == null || (!orderBy.equals("date") && !orderBy.equals("views"))) { diff --git a/src/main/java/io/company/localhost/service/localvacaService.java b/src/main/java/io/company/localhost/service/localvacaService.java index 91086c3..b932f60 100644 --- a/src/main/java/io/company/localhost/service/localvacaService.java +++ b/src/main/java/io/company/localhost/service/localvacaService.java @@ -14,12 +14,12 @@ public class localvacaService { private final localvacaMapper localvacaMapper; - public void insertVacation(MapDto vacationRequest) { - localvacaMapper.insertVacation(vacationRequest); + public void insertVacation(MapDto map) { + localvacaMapper.insertVacation(map); } - public List getVacationList() { - return localvacaMapper.findVacations(); + public List getVacationList(MapDto map) { + return localvacaMapper.findVacations(map); } } diff --git a/src/main/resources/mapper/commoncodMapper.xml b/src/main/resources/mapper/commoncodMapper.xml index 710c47e..a4c7c92 100644 --- a/src/main/resources/mapper/commoncodMapper.xml +++ b/src/main/resources/mapper/commoncodMapper.xml @@ -62,5 +62,10 @@ WHERE CMNCODVAL = #{color}; + + diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index 7d451c4..de7e078 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -62,7 +62,7 @@ diff --git a/src/main/resources/mapper/localvacaMapper.xml b/src/main/resources/mapper/localvacaMapper.xml index a926273..6138a15 100644 --- a/src/main/resources/mapper/localvacaMapper.xml +++ b/src/main/resources/mapper/localvacaMapper.xml @@ -9,7 +9,7 @@ - SELECT MEMBERSEQ LOCVACUDT, From 50d3787a69a4e6dd42b1249ad7f22b12efcb30dc Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Mon, 3 Feb 2025 16:16:46 +0900 Subject: [PATCH 62/72] =?UTF-8?q?=EA=B3=B5=ED=86=B5=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mapper/localbordMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index de7e078..9230de1 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -11,7 +11,7 @@ LOCBRDUDT AS date, LOCBRDCNT AS cnt FROM localbord - WHERE LOCBRDTYP = 'N' + WHERE LOCBRDTYP = '300103' AND LOCBRDTTL LIKE CONCAT('%', #{searchKeyword}, '%') @@ -27,7 +27,7 @@ LOCBRDUDT AS date, LOCBRDCNT AS cnt FROM localbord - WHERE LOCBRDTYP IN ('F', 'S') + WHERE LOCBRDTYP IN ('300101', '300102') AND LOCBRDTTL LIKE CONCAT('%', #{searchKeyword}, '%') From 7dea6891650339b7a03511516f7f62481815091d Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Tue, 4 Feb 2025 16:08:03 +0900 Subject: [PATCH 63/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/company/localhost/service/localbordService.java | 3 ++- src/main/resources/mapper/localvacaMapper.xml | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 5e28d64..7e6550a 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -32,8 +32,9 @@ public class localbordService { } public PageInfo getGeneralPosts(MapDto map) { + System.out.println(map); int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; - int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 12; + int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 10; String orderBy = map.getString("orderBy"); if (orderBy == null || (!orderBy.equals("date") && !orderBy.equals("views"))) { diff --git a/src/main/resources/mapper/localvacaMapper.xml b/src/main/resources/mapper/localvacaMapper.xml index 6138a15..e4b4694 100644 --- a/src/main/resources/mapper/localvacaMapper.xml +++ b/src/main/resources/mapper/localvacaMapper.xml @@ -8,10 +8,10 @@ VALUES (#{employeeId}, #{date}, #{type}, NOW()) - + SELECT - CMNCODVAL + CMNCODVAL ,CMNCODNAM FROM commoncod @@ -56,6 +56,18 @@ CMNCODODR != 0 + + UPDATE commoncod SET CMNCODYON = 1 From 74272f323319d38dd256d361609c26139964794e Mon Sep 17 00:00:00 2001 From: yoon Date: Thu, 6 Feb 2025 14:22:09 +0900 Subject: [PATCH 65/72] =?UTF-8?q?=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EC=9E=AC=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/UserController.java | 192 +++++++++++------- .../localhost/mapper/NetmemberMapper.java | 5 + .../localhost/service/NetmemberService.java | 136 ++++++++----- src/main/resources/mapper/netmemberMapper.xml | 17 ++ 4 files changed, 223 insertions(+), 127 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/common/UserController.java b/src/main/java/io/company/localhost/controller/common/UserController.java index 604463e..5626e28 100644 --- a/src/main/java/io/company/localhost/controller/common/UserController.java +++ b/src/main/java/io/company/localhost/controller/common/UserController.java @@ -41,6 +41,7 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolderStrategy; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -58,65 +59,114 @@ import static org.springframework.security.web.authentication.rememberme.Abstrac @RequestMapping("/api/user") @RequiredArgsConstructor public class UserController { - + private final commoncodService commoncodservice; private final NetmemberService netmemberservice; + + /** + * 사용 가능 색상 조회 + * + * @return ApiResponse> + * + */ + @ParameterCheck + @GetMapping("/color") + public ApiResponse> getColorList() { + List ColorList = commoncodservice.getColorList(); + return ApiResponse.ok(ColorList); + } + + /** + * MBTI 목록 조회 + * + * @return ApiResponse> + * + */ + @ParameterCheck + @GetMapping("/mbti") + public ApiResponse> getMbtiList() { + List MbtiList = commoncodservice.getMbtiList(); + return ApiResponse.ok(MbtiList); + } + + /** + * 비밀번호 힌트 목록 조회 + * + * @return ApiResponse> + * + */ + @ParameterCheck + @GetMapping("/pwhint") + public ApiResponse> getPwhintList() { + List PwhintList = commoncodservice.getPwhintList(); + return ApiResponse.ok(PwhintList); + } + + /** + * 회원가입 + * + * @param profile + * @param map + * @return ApiResponse + * @throws RuntimeException 파일 업로드 실패 시 + */ + @PostMapping("/join") + public ApiResponse register(@RequestParam("memberPrf") MultipartFile memberPrf, @ReqMap MapDto map) { + int member = netmemberservice.register(memberPrf, map); + return ApiResponse.ok(member); + } + + /** + * 아이디 중복 체크 + * + * @param memberIds + * @return ApiResponse + * + */ + @GetMapping("/checkId") + public ApiResponse selectCheckId(@RequestParam String memberIds) { + boolean isDuplicate = netmemberservice.selectCheckId(memberIds); + return ApiResponse.ok(!isDuplicate); + } + + /** + * 로그인 여부 체크 + * + * @return ApiResponse + */ + @GetMapping("/isLogin") + public ApiResponse checkLogin() { + boolean isLoggedIn = AuthUtil.isLoggedIn(); + return ApiResponse.ok(isLoggedIn); + } + + /** + * 비밀번호 재설정 member 체크 + * + * @param map + * @return ApiResponse + * + */ + @PostMapping("/pwReset") + public ApiResponse selectPwReset(@ReqMap MapDto map) { + boolean isPwReset = netmemberservice.selectPwReset(map); + return ApiResponse.ok(isPwReset); + } /** - * 사용 가능 색상 조회 - * - * @return ApiResponse> - * - */ - @ParameterCheck - @GetMapping("/color") - public ApiResponse> getColorList() { - List ColorList = commoncodservice.getColorList(); - return ApiResponse.ok(ColorList); - } - - /** - * MBTI 목록 조회 - * - * @return ApiResponse> - * - */ - @ParameterCheck - @GetMapping("/mbti") - public ApiResponse> getMbtiList() { - List MbtiList = commoncodservice.getMbtiList(); - return ApiResponse.ok(MbtiList); - } - - /** - * 회원가입 - * - * @param profile - * @param map - * @return ApiResponse - * @throws RuntimeException 파일 업로드 실패 시 - */ - @PostMapping("/join") - public ApiResponse register(@RequestParam("memberPrf") MultipartFile memberPrf, @ReqMap MapDto map) { - int member = netmemberservice.register(memberPrf, map); - return ApiResponse.ok(member); - } - - /** - * 아이디 중복 체크 - * - * @param memberIds - * @return ApiResponse - * @throws IllegalArgumentException - */ - @GetMapping("/checkId") - public ApiResponse selectCheckId(@RequestParam String memberIds) { - boolean isDuplicate = netmemberservice.selectCheckId(memberIds); - return ApiResponse.ok(!isDuplicate); - } - + * 비밀번호 재설정 + * + * @param map + * @return ApiResponse + * + */ + @PatchMapping("/pwNew") + public ApiResponse updatePassword(@ReqMap MapDto map) { + boolean isPwNew = netmemberservice.updatePassword(map); + return ApiResponse.ok(isPwNew); + } - //security 인증 체크 + // security 인증 체크 @GetMapping("userInfo") public ApiResponse getUserInfo(@AuthenticationPrincipal MemberVo memberVo) { SecurityContextHolderStrategy contextHolderStrategy = SecurityContextHolder.getContextHolderStrategy(); @@ -133,9 +183,9 @@ public class UserController { return ApiResponse.ok(memberVo); } - //유저 세션 체크 + // 유저 세션 체크 @GetMapping(value = "check") - public ApiResponse check(){ + public ApiResponse check() { Map sessions = SessionListener.getSessions(); Map sessionData = new HashMap<>(); @@ -172,10 +222,7 @@ public class UserController { return ApiResponse.ok(remember); } - - - - //로그아웃 + // 로그아웃 @Guest @GetMapping("/logout") public ApiResponse logout(HttpServletRequest request, HttpServletResponse response) { @@ -198,20 +245,19 @@ public class UserController { return ApiResponse.ok(returnMessage); } - /** - * 사원 목록 전체 조회 - * - * - * - */ - @ParameterCheck - @GetMapping("/allUserList") - public ApiResponse> getallUserList() { - List allUserList = netmemberservice.getallUserList(); - return ApiResponse.ok(allUserList); - } - + /** + * 사원 목록 전체 조회 + * + * + * + */ + @ParameterCheck + @GetMapping("/allUserList") + public ApiResponse> getallUserList() { + List allUserList = netmemberservice.getallUserList(); + return ApiResponse.ok(allUserList); + } @Guest @GetMapping("get1") diff --git a/src/main/java/io/company/localhost/mapper/NetmemberMapper.java b/src/main/java/io/company/localhost/mapper/NetmemberMapper.java index 3020353..39fbbc1 100644 --- a/src/main/java/io/company/localhost/mapper/NetmemberMapper.java +++ b/src/main/java/io/company/localhost/mapper/NetmemberMapper.java @@ -31,6 +31,11 @@ public interface NetmemberMapper { int insertMember(MapDto map); int selectCheckId(String memberIds); + + int selectPwReset(MapDto map); + + int updatePassword(MapDto map); List getallUserList(); + } diff --git a/src/main/java/io/company/localhost/service/NetmemberService.java b/src/main/java/io/company/localhost/service/NetmemberService.java index e00f7df..1302eef 100644 --- a/src/main/java/io/company/localhost/service/NetmemberService.java +++ b/src/main/java/io/company/localhost/service/NetmemberService.java @@ -34,66 +34,94 @@ public class NetmemberService { private final commoncodMapper commoncodMapper; private final DelegatingPasswordEncoder passwordEncoder; private final FileService fileService; - + /** - * 회원 가입 - * - * @param profile - * @param map - * @return - */ - public int register(MultipartFile memberPrf, MapDto map) { - // 프로필 이미지 저장, 저장된 경로 가져옴 - String profilePath = fileService.uploadFile(memberPrf); - map.put("memberPrf", profilePath); - - // 비밀번호 암호화 및 저장 - String encodedPassword = passwordEncoder.encode(map.getString("memberPwd")); - map.put("memberPwd", encodedPassword); - - // 회원 기본 정보 설정 - map.put("memberRol", "ROLE_MEMBER"); - map.put("memberPos", 500107); - map.put("memberTkn", "Null"); - map.put("memberPrm", "Y"); - map.put("memberDel", "N"); - map.put("memberLea", "N"); - map.put("memberRdt", LocalDateTime.now()); - map.put("memberCdt", LocalDateTime.now()); - - // 회원 정보 저장 - int result = memberMapper.insertMember(map); - - // 선택한 색상 코드 사용 처리 - String color = map.getString("memberCol"); - commoncodMapper.updateColorYon(color); - - return result; - } - - /** - * 아이디 중복 체크 - * - * @param memberIds - * @return - */ - public boolean selectCheckId(String memberIds) { - return memberMapper.selectCheckId(memberIds) > 0; - } - - /** - * 사원 목록 전체 조회 - * - * @param - * @return - */ + * 회원 가입 + * + * @param profile + * @param map + * @return + */ + public int register(MultipartFile memberPrf, MapDto map) { + // 프로필 이미지 저장, 저장된 경로 가져옴 + String profilePath = fileService.uploadFile(memberPrf); + map.put("memberPrf", profilePath); + + // 비밀번호 암호화 및 저장 + String encodedPassword = passwordEncoder.encode(map.getString("memberPwd")); + map.put("memberPwd", encodedPassword); + + // 회원 기본 정보 설정 + map.put("memberRol", "ROLE_MEMBER"); + map.put("memberPos", 500107); + map.put("memberTkn", "Null"); + map.put("memberPrm", "Y"); + map.put("memberDel", "N"); + map.put("memberLea", "N"); + map.put("memberRdt", LocalDateTime.now()); + map.put("memberCdt", LocalDateTime.now()); + + // 회원 정보 저장 + int result = memberMapper.insertMember(map); + + // 선택한 색상 코드 사용 처리 + String color = map.getString("memberCol"); + commoncodMapper.updateColorYon(color); + + return result; + } + + /** + * 아이디 중복 체크 + * + * @param memberIds + * @return + */ + public boolean selectCheckId(String memberIds) { + return memberMapper.selectCheckId(memberIds) > 0; + } + + /** + * 사원 목록 전체 조회 + * + * @param + * @return + */ public List getallUserList() { return memberMapper.getallUserList(); } - - @Transactional + /** + * 로그인 토큰 + * + * @param id, token + * @return + */ public void updateMemberToken(String id, String token) { memberMapper.updateMemberToken(id, token); } + + /** + * 비밀번호 재설정 member 체크 + * + * @param map + * @return + */ + public boolean selectPwReset(MapDto map) { + return memberMapper.selectPwReset(map) > 0; + } + + /** + * 비밀번호 재설정 + * + * @param map + * @return + */ + public boolean updatePassword(MapDto map) { + String encodedPassword = passwordEncoder.encode(map.getString("password")); + map.put("password", encodedPassword); + System.out.println("암호화된 비밀번호: " + encodedPassword); + return memberMapper.updatePassword(map) > 0; + } + } diff --git a/src/main/resources/mapper/netmemberMapper.xml b/src/main/resources/mapper/netmemberMapper.xml index e79edec..689ae90 100644 --- a/src/main/resources/mapper/netmemberMapper.xml +++ b/src/main/resources/mapper/netmemberMapper.xml @@ -95,6 +95,23 @@ WHERE MEMBERIDS = #{memberIds} + + + + + + UPDATE netmember + SET MEMBERPWD = #{password} + WHERE MEMBERIDS = #{id} + + + + + + UPDATE netmember From bbb1bc4eae307afc38f24ba26509293d83d82cdd Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Fri, 7 Feb 2025 15:25:28 +0900 Subject: [PATCH 72/72] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EB=A7=81=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/BoardController.java | 19 ++++---- src/main/resources/mapper/localbordMapper.xml | 43 +++++++++++-------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/main/java/io/company/localhost/controller/api/BoardController.java b/src/main/java/io/company/localhost/controller/api/BoardController.java index 3cb1643..b306e51 100644 --- a/src/main/java/io/company/localhost/controller/api/BoardController.java +++ b/src/main/java/io/company/localhost/controller/api/BoardController.java @@ -29,6 +29,7 @@ import io.company.localhost.common.dto.ApiResponse; import io.company.localhost.common.dto.MapDto; import io.company.localhost.service.commoncodService; import io.company.localhost.service.localbordService; +import io.company.localhost.utils.AuthUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -55,7 +56,7 @@ public class BoardController { /** * 자유/익명 게시판 목록 조회 - * @ReqMap map 요청 파라미터 (page, searchKeyword, orderBy) + * @ReqMap map 요청 파라미터 (page, searchKeyword, orderBy, size) * @return 페이징된 자유/익명 게시판 목록 */ @Member @@ -75,8 +76,8 @@ public class BoardController { @ParameterCheck @PostMapping public ApiResponse createBoard(@ReqMap MapDto map) { - //임시 - map.put("MEMBERSEQ", 1); + Long userId = AuthUtil.getUser().getId(); + map.put("MEMBERSEQ", userId); return ApiResponse.ok(boardService.createBoard(map)); } @@ -130,8 +131,8 @@ public class BoardController { @ParameterCheck @PostMapping("/{CMNBRDSEQ}/attachments") public ApiResponse uploadAttachment(@ReqMap MapDto map) { - //임시 - map.put("CMNFLEREG", 1); + Long userId = AuthUtil.getUser().getId(); + map.put("CMNFLEREG", userId); boardService.addAttachment(map); return ApiResponse.ok("첨부파일이 저장되었습니다."); } @@ -145,8 +146,8 @@ public class BoardController { @ParameterCheck @PostMapping("/{LOCBRDSEQ}/{LOCCMTSEQ}/reaction") public ApiResponse reactToBoard(@ReqMap MapDto map) { - //임시 - map.put("MEMBERSEQ", 1); + Long userId = AuthUtil.getUser().getId(); + map.put("MEMBERSEQ", userId); boardService.reactToBoard(map); return ApiResponse.ok("반응이 성공적으로 처리되었습니다."); } @@ -173,8 +174,8 @@ public class BoardController { @ParameterCheck @PostMapping("/{LOCBRDSEQ}/comment") public ApiResponse addCommentOrReply(@ReqMap MapDto map) { - //임시 - map.put("MEMBERSEQ", 1); + Long userId = AuthUtil.getUser().getId(); + map.put("MEMBERSEQ", userId); boardService.addCommentOrReply(map); return ApiResponse.ok("댓글 또는 대댓글이 작성되었습니다."); } diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index 9230de1..ed00e27 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -5,12 +5,14 @@ - + +