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

Momenter·2021년 7월 12일
0

Spring Boot

목록 보기
6/15

API를 만들기위해 필요한 클래스

- Request 데이터를 받을 Dto

- API 요청을 받을 Controller

- 트랜잭션, 도에인 기능 간의 순서를 보장하는 Service

Service는 트랙잭션과, 도메인 간 순서 보장의 역할만 한다.

Spring 웹 계층 이해하기

Web Layer

  • 흔히 사용하는 컨트롤러(@Controller)와 JSP/Freemaker 등의 부 템플릿 영역
  • 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적인 영역을 이야기 합니다.

Service Layer

  • @Service에 사용되는 서비스 영역입니다.
  • 일반적으로 Controller와 Dao의 중간 영역에서 사용합니다.
  • @Transaction이 사용되는 영역이가도 합니다.

Repository Layer

  • Database와 같이 데이터 저장소에 접근하는 영역입니다.
  • Dao영역이라고 이해하시면 쉬울것 같습니다.

Dtos

  • Data Transfer Object 계층 간에 데이터 교환을 위한 객체
  • Dtos는 이들의 영역을 이야기 합니다.

Domain Model

  • 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순회시킨 것을 도메인 모델이라고 합니다,
  • @Entity가 사용된 클래스를 도메인 모델이라고 이해하시면 됩니다.
  • 무조건 데이터 베이스의 테이블과 관계가 있어야만 하는 것은 아닙니다.

게시글 등록 API 만들기

PostsSaveRequestDto 작성

  • src -> main -> java -> com.momenting.book.springboot -> web.dto -> PostsSaveRequestDto 클래스 생성
package com.momenting.book.springboot.web.dto;

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

@Getter
@NoArgsConstructor
public class PostsSaveRequestDto {

    private  String title;
    private  String content;
    private  String author;

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

    public Posts toEntity() {
        return Posts.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();
    }
}
  • Dto 클래스를 추가로 생성한 이유
    • Entity클래스를 Request/Response 클래스로 사용하면 않되기 때문입니다.
    • Entity클래스는 데이터베이스와 맞닿는 핵심 클래스 입니다.
    • Request/Response용 Dto는 view를 위한 클래스라고 생각하면 됩니다.
    • Controller에서 결괏값으로 여러 테이블을 조인해서 줘야 할 경우가 많기 때문에
      Entity클래스와 Controller에서 쓸 Dto를 분리해서 생성 했습니다.

PostsService 작성

  • src -> main -> java -> com.momenting.book.springboot -> service.posts 패키지 생성 후 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.PostsSaveRequestDto;
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();
    }
}
  • Bean 주입받는 방법
    - @RequiredArgsConstructor에서 final이 선언된 모든 필드를 인자값으로 하는 생성자를 대신 생성해 줍니다.
    - 생성자를 직접 작성하지 않고 롬복 어노테이션을 사용한느 이유는 해당 클래스의 의존성 관계가 변경될 때마다 생성자 코드를 계속해서 수정하는 번거로움을 덜어주기 위함입니다.

PostsApiController 작성

  • src -> main -> java -> com.momenting.book.springboot -> web 에 PostsApiController 클래스 생성
package com.momenting.book.springboot.web;


import com.momenting.book.springboot.service.posts.PostsService;
import com.momenting.book.springboot.web.dto.PostsSaveRequestDto;
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);
    }

}
profile
순간을 기록하는 개발자

0개의 댓글