이것저것 해보기🌼

TO-DO LIST 만들기 프로젝트 1 (구현) 본문

BE/Spring Boot

TO-DO LIST 만들기 프로젝트 1 (구현)

realtree 2021. 6. 28. 16:59

 

필요 Tool

1) IntelliJ

https://www.jetbrains.com/ko-kr/idea/

 

IntelliJ IDEA: 우수성과 인체 공학이 담긴 JetBrains Java IDE

 

www.jetbrains.com

2) Postman App

https://www.postman.com/downloads/

 

Download Postman | Try Postman for Free

Try Postman for free! Join 13 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.

www.postman.com


0. 프로젝트 목표

1 TO-DO LIST에 아이템 추가
2 TO-DO LIST에 특정 아이템 조회
3 TO-DO LIST 전체 목록 조회
4 TO-DO LIST의 특정 아이템 수정
5 TO-DO LIST의 특정 아이템 삭제
6 TO-DO LIST의 전체 목록 삭제

구현해야할 6가지 기능은 위와 같다. Spring boot로 백엔드를 만들고, 프론트엔드를 통해 이를 확인해보자.


1. 프로젝트 생성

 

Gradle 로 New Project를 만든다.

우선 build.gradle에 필요한 plugin과 dependencies를 추가했다.

 

dependencies의 정보는 구글에 maven spring boot를 검색하면 아래와 같은 사이트에서 정보를 확인해볼수 있다.

 

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web/2.4.3

 

 

이후 다시 build를 해서 BUILD SUCCESSFUL 가 나오면 된다.

 

lombok의 경우 plugins에서 검색해서 추가로 설치를 해주어야한다.

 


2. 모델 구현

model 이라는 패키지를 생성하여 그 아래 3개의 클래스를 만든다.

 

1) todoEntity

lombok에서 제공되는 @Data, @NoArgsConstructor, @AllArgsConstructor 등을 사용한다.

public class TodoEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String title;

    @Column(name = "todoOrder", nullable = false)
    private Long order;

    @Column(nullable = false)
    private Boolean completed;

}

 

2) todoRequest

마찬가지로 @Data, @NoArgsConstructor, @AllArgsConstructor를 import 하고, 

아래와 같은 private data를 갖는다.

public class TodoRequest {
    private String title;
    private Long order;
    private Boolean completed;
}

 

3) todoResponse

response에는 모든 데이터를 담아보낼수 있도록 아래와 같이 구성한다.

url의 경우 저렇게 코드안에 직접적으로 주소를 넣는것은 설계상 좋지 않지만, 우선 간단한 구현목표를 위해 이렇게 작성하였다.

public class TodoResponse {
    private Long id;
    private String title;
    private Long order;
    private Boolean completed;
    private String url;

    public TodoResponse(TodoEntity todoEntity){
        this.id = todoEntity.getId();
        this.title = todoEntity.getTitle();
        this.order = todoEntity.getOrder();
        this.completed = todoEntity.getCompleted();

        this.url = "http://localhost:8080/" + this.id;
    }
}

 


3. Repository 구현

 

데이터 인터페이스를 위한 repository 를 구현한다. 

JpaRepository 를 extend하여 그안의 기능들을 사용한다.

package org.example.repository;

import org.example.model.TodoEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TodoRepository extends JpaRepository<TodoEntity, Long> {
}

 

JpaRepository 에 어떤 기능이 들어있는지도 확인이 가능하다.

 


4. 서비스코드 구현

마찬가지로 service 의 패키지를 추가하고 그아래 TodoService 라는 Class를 추가하였다.

@Service
@AllArgsConstructor
public class TodoService {
    private final TodoRepository todoRepository;

    public TodoEntity add(TodoEntity request){
        TodoEntity todoEntity = new TodoEntity();
        todoEntity.setTitle(request.getTitle());
        todoEntity.setOrder(request.getOrder());
        todoEntity.setCompleted(request.getCompleted());
        return this.todoRepository.save(todoEntity);
    }
    public  TodoEntity searchById(Long id){
        return this.todoRepository.findById(id)
                .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
    }
    public List<TodoEntity> searchAll(){
        return this.todoRepository.findAll();
    }
    public TodoEntity updateById(Long id, TodoRequest request){
        TodoEntity todoEntity = this.searchById(id);
        if(request.getTitle() != null){
            todoEntity.setTitle(request.getTitle());
        }
        if(request.getOrder() != null){
            todoEntity.setOrder(request.getOrder());
        }
        if(request.getCompleted() != null){
            todoEntity.setCompleted(request.getCompleted());
        }
        return this.todoRepository.save(todoEntity);
    }
    public void deleteById(Long id){
        this.todoRepository.deleteById(id);
    }
    public void deleteAll(Long id){
        this.todoRepository.deleteAll();
    }
}

import 부분을 제외하고 서비스 코드는 위와 같다.

 


5. 컨트롤러 구현

마찬가지로 controller 라는 패키지를 추가하고, 그아래 TodoController 클래스를 기본적인 뼈대만 먼저 완성했다.

@CrossOrigin
@AllArgsConstructor
@RequestMapping("/")
@RestController
public class TodoController {
    private final TodoService service;

    @PostMapping
    public ResponseEntity<TodoResponse> create(){
        System.out.println("CREATE");
        return null;
    }

    @GetMapping
    public ResponseEntity<TodoResponse> readOne(){
        System.out.println("READ ONE");
        return null;
    }

    @GetMapping
    public ResponseEntity<List<TodoResponse>> readAll(){
        System.out.println("READ ALL");
        return null;
    }

    @PatchMapping("{id}")
    public ResponseEntity<TodoResponse> update(){
        System.out.println("UPDATE");
        return null;
    }

    @DeleteMapping("{id}")
    public ResponseEntity<?> deleteOne(){
        System.out.println("DELETE");
        return null;
    }

    @DeleteMapping
    public ResponseEntity<?> deleteAll(){
        System.out.println("DELETE ALL");
        return null;
    }
}

 

실행을 위해 Main method도 구현해준다.

org.example 패키지 아래 TodoApplication.java 의 내용은 아래와 같다. 

package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TodoServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(TodoServerApplication.class, args);
    }
}

 

'BE > Spring Boot' 카테고리의 다른 글

[REST API] PUT 다루기  (0) 2021.06.30
[REST API] POST 다루기  (0) 2021.06.30
[REST API] GET 다루기  (0) 2021.06.30
웹 개발 개론  (0) 2021.06.30
TO-DO LIST 만들기 프로젝트 2 (실행 및 테스트)  (0) 2021.06.29