[H2 데이터베이스]
- 주로 개발용이나 소규모 프로젝트에서 사용되는 파일 기반의 경량 데이터베이스
- gradle.build에 라이브러리 주입 예시
dependencies {
runtimeOnly 'com.h2database:h2'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
implementation(연관된 상위 의존성 라이브러리를 제외하고 필요한 라이브러리만을 선택적으로 가져옴)
-application.properties(프로젝트 환경 설정 파일, H2 데이터베이스를 사용하려면 application.yml로 리팩토링)
# DATABASE
spring:
datasource:
driver-class-name: org.h2.Driver # 데이터베이스 접속시 사용하는 드라이버이다. Database를 H2로 사용하겠다는 것을 명시한
다.
url: jdbc:h2:~/test # 데이터베이스 접속을 위한 경로이다.
username: sa # (사용자명은 기본 값인 sa로 설정한다.)
password: #로컬 개발 용도로만 사용하기 때문에 패스워드를 설정하지 않았다.
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
show_sql: true
format_sql: true
h2:
console:
3주차 - 데이터 베이스 연동 2
enabled: true #H2 콘솔의 접속을 허용할지를 설정
path: /console #콘솔 접속을 위한 URL 경로이다.
spring.jpa.hibernate.ddl-auto : 엔티티를 기준으로 테이블을 생성하는 규칙을 정의
- none - 엔티티가 변경되더라도 데이터베이스를 변경하지 않음
- update - 엔티티의 변경된 부분만 적용
- validate - 변경사항이 있는지만 검사
- create - 스프링부트가 시작될 때 모두 drop하고 다시 생성
- create-drop - create와 동일하나 종료시에도 모두 drop
spring.jpa.properties.show_sql : sql문을 출력
spring.jpa.properties.format_sql : sql을 이쁘게 정렬
[ORM]
-Object Relational Mapping의 약자
-객체지향 관점과 데이터 중심 관점간 패러다임의 불일치 문제를 해결하기 위한 방식
-패러다임의 불일치란?
- 세분성 : 테이블 수와 엔티티 클래스의 수가 서로 다를 수 있음
- 상속성 : RDBMS에서는 상속이라는 개념이 없음
- 식별성 : 데이터베이스는 기본키와 같은 식별자로 동일성을 정의하지만, 자바의 경우 두 객체의 값이 같을지라도 참조값이 다르다면 다르다고 판별할 수 있음
- 연관성 : 객체지향관점에서는 객체를 참조함으로써 연관성(의존성)을 나타내지만, RDBMS에서 는 외래키만으로 연관성을 표현할 수 있음. 즉, 데이터베이스에서는 외래키만으로 양방향 연관관계를 표현할 수 있지만, 객체간에는 단방향만 가짐으로 불일치가 발생
[JPA]
-Java 진영에서는 이 ORM이라는 기술 표준 명세서가 JPA라는 이름으로 불림
-내부적으로 JDBC(자바용 데이터베이스 접속 API)를 사용
-메서드를 통해 자동으로 SQL문을 짜주기 때문에, 기존 sql문 쿼리를 작성하여 의존성이 높고 개발 효율이 떨어지던 문제를 해결
-이중에서도 Hibernate가 대표적인 JPA의 구현체이며, Spring Data JPA는 이 Hibernate를 조금 더 사용하기 쉽게 모듈화 해놓은 것임
[Lombok]
-클래스를 생성할 때 반복적으로 사용하는 getter/setter, toString 같은 반복 메서드를 어노테이션으로 대체하여 컴파일 과정에서 자동으로 생성해주는 기능을 제공하는 라이브러리
-코드를 짧고 가독성 높게 구성할 수 있다는 장점
-어노테이션 종류
- @Getter/@Setter
- 생성자 자동 생성 어노테이션(@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor)
- @ToString
-Object 클래스의 toString() 메서드를 자동으로 오버라이드 - @EqualsAndHashCode
-객체의 동등성과 동일성을 비교하는 연산 메서드를 자동으로 생성 - @Data
-앞의 모든 어노테이션을 포괄하나 권장되지 않음(Setter가 포함되는 문제)
[엔티티 개념]
-JPA에서 엔티티는 데이터베이스의 테이블에 대응하는 클래스
-엔티티 클래스 내의 필드는 테이블의 애트리뷰트와 매핑됨
[엔티티 관련 어노테이션]
- @Entity
- 해당 클래스가 엔티티임을 명시하며, 인스턴스는 매핑되는 테이블에서 하나의 레코드를 의미 - @Table
- 클래스의 이름과 테이블의 이름을 다르게 지정해야 할 경우 @Table(name = "member")과 같은 식으로 사용 - @Id
- 테이블의 기본키를 설정해주기 위한 역할로 반드시 선언되어야 함 - @GeneratedValue
- 해당 Id 필드를 어떤 방식으로 자동 생성할 것인지 결정할 때 사용
- 직접 기본키를 할당해주고자 한다면 사용하지 않고, 자동으로 기본키를 할당할 때는 GenerationType의 옵션을 통하여 전략을 세울 수 있음(Auto는 데이터베이스 시스템에 맞게 자동으로 생성, Identity는 Auto_INCREMENT를 사용하여 기본값을 생성) - @Column
-엔티티 클래스의 필드를 자동으로 테이블의 칼럼(애트리뷰트)와 매핑
-name : 데이터베이스의 칼럼명을 설정하는 속성, 명시하지 않으면 필드명으로 자동 설정
-nullable : 레코드를 생성할 때 컬럼 값이 null을 허용하는지 명시, 기본 값은 false
-length : 데이터의 최대 길이를 지정
-unique : 해당 칼럼이 중복을 허용하지 않도록 설정
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "member")
public class Member {
@Id
@GeneratedValue
private Long id; //PK
@Column(nullable = false)
private Integer studentId; //학번
@Column(nullable = false)
private String name;//이름
@Column(nullable = false)
private String generation; //동아리 기수
@Column(nullable = false)
private String club; //동아리
}
[Repository Interface 생성]
- Spring Data JPA는 JpaRepository를 기반으로 데이터베이스를 쉽게 사용할 수 있는 인터페이스를 제공
- 이러한 JpaRepository를 상속하는 인터페이스를 생성함으로써, 사전에 정의되고 구현된 메서드를 활용할 수 있음
- 상속받는 JpaRepository의 타입은 <엔티티 클래스 명, 기본키 타입>으로 지정해주어야 함
[영속성 컨텍스트 및 엔티티 매니저]
영속성 컨택스트
-엔티티 클래스와 테이블 레코드의 패러다임 불일치를 해소하는 기능과 객체를 보관하는 기능을 수행하는 영역
-엔티티 객체가 영속성 컨텍스트에 놓여지면, JPA는 엔티티 객체 내에 선언된 어노테이션을 바탕으로 데이터베이스에 반영함. 이때 영속성 컨텍스트 영역에 들어와 JPA의 엔티티 매니저가 관리를 받는 엔티티 객체를 영속 객체라고 부름
-엔티티의 생명주기는 비영속, 영속, 준영속, 삭제로 구분([JPA] 엔티티의 생명주기 (Entity LifeCycle) - Heee's Development Blog (gmlwjd9405.github.io))
엔티티 매니저
-엔티티를 관리하는 객체이자 관리자 역할
-데이터베이스에 접근해서 CRUD를 수행함
-JpaRepository 내의 메서드들을 실제로 구현한 구현체 클래스는 SimpleJpaRepository이며 그 안에
컴포넌트 시리즈인 @Repository 어노테이션, 데이터베이스를 CRUD 등의 작업을 하는 가장 최소 단위인 @Transcational 어노테이션이 선언되어 있으며 내부 필드에 엔티티 매니저가 정의되어 있음
'Backend > 스프링' 카테고리의 다른 글
| 스프링부트 스터디 5주차 - 유효성 검사 및 실습 (0) | 2023.08.30 |
|---|---|
| 스프링부트 스터디 4주차 - Spring Data JPA 및 연관매핑 (0) | 2023.08.23 |
| 스프링부트 스터디 2주차 - 프로젝트 생성 및 API 구현 (0) | 2023.08.02 |