JAVA/프로젝트

Spring Boot : 게시판 End point 개발. board와 post 생성

whyHbr 2024. 4. 26. 22:58
728x90
반응형

End point?

웹에서 클라이언트가 서버에게 요청을 보낼 수 있는 특정 URL, URI 경로

API가 서버에서 리소스에 접근할 수 있도록 가능하게 하는 URL이다. 

 

 

1.글 작성하는 부분

작성자 userName 김어쩌구
비밀번호 password 1234
제목 title 문의 합니다.
문의 내용 content 문의합니다. 현재 ~~~~입니다.

 

 

2. 게시판에 처음 진입하면 들어오게 되는 부분

번호 id  제목 title 작성일 postedAt 작성자userName
1 문의 합니다. 2024-04-26 김어쩌구
2 상세 내역 문의합니다. 2024-04-27 김이박

 

 

 

1. 글 작성 부분 개발

 

Board :

게시판을 만들기 위해선 게시판 만들어주는 api 필요 : board pacakage - controller package - BoardController class 

요청 받기 위해 모델이 필요 : board package - model package - BoardRequest class 생성

컨트롤러 요청 받을 서비스 필요 : board package - service package - BoardService 생성

 

 

들어오는 요청값:

package com.example.myboard.board.model;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import jakarta.validation.constraints.NotBlank;
import lombok.*;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class BoardRequest {

    @NotBlank //notnull포함
    private String boardName;
    //사용자의 입력이기 때문에 status는 필요 없음
}

컨트롤러에서 쓰인 @Valid 는 여기 있는 @NotBlank 를 검증한다. 

 

 

컨트롤러에 요청이 들어오면  해당 요청(BoardRequest)은 @Valid를 통해 검증이 된다(@NotBlank 이름이 반드시 있어야 함). 

package com.example.myboard.board.controller;

import com.example.myboard.board.db.BoardEntity;
import com.example.myboard.board.model.BoardRequest;
import com.example.myboard.board.service.BoardService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/board") //경로 지정
@RequiredArgsConstructor
public class BoardController {
    private final BoardService boardService;

    @PostMapping("")// 경로 기본값 ("/board")
    public BoardEntity create(@Valid @RequestBody BoardRequest boardRequest){
        return boardService.create(boardRequest);
    }
}

 

 

 

서비스의 create통해 온 요청온 request에 대한 이름을 지정, 상태는 "등록" 으로 설정. 이것을 저장한 다음 값을 레포지토리에 리턴 함. 

package com.example.myboard.board.service;

import com.example.myboard.board.db.BoardEntity;
import com.example.myboard.board.db.BoardRepository;
import com.example.myboard.board.model.BoardRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor //final 사용시 필요함
public class BoardService {
    private final BoardRepository boardRepository;

    public BoardEntity create(BoardRequest boardRequest){
        var entity = BoardEntity.builder()
                .boardName(boardRequest.getBoardName())
                .status("REGISTERED")
                .build();
        return boardRepository.save(entity);
    }
}

 

 

레포지토리는 값을 받는다. JpaRepository를 상속 받았기에 따로 구현은 필요 없다

package com.example.myboard.board.db;

import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<BoardEntity, Long> {
}

 

 

 

Post:

작성자, 비밀번호, 제목, 문의내용을 입력 받음

board와 같은 패키지, 클래스 생성한다. 

 

사용자 입력, 요청받은 값

package com.example.myboard.post.model;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.*;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class PostRequest {

    @NotBlank
    private String userName;
    @NotBlank
    @Size(min = 4, max = 4) //db에 int(4) 로 지정해놔서 거기에 맞춰준다.
    private int password;
    @NotBlank
    private String title;
    @NotBlank
    private String content;

}

 

 

 

PostController: 요청 받은 PostRequest를 @Valid 를 통해 검증, 서비스로 넘겨준다. 

package com.example.myboard.post.controller;

import com.example.myboard.post.db.PostEntity;
import com.example.myboard.post.model.PostRequest;
import com.example.myboard.post.service.PostService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/post") //이 경로로 들어온다
public class PostController {
    private final PostService postService;

    @PostMapping("") //경로기본값
    public PostEntity create(@Valid @RequestBody PostRequest postRequest){
        return postService.create(postRequest);
    }
}

 

 

PostService : 요청값 + PostEntity에 있던 걸 붙여 만들어 PostRepository에 넘긴다.

package com.example.myboard.post.service;

import com.example.myboard.post.db.PostEntity;
import com.example.myboard.post.db.PostRepository;
import com.example.myboard.post.model.PostRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

@Service
@RequiredArgsConstructor
public class PostService {

    private final PostRepository postRepository;
    public PostEntity create(PostRequest postRequest) {
        var entity = PostEntity.builder()
                .boardId(1L) //임시 고정값
                .userName(postRequest.getUserName())
                .password(postRequest.getPassword())
                .status("REGISTERED") //등록됨
                .title(postRequest.getTitle())
                .content(postRequest.getContent())
                .postedAt(LocalDateTime.now()) //현시각
                .build();

        return postRepository.save(entity);
    }
}

 

 

PostRepository:

package com.example.myboard.post.db;

import org.springframework.data.jpa.repository.JpaRepository;

public interface PostRepository extends JpaRepository<PostEntity, Long> {
}

 

 

 

 

 

결과 확인:

 

board 생성

{
  "board_name" :"QnA"
}

 

boardRequest 양식에 맞춰 제이슨으로 보내주면

 

service에서 살을 붙여 온 결과를 볼 수 있다.

 

 

POST 게시글 생성 :

{
  "user_name":"김이박",
  "password": "1234",
  "title":"문의합니다.",
  "content" :"문의 내용입니다."
}

PostRequest 에 맞춰 제이슨 형식으로 보내면

 

Service에서 PostEntity 형식으로 변환해 저장해준다.

 

 

DB 연동은 잘됐을까

select * from board;
select * from post;

 

확인 끝

728x90