💡 학습 목표
1. DTO 에 대한 개념을 설명 할 수 있다.
2. 애플리케이션 컨텍스트에 대해서 설명 할 수 있다.
3. 서비스 계층, 컨트롤러 계층을 코드로 작성할 수 있다.
1. 작업
작업 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.Getter;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Getter
// 즉, 주로 계층간에 데이터 전송 목적으로 설계 된다.
public class ArticleDTO {
private String title;
private String content;
public Article toEntity() {
return Article.builder()
.title(title)
.content(content)
.build();
}
}
작업 2
서비스 클래스 만들기 (게시글 저장)
서비스 계층은 애플리케이션에서 비즈니스 로직을 처리하는 중요한 역할을 한다. 서비스 계층은 주로
컨트롤러와 데이터베이스 간의 중간 계층으로, 데이터를 조작하거나 처리하는 모든 비즈니스 규칙을 담당한다.
(서비스 클래스에서 일반적으로 하는 작업들을 직접 찾아서 조사해보자)
package com.example.demo._domain.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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 jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
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.service.BlogService;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@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: 서버에서 오류가 발생하여 요청을 처리할 수 없습니다.
'Spring Boot > Blog 프로젝트 만들기(JPA)' 카테고리의 다른 글
글 상세보기(조회) API 구현 - 6 (0) | 2024.10.02 |
---|---|
글 목록 조회 API 만들어 보기 - 5 (0) | 2024.10.02 |
레포지토리 만들기 - 3 (1) | 2024.10.01 |
블로그 엔티티 만들기 - 2 (0) | 2024.10.01 |
블로그 프로젝트 만들기 - 1 (3) | 2024.10.01 |