Persistence Framework
(데이터 영속성을 부여하는 계층) 에서 사용하는 프레임워크로 데이터베이스와 연동되는 시스템을 빠르게 개발 및 안정적 구동
ex) 종류로는 SQL Mapper(MyBatis) 와 ORM(Hibernate)
* 영속성(Persistence) : 데이터가 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 것(자바에서는 JDBC의 역할)
1. ORM(Object-Relational Mapping)
객체(Object)와 데이터베이스(DB테이블)와의 사이의 관계를 연결시켜주는 것(=호환되지 않은 데이터를 변환하는 프로그래밍 기법)
CRUD 관련 메소드를 사용하면 자동으로 SQL을 만들어 개발자가 반복적인 SQL을 직접 작성하지 않아도 되고, DBMS에 종속적이지 않다.
VO Table
id ——ORM—— id
ex) Hibernate
SQL Mapper
Object와 SQL의 필드를 매핑하여 데이터를 객체화하는 기술
SQL문을 직접 작성하고 쿼리 수행결과를 어떠한 객체에 매핑하여 줄지 바인딩하는 방법(SQL 의존)
ex) MyBatis : SQL을 xml파일로 분리하여 관리, 결과와 객체 인스턴스의 매핑을 도와주는 역할, 동적쿼리를 다이나믹하게 작성 가능
출처 : https://deveun.tistory.com/entry/SQL-Mapper%EC%99%80-ORM-%EC%B0%A8%EC%9D%B4
참고 : [10분 테코톡] ⏰ 아마찌의 ORM vs SQL Mapper vs JDBC
2. JPA(Java Persistence API)
java = Jakarta
javax.persistence 패키지안에 EntityManager라는 인터페이스 사용
ex) persist(), merge(), remove(), find()
관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스다.
구현되어 있지 않다.(구현체=Hiberante)를 사용
JPA에서의 엔티티는 컬럼으로 표현됨-롬복을 사용해서 다수의 필드의 setter(),getter() 코드를 줄일 수있다.
Spring Data JPA(Repository인터페이스)
Spring Data JPA는 JPA를 쓰기 편한게 만들어 놓은 모듈
출처 : https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html
Hibernate ORM 5.4.33.Final User Guide
Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat
docs.jboss.org
3.Lombok
java 기반에서 반복적으로 작성하는 VO, DTO, Entity 관련 작업을 쉽게 해주는 라이브러리
build.gradle에서 lombok 선언
* Lombok 의 기능
* : @Getter, @Setter
* - 어노테이션을 클래스에 사용시 모든 필드에 대해서 setter(), getter() 선언됨
* - 어노테이션을 필드에 사용시 필드에 대해서 setter(), getter() 선언됨
* - 컴파일시 우측>리팩토링>Delombok에서 자동 setter(), getter() 자동 생성
* : @ToString
* - 어노테이션 사용으로 클래스에 필드 toString() 선언
* : @NoArgsConstructor
* - 인자가 없는 생성자(반드시 필요하여 항시 선언)
* : @AllArgsConstructor
* - 객체가 가지고 있는 모든 필드를 인자로 받는 생성자
* : @RequiredArgsConstructor
* - 필요한 인자만 가지고 만든 생성자
* : @NonNull
* - Lombok에서 제공, 해당 필드를 필수값으로 지정하여 @RequiredArgsConstructor 생성자를 사용
* : @EqualsAndHashCode
* - Equals(), HashCode()를 오버라이딩하여 사용한다는 어노테이션
* : @Data
* - Equivalent to @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode.
* - 위의 어노테이션들을 합쳐놓은것과 동일하다.(만능 어노테이션으로 보이나, OOP원칙을 깨는 단점이 보임)
* : @Builder
* - @AllArgsConstructor와 비슷하게 객체를 생성하고 필드값을 주입해주는 빌더의 형식으로 제공
* : @Entity
* - ORM에서 DB테이블에서 객체와 연결해주기 위해 객체를 엔티티로 선언
* - 해당 객체를 JPA에서 관리하는 객체임을 말함
* - PK인 @Id가 반드시 필요
* : @Id
* - 엔티티의 PK 선언
* : @GeneratedValue
* - 기본키를 순차적으로 숫자 증가
* : @OneToMany
* - 엔티티간의 관계를 표현
* (targetEntity) - 관계를 맺을 Entity클래스를 정의
* (cascade) - 현재의 엔티티의 변경에 대하여 관계를 맺은 엔티티도 변경 결정
* (fetch) - 관계엔티티를 읽는데 있어 즉시로딩, 지연로딩할지 결정, FetchType.EAGER, FetchType,LAZY
* (mappedBy) - 양방향관걔설정시 관계의 주체가 되는 쪽에 정의
* (orphanRemoval) - 관계엔티티에서 변경이 일어난 경우 DB변경을 할지 결정, cascade는 JPA레이어 단계
4. H2 랑 인텔리제이 in-memory로 설정하는법
경량형 관계형 DB, JUNIT5 테스트용 DB
H2 Console연결 방법
1. dependencies H2 추가 후 Spring 실행시 h2 jdbc url이 결과로 나옴
2. H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:~~~~'
3. http://localhost:8080/h2-console 접속
4-1. url 부분에 위의 url 추가(in-memory방식)
4-2. application.properties 나 application.yml(계층형으로) 추가
application.properties
# h2 데이터베이스 기본 접속 주소 (현재는 In-Memory)
spring.datasource.url=jdbc:h2:mem:~;
# h2 드라이버
spring.datasource.driverClassName=org.h2.Driver
# username
spring.datasource.username=sa
# password
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# JPA의 DDL 적용 모드(update 등이 있음)
spring.jpa.hibernate.ddl-auto=create
# h2-console의 url
spring.h2.console.path=/h2-console
# h2-console 활성화
spring.h2.console.enabled=true
server.port:8080
5. 실행
6. Intellij에서 DB 확인
- 무료버전은 플러그인에서 DB Browser을 설치하여 H2 라이브러리를 import하여 사용
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
클래스 A
/*
* Lombok 의 기능
* : @Getter, @Setter
* - 어노테이션을 클래스에 사용시 모든 필드에 대해서 setter(), getter() 선언됨
* - 어노테이션을 필드에 사용시 필드에 대해서 setter(), getter() 선언됨
* - 컴파일시 우측>리팩토링>Delombok에서 자동 setter(), getter() 자동 생성
* : @ToString
* - 어노테이션 사용으로 클래스에 필드 toString() 선언
* : @NoArgsConstructor
* - 인자가 없는 생성자(반드시 필요하여 항시 선언)
* : @AllArgsConstructor
* - 객체가 가지고 있는 모든 필드를 인자로 받는 생성자
* : @RequiredArgsConstructor
* - 필요한 인자만 가지고 만든 생성자
* : @NonNull
* - Lombok에서 제공, 해당 필드를 필수값으로 지정하여 @RequiredArgsConstructor 생성자를 사용
* : @EqualsAndHashCode
* - Equals(), HashCode()를 오버라이딩하여 사용한다는 어노테이션
* : @Data
* - Equivalent to @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode.
* - 위의 어노테이션들을 합쳐놓은것과 동일하다.(만능 어노테이션으로 보이나, OOP원칙을 깨는 단점이 보임)
* : @Builder
* - @AllArgsConstructor와 비슷하게 객체를 생성하고 필드값을 주입해주는 빌더의 형식으로 제공
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode
@Data
@Builder
public class User extends Object{
@NonNull
private String id;
@NonNull
private String pwd;
private LocalDateTime createDt;
private LocalDateTime updateDt;
}
클래스 A의 test(JUNIT5)
단축키 : Command(Control) + Shitf + T
class UserTest extends Object{
@Test
void test(){
/*
* @Setter,@Getter, @ToString, @NoArgsConstructor
*/
User user = new User();
user.setId("abcd123");
user.setPwd("1111234");
/*
* 클래스 extends Object 안에 toString() 리턴 값은 클래스이름+@+HexString
* 모든 객체의 출력은 toString()을 출력하는 것이다.
* user = user.toString()
* Object의 toString()을 Overriding을 권고.(User클래스에서 toString());
*/
System.out.println("UserID : "+user);
/*
* @AllArgsConstructor
*/
User user1 = new User("tin","333", LocalDateTime.now(), LocalDateTime.now());
System.out.println("User1ID : "+user1);
/*
* @RequiredArgsConstructor, @NonNull
*/
User user2 = new User("ton","444" );
System.out.println("User2ID : "+user2);
/*
* @Builder
* Test 에 자주 사용됨
*/
User user3= User.builder()
.id("tom")
.pwd("333")
.build();
System.out.println("User3ID : "+user3);
}
}
test(JUNIT5) 실행결과
'Spring > 1-3. JPA' 카테고리의 다른 글
(5. Spring Data JPA) Entity Listener 활용 (1) | 2022.10.18 |
---|---|
(4. Spring Data JPA) Entity의 기본속성(@Entity) (0) | 2022.10.17 |
(3. Spring Data JPA)QueryMethod 쿼리메소드 정의 및 실습 (0) | 2022.10.15 |
(2. Spring Data JPA)JpaRepository의 findById와 getOne 차이 (0) | 2022.10.12 |
(1. Spring Data JPA)Spring Data JPA 정의 (1) | 2022.09.23 |