[spring]스프링

[Spring 게시판] 7. 기본 폴더 구조 정리4 (service파일 생성)

낭만적인 부자 2023. 7. 14. 06:56

이전 포스팅에서는 Repository 파일의 코드를 간단하게 짜봤습니다.

Service 파일은 그렇게 만든 Repository를 관리하는 곳입니다.

먼저 코드부터 보고 갈게요.

 

 

이 파일입니다!

 

 

package com.homepage.board.service;

import java.util.NoSuchElementException;

import org.springframework.stereotype.Service;

import com.homepage.board.entity.Post;
import com.homepage.board.dto.PostRequestDto;
import com.homepage.board.repository.BoardRepository;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class BoardService{

	private final BoardRepository boardRepository;
	
	public PostResponseDto getPostById(Long postId) {
    
		Post post=boardRepository.findById(postId).orElseThrow(()->
				new NoSuchElementException("게시물이 존재하지 않습니다."));
		
		PostResponseDto postResponseDto=PostResponseDto.builder()
				.id(post.getId())
				.title(post.getTitle())
				.content(post.getContent())
				.category(post.getCategory())
				.build();

		return postResponseDto;
	}
}

BoardService.java의 전반적인 코드입니다.

import 하는 부분까지 전부 보여드릴게요

Post의 id값을 받아서 일치하는 Post값을 전부 가져오는 코드입니다.

 

 

@Service

이 파일을 서비스 레이어로 등록하는 어노테이션입니다.

스프링한테 내가 이걸 Service 역할을 하는 코드로 쓸거라고 알려주는 거예요.

스프링은 이런 것들을 모아서 알아서 내부 로직을 생성합니다.

 

(@가 붙은 것들을 어노테이션이라고 해요.

어노테이션은 주석이라는 뜻으로

특정 기능들을 주석으로 붙임으로써 사용 가능하게 해주는 기술입니다.)

 

 

private final BoardRepository boardRepository;

BoardRepository 앞에 final이 붙어 있습니다.

이는 바로 위에 있는 @RequiredArgsConstructor 어노테이션이 적용되어서

자동으로 생성자가 주입됩니다.

 

 

public PostResponseDto getPostById(Long postId) {

반환형이 PostResponseDto입니다.DB에서 Post값을 가져와서PostResponseDto로 전환한 다음 반환할 겁니다.DB의 데이터를 그대로 보내주는 것은 언제나 조심해야 합니다.

 

 

Post post=boardRepository.findById(postId).orElseThrow(()->
				new NoSuchElementException("게시물이 존재하지 않습니다."));

우린 BoardRepository에 findById라는 메서드를 설정하지 않았습니다.

하지만 에러가 뜨지 않아요.

BoardRepository에서 상속받은 JpaRepository를 타고 올라가면 findById가 숨어 있습니다.

그걸 우린 그대로 사용한 거예요.

 

불러온 post 값이 없다면 orElseThrow가 실행되고

그 안에 넣어둔 NoSuchElementException가 발생합니다..

그런 데이터는 없다고 예외를 발생시키는 거죠.

 

 

PostResponseDto postResponseDto=PostResponseDto.builder()
				.id(post.getId())
				.title(post.getTitle())
				.content(post.getContent())
				.category(post.getCategory())
				.build();

postResponseDto에 선언해둔 @Builder 어노테이션을 사용합니다.

postResponseDto의 필드값을 메서드 체인으로 사용할 수 있어요.

post의 데이터를 추출하여 postResponseDto에 넣어줬어요.

 

 

그리고 그렇게 가져온 postResponseDto값을 return 하면 Service의 역할은 끝납니다.

앞으로 우리는 Service에 다양하고 복잡한 로직을 추가할 거예요.

그렇다고 해도 많이 어려운 내용은 없으니 힘내봅시다^^