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 연동은 잘됐을까
확인 끝
'JAVA > 프로젝트' 카테고리의 다른 글
Spring Boot: End point 개발 3, 게시글과 게시글에 달린 답변 같이 보기 (0) | 2024.04.27 |
---|---|
Spring Boot: End point 개발 2, 조회, 개별 조회, 삭제 (0) | 2024.04.27 |
Spring Boot : Entity 개발, DB 테이블과 연동 (0) | 2024.04.26 |
Spring Boot: 게시판 설계, ERD Diagram, DB 연동 (0) | 2024.04.26 |
Spring - MVC와 템플릿 엔진 (0) | 2023.07.28 |