Tiny Star

🏕️내일배움캠프/📂나만의 항해 블로그 백엔드 서버 만들기(23.06.12)

개인과제 - 나만의 항해 블로그 백엔드 서버 만들기 Lv1

청크 2023. 7. 12. 20:19

스파르타 코딩클럽_내일 배움 캠프 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

 

GitHub - hyunkyounglee1209/Spring_Lv1

Contribute to hyunkyounglee1209/Spring_Lv1 development by creating an account on GitHub.

github.com