View <-> Controller <-> Modelcontroller, dto, entity, repository, service 이렇게 5개 폴더가 기본인데 여기서 사용할 개념들만 폴더 만들어서 써도 됨config는 로그인이랑 프론트 할 때 추가해주어야 함builder와 toString method 정도가 포함됨import com.camp.reservation.reservation.room.entity.Room;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDate;
import java.time.LocalTime;
@Entity
@Getter
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Reservation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String userName;
@Column(nullable = false)
private String userFaculty;
@ManyToOne
@JoinColumn(name = "room_id", nullable = false)
private Room room;
@Column(nullable = false)
private LocalDate date;
@Column(nullable = false)
private LocalTime startTime;
@Column(nullable = false)
private LocalTime endTime;
@Column(nullable = false)
private int capacity;
@Column(nullable = false)
private String groupname;
@Column(nullable = false)
private String purpose;
@CreatedDate
@Column(updatable = false)
private LocalDate createdDate;
@LastModifiedDate
private LocalDate lastModifiedDate;
@Builder
public Reservation(String userName, String userFaculty, Room room, LocalDate date, LocalTime startTime, LocalTime endTime, int capacity, String groupname, String purpose) {
this.userName = userName;
this.userFaculty = userFaculty;
this.room = room;
this.date = date;
this.startTime = startTime;
this.endTime = endTime;
this.capacity = capacity;
this.groupname = groupname;
this.purpose = purpose;
}
@Override
public String toString() {
return "Reservation{" +
"id=" + id +
", user=" + userName +
", userFaculty=" + userFaculty +
", room=" + room +
", date=" + date +
", startTime=" + startTime +
", endTime=" + endTime +
", capacity=" + capacity +
", groupname='" + groupname + '\'' +
", purpose='" + purpose + '\'' +
'}';
}
}
Entity Annotation
@Id
@CreatedTime
@LastModifiedTime
@Column(name =”author”, nullable=false)
안써도 됨
→ 안 써도 이름이 변수명과 동일하게 설정됨
→ 다만 안 쓰면 null 값 방지가 사라짐
쓰면 널값을 db차원에서 방지해줌
자바 코드를 SQL로 번역해준다 했는데 보통 자바에서는 camel case로 쓰고 SQL은 언더바로 구분함
@Column(name = “원하는 이름”)
이걸 일일이 안해줘도 SQL 입장에서는 자바 문법이 사투리니까 그걸 default로 번역해줌
@Auditing
@Builder
import jakarta.persistence.*;
→ JPA 에서 import 하는 것
코드 수 를 줄여준다? 보통 Lombok 에서 온다고 생각
DB 와 관련되어 있다? 보통 JPA 에서 온다고 생각
불변 객체 가 아님Data Transfer Object
왜?
불변 객체의 역할
record자바에서 신식 문법이라 할 수 있는 부분
가독성 측면에서도 아 이 부분은 전달 역할만 하는구나 라고 바로 인식할 수 있음
⇒ 근데 class로 먼저 플로우와 그 불편함을 경험하고 나서 쓰는 것을 더 추천함
왜 편한지를 알아야 편하게 쓸 수 있을 것이기 때문
public record BoardCreateDTO {
}
Dispatcher Servlet: Tomcat에서 browser 에 띄워주고 Dispatcher가 전달하는 servlet 작은 알맹이
@PostMapping(”/api/board/save”)
@RequestBody 로 받음 → 프론트에서 보낸 내용 전달 받음 → 안쓰면 인식을 못하고 null값 들어감
클라이언트에서 요구하는 것 = 비즈니스 로직 이라 한다
두 가지 파일로 나우기: request 파일 + response 파일
스프링부트 입장에서 요청 받으면 request
반대로 답변 주면 response
요청 받는 것 ⇒ requestbody ⇒ dto
controller → service → db
@service
Service랑 Controller는 spring web에서 제공함
DTO: client에서 back으로 전달되는 방식
Entity: back에서 db로 전달되는 방식
→ 알맞는 형식으로 바꿔야 함
따라서 toEntity라는 함수를 DTO 안에 만들어준 이유: 받은 DTO 를 Entity로 만들어준다는 것
Repository 에서는 JPA 사용
JPA 에서 기본으로 제공해주는 것 중 하나가 insert 함수를 save라는 함수로 사용 가능
boardRepository.save(board)
이렇게 열심히 만든 API를 프론트 없이 테스트 해보고 싶을 때 사용할 수 있는 툴