Tiny Star

📌TIL [Today I Learn]

[TIL] 23년 6월 15일 목요일

청크 2023. 6. 15. 22:41

23년 6월 15일 목요일

오늘의 목표 : Spring 기초 2주차 완강 / 개인과제 

 

오늘 공부한 내용🤓

오늘은 Spring 기초 2주차를 완강을 목표로 삼았다.

 

2주차에는 JPA의 개념과 Java 환경, Spring Boot환경에서 각각가 어떻게 동작하는지 실습했다.

 

기초 강의가 끝나고 "스프링 부트로 로그인 기능이 없는 나만의 항해 블로그 백엔드 서버 만들기"

Spring 개인과제를 시작!

 

서비스 완성 요구사항은 일단 다 작성했다..(비밀번호빼고ㅠ)

[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.service.BlogService;
import org.springframework.web.bind.annotation.*;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api")
public class BlogController {

    //데이터 베이스 대신 Map 사용
    private final Map<Long, Blog> postList = new HashMap<>();


    //전체 게시글 목록 조회 API
    //- 제목, 작성자명, 작성 내용, 작성 날짜를 조회하기
    //- 작성 날짜 기준 내림차순으로 정렬하기
    @GetMapping("/posts")
    public List<BlogResponseDto> getPosts() {
        BlogService blogService = new BlogService();
        return blogService.getPosts();
    }

    //게시글 작성 API
    //- 제목, 작성자명, 비밀번호, 작성 내용을 저장하고 저장된 게시글을 Client 로 반환하기
    @PostMapping("/posts")
    public BlogResponseDto createPost(@RequestBody BlogRequestDto requestDto) {
        BlogService blogService = new BlogService();
        return blogService.createPost(requestDto);
    }

    //선택한 게시글 조회 API
    // - 선택한 게시글의 제목, 작성자명, 작성 날짜, 작성 내용을 조회하기
    // - (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
    @GetMapping("/post/{id}")
    public Long getSelectPost(@PathVariable Long id, @RequestBody BlogRequestDto requestDto) {
        BlogService blogService = new BlogService();
        return blogService.getSelectPost(id, requestDto);
    }

    //선택한 게시글 수정 API
    // - 수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    // - 제목, 작성자명, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
    @PutMapping("/post/{id}")
    public Long updatePost(@PathVariable Long id, @RequestBody BlogRequestDto requestDto) {
        BlogService blogService = new BlogService();
        return blogService.updatePost(id, requestDto);
    }

    //선택한 게시글 삭제 API
    // - 삭제를 요청할 때 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    // - 선택한 게시글을 삭제하고 Client 로 성공했다는 표시 반환하기
    @DeleteMapping("/post/{id}")
    public Long deletePost(@PathVariable Long id) {
        BlogService blogService = new BlogService();
        return blogService.deletePost(id);
    }
}

[BlogService]

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 java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BlogService {

    //데이터 베이스 대신 Map 사용
    private final Map<Long, Blog> postList = new HashMap<>();

    public List<BlogResponseDto> getPosts() {

        // Map To List
        List<BlogResponseDto> responseList = postList.values().stream()
                .map(BlogResponseDto::new).toList();

        return responseList;
    }

    public BlogResponseDto createPost(BlogRequestDto requestDto) {
        //RequestDto -> Entity (데이터 베이스랑 소통하는 Entity class로 변경)
        Blog blog = new Blog(requestDto); //requestDto한테 클라이언트가 보내준 데이터를 값으로 들어옴

        //Blog Post Max ID (Post 중복 X , 구분값)
        Long maxId = postList.size() > 0 ? Collections.max(postList.keySet()) + 1 : 1;
        blog.setId(maxId);

        //DB 저장 (Map)
        BlogRepository blogRepository = new BlogRepository();

        postList.put(blog.getId(), blog);

        //Entity -> ResponseDto
        BlogResponseDto blogResponseDto = new BlogResponseDto(blog);

        return blogResponseDto;
    }


    public Long getSelectPost(Long id, BlogRequestDto requestDto) {

        if (postList.containsKey(id)) {
            //해당 게시글 가져오기
            Blog blog = postList.get(id);
            return id;
        } else {
            //데이터가 없을 경우
            throw new IllegalArgumentException("선택한 게시글이 존재하지 않습니다.");
        }
    }

    public Long updatePost(Long id, BlogRequestDto requestDto) {

        //해당 게시글이 데이터베이스에 존재하는지 확인
        if (postList.containsKey(id)) {
            //해당 게시글 가져오기
            Blog blog = postList.get(id);

            //게시글 수정
            blog.update(requestDto);
            return blog.getId(); // 블로그의 id값 리턴

        } else {
            //데이터가 없을 경우
            throw new IllegalArgumentException("선택한 게시글이 존재하지 않습니다.");
        }
    }

    public Long deletePost(Long id) {

        //해당 게시글이 데이터베이스에 존재하는지 확인
        if (postList.containsKey(id)) {
            //해당 게시글 삭제하기
            postList.remove(id);
            return id;
        } else {
            //데이터가 없을 경우
            throw new IllegalArgumentException("선택한 게시글이 존재하지 않습니다.");
        }
    }
}
어려웠던 내용😵‍💫

 

궁금&부족한 내용❓

과제 요구사항 중 비밀번호 관련된 부분을 아직 하나도 구현하지 못했다.

 

Map으로 받던 데이터를 SQL로 옮기고, JDBC를 사용해서 JdbcTemplate으로 코드를 구현해야 중복코드가 안생길 것 같은데

JDBC를 구현할 수 없어서 아직 많이 부족하다.

느낀 점💡

JDBC는 강의에서 에 대한 내용이 너무 짧아서 개인적인 공부가 필요할 것 같다.

그래도 오늘도 한단계 성장!

'📌TIL [Today I Learn]' 카테고리의 다른 글

[TIL] 23년 6월 19일 월요일  (0) 2023.06.20
[TIL] 23년 6월 16일 금요일  (0) 2023.06.16
[TIL] 23년 6월 14일 수요일  (0) 2023.06.14
[TIL] 23년 6월 13일 화요일  (0) 2023.06.13
[TIL] 23년 6월 12일 월요일  (0) 2023.06.12