벡엔드 순서
ReplyBoard.java -> ReplyBoardRepository.java-> ReplyBoardDto -> ReplyBoardService.java
-> ReplyBoardController.java
ReplyBoard.java
package com.example.simpledms.model.entity.normal;
import com.example.simpledms.model.common.BaseTimeEntity;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import javax.persistence.*;
/**
* packageName : com.example.simpledms.model.entity.normal
* fileName : ReplyBoard
* author : GGG
* date : 2023-10-26
* description :
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-26 GGG 최초 생성
*/
@Entity
@Table(name="TB_REPLY_BOARD")
@SequenceGenerator(
name = "SQ_REPLY_BOARD_GENERATOR"
, sequenceName = "SQ_REPLY_BOARD"
, initialValue = 1
, allocationSize = 1
)
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@DynamicInsert
@DynamicUpdate
// soft delete
@Where(clause = "DELETE_YN = 'N'")
@SQLDelete(sql = "UPDATE TB_REPLY_BOARD SET DELETE_YN = 'Y', DELETE_TIME=TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') WHERE BID = ?")
public class ReplyBoard extends BaseTimeEntity {
// 속성
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE
, generator = "SQ_REPLY_BOARD_GENERATOR")
private Integer bid; // 기본키, 시퀀스
private String boardTitle;
private String boardContent;
private String boardWriter;
private Integer viewCnt;
private Integer boardGroup; // 트리구조 최상위 부모 노드( 부모가 있을 경우 : 부모번호, 없을 경우 : 자신의 게시판번호 )(정렬)
private Integer boardParent; // 자신의 부모 노드 ( 부모가 있을 경우 : 부모번호, 없을 경우 : 0 ) : 핵심
}
ReplyBoardRepository.java
package com.example.simpledms.model.entity.normal;
import com.example.simpledms.model.common.BaseTimeEntity;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import javax.persistence.*;
/**
* packageName : com.example.simpledms.model.entity.normal
* fileName : ReplyBoard
* author : GGG
* date : 2023-10-26
* description :
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-26 GGG 최초 생성
*/
@Entity
@Table(name="TB_REPLY_BOARD")
@SequenceGenerator(
name = "SQ_REPLY_BOARD_GENERATOR"
, sequenceName = "SQ_REPLY_BOARD"
, initialValue = 1
, allocationSize = 1
)
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@DynamicInsert
@DynamicUpdate
// soft delete
@Where(clause = "DELETE_YN = 'N'")
@SQLDelete(sql = "UPDATE TB_REPLY_BOARD SET DELETE_YN = 'Y', DELETE_TIME=TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') WHERE BID = ?")
public class ReplyBoard extends BaseTimeEntity {
// 속성
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE
, generator = "SQ_REPLY_BOARD_GENERATOR")
private Integer bid; // 기본키, 시퀀스
private String boardTitle;
private String boardContent;
private String boardWriter;
private Integer viewCnt;
private Integer boardGroup; // 트리구조 최상위 부모 노드( 부모가 있을 경우 : 부모번호, 없을 경우 : 자신의 게시판번호 )(정렬)
private Integer boardParent; // 자신의 부모 노드 ( 부모가 있을 경우 : 부모번호, 없을 경우 : 0 ) : 핵심
}
ReplyBoardDto
package com.example.simpledms.model.dto.normal;
/**
* packageName : com.example.simpledms.model.dto.normal
* fileName : ReplyBoardDto
* author : GGG
* date : 2023-10-26
* description : 계층형 쿼리 DTO
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-26 GGG 최초 생성
*/
public interface ReplyBoardDto {
// 속성 x => getter 함수
public Integer getBid();
public String getBoardTitle();
public String getBoardContent();
public String getBoardWriter();
public Integer getViewCnt();
public Integer getBoardGroup();
public Integer getBoardParent();
}
ReplyBoardService.java
package com.example.simpledms.service.normal;
import com.example.simpledms.model.dto.normal.ReplyBoardDto;
import com.example.simpledms.model.entity.normal.ReplyBoard;
import com.example.simpledms.repository.normal.ReplyBoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* packageName : com.example.simpledms.service.normal
* fileName : ReplyBoardService
* author : GGG
* date : 2023-10-26
* description :
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-26 GGG 최초 생성
*/
@Service
public class ReplyBoardService {
@Autowired
ReplyBoardRepository replyBoardRepository;
// 계층형 쿼리 조회(dto) : like 검색
public Page<ReplyBoardDto> selectByConnectByPage(String boardTitle, Pageable pageable) {
Page<ReplyBoardDto> page
= replyBoardRepository.selectByConnectByPage(boardTitle, pageable);
return page;
}
// 답변 글 저장
public ReplyBoard save(ReplyBoard replyBoard) {
ReplyBoard replyBoard2 = replyBoardRepository.save(replyBoard);
return replyBoard2;
}
// 게시물 저장
public int saveBoard(ReplyBoard replyBoard) {
int insertCount
= replyBoardRepository.insertByBoard(replyBoard);
return insertCount;
}
// 상세조회 함수
public Optional<ReplyBoard> findById(int bid) {
Optional<ReplyBoard> optionalReplyBoard
= replyBoardRepository.findById(bid);
return optionalReplyBoard;
}
// 답변만 삭제
public boolean removeById(int bid) {
if (replyBoardRepository.existsById(bid)) { // bid 있는지 확인
replyBoardRepository.deleteById(bid); // 삭제 진행
return true;
}
return false;
}
// 게시물 + 답변 2개이상 삭제
public boolean removeAllByBoardGroup(int boardGroup) {
int deleteCount = replyBoardRepository.removeAllByBoardGroup(boardGroup);
if (deleteCount > 0) {
return true;
} else {
return false;
}
}
}
ReplyBoardController
package com.example.simpledms.controller.normal;
import com.example.simpledms.model.dto.normal.ReplyBoardDto;
import com.example.simpledms.model.entity.basic.Dept;
import com.example.simpledms.model.entity.normal.ReplyBoard;
import com.example.simpledms.service.normal.ReplyBoardService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
/**
* packageName : com.example.simpledms.controller.normal
* fileName : ReplyBoardController
* author : GGG
* date : 2023-10-26
* description :
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-26 GGG 최초 생성
*/
@Slf4j
@RestController
@RequestMapping("/api/normal")
public class ReplyBoardController {
@Autowired
ReplyBoardService replyBoardService;
// 전체 조회(계층형, dto) : like 검색
@GetMapping("/reply-board")
public ResponseEntity<Object> selectByConnectByPage(
@RequestParam(defaultValue = "") String boardTitle,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "3") int size
) {
try {
Pageable pageable = PageRequest.of(page, size);
Page<ReplyBoardDto> replyBoardDtoPage
= replyBoardService
.selectByConnectByPage(boardTitle, pageable);
Map<String, Object> response = new HashMap<>();
response.put("replyBoard", replyBoardDtoPage.getContent()); // 배열
response.put("currentPage", replyBoardDtoPage.getNumber()); // 현재페이지번호
response.put("totalItems", replyBoardDtoPage.getTotalElements()); // 총건수(개수)
response.put("totalPages", replyBoardDtoPage.getTotalPages()); // 총페이지수
if (replyBoardDtoPage.isEmpty() == false) {
// 성공
return new ResponseEntity<>(response, HttpStatus.OK);
} else {
// 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// 답변글 저장
@PostMapping("/reply")
public ResponseEntity<Object> create(@RequestBody ReplyBoard replyBoard) {
try {
ReplyBoard replyBoard2 = replyBoardService.save(replyBoard); // db 저장
return new ResponseEntity<>(replyBoard2, HttpStatus.OK);
} catch (Exception e) {
// DB 에러가 났을경우 : INTERNAL_SERVER_ERROR 프론트엔드로 전송
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// 게시물 저장
@PostMapping("/reply-board")
public ResponseEntity<Object> createBoard(@RequestBody ReplyBoard replyBoard) {
try {
int insertCount = replyBoardService.saveBoard(replyBoard); // db 저장
return new ResponseEntity<>(insertCount, HttpStatus.OK);
} catch (Exception e) {
// DB 에러가 났을경우 : INTERNAL_SERVER_ERROR 프론트엔드로 전송
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// 수정함수
@PutMapping("/reply-board/{bid}")
public ResponseEntity<Object> update(
@PathVariable int bid,
@RequestBody ReplyBoard replyBoard) {
try {
ReplyBoard replyBoard2 = replyBoardService.save(replyBoard); // db 수정
return new ResponseEntity<>(replyBoard2, HttpStatus.OK);
} catch (Exception e) {
// DB 에러가 났을경우 : INTERNAL_SERVER_ERROR 프론트엔드로 전송
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// 상세조회
@GetMapping("/reply-board/{bid}")
public ResponseEntity<Object> findById(@PathVariable int bid) {
try {
// 상세조회 실행
Optional<ReplyBoard> optionalReplyBoard = replyBoardService.findById(bid);
if (optionalReplyBoard.isPresent()) {
// 성공
return new ResponseEntity<>(optionalReplyBoard.get(), HttpStatus.OK);
} else {
// 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
// 서버 에러
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// 답변만 삭제
@DeleteMapping("/reply/deletion/{bid}")
public ResponseEntity<Object> delete(@PathVariable int bid) {
// 프론트엔드 쪽으로 상태정보를 보내줌
try {
// 삭제함수 호출
boolean bSuccess = replyBoardService.removeById(bid);
if (bSuccess == true) {
// delete 문이 성공했을 경우
return new ResponseEntity<>(HttpStatus.OK);
}
// delete 실패했을 경우( 0건 삭제가 될경우 )
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} catch (Exception e) {
// DB 에러가 날경우
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// 게시물 + 답변 2개이상 삭제
@DeleteMapping("/reply-board/deletion/{boardGroup}")
public ResponseEntity<Object> deleteBoard(@PathVariable int boardGroup) {
// 프론트엔드 쪽으로 상태정보를 보내줌
try {
// 삭제함수 호출
boolean bSuccess = replyBoardService.removeById(boardGroup);
if (bSuccess == true) {
// delete 문이 성공했을 경우
return new ResponseEntity<>(HttpStatus.OK);
}
// delete 실패했을 경우( 0건 삭제가 될경우 )
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} catch (Exception e) {
// DB 에러가 날경우
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
'SI' 카테고리의 다른 글
[SI]공공데이터 포털 오픈 api 사용하여 음식점정보 불러오기 (0) | 2023.11.12 |
---|---|
[SI]영화진흥위원회 오픈 api 사용하여 데이터(영화순위, 영화명, 개봉일, 누적관객수, 상영관수, 영화 정보) 불러오기 (0) | 2023.11.10 |
[SI] 프론트엔드 (02_SimpleDMS_Page) 반응형 게시판 (0) | 2023.10.27 |
[SI] 벡엔드 (02_SimpleDMS_Page) 페이지 기능 추가 (0) | 2023.10.23 |
[SI] 프론트엔드 (02_SimpleDMS_Page) 페이지 기능 추가 (0) | 2023.10.20 |