이전 포스트에 이어 Spring Boot에서 JPA/Hibernate를 적용하여 테이블 생성을 진행합니다.
로컬 데이터베이스 연동을 기준으로 합니다.
ORM이란?
- Object-Relational Mapping, 객체와 RDB의 테이블을 연결하는 것
- 즉, 모델 객체와 DB 테이블을 연결함으로써, 데이터베이스 관련 기술을 코드로 구현/관리 할 수 있도록 하는 기술
- SQL Query가 아닌 자바 코드(메서드)로 데이터 조작이 가능
- 물론, SQL Query도 사용할 수 있지만, @Query와 같은 Annotation으로 코드에서 사용할 수 있음
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
...
</dependencies>
spring-boot-starter-data-jpa
: JPA/Hibernate 의존성 설정mysql-connector-java
: MySQL용 JDBC 커넥터(드라이버) 의존성 설정spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/wisestudy?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
spring.datasource.username=wisestudy
spring.datasource.password=wise$tudy
spring.datasource.initialization-mode=always
spring.datasource.dbcp2.validation-query=SELECT 1
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.open-in-view=false
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.format_sql=true
logging.level.web=DEBUG
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.BasicBinder=TRACE
datasource
: JDBC 드라이버 설정, driver-class, DB 접속 정보 설정jpa
: JPA 관련 설정, O-R 매핑을 위한 DB 플랫폼 정보 설정, 테이블 생성 관련 설정jpa.hibernate
: Hibernate 구현체에 대한 설정, DDL 사용, SQL 로그 출력 형식 설정 등logging.lovel.org.hibernate
: Hibernate 런타임 로그 관련 설정※ 상세 설정 정보는 검색을 통해 확인 부탁드립니다.
@Entity
@Table
@Getter
@Setter
public class User {
@Id
@Column(name = "user_id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String email;
@Column(nullable = false, length = 20)
private String password;
@Column(nullable = false, length = 20)
private String name;
@Column(name = "birthday")
private LocalDate birth;
@Column(name = "cell_phone", nullable = false, length = 20)
private String cellPhone;
@Enumerated(EnumType.STRING)
@Column(nullable = false, columnDefinition = "enum('FEMALE', 'MALE')")
private Gender gender;
}
@Entity
: 테이블에 대응되는 도메인 클래스를 의미, JPA가 동작할 때, 데이터를 다루는 작업 단위이기도 함@Table
: 테이블을 생성할 때 사용할 정보를 기술할 수 있음, 기술하지 않으면 클래스 명으로 테이블을 생성@Id
: Primary Key를 지정@GeneratedValue
: Primary Key 컬럼의 데이터를 삽입할 때, 사용할 전략, GenerationType.IDENTITY로 지정 시 PK 생성 전략을 데이터베이스에 위임@Enumerated
: Enum 타입을 사용시 지정Annotation에 관련된 내용은 JPA/Hibernate 관련 서적 또는 검색을 통해 보다 자세히 알아보시면 좋습니다. :D
GenerationType.IDENTITY
는 Spring Boot 2.0, Hibernate 5.0에서부터 GenerationType.AUTO가 IDENTITY 방식이 아닌 TABLE 방식이 기본 값으로 변경되었습니다.
spring.jpa.properties.hibernate.hbm2ddl.import_files=classpath:sql/init-import.sql
spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
...import_files
: 데이터 삽입 SQL 파일 지정...import_files_sql_extrator
: SQL 추출기 지정, 여기서는 멀티라인 추출기 사용, SQL 포멧을 보기 쉽게 하기 위해서 지정함INSERT INTO
`user` (`name`, `email`, `password`, `birthday`, `cell_phone`, `gender`)
VALUES
('TestUser1', 'test1@test.com', 'test1234', now(), '010-1234-5678', 'MALE');
org.hibernate.dialect.Dialect
: Properties에 설정한 MySQL5InnoDBDialect 확인org.hibernate.SQL
관련 로그 확인
이 글 보고 안되던거 드디어 해결했습니다 알라븅 뽀뽀 쪽