티스토리 뷰
- JPA를 이용해 User class와 User table을 매핑 즉, Java 객체와 MySQL Table을 매핑해보자
- 현재 User 객체와 User 테이블의 속성은 아래와 같다.
● 매핑하기
(1). User class에 @Entity Annotation을 붙여준다.
@Entity
1. Spring이 User 객체와 User 테이블을 같은 것으로 바라보게(생각하게) 해준다.
2. Entity = 저장되고 관리되어야 하는 데이터
(2). 현재 User class에 빠져있는 id를 추가해줘야한다.(객체와 테이블을 일치시켜야하니까)
- 단순히 class에 id 필드만 추가해서는 안 되고 아래와 같이 Annotation을 몇 개 붙여줘야한다.
@Id : 해당 필드를 PK로 간주한다.
@GeneratedValue : PK는 자동 생성되는 값이다. → AUTO_INCREMENT를 붙여줬으므로 필요
cf1) MySQL의 bigint는 Java의 Long과 대응된다.
cf2) (javax.persistence.Id)를 import 해줘야한다.
cf3)
- (strategy = GenerationType.IDENTITY) 부분은 DB의 종류마다 자동 생성 전략이 다르다.
- 이 글에서는 MySQL의 AUTO_INCREMENT를 사용했고 이것이 IDENTITY 전략과 매칭되기에 사용한 것이다.
AUTO_INCREMENT = IDENTITY
(3). JPA를 사용하기 위해서는 파라미터가 하나도 없는 기본 생성자가 꼭 필요하다
- 즉, JPA 객체(Entity 객체)에는 기본 생성자가 있어야 한다는 말이다.
- 기본 생성자의 접근 제어자는 protected / public 상관없다.
(4). id 컬럼을 제외한 기본 column들을 매핑하는 Annotation도 필요하다.
@Column : 객체의 필드와 Table의 필드를 매핑한다.
- null 허용 여부, 길이 제한, DB에서의 column 이름 등을 속성으로 지정할 수 있다.
- @Column Annotation은 생략할 수도 있다.
- User class의 age와 User table의 age는 완전히 동일하다.
- name 필드의 경우 null 허용 불가나 크기 등을 설정해 줄 필요가 있는데 age는 그러한 설정이 필요없으므로 @Column Annotation이 별도로 필요하지 않다.(크기 제한도 없고 null도 허용되고 Integer와 int는 동일하다.)
● JPA 사용을 위한 추가적인 설정(한 번만 해주면 되는 설정)
- 위의 1~4단계를 통해 객체와 테이블 매핑은 끝났다.
- 이제 application.yml에서 JPA 사용을 내용을 추가해보자
[application.yml]
spring:
datasource:
url: "jdbc:mysql://localhost/library"
username: "*****"
password: "*****"
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
# hibernate 관련 설정
hibernate:
ddl-auto: none
# jpa 속성 설정
properties:
hibernate:
show_sql: true
format_sql: true
dialect: org.hibernate.dialect.MySQL8Dialect
cf) hibernate는 jpa의 구현체이다.
- 위의 설정들이 어떤 의미인지 하나씩 뜯어서 알아보자
ddl-auto: none
- Spring이 시작할 때 DB에 있는 테이블을 어떻게 처리할지에 대한 부분
- 객체와 테이블을 매핑할 때 이 둘이 서로 다르게 생겼을 경우 무시할 수도 있고, 테이블을 변경할 수도 있고, 잘못되었다고 알려줄 수도 있다.
- 이러한 다양한 선택지를 설정할 수 있는 부분이다.
(ddl-auto 속성 값)
- create : 기존 테이블이 있다면 삭제 후 다시 생성(이러면 table에 있는 데이터도 다 날라간다.)
- create-drop : 스프링이 종료될 때 매핑되었던 테이블을 모두 제거(이러면 table에 있는 데이터도 다 날라간다.)
- update : 객체와 테이블이 다른 부분만 변경
- validate : 객체와 테이블이 동일한지 확인만 하고 확인해서 실패한 경우 서버를 종료시킨다.
- none : 별다른 조치를 하지 않는다.
show_sql: true
- JPA를 사용해 DB에 SQL을 날릴 때 해당 SQL을 보여줄지를 설정
format_sql: true
- SQL을 보여줄 때 읽기 쉽게 포맷팅 할 것인가
dialect: org.hibernate.dialect.MySQL8Dialect
- dialect = 방언, 사투리
- 해당 옵션으로 DB를 특정하면 다양한 종류의 DB마다 조금씩 다른 SQL 문법을 지정한 DB에 맞게 수정해준다.
- JPA가 MySQL에 맞게 수정해주는 것이다.
cf)
07-02 접근 제어자
접근 제어자(access modifier)를 사용하여 변수나 메서드의 사용 권한을 설정할 수 있다. 다음과 같은 접근 제어자를 사용하여 사용 권한을 설정할 수 있다. * pri…
wikidocs.net
'Backend > Spring' 카테고리의 다른 글
#25 트랜잭션 - 이론 (0) | 2023.09.25 |
---|---|
#24 JPA를 이용해 SQL 날리기 with Spring Data JPA (0) | 2023.09.19 |
#22 JPA - 등장 (0) | 2023.09.05 |
#21 Spring bean을 등록하는 방법 / Spring bean을 주입 받는 방법 (0) | 2023.09.03 |
#20 Spring Container 사용 이유 with @Primary, IoC, DI (0) | 2023.08.31 |
- Total
- Today
- Yesterday
- Phaser
- 알고리즘
- node.js
- Advanced Stream
- db
- DART
- 프로그래머스
- API
- MongoDB
- 운영체제
- OS
- Java8
- 메모리
- 빅데이터
- 프로세스
- java
- 빅데이터 분석기사
- 코딩테스트
- spring
- Stream
- nosql
- SQL
- git
- Spring Boot
- 자료구조
- SpringBoot
- 코테
- MySQL
- Phaser3
- jpa
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |