Java/Spring

스프링 스터디(3주차) CRUD 게시판 만들기 + Postman 사용

SeungbeomKim 2022. 7. 20. 16:15
반응형

스프링에서 CRUD 게시판을 만들기 위해 만들어줬던 4가지

1.Entity(개체, DB의 관점에서는 테이블로 바라볼 수 있음) -> 가장 먼저 만듦

기본 어노테이션 

@Data

@AllArgsConstructor

@NoArgsConstructor

@Entity

=>이것 네 개는 필수적으로 깔고 코드 작성 해야함.

2.BoardRepository=>Repository를 통해 , DB와 스프링 서버를 연동시켜준다.

=>코드가 간결하기에 두 번째로 만들어준다.

다른 파일들은 전부 class이지만, BoardRepository는 interface를 통해 상속(extends)받아야 한다.   

3. => Controller, Service 

Controller는 요청을 담당하고, Service는 기능 구현을 담당한다.  

Controller

기본 어노테이션

@RestController => RestAPI 서버

@RequiredArgsConstructor=> Not Null, Static 생성자.

Controller에서는 Service를 통해 기능을 구현하기 때문에,

private final BoardService boardService => 객체를 불러준다.

+@RequestBody => json 형식의 데이터를 자바 형식으로 바꿔주기 위해 사용한다.(게시글 수정과 작성에서 사용)

+@PathVariable=> 백엔드에 서버를 요청하기 위해 사용한다. (게시글 수정과 삭제 및 단건 조회에서 사용)

Service

기본 어노테이션

@Service

@RequiredArgsConstructor => Not Null, Static 생성자.

Service에서는 @Transactional라는 어노테이션을 달아주는데, 사용하는 이유는 begin, commit 기능 등을 자동으로 처리해주고, 오류 발생시 rollback 처리을 자동으로 수행해준다. (+자동 저장 기능)

Service에서는 Repository의 데이터를 가져오기 때문에,

private final BoardRepository boardRepository => 객체를 불러준다.

+

// GET 전체 게시물 조회 -> 대략적인 게시물 정보 확인

// GET 상세 게시물 조회 -> 게시글 상세 조회

// POST 게시글 작성

// PUT 게시글 수정

// DELETE 게시글 삭제

 

 

Board Entity

package com.example.mentoring.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

/**
 * Entity 는 데이터베이스 테이블이라고 보면 됩니다.
 * Entity를 만들고 실행한 후, 데이터베이스를 확인해보면 아래 코드대로 테이블이 생성된 걸 볼 수 있습니다.
 */

@Data //Getter + Setter
@AllArgsConstructor // 모든 인스턴스를 받는 생성자
@NoArgsConstructor // 빈 생성자
@Entity // Board가 Entity인 것을 명시해준다.
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 인스턴스를 생성하면, 자동으로 인덱스를 붙여라
    private Long id; //1,2,3,4,5 테이블에서 구별하기 위한 Index id

    @Column(nullable = false, length = 30)
    private String title;   // null값 허용 안됨, 길이 제한 30자 이내
    @Column(nullable = false)
    private String content;

    @Column(nullable = false)
    private String writer;


}

BoardRepository

package com.example.mentoring.repository;

import com.example.mentoring.entity.Board;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * Repository 는 JPA를 이용해서 데이터베이스에서 데이터를 불러오거나 저장하는 용도입니다.
 * Repository는 Service 클래스에서 기능 구현할 때 사용합니다.
 *
 * @Repository 는 생략해도됨, 이유는 인터페이스가 JpaRepository 상속 받는데 안에 @Repository가 포함됨
 */
public interface BoardRepository extends JpaRepository<Board, Long> {

}

BoardController

package com.example.mentoring.controller;


import com.example.mentoring.entity.Board;
import com.example.mentoring.service.BoardService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
//Get : 게시글 전체 조회, 단건 조회
//Post : 게시글 작성
//Put : 게시글 수정
//Delete : 게시글 삭제 

@RestController //RestAPI 서버
@RequiredArgsConstructor //@Non null + static 생성자

public class BoardController {
    private final BoardService boardService;
    //게시글 전체 조회
    ex)localhost:8080/boards
    @GetMapping("/boards")
    public ResponseEntity<?> getBoards()
    {
        return new ResponseEntity<>(boardService.getBoards(), HttpStatus.OK );
    }
    //게시글 단건 조회
    ex)localhost:8080/boards/3
    @GetMapping("/boards/{id}")
    public ResponseEntity<?> getBoard(@PathVariable("id") Long id){
        return new ResponseEntity<>(boardService.getBoard(id), HttpStatus.OK);
    }
    //게시글 작성
    //HttpStatus.Ok == 200, HttpStatus.CREATED == 201
    //localhost:8080/boards
    //Post 게시글 작성
    //매개변수로 게시글이 들어오면, 들어온 게시글을 DB에 저장
    @PostMapping("/boards")
    public ResponseEntity<?> save(@RequestBody Board board){
        return new ResponseEntity<>(boardService.save(board),HttpStatus.CREATED);
    }
    //게시글 수정
    ex)localhost:8080/boards/3
    게시글 수정->완료 버튼-> 백엔드 서버 요청(id, updateBoard)
    @PutMapping("/boards/{id}")
    public ResponseEntity<?> editBoard(@PathVariable("id") Long id, @RequestBody Board updateBoard)
    {
        return new ResponseEntity<>(boardService.editBoard(id, updateBoard),HttpStatus.OK);
    }
    //게시글 삭제
    @DeleteMapping("/api/boards/{id}")
    public ResponseEntity<?> deleteBoard(@PathVariable("id") Long id){
        boardService.deleteBoard(id);
        return new ResponseEntity<>("게시글 삭제 완료",HttpStatus.OK);
    }
}

BoardService

package com.example.mentoring.service;

import com.example.mentoring.entity.Board;
import com.example.mentoring.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class BoardService {
    private final BoardRepository boardRepository;

    @Transactional(readOnly = true)
    public List<Board> getBoards(){
        List<Board> boards = boardRepository.findAll();
        return boards;
    }
    @Transactional(readOnly = true)
    public Board getBoard(Long id){
        Board board = boardRepository.findById(id).get();
        return board;
    }
    @Transactional
    public Board save(Board board){
        return boardRepository.save(board);
    }
    @Transactional
    public Board editBoard(Long id,Board updateBoard){
        Board board = boardRepository.findById(id).get();
        board.setTitle(updateBoard.getTitle());
        board.setContent(updateBoard.getContent());

        return board;
    }
    @Transactional
    public void deleteBoard(Long id){
        boardRepository.deleteById(id);
    }


}

Postman 사용

Postman 사용하는 방식은 workspace를 통해 workspace를 만들고, Collection을 생성해준다. 그리고 컨트롤러를 보면서 각각의 주소를 추가해줘야 한다.

전체 게시글 조회:GET http://localhost:8080/boards(컨트롤러에서 지정한 주소)
게시글 단건 조회:GET http://localhost:8080/boards(컨트롤러에서 지정한 주소)/{id}
게시글 작성:POST http://localhost:8080/boards(컨트롤러에서 지정한 주소)
게시글 수정:PUT http://localhost:8080/boards(컨트롤러에서 지정한 주소)/{id}
게시글 삭제:DELETE http://localhost:8080/boards(컨트롤러에서 지정한 주소){id}

 

게시글 작성 및 수정의 경우

Body => raw => 글자형식(JSON)으로 변환 후, 다음과 같은 형식으로 데이터를 추가 및 수정 해줘야 한다.

{
	"title": "제목",
    	"content": "내용"

}

Postman을 사용하는 이유

1.우리가 만든 API를 테스트하기 위함

2.개발된 API를 문서화하여 공유하기 위함

반응형