- CRUD (create read update delete)
데이터 저장하기 & 조회하기
Repository 의 save와 findAll 을 이용한다.
메인함수 밑에 코드를 작성하자
// 데이터 저장하기
repository.save(new Course("수업이름", "사람이름"));
// 데이터 전부 조회하기
List<Course> courseList = repository.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 course = repository.findById(1L).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
항상 CRUD 기능을 하고싶으면 repository. 메소드명 을 적어주면 된다.
데이터를 저장하고싶으면 .save
전부 조회하고싶으면 반복문을 돌려서 .findAll()과 .get() 메소드를 써주면된다
데이터를 하나 조회할때 만약 id가 1값이아닐때, 가르키는 대상이 없을때 다른결과를 보여줘야할때도 처리를 해줘야한다
orElseThrow메소드를 써주고 illegaArgumenException이나 NullPointerException 을써주고 뒤에 알럿메세지(?)를 써준다.
- 서비스
update와 delete를 해보기전에 서비스의 개념에 좀 이해를 하고 넘어가야한다.
스프링의 구조는 크게 세가지로 나뉜다
1.controller
2.service
3. Repository
서비스 경우는 컨트롤러와 레포사이에서 데이터베이스와 요청을 도와주는 기능이다. 업데이트는 요청을 받아서 데이터베이스에 다시 저장을 해야하므로 서비스에 해당한다. 그러므로 업데이트의 코드는 서비스에 작성해야 한다.
하지만 메소드는 기존에 있던 클래스에 만들어 두어야한다.
public void update(Course course) {
this.title = course.title;
this.tutor = course.tutor;
}
그 다음 service 패키지를 설치한후, CourseService.java도 만들어준다.
CourseService클래스안쪽엔,
@Service // 스프링에게 이 클래스는 서비스임을 명시
public class CourseService {
// final: 서비스에게 꼭 필요한 녀석임을 명시
private final CourseRepository courseRepository;
// 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
// 스프링에게 알려줌
public CourseService(CourseRepository courseRepository) {
this.courseRepository = courseRepository;
}
@Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
public Long update(Long id, Course course) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
course1.update(course);
return course1.getId();
}
}
1. @service 어노테이션을 써서 업데이트 작용이 일어나는것임을 명시
2. final을써서 서비스에게 CourseRepository가 꼭 필요한 요소인것을 명시
메인함수에 이제 쓸 코드는
@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", "임민영");
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());
}
};
}
위에는 다똑같지만 업데이트부분을 보면 조금 다르다.
Course 값을 new_course로 새로 정해주었고 "프론트엔드의 꽃"을 "웹개발의봄"으로 새로 업데이트해주었다.
Delete 삭제하기
@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", "임민영");
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());
}
courseRepository.deleteAll();
};
}
삭제하는 기능은 상당히 간단하다. 맨아래줄 courseRepository의 메소드를 이용하면 끝.
Lombok,DTO
Lombok(이하 롬복)은, 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메소드/생성자 등을 자동생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리이다.
롬복이 코드를 줄여주는 대상은 두가지이다. 하나는 Course클래스이고 , 하나는 CourseRepository 클래스이다.
바로 롬복을 써보자
먼저 Course클래스에 있는 Getter부분을 다 지워주자. 그리고 Course클래스 맨위에 @Getter만써주면 그 길었던 코드가
한방에 해결된다.
Course클래스에 @NoArgsConstructor어노테이션이 바로 롬복의 기능을 한다.기능의 역할은 그냥 기본생성자를 써준다.
추가적으로 CourseService 클래스에 위에 적었던 기본생성자를 지워보자. 그럼 위에 final CourseRepository에 오류가 뜰것인데 맨위에 @RequiredArgsConstructor를 적어서 기본생성자를 자동으로 생성되게 설정하면 오류가 사라진다.
DTO => Data Transfer Object.
예> 우리가 read와 update를 할때 Course클래스를 함부로 써도되는가? 아니다. 그럼 DB에 있는 데이터가 변할 가능성이 커진다. 그럴때 원래 기본으로 기능을 할 read는 Course 클래스에 정상적으로 놔두고, update같은 변할 가능성이 큰 기능들을 DTO로 활용해주어야 한다.
API
간단하다.클라이언트가 정한대로 서버에게 request을 보내면 서버가 요구사항을 확인해서 response해준다.
Rest
주소에 /어쩌고저쩌고 이렇게 붙은걸 본적이 있다. 주소에 명사,요청 방식 등 동사를 사용해 의도를 명확히 드러내는것을 의미한다. 여기에서 쓰는 동사는 내가 배웠던 JPA 의 CRUD이다.
생성 (POST) 삭제 (DELETE) 수정 (PUT) 조회 (GET)
예시
- GET /courses → 강의 전체 목록 조회 요청
- GET /courses/1 → ID가 1번인 녀석 조회 요청
- POST /courses → 강의 생성 요청
- PUT /courses/3 → ID가 3번인 녀석 수정 요청
- DELETE /courses/2 → ID 2번인 녀석 삭제 요청
댓글