
한동안 개발 작업보단 개발 공부에 조금 집중했었다.
그러다 오랜만에 멋쟁이사자처럼 운영진 동료의 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 (빌더 패턴)
'2026 Dev Log' 카테고리의 다른 글
| [SpringBoot] 자동 배포 2026 최종본 (Docker + GitHub Actions) (0) | 2026.05.14 |
|---|---|
| [Springboot] entity <-> DTO 변환 방법 (0) | 2026.04.30 |
| [Spring Boot] Service 파일 CRUD (0) | 2026.04.29 |
| Port 8080 is already in use (1) | 2026.03.04 |
| [1] 컴파일러(Compiler)와 프레임워크(Framework)의 구분 (0) | 2026.01.13 |