개발/Spring

[3] DTO 설정

민지기il 2025. 3. 4. 18:01

동적 커리를 위해 필요한 Data를 DTO로 받는다.

[1] DTO 설정

@Data // getter, setter 모두 만든다
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TodoDTO {
    private Long tno;
    private String title;
    private String content;
    private boolean complete;
    private LocalDate dueDate;
}

[2] TodoService

@Transactional
public interface TodoService {
    TodoDTO get(Long tno);
    default TodoDTO entityDTO(Todo todo) { //1. Todo라는 엔티티를 DTO로 만든다.
    TodoDTO todoDTO =
            TodoDTO.builder()
                    .tno(todo.getTno())
                    .title(todo.getTitle())
                    .content(todo.getContent())
                    .dueDate(todo.getDueDate())
                    .build();
    return todoDTO;
    }

    default Todo dtoToEntity(TodoDTO todoDTO){ //2. DTO를 Todo라는 엔티티로 만든다.
        return Todo.builder()
                .tno(todoDTO.getTno())
                .title(todoDTO.getTitle())
                .content(todoDTO.getContent())
                .dueDate(todoDTO.getDueDate())
                .build();
    }
}

[3] TodoServiceImpl -- 실제 객체

@Service
@Log4j2
@RequiredArgsConstructor
public class TodoServiceImpl implements TodoService{
    private final TodoRepository todoRepository;
    @Override
    public TodoDTO get(Long tno){
        Optional<Todo> result = todoRepository.findById(tno);
        Todo todo = result.orElseThrow();
        return entityDTO(todo);
    }
}

@Transactional: Method, Interface, Class에 선언 가능

 

[4] Test 해보기

@SpringBootTest
@Log4j2
public class TodoServiceTests {
    @Autowired
    TodoService todoService;
    @Test
    public void testGet(){
        Long tno = 1L;
        log.info(todoService.get(tno));
    }
}

정상적으로 DTO가 생성된 걸 알 수 있다.