[spring boot] 게시글 등록/수정/삭제/조회 API 만들기 - 02

Momenter·2021년 7월 15일
0

Spring Boot

목록 보기
7/15

게시글 수정/조회 API 만들기

Posts 추가 작성

package com.momenting.book.springboot.domain.posts;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Getter
@NoArgsConstructor
@Entity // 테이블과 링크될 클래스임을 나타냄 테이블이름은 posts
public class Posts {

    @Id //해당 테이블의 PK필드가 될 녀셕에게 붙힌다.
    @GeneratedValue //PK생성 규칙을 나타냄
    private Long id;

    @Column(length = 500, nullable = false)
    private  String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
    //이번글에서 추가 작성된 구문
    public void update(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

Posts클래스에 update라는 이름의 생성자 메소드를 추가로 작성 해줍니다.

PostsUpdateRequestDto 작성하기


src -> main -> java -> com.momenting.book.springboot -> web.dto -> PostsUpdateRequestDto 클래스 생성 후 작성

package com.momenting.book.springboot.web.dto;


import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class PostsUpdateRequestDto {

    private  String title;
    private  String content;

    @Builder
    public PostsUpdateRequestDto(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

PostsResponseDto 작성하기


src -> main -> java -> com.momenting.book.springboot -> web.dto ->
PostsResponseDto 클래스 생성 후 작성

package com.momenting.book.springboot.web.dto;

import com.momenting.book.springboot.domain.posts.Posts;
import lombok.Getter;

@Getter
public class PostsResponseDto {

    private  Long id;
    private  String title;
    private  String content;
    private  String author;

    public  PostsResponseDto(Posts entity) {
        this.id = entity.getId();
        this.title = entity.getTitle();
        this.content = entity.getContent();
        this.author = entity.getAuthor();
    }

}

PostsResponseDto는 Entity의 필드 중 일부만 사용하므로 생성자로 Entity를 필드에 값을 채워 줍니다.

PostsService 추가 작성하기

package com.momenting.book.springboot.service.posts;

import com.momenting.book.springboot.domain.posts.Posts;
import com.momenting.book.springboot.domain.posts.PostsRepository;
import com.momenting.book.springboot.web.dto.PostsResponseDto;
import com.momenting.book.springboot.web.dto.PostsSaveRequestDto;
import com.momenting.book.springboot.web.dto.PostsUpdateRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Service
public class PostsService {

    private final PostsRepository postsRepository;

    @Transactional
    public Long save(PostsSaveRequestDto requestDto) {
        return postsRepository.save(requestDto.toEntity()).getId();
    }

    @Transactional
    public Long update(Long id, PostsUpdateRequestDto requestDto) {

        Posts posts = postsRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id =" + id));

        posts.update(requestDto.getTitle(), requestDto.getContent());

        return id;
    }
    
       public PostsResponseDto findById (Long id) {
        Posts entity = postsRepository.findById(id).orElseThrow( () -> new IllegalArgumentException("해당 게시글이 없습니다. id =" + id));

        return  new PostsResponseDto(entity);
    }
}

PostsApiController 추가 작성하기

package com.momenting.book.springboot.web;


import com.momenting.book.springboot.service.posts.PostsService;
import com.momenting.book.springboot.web.dto.PostsResponseDto;
import com.momenting.book.springboot.web.dto.PostsSaveRequestDto;
import com.momenting.book.springboot.web.dto.PostsUpdateRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

@RequiredArgsConstructor
@RestController
public class PostsApiController {

    private final PostsService postsService;

    @PostMapping("api/v1/posts")
    public Long save (@RequestBody PostsSaveRequestDto requestDto) {
        return postsService.save(requestDto);
    }

    @PutMapping("api/v1/posts/{id}")
    public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto) {
        return  postsService.update(id, requestDto);
    }
    
    @GetMapping("api/v1/posts/{id}")
    public PostsResponseDto findById (@PathVariable Long id) {
        return postsService.findById(id);
    }
}

흐름 정리

수정 요청시 흐름

PostsApiController의 update에서 postsService의 update호출 -> postsService에서 postsRepository.findById(id)로 수정하고자하는 게시글이 있는지 탐색 -> Posts의 Update 메소드 호출

조회 요청시 흐름

PostsApiController의 findById에서 postsService의 findBy호출 -> postsService에서 postsRepository.findById(id)로 조회하고자하는 게시글이 있는지 탐색 -> PostsResponseDto의 Entity객체로 조회하고자하는 게시글 리턴

profile
순간을 기록하는 개발자

0개의 댓글