Spring Boot Handsonlab (KSUG) — (2)


  • 게시판을 만들어 본다.

1 2 3 4 5 6

1. Board 엔티티 생성


소스 루트 경로(src/main/java)에 마우스 우클릭하여 New > Package 클릭!

Name : org.ksug.board 입력 후 Finish 클릭!

생성 된 패키지에 마우스 우클릭하여 New > Class 클릭!

Board 입력 후 Fisnish 클릭!

Board 클래스 선언 위에 @Entity 애노테이션 설정

위 그림과 같이 javax.persistence 패키지의 Entity 선택하고 Enter키를 누르면 아래 그림과 같이 import 구문이 자동 생성 된다.

id : 게시판 식별번호 (프라이머리 키, 자동 증가)

name : 게시판 이름

createAt : 게시판 생성 날짜

디폴트 생성자, 게시판 이름을 주입 받는 생성자 제공

코드 에디터 뷰에서 마우스 우클릭하여 Source > Generate Getters and Setters… 메뉴를 클릭!

Select Getters 클릭 후 id 항목은 체크 해제! (id는 별도로 getter를 제공하지 않음)

id 에 @Id, @GeneratedValue(strategy = GenerationType.AUTO) 설정


2. Post 엔티티 생성


org.ksug.board 패키지에 마우스 우클릭하여 New > Class 클릭!

Board 클래스 추가 했던 과정과 동일하게 Post 클래스를 추가 한다.

id : 게시글 식별 번호 (자동 증가)

author : 작성자

title : 제목

content : 내용

createdAt : 작성일

board : 게시판 (게시글을 담게 될…)

Post 클래스에는 모든 getter를 제공한다. (주의) getBoard()는 protected로 변경해야 한다. Post 엔티티를 JSON으로 변환할 때 getBoard()가 public으로 선언되어 있으면 Board 객체도 JSON 변환 대상이 되므로 에러가 발생한다. 따라서 Board를 JSON 변환 대상이 되지 않도록 public 선언이 아니라 protected 선언으로 변경해야 한다.

Post와 Board의 관계 설정 @ManyToOne


3. 레파지토리 생성

소스 루트 경로(src/main/java)에 마우스 우클릭하여 New > Package 클릭!

Name : org.ksug.board.module 입력 후 Finish 클릭!

생성 된 패키지에 마우스 우클릭하여 New > Interface 클릭!

Name : BoardRepository 입력 후 Add… 클릭!

Choose interfaces : JpaRepository 입력 후 아래 항목 선택하고 OK 클릭!

Extended interfaces에 항목이 추가 된 것을 확인 후 Finish 클릭!

제네릭 타입에 Board와 Long을 지정 (Board 엔티티의 식별 키- Long 타입)

게시판 이름에 해당하는 Board를 반환하는 findByName() 메서드 선언.

같은 방법으로 PostRepository 인터페이스를 정의한다.

Board 엔티티에 있는 Post 목록을 조회하는 findByBoard() 메소드를 선언.

이렇게 레파지토리 인터페이스를 선언만 해두면 구현체를 스프링이 자동으로 생성해 주고 서비스 클래스에서 API를 호출 할 수 있게 된다.


3. 서비스 생성


org.ksug.board.module 패키지에 BoardService 클래스를 추가한다.

BoardService에 @Service, @Transactional 애노테이션 설정을 한다.

boardRepository와 postRepository를 선언하고 아래 그림과 같이 레파지토리를 주입 받도록 @AutoWired 애노테이션이 설정된 setter 메소드를 추가한다.

게시판 이름을 사용하여 게시판을 찾아서 반환하는 findBoard() 메소드와 게시판 이름을 사용하여 찾은 게시판의 게시글 목록을 반환하는 findPosts() 메소드, 그리고 게시글 번호를 사용하여 게시글을 조회하는 getPost() 메소드를 위 그림과 같이 추가한다. getPost()가 private으로 정의되어 있는 이유는 특정 하나의 게시글에 대해 수정 하거나 삭제 하고자 할 때 사용되는 메소드이기 때문이다.


4. 컨트롤러 생성


org.ksug.webservice 패키지에 BoardController 클래스를 추가하고 클래스 선언부 위에 @RestController, @RequestMapping(“/board”) 애노테이션을 지정하여 Rest (get/post/put/delete) 방식의 요청을 처리하도록하고, 컨트롤러 클래스 내부에서 공통으로 “/board” 경로를 사용하도록 지정한다.

컨트롤러에서 서비스를 사용하기 위해 boardService 인스턴스 변수를 선언하고 @Autowired 애노테이션 설정으로 setBoardService() 메소드를 추가하여 주입 받도록 한다.

게시판 이름을 @PathVariable로 받아서 boardService의 findBoard()메소드의 인자로 넘기고 해당 Board를 ResponseEntity에 담아서 반환하는 info() 메소드를 추가한다.

게시판 이름이 “free” 라고 가정하고 info() 메소드가 호출되려면 “http://localhost:8080/board/free/info” 주소를 get 방식으로 요청해야 한다.

listPosts() 메소드는 “http://localhost:8080/board/free” 주소를 get 방식으로 요청하면 호출된다. “free”는 @PathVariable애노테이션으로 정의되어 있는 boardname 파라미터 변수로 받게 된다. 게시판 이름을 받아서 boardService의 findPosts()메소드로 전달하고 해당 게시판의 게시물 목록을 받아서 ResponseEntity에 List<Post>로 담아서 반환한다.


http://localhost:8080/board/free 또는 http://localhost:8080/board/free/info 를 요청해 본다.

free 게시판을 만들지 않았기 때문에 찾지 못하고 404 에러를 반환한다.