'스프링 부트와 AWS로 혼자 구현하는 웹 서비스'를 읽고 공부하며 정리한 내용입니다. 오류 해결부분은 틀린 내용이 있을 수 있습니다.😂
관계형 데이터베이스와 객체지향 프로그래밍 패러다임 불일치로 여러 문제가 발생한다.
서로 지향하는 바가 다른 2개 영역을 중간에서 일치시켜주는 것 ➡ JPA
즉 개발자는 객체지향적으로 프로그래밍하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행
jpa는 인터페이스로서 자바 표준 명세서이다.
인터페이스 구현체로는 Hibernate, Eclipse등이 있지만
1. 구현체 교체 용이
2. 저장소 교체 용이
두 가지 이유로 Spring Data JPA라는 모듈을 이용
@Getter
@NoArgsConstructor
@Entity
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
}
Entity의 PK는 Long타입의 Auto_increment를 추천(MySQL 기준 bigint타입)
Entity 클래스에서는 Setter 메소드는 절대 만들지 않는다. 해당 클래스의 인스턴스 값들이 언제 어디서 변하는지 코드상으로 명확히 구분이 힘들어 차후 기능 변경 시 복잡해지기 때문이다.
대신 해당 필드의 값 변경이 필요하면 명확히 목적과 의도를 나타낼 수 있는 메소드를 추가해야한다.
생성자 대신 빌더를 사용하면 어느 필드에 어떤 값을 채워야하는지 명확하게 인지 가능하다.
@Entity : 테이블과 링크될 클래스 , 기본값으로 카멜케이스 이름을 언더스코어 네이밍으로 테이블이름 매칭
ex) SalesManager.java -> sales_manager table
@Id : 해당 테이블의 PK 필드를 나타냄
@GeneratedValue : PK의 생성 규칙을 나타냄
@Column : 테이블의 칼럼을 나타냄 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼임. 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용
(문자열의 사이즈를 500으로 늘리거나 타입을 TEXT로 변경)
@NoArgsConstructor : 기본 생성자 자동 추가, public Posts() {}와 같음
@Getter : 클래스 내 모든 Getter메소드 생성
@Builder : 해당 클래스의 빌더 패턴 클래스 생성