찔끔찔끔씩😎

[웹개발의 봄, Spring] 2주차 (3) - API, Lombok, DTO 본문

Server/Spring

[웹개발의 봄, Spring] 2주차 (3) - API, Lombok, DTO

댕경 2022. 3. 13. 02:29
728x90
[웹개발의 봄, Spring] 2주차 (1) - RDBMS, H2, SQL
[웹개발의 봄, Spring] 2주차 (2) - JPA, Repository

이번 포스팅 내용

Lombok

🔎 Lombok 이란?

Lombok(롬복)은, 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메소드/생성자 등을 자동생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리이다.

 

- Course.java 

@Getter: Getter를 각각 따로 만들어 주지 않아도 가능해졌다.

@NoArgsConstructor: 기본 생성자를 따로 만들어 주지 않아도 가능해졌다.

- CourseService.java

@RequiredArgsConstructor: CourseRepository를 따로 받아오지 않아도 final 선언만 하여도 사용 가능해졌다.

 

DTO

🔎 DTO 필요성

Data Transfer Object

DB에 연결되어있는 클래스는 그대로 두고 새로운 클래스를 만들어 사용하자.

🔎 DTO 생성하기

Dto 위치

package com.sparta.week02.domain;

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

@Getter
@Setter
@RequiredArgsConstructor
public class CourseRequestDto { // 데이터를 물고 다니는 녀석!
    private final String title;
    private final String tutor;
    
}

- 기존 update 

기존 update 사용 시, Course를 직접 받아서 수정하였는데, 이 과정을 Dto를 사용하여 바꾸어 보자.

Course new_course = new Course("웹개발의 봄, Spring", "임민영");
courseService.update(1L, new_course);
courseList = courseRepository.findAll();
for (int i = 0; i < courseList.size(); i++) {
    Course course = courseList.get(i);
    System.out.println(course.getId());
    System.out.println(course.getTitle());
    System.out.println(course.getTutor());
}

🔎 DTO 적용하기

1. Week02Application

CourseRequestDto requestDto = new CourseRequestDto("웹개발의 봄, Spring", "임민영");
courseService.update(1L, requestDto);
courseList = courseRepository.findAll();
for (int i = 0; i < courseList.size(); i++) {
    Course course = courseList.get(i);
    System.out.println(course.getId());
    System.out.println(course.getTitle());
    System.out.println(course.getTutor());
}

2. CourseService 

@Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
public Long update(Long id, CourseRequestDto requestDto) { // 어떤 id를 업데이트?
    Course course1 = courseRepository.findById(id).orElseThrow(
            () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
    );
    course1.update(requestDto);
    return course1.getId();
}

3. Course

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

 

API

🔎 API

API 란 클라이언트와 서버간의 약속이다.

클라이언트가 정한대로 서버에게 요청(Request)을 보내면, 서버가 요구사항을 처리하여 응답(Response)을 반환하는 것.

 

REST란 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미한다. 여기서 동사는 전에 말했던 CRUD를 지칭한다. 예를 들자면 courses에 대해 생성(POST)/조회(GET)/수정(PUT)/삭제(DELETE) 요청하는 것.

- 주소 예시

  주소에 들어가는 명사들은 복수형을 사용하고 동사는 가급적이면 사용하지 않는다.

  • GET /courses → 강의 전체 목록 조회 요청
  • GET /courses/1 → ID가 1번인 녀석 조회 요청
  • POST /courses → 강의 생성 요청
  • PUT /courses/3 → ID가 3번인 녀석 수정 요청
  • DELETE /courses/2 → ID 2번인 녀석 삭제 요청

 

🔎 Controller에 API 작성하기

Controller 위치

controller package를 만들고, 클래스를 생성한다.

@RequiredArgsConstructor
@RestController
public class CourseController {

    private final CourseRepository courseRepository;

	// 이 위치에 API를 작성함
    
}

- GET

데이터 조회

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

 

- POST 

생성요청


// PostMapping을 통해서, 같은 주소라도 GetMapping 방식이 다름을 구분할 수 있다.
@PostMapping("/api/courses")
public Course createCourse(@RequestBody CourseRequestDto requestDto) {
    // requestDto: 데이터를 물고다니는 넘
    // @RequestBody: Controller에서 요청을 받는 녀석이라는 것을 알려준다, 넘어오는 넘을 잘 받기 위해서!

    // 저장하는 될 정보는 Dto가 아니라 Course라서, Dto의 정보를 course에 담아야 한다.
    // Course에서 위와 같은 생성자를 만들어 주어야한다!
    Course course = new Course(requestDto);

    // JPA를 이용하여 DB에 저장하고, 그 결과를 반환합니다.
    return courseRepository.save(course);
}

-Course.java

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

 

- PUT

@PutMapping("/api/courses/{id}")
public Long updateCourse(@PathVariable Long id, @RequestBody CourseRequestDto requestDto) {
    // 변경하고싶은 id, 변경할 내용을 받아온다. 
    // @PathVariable: {id}로 받아온 넘임을 명시
    // @RequestBody: Controller에서 요청을 받는 녀석이라는 것을 알려준다, 넘어오는 넘을 잘 받기 위해서!
    return courseService.update(id, requestDto);
}

 

- Delete

@DeleteMapping("/api/courses/{id}")
public Long deleteCourse(@PathVariable Long id){
    courseRepository.deleteById(id);
    return id;
}

 

 

cf)

Sprint POST,PUT 방식은 엄격하게 정해져 있다. ARC를 사용할 때도 유념해야 한다.

1. header에 Content-Type을 application/json으로 추가하기

2. body에 json 형식으로 course 정보를 넘겨주기

Comments