데이터베이스를 간단하게 설명하면 매우 고도화된 엑셀이라고 할 수 있다.
- 엑셀 파일 하나 = 데이터베이스
- 엑셀 시트 하나 = 테이블
- 엑셀 행 하나 = 데이터
테이블 생성, 데이터 삽입, 데이터 조회 등을 하고자 한다면 아래 더보기처럼 SQL문을 이용하면 된다.
만약 자동차 테이블을 만들고자 한다면,
CREATE TABLE IF NOT EXISTS Car (
id bigint NOT NULL AUTO_INCREMENT,
model varchar(255) NOT NULL,
brand varchar(255) NOT NULL, PRIMARY KEY (id)
);
여기에 행 2개를 삽입한다면
INSERT INTO car (model, brand) VALUES
('i8', 'BMW'), ('R8', 'Audi');
"그럼 웹 서비스를 만들기 위해 SQL문도 배워야 하는건가?"
그건 아니라고 한다.
이미 세상에는 JPA 라는 번역기가 등장해서 SQL을 사용하지 않고도 데이터를 다룰 수 있다.
Java 만으로도 SQL을 대체할 수 있다.
- Java로 DB를 사용하도록 도와주는 것 = JPA
- DB의 테이블 = Domain(Entity)
- DB의 SQL = Repository
그럼 새 프로젝트를 만들어보자.
Lombok은 코드를 절약하기 위해서 추가해주고
RDBMS 의 한 종류인 H2와 MYSQL도 추가해준다.
H2는 서버가 작동하는 동안에만 내용을 저장하는 In-memory DB의 하나로 연습용으로 많이 사용하는 DB이다.
연습 중 H2웹콘솔을 띄우기 위해서는 application.properties 파일에 아래 내용을 추가해야한다.
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
웹 콘솔을 띄우는 주소는 localhost:8080/h2-console 로 접속하면 된다.
그럼 JPA 로 데이터를 사용하기 위해 도메인 패키지를 만들어준 후에 Car 클래스를 만들어보자.
Car.java
package com.eunki96.test02.domain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@NoArgsConstructor
@Entity
@Getter
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String model;
@Column(nullable = false)
private String brand;
public Car (String model, String brand){
this.model = model;
this.brand = brand;
}
}
- @NoArgsConstructor : 기본생성자를 알아서 생성해준다.
- @Entity : 단순 클래스가 아니라 테이블(엔티티)임을 나타낸다.
- @Id : Primary Key(식별자)로 사용하겠다는 뜻입니다.
- @Column(nullable = false) : 꼭 있어야하며 컬럼값임을 나타낸다.
이어서 리포지토리 파일도 만들어준다.
JPA는 리포지토리를 통해서만 사용 가능하며, 리포지토리는 interface 파일로만 사용 사능하다.
interface 파일이란 멤버없이 메소드들로 구성된 것이라 설명할 수 있다.
CarRepository.java
public interface CourseRepository extends JpaRepository<Course, Long> {
}
JPA repository 를 상속한다.
즉, JPA 에서 만들어놓은 메소드들을 사용하겠다는 뜻이다.
+ 아까 H2 웹콘솔 설정을 위해 내용을 추가한 application.properties 에 다음 내용을 추가하면 JPA를 사용할 때 콘솔에 SQL문이 보이도록 세팅 가능하다.
spring.jpa.show-sql=true
DB의 기본은 생성일자와 수정일자를 필드로 갖는 것이다.
우선 Timestamped 파일을 만들고
Timestamped.java
package com.eunki96.test02.domain;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public abstract class Timestamped {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
}
- @EntityListeners(AuditingEntityListener.class) : 테이블을 주시하고 있다가, 수정이 일어날 때 자동으로 반영해준다. 여기서 생성일자는 초기값으로 고정일테니 수정일자 변경시 동작하는 것이다.
- @MappedSuperclass : 이 클래스를 상속한 녀석의 멤버변수도 컬럼으로 인식함을 나타낸다.
- @CreatedDate : 생성일자임을 나타낸다.
- @LastModifiedDate : 마지막 수정일자임을 나타낸다.
class Car extends Timestamped { //.....
Car 클래스에 생성일자/수정일자 멤버를 추가하기 위해 Timestamped 파일을 상속시켜보자.
그리고 프로젝트 생성시 처음 만들어지는 ~Application 클래스에 다음을 추가한다.
@EnableJpaAuditing
아마 아직 추가한것이 아무것도 없기 때문에 H2 콘솔 주소에 들어가서 검색해도 아무것도 나오지 않겠지만,
혼자 연습할 때 자동차 두 종류를 추가했었는데, 여기서 생성/수정일자가 잘 나타난다. 성공.
다음엔 JPA로 CRUD 기능을 실행해보자.
'[Spring] > Spring 정리' 카테고리의 다른 글
API - 2 (GET, POST) (0) | 2022.09.21 |
---|---|
DTO (2) | 2022.09.19 |
JPA - 2 /CRUD로 행복회로 돌려보기(실습) (0) | 2022.09.18 |
RestController (브라우저에 클래스 정보 보여주기) (2) | 2022.09.16 |
API - 1 (JSON) (0) | 2022.09.16 |