일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 백준
- 프로그래밍
- 게임
- node.js
- 깃
- netlify
- spring
- RiotAPI
- unity
- OAuth2.0
- IntelliJ
- oAuth
- 파이썬
- AWS
- react
- JSON
- frontend
- 게임개발
- Python
- 코딩
- bcrypt
- express
- 유니티
- c#
- jwt
- 스프링
- 백엔드
- MongoDB
- 스프링부트
- springboot
- Today
- Total
Unwound Developer
별글 프로젝트 - WBS, ERD 설계와 Restful API 본문
저번 Arcane 프로젝트는 너무 주먹구구 식으로 개발한거 같아 이번엔
소프트웨어 공학적으로 해보려고 합니다.
- WBS
WBS는 work-breakdown structure의 약자로, 업무 분업 구조 또는 작업 분류 체계 정도의 뜻을 가지고 있는 말입니다. 조금 더 쉽게 말해서, 팀의 작업을 관리 가능한 부분들로 분할 후 조직화한 구조도입니다.
다음은 별글 프로젝트의 WBS 입니다.
추후에 수정 될 수도 있지만, 우선 설계단계에서 확정된 WBS에요.
크게 사용자(클라이언트) 부분과 관리자(Admin)부분으로 나누었습니다.
로그인, 프로필 관련 메뉴, 글 작성 등
가장 큼직한 부분들로 먼저 기능을 분류하고,
해당 기능들의 하위 기능(세부 기능)들로 WBS를 채워나갔습니다.
- WBS
작성한 WBS를 기반으로 데이터베이스를 설계하고, ERD까지 작성해봤습니다.
WBS의 기능들을 보고 이 기능엔 어떤어떤 데이터가
필요하겠다 를 생각하면서 설계해봤는데요,
우선 조금 특이한 부분으로는 post(게시글)부분이 가장 이상하게 보일 것 같습니다.
게시글과 게시글의 메인텍스트(내용), 게시글 배경이미지가
세 개의 테이블로 분리되어 있습니다.
이유는 메인 게시글 페이지의 디자인을 먼저 봐야해요.
디자인은 Figma로 만들었습니다.
위 처럼 게시글들이 사진 형태의 목록으로 정렬되어있고, 게시글을 클릭해 세부 화면으로 진입하면
위와 같이 글을 사진과 함께 여러 페이지로 게시할 수 있습니다.
(최대 10페이지) 이 때 글 마다 페이지 개수가 다를텐데,
최대 10페이지로 지정해놨기때문에,
테이블에는 10장의 사진과 10개의 글이 저장되어야 할 컬럼이 필요합니다.
이걸 모두 post라는 한 테이블에 저장해버리면
테이블의 컬럼이 너무 많아져서
게시글의 기본 정보만 가지고있는 post테이블,
최대 10개까지 글을 저장할 수 있는 post_maintext 테이블,
최대 10장의 사진을 저장할 수 있는 post_bg 테이블,
총 3개의 테이블로 분리했습니다.
post_maintext와 post_bg 테이블은 당연히 post테이블을 외래키로 참조하고 있습니다.
### \-API
ERD를 기반으로 API도 작성했습니다.
API하면 같이 따라오는 말이 Restful이엥요.
팀 프로젝트같은 수업때도 Restful API라는 말을 설계 단계에서 들었는데,
정작 정확히는 뭔지 모르고 넘어갔습니다.
주먹구구식 개발이 이유인 것 같습니다..
우선 API의 정의부터 짚고 넘어가요.
API는 Application Programming Interface의 줄임말입니다.
API의 맥락에서 애플리케이션이라는 단어는
고유한 기능을 가진 모든 소프트웨어를 나타냅니다.
인터페이스는 두 애플리케이션 간의 서비스 계약이라고 할 수 있습니다.
이 계약은 요청과 응답을 사용하여 두 애플리케이션이
서로 통신하는 방법을 정의합니다.
API 문서에는 개발자가 이러한 요청과 응답을 구성하는
방법에 대한 정보가 들어 있습니다.
AWS에서 설명하는 API입니다.
그냥 웹 애플리케이션을 개발하는 과정에서 쉽게 말하면,
클라이언트와 서버 사이의 통신 방법에 대한 규칙 정도로 요약할 수 있을것 같습니다.
그럼, REST API에 대한 정의도 알아봅니다.
우선 REST라는건 공식적인것이 아니기때문에, 정답이 있는 것은 아니에요.
REST 규칙에 따르는것이 API에 대한 이해도와 호환성을 높여주기 때문에,
최대한 RESTful 하게 API를 만드는 것 뿐입니다.
REST는 Representational State Transfer의 줄임말입니다.
REST는 클라이언트가 서버 데이터에 액세스하는 데 사용할 수 있는
GET, PUT, DELETE 등의 함수 집합을 정의합니다.
클라이언트와 서버는 HTTP를 사용하여 데이터를 교환합니다.
REST API의 주된 특징은 무상태입니다.
무상태는 서버가 요청 간에 클라이언트 데이터를
저장하지 않음을 의미합니다.
서버에 대한 클라이언트 요청은 웹 사이트를 방문하기 위해
브라우저에 입력하는 URL과 유사합니다.
REST API라고 할 수 있는데에는 6가지 조건이 있습니다.
- 일관성
- 무상태
- 캐시 처리 가능(Cacheable)
- 계층화
- Optional
- 클라이언트/서버 구조
가장 큰 특징은 무상태(Stateless) 라고 합니다.
서버가 요청 간에 클라이언트 데이터를
저장하지 않음을 의미한다고 하는데,
사실 요즘 거의 모든 웹이 Stateless하게 만들어져서,
Stateful한 웹 서비스가 뭔지를 잘 모르겠습니다.
Stateful 하다는건 서버에 클라이언트의 세션 정보(상태)를
저장하는 것을 말한다고 합니다.
아마 최근의 웹 서비스는 모두 대용량 트래픽을 이루고,
유동성도 매우 커서 이런 Stateful한 서비스는 없을 것 같다고 생각해요.
REST API의 개념을 좀 더 구체적으로 명시하자면,
HTTP url을 통해 자원을 나타내고,
method(GET, POST 등 자주 사용하던 CRUD 요청)를
사용하는 api를 모두 REST라고 합니다.
그런데, REST API에는 정확한 표준이 없는 규칙이라서,
모두 조금씩 다르기도합니다.
참고하는 API마다 규칙이 달라서 헷갈리기도 했는데
최대한 RESTful하게 작성하려 노력했습니다.
작성한 API로 예시를 들어볼게요.
GET /api/users
라는 GET요청이 있습니다. 모든 사용자 정보를 요청하는 API입니다.
여기서, 요청하다 등의 행위를 명시하면 안되고,
위처럼 요청할 자원만을 소문자로 명시해야합니다.
행위에 대한건 GET, POST등의 CRUD에서 명시하기 때문에, URI에는 없습니다.
그냥 이런식의 규칙을 지켜가면서 만들면 그게 RestAPI에요.
다만, 규칙과 너무 안맞으면 Restful하다고 할 수 없으니
최대한 지켜가면서 만들어봅니다.
다음은, 좀 더 자세한 규칙들이에요.
- URI는 정보의 자원을 표현해야 한다.
- resource는 동사보다는 명사를, 대문자보다는 소문자를 사용한다.
- resource의 도큐먼트 이름으로는 단수 명사를 사용해야 한다.
- resource의 컬렉션 이름으로는 복수 명사를 사용해야 한다.
- resource의 스토어 이름으로는 복수 명사를 사용해야 한다.
- 자원에 대한 행위는 HTTP Method (GET, PUT, POST, DELETE 등)로 표현한다.
- URI에 HTTP Method가 들어가면 안된다.
- URI에 행위에 대한 동사 표현이 들어가면 안된다.(즉, CRUD 기능을 나타내는 것은 URI에 사용하지 않는다.)
- 경로 부분 중 변하는 부분은 유일한 값으로 대체한다.(즉, :id는 하나의 특정 resource를 나타내는 고유값이다.)
- 슬래시 구분자(/ )는 계층 관계를 나타내는데 사용한다.
- URI 마지막 문자로 슬래시(/ )를 포함하지 않는다.
- URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 한다.
- REST API는 분명한 URI를 만들어 통신을 해야 하기 때문에 혼동을 주지 않도록 URI 경로의 마지막에는 슬래시(/)를 사용하지 않는다.
- 하이픈(- )은 URI 가독성을 높이는데 사용
- 밑줄(_ )은 URI에 사용하지 않는다.
- URI 경로에는 소문자가 적합하다.
- URI 경로에 대문자 사용은 피하도록 한다.
- 파일확장자는 URI에 포함하지 않는다
위의 규칙을 최대한 지켜가면서, ERD를 기반으로 제작한 API 입니다.
구체적인 API는 노션에 있습니다. 아래는 간략하게 옮겼어요.
User
💡 JSON 안의 데이터는 예시입니다!
GET
/api/users
- 모든 사용자들의 정보 불러오기
GET
/api/users/:id
- 특정 id를 가진 사용자 한명의 정보 불러오기
GET
/api/users/:nickname
- 특정 nickname을 가진 사용자 한명의 정보 불러오기
GET
/api/login
- 로그인
POST
/api/auth
- 새로운 사용자 생성
PUT
/api/users/:id
- 특정 id를 가진 사용자 정보 수정
DELETE
/api/users/:id
- 특정 id를 가진 사용자 삭제
Admin
Get
/api/admin/:id
- 특정id 관리자 정보 불러오기
USER
- 사용자 관리 api
- 모든 유저의 정보를 관리자 권한으로 불러오기
GET
/api/admin/users
Get
/api/admin/users/:users-id
- 특정 id를 가진 유저의 정보를 관리자 권한에서 불러오기
GET
/api/admin/users/:nickname
- 특정 nickname을 가진 유저의 정보를 관리자 권한으로 불러오기
PUT
/api/admin/users/:users-id
- 특정 id를 가진 유저의 정보를 관리자 권한으로 수정하기
DELETE
/api/admin/users/:users-id
- 특정 id를 가진 유저를 관리자 권한으로 삭제하기
POST
- 게시글 관리 api
- 모든 post를 관리자 권한에서 불러오기
GET
/api/admin/post
`GET` /api/admin/post?approved=false
- 아직 승인되지 않은 글 불러오기
`PUT` /api/admin/approval/:post-id
- 글 승인하기
`DELETE` /api/admin/:post-id
- 특정 id를 가진 post 삭제하기
`Delete` /api/admin/comment/:post-id
- 특정 post의 특정 comment 삭제
Enquiry
- 문의 관리 api
- 답변 작성
Put
/api/admin/enquiry/answer
`Delete` /api/enquiry/:id
- 문의 삭제
Report
- 게시글 신고 관리 api
- 특정 신고 처리
Put
/api/admin/report/:id
`Delete` /api/admin/report/:id
- 특정 신고 삭제
FAQ
- FAQ 관리 api
- 새로운 faq 생성
Post
/api/admin/faq
`Delete` /api/admin/faq/:id
- 특정 faq 삭제
Notice
- 공지사항 관리 api
- 새로운 notice 생성
Post
/api/admin/notice
`Delete` /api/admin/notice/:id
- 특정 id notice 삭제
Suspension
Get
/api/admin/suspension
- 모든 사용자정지 불러오기
Get
/api/admin/suspension/:user-id
- 특정 사용자 정지목록에서 불러오기
Post
/api/admin/suspension
- 정지목록에 사용자 추가
Delete
/api/admin/suspension/:user-id
- 특정 사용자 정지목록에서 삭제
Follow
Get
/api/following/:user-id
- 특정 사용자의 팔로우 목록 불러오기
Get
/api/follower/:user-id
- 특정 사용자의 팔로워 목록 불러오기
```
Post
/api/follow
- 팔로우 생성
Delete
/api/unfollow
- 팔로우 삭제
Post
Get
/api/post
- 모든 post 정보 불러오기
Get
/api/post/:id
- 특정 uuid를 가진 post 불러오기
Get
/api/post/:user-id
- 특정 user_id를 가진 post 불러오기
Get
/api/post?tag=tag
- 특정 태그를 가진 post 불러오기
Post
/api/post
- 새로운 post 생성
Delete
/api/post/:id
- 특정 id를 가진 post 삭제
Post_maintext
Get
/api/post-maintext/:post-id
- 특정 post의 maintext 모두 불러오기
Post
/api/post-maintext/:post-id
- 특정 post의 maintext 생성
Post_bg
Get
/api/post-background/:post-id
- 특정 post의 background 모두 불러오기
Post
/api/post-background/:post-id
- 특정 post의 background 생성
Post_comment
Get
/api/comment/:post-id
- 특정 post의 comment 모두 불러오기
Post
/api/comment/:post-id
- 특정 post의 comment 생성
Delete
/api/comment/:post-id
- 특정 post의 특정 comment 삭제
Like
Get
/api/like/:post-id
- 특정 post의 좋아요 정보 불러오기
Get
/api/like/:user-id
- 특정 사용자의 좋아요 정보 불러오기
Post
/api/like/:post-id
- 특정 post에 특정 사용자의 좋아요 생성
Delete
/api/like/:id
- 특정 좋아요 삭제
Tag
Get
/api/tag/:post-id
- 특정 post의 태그 모두 불러오기
Post
/api/tag/:post-id
- 특정 post에 tag 생성
Delete
/api/tag/:post-id
- 특정 post의 특정 태그 삭제하기
Enquiry
Get
/api/enquiry
- 모든 문의 불러오기
Get
/api/enquiry/:user-id
- 특정 사용자가 작성한 문의 불러오기
Post
/api/enquiry
- 문의 작성
Delete
/api/enquiry/:id
- 문의 삭제
Report
Get
/api/report
- 신고 목록 불러오기
Get
/api/report/:user-id
- 특정 유저의 신고 목록 불러오기
Get
/api/report?reported=false&reject_reason=null
- 아직 신고승인 여부를 판단하지 않은 목록 불러오기
Post
/api/report
- 새로운 신고 생성
Put
/api/admin/report/:id
- 특정 신고 처리
Delete
/api/report/:id
- 특정 신고 삭제
FAQ
Get
/api/faq
- faq 모두 불러오기
Notice
Get
/api/notice
- notice 모두 불러오기
'Web > Spring' 카테고리의 다른 글
스프링 "empty": false 오류 (0) | 2022.12.24 |
---|---|
스프링 mysql 연결과 @RequestBody로 JSON 받기/넘겨주기 (0) | 2022.12.20 |
Spring - mvc패턴과 Controller, Mapping (0) | 2022.12.08 |
스프링 부트를 사용하는 프로젝트 - 별글 시작 (0) | 2022.12.08 |
자바 스프링, IntelliJ vs Eclipse (0) | 2022.11.27 |