우당탕탕 개발일지
11일차_게시판 프로젝트(4) 본문
Git Hub
https://github.com/ujin302/Board
1. Table에 Data 저장 완료
yml 파일 이슈로 인해서 새로운 플젝 생성 후, 기존에 개발하였던 곳까지 개발 완료
BoardControrller
1) Get > save.html 파일 호출
2) Post > BoardService 클래스를 사용하여 DB에 데이터 저장 & index 화면으로 이동
BoardDTO
1) html에 태그에 있는 name과 동일한 변수명에 Data 저장
BoardEntity
1) Table, Column 생성
2) DTO의 Data를 Entity에 저장
BoardService
1) Entity Data를 호출
2) JPA 의 save 함수를 호출하여 DB에 Data 저장 >> boardRepository.save(boardEntity);
2. 게시글 목록
findAll 함수 호출이 안되는 오류 발생..
아예 호출이 안되는듯 함... list가 출력이 안됨
2-1 해결
소스 수정
: GetMapping("/") -> GetMapping
14번째줄에 RequestMapping("/board") 어노테이션 추가된 상태
따라서 http://localhost:8082/board 경로로 이동하고 싶을때는 GetMapping만 사용한다.
GetMapping("/")으로 사용하게 되면 http://localhost:8082/board// 로 인식하기 때문에 404 에러 발생함.
2-2. 공부해야할 부분
1) Model
-> Spring이 지원하는 기능으로, HashMap이다! (Key, Value로 이루어져 있음)
https://m42-orion.tistory.com/119
[Spring] Model이란?
이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다! ⛅️ Model이란? ✅ Model 개요 Model은 스프링이 지원하는 기능으로써, key와 val
m42-orion.tistory.com
2) Entity와 DTO 사용하는 경우
2-1) Entity
-> 실제 DB와 매핑되는 핵심클래스
2-2) DTO
-> 계층 간 데이터 교환이 이루어질 때 사
https://wildeveloperetrain.tistory.com/101
역할 분리를 위한 Entity, DTO 개념과 차이점
'Entity, DTO 개념과 차이점 (+ VO)' - Entity Entity 클래스는 실제 DB 테이블과 매핑되는 핵심 클래스로, 데이터베이스의 테이블에 존재하는 컬럼들을 필드로 가지는 객체입니다. (DB의 테이블과 1:1로 매
wildeveloperetrain.tistory.com
2-3. 유튜브
https://www.youtube.com/watch?v=mJytzx8qIRI&list=PLV9zd3otBRt7jmXvwCkmvJ8dH5tR_20c0&index=5
3. 게시글 조회
3-1. 게시글 상세 페이지 이동
http://localhost:8082/board/{id}
3-2. id와 관련된 모든 데이터 가져오기!
소스 구현 내용
1. 조회수 + 1
2. 상세 페이지에 Data 뿌리기
3-3. 소스
[ BoardController.java ]
1. 조회수 + 1
2. 상세 페이지에 Data 뿌리기
// 4. detail.html에 상세 화면 뿌리기
@GetMapping("/{id}") // board/id
public String findById(@PathVariable Long id, Model model) {
// 1. 조회수 +1
boardService.updateHits(id);
// 2. 데이터 뿌리기
BoardDTO boardDTO = boardService.findById(id);
model.addAttribute("board", boardDTO);
return "detail";
}
[ BoardService.java ]
updateHits : 조회수 + 1
findById :
1) Table에서 기본키 열에 해당하는 Row 데이터 가져오기
2) 해당 데이터를 DTO로 변환
Optional?
null 반환 시, 오류 발생 가능성이 높은 경우 사용
NPE(NullPointerException) 방지
boardRepository.findeById(id);
-> findById 메소드는 JPA에 포함되어 있는 함수
-> Entity에서 지정한 id 컬럼(기본키)에서 해당하는 값을 찾아 해당 Row 반환
-> 반환 형태 : Optional
Optional 형태로 반환받고 싶지 않을 경우 방법 2 사용
orElse 메소드를 사용하여 Null 값으로 인한 오류 방지!
@Transactional // 데이터의 일관성을 위해 사용
// 트랜잭션 시작 -> 메서드 정상 종료 -> Commit
// 트랜잭션 시작 -> 메서드 비정상 종료 -> rollback
// 일부 작업만 데이터베이스에 반영되는 것을 방지하여 데이터 일관성 유지!
// 3. 조회수 +1
public void updateHits(Long id) {
boardRepository.updateHits(id);
}
// 4. id가 있을 경우, 해당 데이터를 가지고 있는 DTO 반환
public BoardDTO findById(Long id) {
// 방법 1. Optional 형태로 데이터 받기
// Optional : NPE(NullPoinrerException) 방지, null 반환 시, 오류 발생 가능성이 높은 경우 사용
// findById : 리턴 값 Optional 형태, Table에서 기본키에 해당하는 Row의 데이터 반환
Optional<BoardEntity> optionalBoardEntity = boardRepository.findById(id);
if(optionalBoardEntity.isPresent()) { // isPresent : 객체가 값을 가지고 있으면 true
BoardEntity boardEntity = optionalBoardEntity.get(); // DB의 데이터를 가져와 Entity 객체에 저장
BoardDTO boardDTO = BoardDTO.toBoardDTO(boardEntity); // Entity 객체를 DTO 객체에 저장
return boardDTO; // DTO 객체 반환
} else {
return null;
}
// 방법 2. Entity 형태로 데이터 받기
BoardEntity BoardEntity = boardRepository.findById(id).orElse(null);
if(BoardEntity != null) {
BoardDTO boardDTO = BoardDTO.toBoardDTO(BoardEntity); // Entity 객체를 DTO 객체에 저장
return boardDTO; // DTO 객체 반환
} else {
return null;
}
}
[ BoardRepository.java ]
쿼리문을 사용하여 조회수 데이터 추출 후 + 1
// Query : JPA에서 제공, 쿼리문을 사용할 수 있음
// Modifying : Update, Delete 문 실행 시 필수 사용
@Modifying
@Query(value = "update BoardEntity b set b.boardHits=b.boardHits+1 where b.id=:id")
void updateHits(@Param("id") Long id);
3-4. 유튜브
https://www.youtube.com/watch?v=zpzhHikKElo&list=PLV9zd3otBRt7jmXvwCkmvJ8dH5tR_20c0&index=6
'개발 프로젝트 > 게시물 프로젝트' 카테고리의 다른 글
13일차_게시판 프로젝트(6) (0) | 2024.03.20 |
---|---|
12일차_게시판 프로젝트(5) (0) | 2024.03.19 |
10일차_게시판 프로젝트(3) (0) | 2024.03.15 |
9일차_게시판 프로젝트(2) (0) | 2024.03.15 |
8일차_게시판 프로젝트(1) (0) | 2024.03.13 |