작업 1
DTO(Data Transfer Object) 클래스 만들기 (게시글 저장)
DTO는 데이터 전송을 위한 객체로, 주로 계층 간 데이터 교환을 목적으로 사용된다. 예를 들어, 클라이언트에서 서버로, 혹은 서비스 계층에서 프레젠테이션 계층으로 데이터를 전달할 때 사용된다.
package com.example.demo._domain.blog.dto;
import com.example.demo._domain.blog.entity.Article;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
// 즉, 주로 계층간에 데이터 전송 목적으로 설계된다.
public class ArticleDTO {
private String title;
private String content;
// 여기서 AricleDTO -> Article 데이터 타입을 변환시키는 메서드를 만들었다.
public Article toEntity(){
return Article.builder()
.title(this.title)
.content(this.content)
.build();
}
}
작업 2
서비스 클래스 만들기 (게시글 저장)
서비스 계층은 애플리케이션에서 비즈니스 로직 을 처리하는 중요한 역할을 한다. 서비스 계층은 주로 컨트롤러와 데이터베이스 간의 중간 계층 으로, 데이터를 조작하거나 처리하는 모든 비즈니스 규칙을 담당한다. (서비스 클래스에서 일반적으로 하는 작업들을 직접 찾아서 조사해보자)
package com.example.demo._domain.blog.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo._domain.blog.dto.ArticleDTO;
import com.example.demo._domain.blog.entity.Article;
import com.example.demo._domain.blog.repository.PostRepository;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service // IoC (빈으로 등록)
public class BlogService {
@Autowired // DI <- 개발자들이 가독성 때문에 작성을 해준다.
private final PostRepository postRepository;
@Transactional // 쓰기 지연 처리까지
public Article save(ArticleDTO dto){
// 비즈니스 로직이 필요하다면 작성
return postRepository.save(dto.toEntity());
}
}
@Service 어노테이션은 해당 클래스를 스프링 컨테이너에 빈(Bean)으로 등록해주는 역할 즉, 스프링 컨테이너 또는 애플리케이션 컨텍스트에 빈으로 등록된다.
애플리케이션 컨텍스트(ApplicationContext)가 스프링 컨테이너의 구체적인 구현체 중 하나입니다. 스프링 컨테이너(Spring Container)는 스프링 프레임워크가 애플리케이션을 관리하고 실행하는 핵심 부분입니다. 스프링 컨테이너는 애플리케이션에서 사용할 객체들(Bean)을 생성하고, 이 객체들 간의 의존성을 관리하며, 생명주기를 관리하는 역할을 합니다.
작업 3
컨트롤러 클래스 만들기 (게시글 저장)
컨트롤러 클래스는 사용자의 요청을 처리하고(URL 맵핑), 그 요청을 서비스 계층으로 전달하며, 결과를 다시 사용자에게 반환하는 역할을 한다.
package com.example.demo._domain.blog.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo._domain.blog.dto.ArticleDTO;
import com.example.demo._domain.blog.entity.Article;
import com.example.demo._domain.blog.service.BlogService;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor // final을 사용했기 때문에 초기화 자동 설정
@RestController // @Controller + @ResponseBody
public class BlogApiController {
private final BlogService blogService;
// URL 즉, 주소 설계 http://localhost:8080/api/articles
@PostMapping("/api/articles")
public ResponseEntity<Article> addArticle(@RequestBody ArticleDTO dto){
// 1. 인증검사
// 2. 유효성 검사
Article savedArticle = blogService.save(dto);
return ResponseEntity.status(HttpStatus.CREATED).body(savedArticle);
}
}
꼭 알아두어야 하는 응답 코드 확인
200 OK: 요청이 성공적으로 처리되었습니다.
201 Created: 요청이 성공적으로 처리되었고, 새로운 리소스가 생성되었습니다. 302
Found: 요청한 리소스가 임시적으로 다른 URL로 리다이렉트됩니다. 400
Bad Request: 클라이언트의 요청이 잘못되었거나 서버가 요청을 이해할 수 없습니다. 401
Unauthorized: 인증이 필요하지만 클라이언트가 인증되지 않았습니다. 403
Forbidden: 클라이언트가 요청한 리소스에 접근할 권한이 없습니다. 404
Not Found:요청한 리소스를 찾을 수 없습니다. 500
Internal Server Error:서버에서 오류가 발생하여 요청을 처리할 수 없습니다.
728x90
'Spring boot > Blog 프로젝트 만들기(JPA)' 카테고리의 다른 글
[Blog] 블로그 프로젝트 만들기 - 6 (글 상세보기 조회 API ) (1) | 2024.10.02 |
---|---|
[Blog] 블로그 프로젝트 만들기 - 5 (글 목록 조회 API ) (1) | 2024.10.02 |
[Blog] 블로그 프로젝트 만들기 - 3 (레포지토리 만들기) (0) | 2024.10.01 |
[Blog] 블로그 프로젝트 만들기 - 2 (엔티티) (0) | 2024.10.01 |
[Blog] 블로그 프로젝트 만들기 - 1 (REST API) (1) | 2024.10.01 |