[SPRING_입문]/개발일지

[2주차] 개발일지 (2-9) API: GET / POST / PUT / DELETE (前)

Code_Otaku 2022. 6. 17. 12:36

저번 시간에 다뤘던 GET / POST / PUT / DELETE 기능 기억하는가?

워낙 중요한 내용이다보니 다시 한 번 리마인딩 해보겠다.

 

GET (읽기: READ)

POST (생성: CREATE)

PUT (수정: UPDATE)

DELETE (삭제: DELETE)

 

이렇게 CRUD와 연계해서 머리 속에 박아넣는 것이 중요한 것 같다.

그렇다면 이제부터 본격적으로 저 4가지 기능을 코드를 통해 살펴보도록 하자!

 

1. GET

package com.sparta.week02.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@Entity // 테이블임을 나타냅니다.
public class Course extends Timestamped{
    // Course 클래스는 Timestamped 클래스를 상속해서 쓴다.
    // Timestamped 클래스는 추상 클래스

    @Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
    @GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
    private Long id;

    @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
    private String title;

    @Column(nullable = false)
    private String tutor;

    public Course(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }

    public Course(CourseRequestDto requestDto){
        this.title = requestDto.getTitle();
        this.tutor = requestDto.getTutor();
    }

    public void update(CourseRequestDto requestDto) {
        this.title = requestDto.getTitle();
        this.tutor = requestDto.getTutor();
    }

}

 

비교적 최근에 롬복 기능을 사용하면서 올렸던 코드인데 기억할지 모르겠다.

요 녀석은 DTO라고 해서 클래스별로 각 객체값을 전달해주는 매개체 역할을 하는 코드이다.

임의로 수정하면 곤란한 데이터들 (title, tutor)에 접근제한자 (private)를 둬서 따로 관리하고 있고..

 

앞으로 GET / POST / PUT / DELETE 영역에서 각각 다뤄야 하는 데이터들은..

 

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@RequiredArgsConstructor

public class CourseRequestDto {

    private final String title;

    private final String tutor;

}

 

다음과 같이 별도로 응답 전용 DTO 클래스를 만들어 바로 전에 올린 클래스와 상속관계를 형성해주고 있다.

변수 타입 앞에 final을 선언하여 '너 이거 안가져다가 쓰면 죽어?' 식으로 협박을 하고 있다.

 

더 좁은 개념으로는 다형성이라고도 하는데..

자바 기본 개념은 따로 페이지를 만들어 포스팅 하도록 하겠으니 우선은 넘어가주기 바란다 앗쎄이! 

 

 

 

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequiredArgsConstructor
@RestController
public class CourseController {

    private final CourseRepository courseRepository;

    private final CourseService courseService;

    @GetMapping("/api/courses")
    public List<Course> getCourses() {
        return courseRepository.findAll();
        // SELECT * FROM COURSES;
    }

 

갑자기???

미안하다. 나도 아직 누비라 여기저기에서 공부한 개념이 보기 좋게 짜여져 있지는 않다.

당분간은 이렇게 생각나는대로 불쑥 불쑥 다루지 않았던 개념을 소개할 거 같다.

 

자! 각설하고..

 

웹을 프로그래밍 할 때는 크게 model단 / command단 / controller단 / 클라이언트단

요런 식으로 각각 스코프를 나눠서 제작하는 게 일반적이다.

요놈은 그중에서 Controller단에 해당하는 코드라고 할 수 있다.

어렵게 생각할 거 없다. 그냥 자동응답기라고 보면 된다.

 

그래서 그게 뭐?

 

하단에 어노테이션을 선언한 부분이 보이는가?

@GetMapping(...) 요 부분 말이다.

DTO 클래스에 선언된 변수들을 따로 배열로 읽어 (GET / READ) 오려고 하는 것이다.

리턴 값으로 courseRepositoty.findAll() 메서드를 선언해줬는데

SQL로 치면 'SELECT * FROM TABLE' 이나 마찬가지인 부분이다.

API의 GET 메서드를 실행하기 위한 핵심코드는 사실 요 스코프라고 할 수 있다.

 

이 다음부터는 나머지 POST / PUT / DELETE 방식을 다뤄봐야 하는데..

글이 너무 길어져서 우선 여기서 끊고 다시 뒤 이에서 포스팅을 하도록 하겠다.

 

미안하고 고맙다..!