우당탕탕 개발일지

11일차_게시판 프로젝트(4) 본문

개발 프로젝트/게시물 프로젝트

11일차_게시판 프로젝트(4)

ujin302 2024. 3. 18. 20:08
반응형

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

 

 

 
반응형