항해 13일차
JPA는, SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기
- JPA가 자바로 DB를 사용하도록 도와준다.
domain(table) 패키지안에 java 클래스를 만들어준다.
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@Entity // 데이터베이스 기준으로 테이블임을 나타냅니다.
public class Course {
@Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
private Long id;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
private String title;
@Column(nullable = false)
private String tutor;
public String getTitle() {
return this.title;
}
public String getTutor() {
return this.tutor;
}
public Course(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
}
"생성일자"와 "수정일자"를 필드로 가지는 것은 DB에서 기본중의 기본.
@MappedSuperclass // 상속했을 때, 컬럼으로 인식
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
public class Timestamped {
@CreatedDate // 생성일자
private LocalDateTime createdAt;
@LastModifiedDate // 마지막 수정일자
private LocalDateTime modifiedAt;
}
CRUD란? 정보관리의 기본 기능
→ 생성 (Create)
→ 조회 (Read)
→ 변경 (Update)
→ 삭제 (Delete)
// 데이터 저장하기
repository.save(new Info("홍길동", "서울특별시"));
// 데이터 전부 조회하기
List<Informainon> list = repository.findAll();
for (int i = 0; i < list.size(); i++) {
Information info = list.get(i);
System.out.println(info.getId());
System.out.println(info.getName());
System.out.println(info.getAddress());
}
// 데이터 하나 조회하기
Infomation info = repository.findById(1L).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
); // id는 Long형으로 1L이라고 표현
먼저 다루어야 하는 개념 Service
1. Controller : 가장 바깥 부분, 요청/응답을 처리함. / 응답기
2. Service : 중간 부분, 실제 중요한 작동이 많이 일어나는 부분 / 업데이트
3. Repository(Entity) : 가장 안쪽 부분, DB와 맞닿아 있음.
// 데이터 업데이트 하기
Information new_info = new Information("이순신", "경기도");
informationService.update(1L, new_info);
list = infomationRepository.findAll();
for (int i=0; i<list.size(); i++) {
Information info = list.get(i);
System.out.println(info.getId());
System.out.println(info.getName());
System.out.println(info.getAddress());
}
// 데이터 삭제하기
informationRepository.deleteAll();
Lombok은 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메소드/생성자 등을 자동생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리
테이블을 막 건드려도 될까?
= read, update할 때 메인DB 클래스를 직접 수정,삭제 하는게 아닌
완충재로 활용하는 것이 DTO(Data Transfer Object)이다.
@Getter // Getter 자동 생성
@Setter // Setter 자동 생성
@RequiredArgsConstructor // 기본 생성자 자동 생성
public class CourseRequestDto {
private final String name;
private final String address;
}
클라이언트 - 서버 간의 약속
클라이언트가 정한대로 서버에게 요청(Request)을 보내면,
서버가 요구사항을 처리하여 응답(Response)을 반환.
REST란, 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미
-여기에 쓰이는 동사는 CRUD를 지칭
-생성(POST)/조회(GET)/수정(PUT)/삭제(DELETE) 요청
- 예시
- GET /informations
→ 전체 목록 조회 요청- GET /informations/1
→ ID가 1번 조회 요청- POST /informations
→ 강의 생성 요청- PUT /informations/3
→ ID가 3번 수정 요청- DELETE /informations/2
→ ID 2번 삭제 요청
@RequiredArgsConstructor
@RestController
public class InformationController {
private final InformationRepository informationRepository;
@GetMapping("/api/intformations")
public List<Information> getInformations() {
return informationRepository.findAll();
}
}
@RequiredArgsConstructor
@RestController
public class InformationController {
private final InformationRepository intformationRepository;
@GetMapping("/api/informations")
public List<Information> getInformations() {
return intformationRepository.findAll();
}
}
@PutMapping("/api/informations/{id}")
// {id} id값이 유동적이기에 @PathVariable 어노테이션을 사용한다.
public Long updateInformation(@PathVariable Long id, @RequestBody InformationRequestDto requestDto) {
return informationService.update(id, requestDto);
}