[SpringBoot](게시판) | 등록, 조회 API 구현하기 1

acacia·2022년 10월 3일
0

SpringBoot

목록 보기
1/2
post-thumbnail

SpringBoot JPA로 게시판 구현하기

💻 개발환경

IntelliJ ultimate , SpringBoot , Java 1.8 , Gradle, jar , JPA , H2

👩‍🏫 개발목표

  • H2 (DB)를 연동해 등록, 조회, 저장, 삭제 등 RESP API를 개발한다.
  • 전송 데이터 타입은 json이다.
  • 호출 테스트는 브라우저나 ARC를 이용한다.

들어가기에 앞서

이번 포스팅은 미리 프로젝트를 생성하고, 다음 의존성을 추가한 상태에서 시작합니다.

  • Lombok
  • Spring Web
  • Spring Data Jpa
  • H2 Database
  • MySQL Driver

Board.java

@NoArgsConstructor
@Getter
@Entity
public class Board extends Timestamped {

    @JsonIgnore
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(length = 50, nullable = false)
    private String title;

    @Column(length = 200, nullable = false)
    private String content;

    @Column(length = 100, nullable = false)
    private String username;

    @JsonIgnore
    @Column(nullable = false)
    private String password;
    
    public Board(BoardRequestDto requestDto) {
        this.title = requestDto.getTitle();
        this.username = requestDto.getUsername();
        this.content = requestDto.getContent();
        this.password = requestDto.getPassword();
    }
    
    public void update(BoardRequestDto requestDto) {
        this.title = requestDto.getTitle();
        this.username = requestDto.getUsername();
        this.content = requestDto.getContent();
        this.password = requestDto.getPassword();

    }
}

BoardRepository

저장된 Board들을 찾을 수 있는 공간 역할 !

public interface BoardRepository extends JpaRepository<Board, Long> {

    List<Board> findAllByOrderByCreatedAtDesc();

}

BoardRequestDto

Board에 추가할 데이터를 입력할 때, 담을 그릇 역할 !

@Getter
public class BoardRequestDto {
   private String password;
   private String title;
   private String username;
   private String content;
   private LocalDateTime createdAt;
}

BoardResponseDto

Board에서 값을 가져올 때, 담을 그릇 역할 !
password같은 정보는 노출시키지 않기위해 필드로 넣지 않았다.

@Getter
@NoArgsConstructor
public class BoardResponseDto {

    private String title;
    private String username;
    private String content;
    private LocalDateTime createdAt;
    private LocalDateTime modifiedAt;


    public BoardResponseDto(Board board){
        this.title = board.getTitle();
        this.content = board.getContent();
        this.username = board.getUsername();
        this.createdAt = board.getCreatedAt();
        this.modifiedAt = board.getModifiedAt();
    }
}

📝 등록 API (Create)

BoardController

@PostMapping

생성할 데이터에 대한 정보requestDto에 담아 파라미터로 전달
파라미터값을 Service의 save메소드로 싣어 보냄
결과값을 responseDto에 담아 클라이언트 쪽에 반환

@RequiredArgsConstructor
@RestController
public class BoardController {
    private final BoardService boardService;
    
    @PostMapping("/api/board")
    public BoardResponseDto createlist(@RequestBody BoardRequestDto requestDto){
        return boardService.save(requestDto);
 }

BoardService

Board 객체 생성.
save를 사용하여 BoardRepository에 객체를 저장

@RequiredArgsConstructor
@Service
public class BoardService {

    private final BoardRepository boardRepository;


    public BoardResponseDto save(BoardRequestDto requestDto){
        Board board= new Board(requestDto);
        boardRepository.save(board);
        return new BoardResponseDto(board);
}

📝 조회 API (Read)

하나의 데이터만 조회하는 방법

BoardController

@GetMapping

조회할 데이터가 가지고 있는 id값을 받아 @pathVariable사용하여 전달
id 값을 Service의 getDetail메소드로 싣어 보냄
결과값을 responseDto에 담아 클라이언트 쪽에 반환

    @GetMapping("/api/board/{id}")
    public BoardResponseDto getDetail(@PathVariable Long id){
        return boardService.getDetail(id);
    }
 }

BoardService

BoardRepository에서 해당 id값과 일치하는 데이터를 찾아 board에 저장.

못찾을 경우: 에러
찾는 경우: BoardResponseDtoboard 를 담아 리턴

 public BoardResponseDto getDetail(Long id){
        Board board = boardRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("아이디값이 없습니다")
        );
        return new BoardResponseDto(board);
}
profile
게으른 개발자의 부지런한 개발일지

0개의 댓글