▶ Lombok?
→ 코드 절약하기!
→ Lombok(이하 롬복)은, 잦바 프로젝트를 진행하는데 거의 필수적으로 필요한 메소드/생성자 등을 자동 생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리이다.
※환결설정 및 설치 방법은 생략하겠다.
▶ DTO?
→ 코딩할 때, 테이블을 막 건드려도 될까?
= read, update 할 때 Course 클래스를 막 써도 될까?
= 내가 아닌 다른 사람이 변경이라도 한다면 ??
→ 완충재로 활용하는 것이 DTO(Data Transfer Object)이다.
→ 정보를 물고 다니는 녀석
→ 데이터를 전달하고 주고받을 때는 새로 클래스를 만들어서 하자. 기존 클래스를 만들지 말자.
💻DTO 생성하기
→ src > main > java > com.sparta.week02 > models CourseRequestDto 파일 생성
CourseRequestDto.java
@NoArgsConstructor
@Getter
public class CourseRequestDto {
private String title;
private String tutor;
public CourseRequestDto(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
}
→ CourseService 수정 : Course -> CourseRequestDto, requestDto
@RequiredArgsConstructor
@Service
public class CourseService {
private final CourseRepository courseRepository;
@Transactional
public Long update(Long id, CourseRequestDto requestDto) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
course1.update(requestDto);
return course1.getId();
}
}
→ Course 수정 : update 메서드
@Getter
@NoArgsConstructor
@Entity
public class Course extends Timestamped {
@Id
@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 void update(CourseRequestDto requestDto) {
this.title = requestDto.getTitle();
this.tutor = requestDto.getTutor();
}
}
→ Week02Application 수정 : CourseRequestDto
@EnableJpaAuditing
@SpringBootApplication
public class Week02Application {
public static void main(String[] args) {
SpringApplication.run(Week02Application.class, args);
}
@Bean
public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
return (args) -> {
courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));
System.out.println("데이터 인쇄");
List<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());
}
Course new_course = new Course("웹개발의 봄, Spring", "임민영");
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());
}
};
}
}
▶ API?
→ 클라이언트 - 서버 간의 약속이다.
→ 클라이언트가 정한대로 서버에게 요청(Request)을 보내면, 서버가 요구사항을 처리하여 응답(Response)을 반환한다.
▶ REST?
→ REST란, 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미한다.
→ 여기에 쓰이는 동사는 JPA시간에 학습한 CRUD를 지칭한다.
→ 즉, A에 대해 생성(POST)/조회(GET)/수정(PUT)/삭제(DELETE) 요청을 하는 것이다.
※주의 사항
1. 주소에 들어가는 명사들은 복수형을 사용한다. ex. /course
2. 주소에 동사는 가급적 사용하지 않는다. ex. /account/edit
💻GET API 만들기
→ src > main > java > com.sparta.week02 아래에 controller 패키시 생성
→ CourseController.java 파일 생성
@RequiredArgsConstructor
@RestController //JSON으로 응답해야하므로
public class CourseController {
private final CourseRepository courseRepository;
@GetMapping("/api/courses")
//여기로 GET방식으로 요청이 오면 아래의 메소드를 실행해라
public List<Course> getCourses() {
return courseRepository.findAll();
}
}
▶ ARC?
→ 현업에서 API를 만들고 나면 각종 툴로 테스트 및 기능 확인을 굉장히 많이 한다.
→ ARC는 그 중에서도 유용한 툴이다.
💻POST API 만들기
→ POST는 생성요청이다.
→ CourseController.java
private final CourseService courseService;
// PostMapping을 통해서, 같은 주소라도 방식이 다름을 구분
@PostMapping("/api/courses")
public Course createCourse(@RequestBody CourseRequestDto requestDto) {
// requestDto 는, 생성 요청을 의미합니다.
// 강의 정보를 만들기 위해서는 강의 제목과 튜터 이름이 필요하잖아요?
// 그 정보를 가져오는 녀석입니다.
// 저장하는 것은 Dto가 아니라 Course이니, Dto의 정보를 course에 담아야 합니다.
// 잠시 뒤 새로운 생성자를 만듭니다.
Course course = new Course(requestDto);
// JPA를 이용하여 DB에 저장하고, 그 결과를 반환
return courseRepository.save(course);
}
→ @RequestBody : 이게 없으면 정보가 requestDto안에 쏙 안들어간다.
→ Course 클래스에 생성자 추가
public Course(CourseRequestDto requestDto){
this.title = requestDto.getTitle();
this.tutor = requestDto.getTutor();
}
→ ARC에서 진행할 때, ⭐Header: json 필요 -> 정해진 방식
💻PUT API 만들기
→ CourseController.java
@PutMapping("/api/courses/{id}")
public Long updateCourse(@PathVariable Long id, @RequestBody CourseRequestDto requestDto) {
return courseService.update(id, requestDto);
}
💻DELETE API 만들기
→ CourseController.java
@DeleteMapping("api/courses/{id}")
public Long deleteCourse(@PathVariable Long id){
courseRepository.deleteById(id);
return id;
}
⭐과제
Person.java
@Getter
@NoArgsConstructor
@Entity
public class Person {
@Id //Primary키로 사용하겠다는 의미
@GeneratedValue(strategy = GenerationType.AUTO) //자동증가명령
private Long id;
@Column(nullable = false) //반드시 값이 존재해야함을 의미
private String name;
@Column(nullable = false)
private String major;
public Person(PersonRequestDto requestDto){
this.name = requestDto.getName();
this.major = requestDto.getMajor();
}
public Person(String name, String major){
this.name = name;
this.major = major;
}
public void update(PersonRequestDto requestDto){
this.name = requestDto.getName();
this.major = requestDto.getMajor();
}
}
PersonRequestDto.java
@Setter
@Getter
@RequiredArgsConstructor
public class PersonRequestDto {
public final String name;
public final String major;
}
PersonRepository.java
public interface PersonRepository extends JpaRepository<Person, Long> {
}
PersonService.java
@RequiredArgsConstructor
@Service //이 클래스는 서비스임을 명시
public class PersonService {
private final PersonRepository personRepository;
@Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
public Long update(Long id, PersonRequestDto requestDto) {
Person person1 = personRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
person1.update(requestDto);
return person1.getId();
}
}
PersonController.java
@RequiredArgsConstructor
@RestController
public class PersonController { //요청/응답을 처리하는 부분
private final PersonRepository personRepository;
private final PersonService personService;
//GET
@GetMapping("/api/persons")
public List<Person> getPersons(){
return personRepository.findAll();
}
//POST
@PostMapping("/api/persons")
public Person createPerson(@RequestBody PersonRequestDto requestDto){
Person person = new Person(requestDto);
return personRepository.save(person);
}
//PUT
@PutMapping("api/persons/{id}")
public Long updatePerson(@PathVariable Long id, @RequestBody PersonRequestDto requestDto){
return personService.update(id, requestDto);
}
//DELETE
@DeleteMapping("/api/persons/{id}")
public Long deletePerson(@PathVariable Long id){
personRepository.deleteById(id);
return id;
}
}