[Spring Boot] CRUD API 구현

아는벌·2023년 3월 9일
0

web (2)

목록 보기
19/20

프로젝트 구조



Controller에서는 사용자의 요청에 대한 DTO를 받으며 DTO로 사용자에게 반환한다.
Controller는 Service를 통해 로직을 처리하는데 이때 DTO를 Entity로 변환하는 과정을 통하여 Service에서는 DTO가 아닌 Entity를 사용하도록 하였다.

API

기능메소드url
등록post/todo
조회get/todo
수정put/todo
삭제delete/todo

Controller


@CrossOrigin("*")
@RestController
@RequestMapping("/todo")
public class TodoController {
    @Autowired
    TodoService todoService;
    String tempUserId = "temporary-user";
    @PostMapping
    public ResponseEntity<?> createTodo(@RequestBody TodoDTO dto){

        try{
            // Entity로 변환
            TodoEntity entity = dto.toEntity();
            // Entity의 id는 생성 당시에 null이어야함(테이블 insert 시 자동 생성되도록 해놨기 때문,,)
            entity.setId(null); // 임시 null 처리,,
            // 임시 userId 사용
            entity.setUserId(tempUserId);
            // service를 이용해서 Entity List 생성
            List<TodoEntity> entities = todoService.create(entity);
            // TodoEntity 리스트를 DTO들로 변경
            List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
            // TodoDTO 리스트를 ResponseDTO로 초기화
            ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();
            // ResponseDTO를 리턴
            return ResponseEntity.ok().body(response);
        }catch (Exception e){
            // 예외 발생 시 처리
            ResponseDTO<TodoEntity> response = ResponseDTO
                    .<TodoEntity>builder().error(" >>> createTodo 에러 : "+ e.getMessage()).build();
            return ResponseEntity.ok().body(response);
        }
    }

    // 검색 기능(사용자 아이디로 조회)
    @GetMapping
    public ResponseEntity<?> searchTodo(@RequestBody TodoDTO dto){
        try{
            List<TodoEntity> entities = todoService.retrieve(dto.getUserId());
            List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
            // TodoDTO 리스트를 ResponseDTO로 초기화
            ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();
            // ResponseDTO를 리턴
            return ResponseEntity.ok().body(response);
        } catch (Exception e){
            ResponseDTO<TodoEntity> response = ResponseDTO
                    .<TodoEntity>builder().error(" >>> searchTodo 에러 : "+ e.getMessage()).build();
            return ResponseEntity.ok().body(response);
        } 
    }
    
    // 수정
    @PutMapping
    public ResponseEntity<?> updateTodo(@RequestBody TodoDTO dto){
        try{
            // Entity로 변환
            TodoEntity entity = dto.toEntity();
            // userId 초기화
            entity.setUserId(tempUserId);
            // 엔티티로 업데이트
            List<TodoEntity>  entities = todoService.update(entity);
            // 엔티티 리스트를 Todo 리스트로 변환
            List<TodoDTO> todos = entities.stream()
                    .map(TodoDTO::new).collect(Collectors.toList());
            // ResponseDTO로 초기화
            ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(todos).build();
            // ResponseDTO로 리턴
            return  ResponseEntity.ok().body(response);
        } catch (Exception e){
            ResponseDTO<TodoEntity> response = ResponseDTO
                    .<TodoEntity>builder().error(" >>> updateTodo 에러 : "+ e.getMessage()).build();
            return ResponseEntity.ok().body(response);
        }
        
    }
    // 삭제
    @DeleteMapping
    public ResponseEntity<?> deleteTodo(@RequestBody TodoDTO dto) {
        try {
            // Entity로 변환
            TodoEntity entity = dto.toEntity();
            // userId 초기화
            entity.setUserId(tempUserId);
            // 엔티티로 업데이트
            List<TodoEntity> entities = todoService.delete(entity);
            // 엔티티 리스트를 Todo 리스트로 변환
            List<TodoDTO> todos = entities.stream()
                    .map(TodoDTO::new).collect(Collectors.toList());
            // ResponseDTO로 초기화
            ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(todos).build();
            // ResponseDTO로 리턴
            return ResponseEntity.ok().body(response);
        } catch (Exception e) {
            ResponseDTO<TodoEntity> response = ResponseDTO
                    .<TodoEntity>builder().error("삭제 에러!"+ e.getMessage()).build();
            return ResponseEntity.ok().body(response);
        }
    }

	// 전체 목록 조회
    @GetMapping("/list")
    public ResponseEntity<?> selectAll() {
        try{
            List<TodoEntity> entities = todoService.findAll();
            List<TodoDTO> todos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
            ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(todos).build();
            return ResponseEntity.ok().body(response);
            
        } catch (Exception e){
            ResponseDTO<TodoDTO> response =
                    ResponseDTO.<TodoDTO>builder().error(" >>> Select All 에러: " + e.getMessage()).build();
            return ResponseEntity.badRequest().body(response);

        }
    }
}

Service

@Service
@Slf4j
public class TodoService {
    @Autowired
    private TodoRepository repository;
	
     // 유효성 검사 (null 체크)
    public void validate(final TodoEntity entity) {
        if(entity == null) {
            log.warn("entity가 null입니다.");
            throw new RuntimeException("entity가 null입니다.");
        }
        if(entity.getUserId() == null) {
            log.warn("userId가 없습니다!");
            throw new RuntimeException("userId가 없습니다!");
        }
    }

	// 등록
    // 매개 변수로 사용된 entity참조 변수를 이용해서 원본이 바뀌지 않도록 final 선언
    public List<TodoEntity> create(final TodoEntity entity) {
        validate(entity);
        repository.save(entity);
        // 처리 후 로그 출력
        log.info("Entity id: {} is saved.", entity.getId());
        return repository.findByUserId(entity.getUserId());
    }

    // 검색(userId로 조회)
    public List<TodoEntity> retrieve(final String userId){
        return repository.findByUserId(userId);
    }

    // 수정
    public List<TodoEntity> update(final TodoEntity entity){
        validate(entity);
        // 검색
        final Optional<TodoEntity> original = repository.findById(entity.getId());

        original.ifPresent(todo->{
            // 수정
            todo.setTitle(entity.getTitle());
            todo.setDone(entity.isDone());

            // 다시 저장
            repository.save(todo);
        });

        return retrieve(entity.getUserId());
    }

    // 삭제
    public List<TodoEntity> delete(final TodoEntity entity){
        validate(entity);
        try{
            repository.delete(entity);
        } catch (Exception e){
            log.warn(entity.getTitle()+ " => 삭제 안됨 ㅠㅠ");
        }
        return retrieve(entity.getUserId());
    }
    
   // 전체 조회
   public List<TodoEntity> findAll() {
       return repository.findAll();
   }
}

등록

조회(사용자아이디로 조회)

수정

삭제

Git

https://github.com/EunbiAn/webkit-backend/tree/master/springboot_TodoList_day30

0개의 댓글