스프링 게시판 API 만들기

🌎·2023년 5월 14일
0

스프링 공부

목록 보기
2/11

1. 엔티티 구성하기

가장 먼저 엔티티를 구성해보겠다.

컬럼명자료형null 허용설명
idintXPK게시글의 아이디
titlevarchar(100)X게시글의 제목
contentvarchar(1000)X게시글의 내용
created_atdateX게시글 작성 날짜
updated_atdateO게시글 수정 날짜

나는 일단 제목과 내용을 우선적으로 넣을 것이기 때문에 이정도로 간단하게만 구상해보았다.

이제는 코드로 엔티티 클래스를 하나 만들어 보자.

@Entity //Entity로 지정
@Getter
public class Board {

    @Id // PK로 지정
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키 자동으로 1씩 증가
    @Column(name = "id", nullable = false)
    private int id;

    @Column(name = "title", nullable = false)
    private String title;

    @Column(name = "content", nullable = false)
    private String content;

    @CreationTimestamp
    @Column(name = "created_at")
    private Date createdAt;

    @UpdateTimestamp
    @Column(name = "updated_at")
    private Date updatedAt;

    @Column(name = "is_deleted")
    private String isDeleted = "N";

    @Builder
    public Board(String title, String content) {
        this.title = title;
        this.content = content;
    }

    protected Board() {

    }
}

@Entity가 붙은 클래스는 JPA가 관리해주며, JPA를 사용해서 DB테이블과 매핑할 클래서는 @Entity를 꼭 붙여야만 매핑이 가능하다.

@Getter와 같은 경우는 getXXX 메소드를 자동으로 생성해준다.
예를 들어 title같은 경우는 getTitle()을 통해 그 값을 읽을 수 있다.

@Builder와 같은 경우는 생성자 위에 입력하면 빌더 패턴 방식으로 객체를 생성할 수 있게 된다. 빌더 패턴을 사용하면 어떤 필드에 어떤 값이 들어가는지 명시적으로 파악할 수 있다.

예를 들어 기본 생성자와 같은 경우는

new Board("잭과 콩나무 읽어보셨나요?", "어린아이가 읽기 너무 좋아요.");

와 같이 되겠지만, 빌더 패턴을 사용하면

Board.builder()
	.title("잭과 콩나무 읽어보셨나요?")
    .content("어린아이가 읽기 너무 좋아요.")
    .build();

이렇게 사용할 수 있다.
딱 보면 title에 어떤 값이 들어갔고, content에 어떤 값이 들어갔는지 쉽게 유추할 수가 있다.

2. 레포지토리 만들기

repository 패키지를 새로 만들고 Repository 인터페이스를 한 번 생성해 보자.

public interface BoardRepository extends JpaRepository<Board, Long> {

}

BoardRepository는 JpaRepository를 상속받는다. JpaRepository는 CrudRepository를 상속받는데 이 클래스에는 기본적인 CRUD 메소드가 포함되어 있다.

3. 서비스 코드 작성하기

@Service
public class BoardServiceImpl implements BoardService {

    BoardRepository repository;

    @Autowired
    public BoardServiceImpl(BoardRepository repository) {
        this.repository = repository;
    }

	// 게시글 리스트 불러오는 메소드
    @Override
    public List<Board> findAll() {
        return repository.findAll();
    }
	
    // 게시글 저장 메소드
    @Override
    public Board save(BoardRequest boardRequest) {
        return repository.save(boardRequest.toEntity());
    }
    
}

4. 컨트롤러 코드 작성하기


@RestController
@RequestMapping("/board")
public class BoardController {

    BoardService boardService;

    @Autowired
    public BoardController(BoardService boardService) {
        this.boardService = boardService;
    }

    @GetMapping()
    public ResponseEntity<List<Board>> findAllBoards() {
        List<Board> boards = boardService.findAll();
        return ResponseEntity.status(HttpStatus.OK)
                .body(boards);
    }

    @PostMapping()
    public ResponseEntity<Board> addBoard(@RequestBody BoardRequest boardRequest) {
        Board board = boardService.save(boardRequest);
        return ResponseEntity.status(HttpStatus.CREATED)
                .body(board);
    }

}

@RestController 어노테이션을 붙이면 HTTP 응답으로 객체 데이터를 JSON 형식으로 반환한다.

return 객체로는 ResponseEntity를 지정했는데, 아래와 같은 응답코드와 함께 객체를 반환해준다.

  • 200 OK : 요청이 성공적으로 수행됨
  • 201 Created : 요청이 성공적으로 수행되었고, 새로운 리소스가 생성되었음
  • 400 Bad Request : 요청 값이 잘못되어 요청에 실패했음
  • 403 Forbidden : 권한이 없어 요청에 실패했음
  • 404 Not Found : 요청 값으로 찾은 리소스가 없어 요청에 실패했음
  • 405 Method Not Allowed : 지정된 메소드가 허용되지 않음
  • 500 Internal Server Error : 서버 상에 문제가 있어 요청에 실패했음

이 외에도 응답코드가 여럿 있으니 필요하면 찾아보자.

이제 이 상태에서 서버를 구동하고 Postman으로 테스트를 해보자.


Get 방식의 /board API에 요청을 했더니


이렇게 미리 넣어둔 데이터들이 잘 나오는 것을 확인해볼 수 있다.

Post 방식의 /board API도 마찬가지다.

이렇게 API 두개를 만들어보고 테스트까지 완료했다. 이와 마찬가지 방식으로 삭제와 수정, 그리고 한 개의 게시글 조회 API까지 만들어 보려고 한다.

끝-*

profile
영차영차

0개의 댓글