[Spring Boot 게시판 ②] CRUD API 설계 (1/3)

2025. 6. 20. 23:51·공부일기../Spring

시리즈 포스팅!! 

SprintBoot로 게시판 만들기 ②📝(API명세서, ERD작성) - 1

SprintBoot로 게시판 만들기 ②📝(CRUD 구현_설정부) - 2

SprintBoot로 게시판 만들기 ②📝(CRUD 구현_개발) - 3

SprintBoot로 게시판 만들기 ②📝(CRUD 구현_테스트) - 4

 


 

 

1. 데이터베이스 설계 및 ERD 작성

 

게시글 요구사항에서는 게시물의 제목, 내용,비밀번호, 작성자명,작성날짜 는 필수로 필요했고

조회수는 내가 임의로 넣었다.. 블로거로서 조회수는 포기할 수 없는 지점이라..ㅋ

 

사용자 테이블은 기타 필요한 항목들이있지만 (이메일, 전화번호등,,) 패스 하기로했다

가입날짜정도는 필요하다구 생각했고 , 사실 추가 요구사항에 권한 부분이있어서 사용자 테이블에 권한ID를 주고 권한테이블을 하나 더 추가설계할까도 고민했었는데 시간관계상 그게 될까..싶어서 ㅋㅋ 일단 패스하기로한다.. 

 

비밀번호와 이름(아이디라고 생각하면된다)부분은 요구사항에 명확하게 

  • username은 최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성되어야 한다.
  • password는 최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9), 특수문자로 구성되어야 한다.

기재되어있었기 때문에 따악~ 맞는 varchar(10), varchar(30)을 지정했다.

게시판같은 경우에 따로 사용자 비밀번호와는 무관한 게시판만의 비밀번호일거같긴하지만? 같은 데이터타입을 지정했음..

게시판의 일련번호는 0부터 그냥 1씩 증가 하려고 long타입중에서 고민을 하다가 bigint로 설정했다.. 특별한 이유는 없고.. 

 

 

*JWT토큰에 관해서..(포스팅쓸꺼임),,

JWT토큰의 종류에는
액세스 토큰(Access Token)과 리프레시 토큰(Refresh Token) 이 있다.
엑세스 토큰은 사용자에 대한 정보를 담고있으며 서비스에 접근 할수있는 토큰으로 만료시간이 짧은게 특징(5분~30분)이다.
리프레시 토큰은 별다른 정보를 가지고 있지않은 대신 액세스 토큰이 만료되었을 때 서버에서 이를 확인하고 새로운 액세스 토큰을 발급해주기 위해 사용한다.

이때 리프레시 토큰은 데이터베이스에 저장해야하지만 나는 엑세스토큰까지만 구현 할 생각이고 엑세스 토큰인 쿠키에 저장하려고 한다. 그래서 사용자테이블에 토큰관련 컬럼은 추가하지않았다.

 

 

 

 

사용툴

https://www.erdcloud.com/

 

ERDCloud

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

 

 


2. API 명세서 작성 (추후 디테일 작성)

나의 디테일 명세서는 이렇다.. 이게 맞는건진 잘 모르겠지만..

우선은 최대한 맞게 작성을 해보았다.

 

일단 아래는 초안이었고 (개발전)

더보기

 

기능 API URL Method Request Header Request Response Response Header 요구사항
게시글 작성 /api/board/insertBoard POST Content-Type: application/json {
"title": "게시글5",
"content": "내용5",
"pwd":"0000"
}
{
"title": "게시글5",
"writer":"이승민",
"content": "내용5",
"rgst_dt":"2025-06-19 5:00",
"udt_dt":"2025-06-19 5:00",
"board_no": "123",
"veiw_cnt":"0"
}
Content-Type: application/json,
Status: 200 Created
- 제목, 작성자명, 비밀번호, 작성 내용을 저장하고
- 저장된 게시글을 Client 로 반환하기
게시글 목록 조회 /api/board/getList GET Content-Type: application/json   {
"board_no": "123",
"title": "게시글5",
"writer":"이승민",
"content": "내용5",
"rgst_dt":"2025-06-19 5:00",
"udt_dt":"2025-06-19 6:10",
"veiw_cnt":"1"
}, {},  {},  {},  .......
Content-Type: application/json,
Status: 200 Created
- 제목, 작성자명, 작성 내용, 작성 날짜를 조회하기
- 작성 날짜 기준 내림차순으로 정렬하기
게시글 상세 조회 /api/board/getDetail/{게시글 key} GET Content-Type: application/json {
"board_no": "123"
}
{
"board_no": "123",
"title": "게시글5",
"content": "내용5",
"writer":"이승민",
"rgst_dt":"2025-06-19",
"veiw_cnt":"1"
}
  선택한 게시글의 제목, 작성자명, 작성 날짜, 작성 내용을 조회
게시글 수정 /api/board/updateBoard/{게시글 key} PUT Content-Type: application/json {
"board_no": "123",
"title": "게시글5",
"content": "내용5",
"pwd":"0000"
}
{
"board_no": "123",
"title": "게시글5",
"content": "내용5",
"writer":"이승민",
"rgst_dt":"2025-06-19 5:00",
"udt_dt":"2025-06-19 6:10",
"veiw_cnt":"1"
"msg": "게시글 수정 성공",
"statusCode": 200
},
{
  "error": "비밀번호가 일치하지않습니다.",
  "status": 400
}
Content-Type: application/json,
Status: 200 OK
- 수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
- 제목, 작성자명, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
게시글 삭제 /api/board/deleteBoard/{게시글 key} DELETE Content-Type: application/json {
"board_no": "123",
"pwd":"0000"
}
{
"msg": "게시글 삭제 성공",
"statusCode": 200
} ,
{
  "error": "비밀번호가 일치하지않습니다.",
  "status": 400
}
Content-Type: application/json,
Status: 200 OK
- 삭제를 요청할 때 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
- 선택한 게시글을 삭제하고 Client 로 성공했다는 표시 반환하기
회원가입 /api/users/createUser POST Content-Type: application/json {
"username": "sm0106",
"password": "lsm@12345"
}
{
"msg": "회원가입 성공",
"statusCode": 200
}

{
  "error": "중복된 아이디입니다.",
  "status": 400
}
Content-Type: application/json - username은  `최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)`로 구성되어야 한다.
- password는  `최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)`로 구성되어야 한다.
- DB에 중복된 username이 없다면 회원을 저장하고 Client 로 성공했다는 메시지, 상태코드 반환하기
로그인 /api/users/loginUser  POST Authorization: Bearer JWT토큰,
Content-Type: application/json
{
"username": "sm0106",
"password": "lsm@12345"
}
{
"msg": "로그인 성공",
"statusCode": 200
},
{
  "error": "계정정보가 일치하지않습니다.",
  "status": 400
}
Authorization: Bearer {JWT}, Content-Type: application/json - DB에서 username을 사용하여 저장된 회원의 유무를 확인하고 있다면 password 비교하기
- 로그인 성공 시, 로그인에 성공한 유저의 정보와 JWT를 활용하여 토큰을 발급하고,
발급한 토큰을 Header에 추가하고 성공했다는 메시지, 상태코드 와 함께 Client에 반환하기

 

개발 후 변경된 나의 API명세서이다! 

최대한 API url 을 간단하게 api 스타일로 하고싶어서 Method를 다르게해서 구현했다 

기능 API URL  Method  Request Header  Request Body  Response  Response Header
게시글 전체 조회 /api/board/ GET Accept: application/json 없음 게시글 리스트 배열 반환 200 OK, JSON
게시글 상세조회 /api/board/{id} GET Accept: application/json 없음 (PathVariable: id) 해당 게시글 정보 반환 200 OK, JSON
게시글 생성 /api/board/ POST Content-Type: application/json { title, content, writer, board_pwd } 생성된 게시글 정보 또는 성공 메시지 201 Created, JSON
게시글 수정 /api/board/{id} PUT Content-Type: application/json { title, content, board_pwd } 수정 완료 메시지 또는 수정된 게시글 정보 200 OK, JSON
게시글 삭제 /api/board/{id} DELETE Content-Type: application/json { board_pwd } 삭제 완료 메시지 200 OK, JSON

 

 

 

API명세서의 테스트 툴은 Swagger 를 사용하기로 했었다.

사용방법은 간단한데

1. Swagger는 Spring-Boot에서 의존성을 추가( pom.xml에 Swagger 의존성 추가 )

2. Controller 클래스에 어노테이션만 추가! ( @Operation, @Tag 등 어노테이션 컨트롤러에 추가 )

3. 서버 실행 후 사이트 접속( 서버 실행 → http://localhost:8080/swagger-ui/index.html 접속 )

4. 자동문서 생성 및 테스트 가능

으로 알고있음!! 

 

(JWT를 사용하는 경우와 사용하지 않는경우 다른 내용을 기재해야한다고 한다. 

나는 추후에 JWT를 활용하지만 지금은 사용하지않기때문에 사용하지 않는 버전으로 먼저 추가한다...!)

 

3.  구현 및 단위 테스트

구현은 길어질것같아 다른 포스팅으로 빼서 작성하도록 할것이다..

 

 

 

 

 

 

도움받은블로그

https://velog.io/@gmlstjq123/SpringBoot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-Swagger-UI-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0

 

'공부일기.. > Spring' 카테고리의 다른 글

[Spring Boot 게시판 ] JWT 로그인 구현 하기  (0) 2025.07.01
[Spring Boot 게시판 ②] CRUD API , Postman 테스트(4/4)  (0) 2025.06.24
[Spring Boot 게시판 ②] CRUD API 개발(3/4)  (0) 2025.06.24
[Spring Boot 게시판 ②] CRUD API 구현 (2/4)  (0) 2025.06.23
[Spring Boot 게시판 만들기①] 테크스펙, 환경설정, 유스케이스  (0) 2025.06.19
'공부일기../Spring' 카테고리의 다른 글
  • [Spring Boot 게시판 ②] CRUD API , Postman 테스트(4/4)
  • [Spring Boot 게시판 ②] CRUD API 개발(3/4)
  • [Spring Boot 게시판 ②] CRUD API 구현 (2/4)
  • [Spring Boot 게시판 만들기①] 테크스펙, 환경설정, 유스케이스
s0-0mzzang
s0-0mzzang
공부한것을 기록합니다...
  • s0-0mzzang
    승민이의..개발일기..🐰
    s0-0mzzang
  • 전체
    오늘
    어제
    • 전체~ (108)
      • 마음가짐..! (10)
      • 공부일기.. (76)
        • weekly-log (6)
        • Spring (19)
        • Java (18)
        • DataBase (10)
        • git (2)
        • JPA (6)
        • kafka (1)
        • Backend Architecture (3)
        • Troubleshooting (삽질..ㅋ) (2)
        • Cloud (1)
        • Docker (2)
        • 알고리즘 (1)
        • 리액트 (2)
        • Infra (3)
      • 하루일기.. (22)
        • 그림일기 (8)
        • 생각일기 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    인프라 기초
    spring boot
    BufferedReader
    자바
    스프링부트
    다짐
    TDD
    MySQL
    항해플러스
    React
    ERD
    항해99
    StringTokenizer
    Paging
    JPA
    SpringBoot
    ADC 환경
    swagger
    리팩토링
    spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s0-0mzzang
[Spring Boot 게시판 ②] CRUD API 설계 (1/3)
상단으로

티스토리툴바