Everyday Dev System

Spring Boot 블로그 서버 구현 본문

내배캠 주요 학습/Spring 입문

Spring Boot 블로그 서버 구현

chaeyoung- 2023. 6. 15. 16:39

서비스 요구사항

  1. 전체 게시글 목록 조회 API
    • 제목, 작성자명, 작성 내용, 작성 날짜를 조회하기
    • 작성 날짜 기준 내림차순으로 정렬하기
  2. 게시글 작성 API
    • 제목, 작성자명, 비밀번호, 작성 내용을 저장하고
    • 저장된 게시글을 Client 로 반환하기
  3. 선택한 게시글 조회 API
    • 선택한 게시글의 제목, 작성자명, 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
  4. 선택한 게시글 수정 API
    • 수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    • 제목, 작성자명, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
  5. 선택한 게시글 삭제 API
    • 삭제를 요청할 때 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    • 선택한 게시글을 삭제하고 Client 로 성공했다는 표시 반환하기

 

 

 


1. UseCase 작성

 

 

 

2. API 명세서

https://docs.google.com/spreadsheets/d/1JZmNS89s8zFramK_9xyLxhH-iz1DUxvwZ1-F8a9hHng/edit#gid=0

Method URL Request Response 기능
GET /api/posts - {
{
"id" : " ",
"title" : " ",
"name" : " ",
"contents" : " ",
"create_date" : " ",
"modified_date" " "
}.
{
"id" : " ",
"title" : " ",
"name" : " ",
"contents" : " ",
"create_date" : " ",
"modified_date" " "
}
}
전체 게시글 목록 조회
GET /api/posts/{id} - {
"id" : " ",
"title" : " ",
"name" : " ",
"contents" : " ",
"create_date" : " ",
"modified_date" " "
}
선택한 게시글 조회
PUT /api/posts/{id} {
"title" : " ",
"name" : " ",
"contents" : " ",
"password" : " "
}
{
"id" : " ",
"title" : " ",
"name" : " ",
"contents" : " ",
"create_date" : " ",
"modified_date" " "
}
선택한 게시글 수정
DELETE /api/posts/{id} {
"password" : " "
}
{
"success": true
}
선택한 게시글 삭제
POST /api/posts {
"title" : " ",
"name" : " ",
"contents" : " ",
"password" : " "
}
{
"id" : " ",
"title" : " ",
"name" : " ",
"contents" : " ",
"create_date" : " ",
"modified_date" " "
}
게시글 작성

 

 

시행착오들

2023.06.15 - [내일배움캠프 공부/TIL : Today I Learned] - 스프링 오류 : Error creating bean with name

 

스프링 오류 : Error creating bean with name

20230614 6:00pm - 20230615 4:00am 20230615 9:00am - 20230615 1:00pm # 문제점 : Error creating bean with name 'postController' defined in file [D:\camp\springBasic\week1\myBlog\build\classes\java\main\com\sparta\myblog\controller\PostController.class]: U

cdev.tistory.com

 

 

 

해당 프로젝트 gitHub 주소 : 

https://github.com/Chaeyounglim/myBlog

 

GitHub - Chaeyounglim/myBlog: It's blog to do; post CRUD.

It's blog to do; post CRUD. Contribute to Chaeyounglim/myBlog development by creating an account on GitHub.

github.com

 

 

 

 


프로젝트를 마친 후에 질문들

 

1. 어떤 상황에 어떤 방식의 request를 써야하나요?

 

[데이터 보안에 따른 분류]

1. 데이터 노출이 상관이 없을 경우
데이터를 url에 명시하여 이를 통해 값을 전달할 경우 get방식을 활용합니다.
데이터가 url에 노출되어 보안이 필요하지 않은 데이터의 경우에 활용하면 됩니다.
개인정보가 포함되지 않는 상황에서 캐싱을 하여 속도를 높힐수 있다는 장점이 있습니다.


예시1) http://localhost:8082/api/posts/id
Controller 내에 해당 API 메서드 파라미터에 해당 어노테이션 기재 : @PathVariable 


예시2) http://localhost:8082/api/posts?id=sally
Controller 내에 해당 API 메서드 파라미터에 해당 어노테이션 기재 :  @RequestParam


2. 데이터 노출을 원치 않을 경우
데이터를 Body에 포함시켜 url에 노출시키지 않고 요청할 경우에는 Post 방식을 활용합니다.
password 같은 경우는 url에 노출시키면 보안상 문제가 있습니다.
예시) 
{
"title" : "sds",
"contents" : "sd",
"name" : "ff",
"password" : "password"
}
위 데이터를 request할 때 
Controller 내에 해당 API 메서드 파라미터에 해당 어노테이션 기재 : @RequestBody
또한 메서드앞에 @ResponseBody를 기재하거나 Controller 앞에 @RestController 기재



[데이터 용도에 따른 분류]

1. 데이터 조회
데이터를 조회하거나, 특정 조건에 맞는 데이터를 조회할 경우에는 get 방식을 활용합니다.
특정 조건에 대한 데이터는 url을 통해 전달받아서 sql 쿼리문에 조건을 주어 조회하여 가져옵니다.

 


2. 데이터 수정
수정할 데이터를 json 타입의 데이터로 전달하여 put 방식을 활용합니다.
서버는 전달받은 json 타입 데이터의 key 값과 Entity Class의 멤버 변수명이 일치할 경우, 이를 Controller에서 맵핑하여 Service에 데이터를 update 역할을 하는 메서드로 전달합니다. 


3. 데이터 저장
저장할 데이터를 json 형태의 데이터로 전달하여 post 방식을 활용합니다.
서버는 전달받은 json 타입 데이터의 key 값과 Entity Class의 멤버 변수명이 일치할 경우, 이를 Controller에서 맵핑하여 Service에 데이터를 insert 역할을 하는알맞는 메서드로 전달합니다. 

 


4. 데이터 삭제
삭제할 데이터의 식별자 값을 json 형태로 받아옵니다. delete 방식을 활용합니다. 받아온 식별자 값을 Service에서 데이터를 삭제하는 역할을 하는 메서드에 전달하여 데이터를 삭제 합니다.

 

 

 

 2. RESTful한 API를 설계했나요? 어떤 부분이 그런가요? 어떤 부분이 그렇지 않나요?

 

찾아보니 REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful하다 말할 수 있다고 한다는 것을 새로 알게되었습니다. 그럼 REST API의 설계 규칙이 뭔지 먼저 알아야 할 것 같습니다.

1. URI는 동사보다는 명사를, 대문자보다는 소문자를 사용하여야 한다.
- 해당 규칙을 잘 준수하였습니다.

2. 마지막에 슬래시 (/)를 포함하지 않는다.
 - 해당 규칙을 잘 준수하였습니다.

3. 언더바 대신 하이폰을 사용한다.
 - 해당 언더바와 하이픈은 사용하지 않았습니다.

4. 파일확장자는 URI에 포함하지 않는다.
 - 확장자는 기재하지 않았습니다.

5. 행위를 포함하지 않는다.
 - 행위는 HTTP Method를 통해 구분하였습니다.

해당 규칙에 맞게 설계를 했습니다. 또한, 데이터에 대한 처리를 알맞은 HTTP Method를 적절히 잘 선택하여 프로젝트를 마쳤습니다.

 

 

 

3. 적절한 관심사 분리를 적용하였나요? (Controller, Repository, Service)

클라이언트로 부터 데이터를 전달 받고, 데이터를 반환하는 역할은 Controller에서 수행합니다. 또한, 데이터를 가공 등 변환하는 처리 등은 Service에서, 가공된 데이터를 전달받아 DB에 반영 하는 역할을 하는 Repository로 3개의 계층으로 잘 분리하여 작성하였습니다.

 

자세한 설명은 아래 글 참조.

2023.06.13 - [내일배움캠프 공부/Spring 입문] - @Service와 @Repository

 

@Service와 @Repository

1. @Service 란? - Controller와 Repository 사이에 있는 계층으로 비즈니스 로직 부분을 포함하는 Class입니다. Service 계층 역할을 하는 Bean Class -> @Service @Service에 @Component가 달려 있으므로, 스프링 내부에

cdev.tistory.com