본문 바로가기
2026 Dev Log

[SpringBoot] 2026 CRUD 서비스 로직

by Dev.후크리 2026. 5. 4.

한동안 개발 작업보단 개발 공부에 조금 집중했었다.
그러다 오랜만에 멋쟁이사자처럼 운영진 동료의 CRUD 코드를 보았는데, 조금 놀랐다.
엇..? 저거 왜 쓰지? 저게 뭐지? 하는 모르는 코드 패턴이었다.
 
그 중 하나가 from이었고, map의 활용이었다.
이왕 이렇게 모르는 부분이 생긴 김에 오랜만에 실습을 해보자 싶기도 하고, 
멋사 아기사자분들이 참고하시길 바라며 이 글을 남긴다.
 


크게 서비스 코드와 DTO 중 하나로 구성했다. 
서비스 코드에선 다양한 방식의 CRUD를, DTO에선 from으로 DTO<->Entity 변화에 집중해 보길 바란다.
 
아래 코드는 직접 실습을 마친 코드이기에 오류는 없다.
다만, 코드 트랜드 변화를 기록하고 싶어서 작성하는 지금이기에
컨트롤러는 큰 변화를 체감하지 못해서 업로드하지 않았다.


서비스 파일

package com.example.study202605.domain.crud.service;

import com.example.study202605.domain.crud.dto.request.CrudRequestDto;
import com.example.study202605.domain.crud.dto.response.CrudResponseDto;
import com.example.study202605.domain.crud.entity.CrudEntity;
import com.example.study202605.domain.crud.repository.CrudRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional
public class CrudService {

    private final CrudRepository crudRepository;

    public List<CrudResponseDto> getAllCrud() {
        List<CrudEntity> cruds = crudRepository.findAll();

        return cruds.stream()
                .map(crud -> new CrudResponseDto(
                        crud.getId(),
                        crud.getName(),
                        crud.getContent()
                ))
                .toList();
    }

    public CrudResponseDto getCrudById(Long crudId) {
        CrudEntity cruds = crudRepository.findById(crudId)
                .orElseThrow(() -> new IllegalArgumentException("해당 데이터가 존재하지 않습니다. id=" + crudId));

        return CrudResponseDto.from(cruds);
    }

    public void createCrud(CrudRequestDto crudRequestDto) {
        CrudEntity cruds = new CrudEntity();
        cruds.setName(crudRequestDto.getName());
        cruds.setContent(crudRequestDto.getContent());

        crudRepository.save(cruds);
        getAllCrud();
    }

    public void updateCrud(Long crudId, CrudRequestDto crudRequestDto) {
        CrudEntity cruds = crudRepository.findById(crudId)
                .orElseThrow(() -> new IllegalArgumentException("해당 데이터가 존재하지 않습니다. id=" + crudId));
        cruds.setName(crudRequestDto.getName());
        cruds.setContent(crudRequestDto.getContent());
        crudRepository.save(cruds);
        getAllCrud();
    }
    //************************************************************ 아래는 AI 활용 코드 예시들
    public void updateCrud1(Long crudId, CrudRequestDto crudRequestDto) {
        CrudEntity cruds = crudRepository.findById(crudId)
                .orElseThrow(() -> new IllegalArgumentException("해당 데이터가 존재하지 않습니다. id=" + crudId));

        cruds.setName(crudRequestDto.getName());
        cruds.setContent(crudRequestDto.getContent());
    }

    public void updateCrud2(Long crudId, CrudRequestDto crudRequestDto) {
        CrudEntity cruds = crudRepository.findById(crudId)
                .orElseThrow(() -> new IllegalArgumentException("해당 데이터가 존재하지 않습니다. id=" + crudId));

        cruds.update(crudRequestDto.getName(), crudRequestDto.getContent());
    }

    public void updateCrud3(Long crudId, CrudRequestDto crudRequestDto) {
        CrudEntity cruds = crudRepository.findById(crudId)
                .orElseThrow(() -> new IllegalArgumentException("해당 데이터가 존재하지 않습니다. id=" + crudId));

        if (crudRequestDto.getName() != null) {
            cruds.setName(crudRequestDto.getName());
        }
        if (crudRequestDto.getContent() != null) {
            cruds.setContent(crudRequestDto.getContent());
        }
    }
    public List<CrudResponseDto> getAllCrud1() {
        return crudRepository.findAll()
                .stream()
                .map(CrudResponseDto::from)
                .toList();
    }

    public List<CrudResponseDto> getAllCrud2() {
        List<CrudEntity> cruds = crudRepository.findAll();
        List<CrudResponseDto> responseDtos = new java.util.ArrayList<>();

        for (CrudEntity crud : cruds) {
            responseDtos.add(new CrudResponseDto(
                    crud.getId(),
                    crud.getName(),
                    crud.getContent()
            ));
        }

        return responseDtos;
    }

    public CrudResponseDto getCrudById1(Long crudId) {
        CrudEntity cruds = crudRepository.findById(crudId)
                .orElseThrow(() -> new IllegalArgumentException("해당 데이터가 존재하지 않습니다. id=" + crudId));

        return new CrudResponseDto(
                cruds.getId(),
                cruds.getName(),
                cruds.getContent()
        );
    }

    public CrudResponseDto getCrudById2(Long crudId) {
        CrudEntity cruds = crudRepository.findById(crudId)
                .orElseThrow(() -> new IllegalArgumentException("해당 데이터가 존재하지 않습니다. id=" + crudId));

        return CrudResponseDto.from(cruds);
    }

    public void createCrud1(CrudRequestDto crudRequestDto) {
        CrudEntity cruds = CrudEntity.builder()
                .name(crudRequestDto.getName())
                .content(crudRequestDto.getContent())
                .build();

        crudRepository.save(cruds);
    }

    public void createCrud2(CrudRequestDto crudRequestDto) {
        CrudEntity cruds = new CrudEntity();
        cruds.setName(crudRequestDto.getName());
        cruds.setContent(crudRequestDto.getContent());

        crudRepository.save(cruds);
    }

    public void createCrud3(CrudRequestDto crudRequestDto) {
        CrudEntity cruds = CrudEntity.builder()
                .name(crudRequestDto.getName() == null ? "" : crudRequestDto.getName())
                .content(crudRequestDto.getContent() == null ? "" : crudRequestDto.getContent())
                .build();

        crudRepository.save(cruds);
    }
}

 

DTO 파일

package com.example.study202605.domain.crud.dto.response;

import com.example.study202605.domain.crud.entity.CrudEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CrudResponseDto {
    private Long id;
    private String name;
    private String content;

    public static CrudResponseDto from(CrudEntity crud) {
        return new CrudResponseDto(crud.getId(), crud.getName(), crud.getContent());
    }
}

 
위 부분에 대해 조금 더 자세한 공부를 하고 싶다면
아래 블로그 글에 실습보단 AI로 공부한 내용을 올려두었으니 참고하길 바란다.
다만, 위 코드는 직접 실습하면서 실제로 사용해본 코드이지만 아래 링크의 코드는 개념용으로만 참고해야 한다.
2026.04.29 - [2026 Dev Log] - [Spring Boot] Service 파일 CRUD
2026.04.29 - [2026 Dev Log] - [Springboot] entity <-> DTO 변환 방법
2026.04.29 - [분류 전체보기] - [SpringBoot] Builder Pattern (빌더 패턴)