스파르타 코딩클럽_내일 배움 캠프 spring 트랙 6기
[프로젝트] 나만의 항해 블로그 백엔드 서버 만들기 Lv1
2023.06.12 ~ 2023.06.16
<프로젝트 정보>
개발도구 : IntelliJ
프로그래밍 언어 : Java
데이터베이스 : MySQL
프레임워크 : Spring
저장소 : GitHub
기타서비스 : Postman
<프로젝트 내용>
Spring Boot를 이용하여 로그인 기능이 없는 나만의 항해 블로그 백엔드 서버 만들기 Lv1
<과제 요구 사항>
1. 아래의 요구사항을 기반으로 Use Case 그려보기 => 따로 그려보지 않았음.
· 손으로 그려도 됩니다.
· cf. https://narup.tistory.com/70
2. 전체 게시글 목록 조회 API
· 제목, 작성자명, 작성 내용, 작성 날짜를 조회하기
· 작성 날짜 기준 내림차순으로 정렬하기
3. 게시글 작성 API
· 제목, 작성자명, 비밀번호, 작성 내용을 저장하고
· 저장된 게시글을 Client 로 반환하기
4. 선택한 게시글 조회 API
· 선택한 게시글의 제목, 작성자명, 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
5. 선택한 게시글 수정 API
· 수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
· 제목, 작성자명, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
6. 선택한 게시글 삭제 API
· 삭제를 요청할 때 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
· 선택한 게시글을 삭제하고 Client 로 성공했다는 표시 반환하기
<과제 주의 사항>
1. Entity를 그대로 반환하지 말고, DTO에 담아서 반환해주세요!
2. 프론트엔드와 백엔드가 느슨하게 결합하는 환경이 ”최근에는” 더 일반적이라고 말씀드렸죠?
앞으로 남은 강의 예제와 실습에서는 html/css/js 즉 뷰도 같이 반환 하겠지만, 과제에는 여러분들이 서버 로직에 더 집중하실 수 있도록
JSON을 반환하는 API형태로 진행하려고 합니다.
3. 눈으로 직접 확인 할 수 있었던 view와는 다르게, 여러분들이 과제를 진행하시려면 서버가 반환하는 결과값을
더 쉽게 확인 하실 수 있는 도구가 필요합니다. 바로 PostMan 입니다. 사용법은 아래 페이지에서 꼭 확인해주세요!
[내가 작성한 코드]
[BlogController]
package com.sparta.blogapi.controller;
import com.sparta.blogapi.dto.BlogRequestDto;
import com.sparta.blogapi.dto.BlogResponseDto;
import com.sparta.blogapi.entity.Blog;
import com.sparta.blogapi.repository.BlogRepository;
import com.sparta.blogapi.service.BlogService;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api")
public class BlogController {
private final BlogService blogService;
private BlogRepository blogRepository;
public BlogController(BlogService blogService) {
this.blogService = blogService;
}
//전체 게시글 목록 조회 API
//- 제목, 작성자명, 작성 내용, 작성 날짜를 조회하기
//- 작성 날짜 기준 내림차순으로 정렬하기
@GetMapping("/posts")
public List<BlogResponseDto> getPosts() {
BlogService blogService = new BlogService(blogRepository);
return blogService.getPosts();
}
//게시글 작성 API
//- 제목, 작성자명, 비밀번호, 작성 내용을 저장하고 저장된 게시글을 Client 로 반환하기
@PostMapping("/posts")
public BlogResponseDto createPost(@RequestBody BlogRequestDto requestDto) {
BlogService blogService = new BlogService(blogRepository);
return blogService.createPost(requestDto);
}
//선택한 게시글 조회 API
// - 선택한 게시글의 제목, 작성자명, 작성 날짜, 작성 내용을 조회하기
// - (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
@GetMapping("/post/{id}")
public Long getSelectPost(@PathVariable Long id, @RequestBody BlogRequestDto requestDto) {
BlogService blogService = new BlogService(blogRepository);
return blogService.getSelectPost(id, requestDto);
}
//선택한 게시글 수정 API
// - 수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
// - 제목, 작성자명, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
@PutMapping("/post/{id}")
public Long updatePost(@PathVariable Long id, @RequestBody BlogRequestDto requestDto) {
BlogService blogService = new BlogService(blogRepository);
return blogService.updatePost(id, requestDto);
}
//선택한 게시글 삭제 API
// - 삭제를 요청할 때 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
// - 선택한 게시글을 삭제하고 Client 로 성공했다는 표시 반환하기
@DeleteMapping("/post/{id}")
public Long deletePost(@PathVariable Long id) {
BlogService blogService = new BlogService(blogRepository);
return blogService.deletePost(id);
}
}
[BolgService]
package com.sparta.blogapi.service;
import com.sparta.blogapi.dto.BlogRequestDto;
import com.sparta.blogapi.dto.BlogResponseDto;
import com.sparta.blogapi.entity.Blog;
import com.sparta.blogapi.repository.BlogRepository;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class BlogService {
private final BlogRepository blogRepository;
public BlogService(BlogRepository blogRepository) {
this.blogRepository = blogRepository;
}
public List<BlogResponseDto> getPosts() {
//DB 조회, 내림차순 정렬
return blogRepository.findAllByOrderByModifiedAtDesc().stream().map(BlogResponseDto::new).toList();
}
public BlogResponseDto createPost(BlogRequestDto requestDto) {
//RequestDto -> Entity (데이터 베이스랑 소통하는 Entity class로 변경)
Blog blog = new Blog(requestDto); //requestDto한테 클라이언트가 보내준 데이터를 값으로 들어옴
//DB 저장
Blog saveBlog = blogRepository.save(blog);
//Entity -> ResponseDto
BlogResponseDto blogResponseDto = new BlogResponseDto(blog);
return blogResponseDto;
//Blog Post Max ID (Post 중복 X , 구분값)
// Long maxId = postList.size() > 0 ? Collections.max(postList.keySet()) + 1 : 1;
// blog.setId(maxId);
}
public Long getSelectPost(Long id, BlogRequestDto requestDto) {
//해당 게시글이 데이터베이스에 존재하는지 확인
Blog blog = findPost(id);
//해당 게시글 가져오기
blog.getPost(requestDto);
return id;
}
@Transactional //트랜잭션 변경 감지
public Long updatePost(Long id, BlogRequestDto requestDto) {
//해당 게시글이 데이터베이스에 존재하는지 확인
Blog blog = findPost(id);
//게시글 수정
blog.update(requestDto);
return id; // 블로그의 id값 리턴
}
public Long deletePost(Long id) {
//해당 게시글이 데이터베이스에 존재하는지 확인
Blog blog = findPost(id);
//게시글 삭제
blogRepository.delete(blog);
return id;
}
private Blog findPost(Long id) {
return blogRepository.findById(id).orElseThrow(() ->
new IllegalArgumentException("선택한 메모는 존재하지 않습니다."));
}
}
https://github.com/hyunkyounglee1209/Spring_Lv1.git
'🏕️내일배움캠프 > 📂나만의 항해 블로그 백엔드 서버 만들기(23.06.12)' 카테고리의 다른 글
개인과제 - 나만의 항해 블로그 백엔드 서버 만들기 Lv2 (0) | 2023.07.12 |
---|