[Spring]/Spring 정리

JPA - 1

응파카 2022. 9. 17. 18:43

클라이언트 - 서버 - 데이터베이스 요약

 

데이터베이스를 간단하게 설명하면 매우 고도화된 엑셀이라고 할 수 있다.

 

  • 엑셀 파일 하나 = 데이터베이스
  • 엑셀 시트 하나 = 테이블
  • 엑셀 행 하나 = 데이터

테이블 생성, 데이터 삽입, 데이터 조회 등을 하고자 한다면 아래 더보기처럼 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