가장 먼저 엔티티를 구성해보겠다.
컬럼명 | 자료형 | null 허용 | 키 | 설명 |
---|---|---|---|---|
id | int | X | PK | 게시글의 아이디 |
title | varchar(100) | X | 게시글의 제목 | |
content | varchar(1000) | X | 게시글의 내용 | |
created_at | date | X | 게시글 작성 날짜 | |
updated_at | date | O | 게시글 수정 날짜 |
나는 일단 제목과 내용을 우선적으로 넣을 것이기 때문에 이정도로 간단하게만 구상해보았다.
이제는 코드로 엔티티 클래스를 하나 만들어 보자.
@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에 어떤 값이 들어갔는지 쉽게 유추할 수가 있다.
repository 패키지를 새로 만들고 Repository 인터페이스를 한 번 생성해 보자.
public interface BoardRepository extends JpaRepository<Board, Long> {
}
BoardRepository는 JpaRepository를 상속받는다. JpaRepository는 CrudRepository를 상속받는데 이 클래스에는 기본적인 CRUD 메소드가 포함되어 있다.
@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());
}
}
@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를 지정했는데, 아래와 같은 응답코드와 함께 객체를 반환해준다.
이 외에도 응답코드가 여럿 있으니 필요하면 찾아보자.
이제 이 상태에서 서버를 구동하고 Postman으로 테스트를 해보자.
Get 방식의 /board API에 요청을 했더니
이렇게 미리 넣어둔 데이터들이 잘 나오는 것을 확인해볼 수 있다.
Post 방식의 /board API도 마찬가지다.
이렇게 API 두개를 만들어보고 테스트까지 완료했다. 이와 마찬가지 방식으로 삭제와 수정, 그리고 한 개의 게시글 조회 API까지 만들어 보려고 한다.
끝-*