스프링에서 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를 문서화하여 공유하기 위함
'Java > Spring' 카테고리의 다른 글
예외처리(Exception)기능 + Response 기능(데이터 반환) 을 추가한 게시판 만들기 코드 (2) | 2022.07.27 |
---|---|
스프링 스터디(RestAPI의 다양한 기능 추가(Exception, Response..) (0) | 2022.07.25 |
스프링 스터디(2주차) + 내용 정리 (0) | 2022.07.12 |
스프링부트 기본구조 및 JPA (0) | 2022.07.04 |
spring boot 프로젝트 생성 및 mysql 스프링부트 연동 (0) | 2022.07.04 |