[spring]스프링

[Spring 게시판] 10. 게시물 등록·조회 API + 포스트맨 사용법

낭만적인 부자 2023. 8. 1. 06:52

처음 회사에서 인턴을 할 때, 저는 웹에 대해서 아무것도 몰랐습니다.

API를 만들라고 하는데 API가 뭔지를 몰라서

굉장히 당황스럽고 민망했던 경험이 있습니다.

 

 

1. API가 무엇인가
2. 게시물을 등록·조회하는 API
3. 포스트맨을 이용해서 만든 API를 테스트

 


API

 

API (Application Programming Interface)

컴퓨터 프로그램들끼리 상호작용하기 위해 쓰이는 인터페이스를 의미합니다.

무슨 말인지 이해가 가지 않습니다...

 

쉽게 말하면 홈페이지에서 로그인 버튼을 눌렀을 때,

프론트에서는 백엔드에 로그인 API를 호출합니다.

백엔드와 프론트엔드가 상호작용 하는 것이라고 할 수 있죠.

그러한 기능들을 API라고 이해하면 좋을 듯 합니다.

 

 


포스트맨

 

 

설치 후 실행해 주세요.

설치 과정은 생략하겠습니다.

프로그램을 실행하면 다음과 같은 창이 보입니다.

좌측 상단에 New->Collection을 눌러 API Request를 모아둘 공간을 생성하겠습니다.

저는 폴더 이름은 homepage로 정했습니다.

 

 

request를 생성하고

 

 

게시물을 등록하기 위한 API를 생성하겠습니다.

서버 리소스를 생성하거나 업데이트 할 때는 POST 메서드를 이용합니다.

또한, 서버에서 리소스를 요청할 때는 GET 매서드를 이용합니다.

 

게시물을 생성하는 것이니 POST 요청을 써야 하겠죠.

http://localhost:8080/board/post 의 경로로 API를 요청하겠습니다.

요청의 Body에는 JSON 형식으로 title, content, category 값을 담아서 전송하겠습니다.

 

 

물론 서버가 실행되어 있어도

다음과 같은 에러가 발생합니다.

우린 아직 http://localhost:8080/board/post 이라는 API를 작성한 적이 없기 때문입니다.

 

그래서 지금부터

게시물 데이터를 생성하기 위한 API를 만들겁니다.

 

 


게시물 조회·생성 API

 

게시판은 매우 기본적인 기능이기에

언뜻 쉬울 것 같지만

굉장히 어려운 작업입니다.

 

먼저 Post.java 클래스를 수정하겠습니다.

post.java 클래스는 앞으로도 계속 수정을 거칠겁니다.

 

 

Post.java

package com.homepage.board.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
@Entity
@Table(name="post")
public class Post {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
    
	private String title;
	private String content;
	private String category;
    
	@CreationTimestamp
	private LocalDateTime  wr_date;
}

@Entity : Post 클래스가 Entity임을 선언합니다. 이게 entity와 dto의 구체적인 차이에요.

앞으로도 모든 entity 값은 DB에 테이블로 생성되게 하겠습니다.

 

@Table : Post 클래스가 DB의 어떤 테이블과 연결되는지 구체적으로 명시합니다.

@Table은 없어도 @Entity만 있다면 DB와 연결이 가능합니다.

 

@Id : 해당 변수(필드)를 기본키로 지정합니다. 이 id 값으로 나중에 다른 테이블과 복잡한 연관 관계를 맺게 됩니다.

 

@GeneratedValue(strategy = GenerationType.IDENTITY) : 기본키를 생성하는 방법을 정합니다. DB에서 테이블의 키값이 자동으로 1씩 증가하게 하는 AUTO_INCREMENT를 클래스에서 설정할 수 있게 합니다.

 

@CreationTimestamp : 자동으로 객체의 생성 시간을 저장합니다

 

+ wr_date 속성은 게시물이 생성된 날짜·시간 입니다.

 

 


application.properties

...
spring.jpa.hibernate.ddl-auto= update

여기까지 설정을 해주면 서버를 실행할 때

JPA가 자동으로 테이블을 생성합니다.

직접 DB를 건드릴 필요가 없는 아주 편한 기능입니다.

 

 

이제 서버를 재실행하면

성공적으로 DB가 생성되어 있습니다.

 

 


 

BoardController.java

...
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import com.homepage.board.dto.PostRequestDto;
import com.homepage.board.dto.PostResponseDto;

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

	//게시물 조회 
	@GetMapping("/post/{postId}")
	public ResponseEntity<PostResponseDto> getPostById(@PathVariable("postId") Long postId){
		
		PostResponseDto postResponseDto = boardService.getPostById(postId);
		
	    return ResponseEntity.ok(postResponseDto);
	}
	
	//게시물 등록
	@PostMapping("/post")
	public ResponseEntity<Void> register(@RequestBody PostRequestDto request){
    
		if(boardService.register(request)) {
			return ResponseEntity.ok().build();
		}
		else {
			return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
		}
	}
}

 

 


 

BoardService.java

...
import java.util.NoSuchElementException;

import com.homepage.board.dto.PostRequestDto;
import com.homepage.board.dto.PostResponseDto;

@Service
@RequiredArgsConstructor
public class BoardService{
	private final BoardRepository boardRepository;
	
	public PostResponseDto getPostById(Long postId) {
		Post post=boardRepository.findById(postId).orElseThrow(()->
				new NoSuchElementException("게시물이 존재하지 않습니다."));
		
		PostResponseDto postResponseDto = PostResponseDto.builder()
				.id(post.getId())
				.title(post.getTitle())
				.content(post.getContent())
				.category(post.getCategory())
				.build();

		return postResponseDto;
	}
	
	public boolean register(PostRequestDto request) {
		
		Post post = Post.builder()
				.title(request.getTitle())
				.category(request.getCategory())
				.content(request.getContent())
				.build();
		boardRepository.save(post);
		
		return true;
	}
}

getPostById는 Post값을 PostResponseDto에 담아 반환합니다.

 


 

API 테스트

 

위에는 게시물 등록

아래는 게시물 조회입니다.

둘 다 성공적으로 200 OK 상태메세지를 전달합니다.

 

 

데이터베이스를 확인해봐도 성공적으로 값이 들어가 있는 것을 확인할 수 있습니다.