Java, Spring Boot를 이용하여 진행하는 게시판 프로젝트 진행 중, 중요한 내용이나 공부한 내용을 작성해보려 한다.
영속성(Persistence)이란?
데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 말한다
ORM이란?
자바의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것.
ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결해준다.
Persistent API라고도 함
ex) hibernate, JPA
ORM의 장점
ORM을 이용하면 SQL 쿼리가 아닌 직관적인 코드로 데이터를 조작할 수 있어 개발자가 객체 지향 프로그래밍하는 데 집중할 수 있도록 도와준다.
SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 인해 생산성이 증가한다.
ORM의 단점
프로젝트가 커질 경우, 부담감이 커질 수 있다.
-> SQL을 결국은 작성해야할 수 있다.
JPA Entity 매핑
JPA에서 엔티티란 쉽게 생각하면, DB 테이블에 대응하는 하나의 클래스.
@Entity가 붙은 클래스는 JPA가 관리해주며, JPA를 사용해서 DB 테이블과 매핑할 클래스는 @Entity를 꼭 붙여야만 매핑이 가능하다.
기본키(PK) 매핑
@Entity
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 게시글 id
기본 키 생성을 데이터베이스에 위임
즉, id 값을 null로 하면 DB가 알아서 AUTO_INCREMENT 해준다
Table 매핑
@Table(indexes = {
@Index(columnList = "title"),
@Index(columnList = "hashtag"),
@Index(columnList = "createdAt"),
@Index(columnList = "createdBy"),
JPA Auditing이란?
ORM인 JPA로 데이터를 매핑할 때, 생성일자나 수정일자 같은 메타데이터를 처리해야할 때가 있다.
이 메타데이터들은 컬럼들이 대부분 공통적으로 가지고 있는 항목으로, Spring JPA에서 자동으로 시간을 매핑해주는 Auditing을 지원해 준다.
compile('org.springframework.boot:spring-boot-starter-data-jpa')
@CreatedDate // 생성일자
@CreatedBy // 생성자
@LastModifiedDate // 수정일자
@LastModifiedBy // 수정자
Column 어노테이션
JPA에서 DB Table의 Column을 Mapping 할 때 @Column Annotation을 사용한다.
@Column(nullable = false) // null 여부 설정
@Column(unique = true) // unique 제약조건 설정
@Column(nullalbe = true, length = 100) // length도 설정 가능
@ManyToOne
게시글과 댓글의 관계를 보자면, 한 개의 게시글에는 여러개의 댓글이 달릴 수 있다.
고로 게시글 -> 댓글은 OneToMany이고, 댓글 -> 게시글은 ManyToOne이다.
@Setter @ManyToOne(optional = false) private Post post; // 게시글 id
여기서 optional은 값에 null이 들어갈 수 있다면 false, 아니라면 true이다.
게시글에는 댓글이 없을 수 있으므로, null이 들어갈 수 있다. 고로 false
AutoWirded(의존성 주입)
Repository