- pom.xml 파일에서 mysql jdbc driver를 다음과 같이 수정한다.
mysql mysql-connector-java 5.1.47 -
lombok 사용할 수 있도록 한다.
- DB를 생성한 후 sql을 실행한다.
예제로 생성한 DB database 이름 : hrdb 계정 : hr 암호 : hr
- application.properties
DataSource jpa 설정.
# DB 접속( dataSource에 대한 설정)
spring.datasource.url=jdbc:mysql://localhost:3306/hrdb?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=hr
spring.datasource.password=hr
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# data.sql 을 자동 실행
spring.datasource.initialization-mode: always
# entity 정보를 통해 table을 자동생, 프로그램 종료될때 drop
# 변경가능
# create : 기존테이블 삭제 후 다시 생성
# create-drop: create와 같으나 종료시점에 테이블 DROP
# update: 변경분만 반영
# validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
# none: 사용하지 않음
spring.jpa.hibernate.ddl-auto= none
# jpa 자동생성되는 sql를 로그로 보여준다.
spring.jpa.show-sql= true
spring.jpa.properties.hibernate.format_sql= true
# jpa가 sql을 생성하는데, Mysql에 맞는 sql을 하려고 Dialect를 지정한다.
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
- CommandLineRunner를 구현한다.
@SpringBootApplication
public class HrApplication implements CommandLineRunner {
@Autowired
DataSource dataSource;
public static void main(String[] args) {
SpringApplication.run(HrApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
if(dataSource != null)
System.out.println(dataSource.getClass().getName());
System.out.println("run메소드가 실행됩니다.");
}
}
- main메소드에서 주입받은 dataSource를 사용할 수 있는가?
- 사용할 수 없다. main 메소드는 static 메소드이기 때문에 static 하지않은 필드는 사용할 수 없다.
- DataSource의 클래스명은 com.zaxxer.hikari.HikariDataSource 이 출력되었다.
어떤 과정을 통해 DataSource에 HikariDataSource가 주입되었을까?- autoconfig를 보면 hikari가 있다.
@EnableAutoConfiguration <– 자동 설정을 읽어들여 빈을 생성한다.
spring.factories 의 org.springframework.boot.autoconfigure.EnableAutoConfiguration
key로 설정되어 있는 설정들을 자동으로 읽어들인다.
- autoconfig를 보면 hikari가 있다.
DataSourceConfiguration 자동설정이 읽어들이면서 HikariDataSource가 빈으로 등록된다.
// classpath에 HikariDataSource.class이 있을 경우 설정
@ConditionalOnClass({HikariDataSource.class})
// DataSource를 구현하는 Bean을 사용자가 직접 등록하지 않았을 경우
@ConditionalOnMissingBean({DataSource.class})
// 자동으로 생성된 어플리케이션은 설정파일이자 메인메소드를 가지고 있는 자바클래스이다.
@SpringBootApplication
public class HrApplication implements CommandLineRunner {// 2. commadlinerunner를 사용하여 static main메소드의 args를 사용하려고 한다.
@Autowired
DataSource dataSource;
public static void main(String[] args) { // 1. static 이 붙지않은 필드는 사용할 수 없다. 그래서 dataSource를 사용 못함
SpringApplication.run(HrApplication.class, args);
}
@Override
public void run(String... args) throws Exception { //... 가변형 필드 3. 을 오버라이딩해서 dataSource를 사용
if(dataSource != null){
System.out.println(dataSource.getClass().getName()); // com.zaxxer.hikari.HikariDataSource 출력
/* @EnableAutoConfiguration 이 붙어있으면 autoconfig에서 자동설정을 불러오고 때문에 hikari로 만들어진다.
key로 설정된 설정을 불러온다.
DataSourceAutoConfiguration 가 자동설정으로 hikariDataSource가 빈으로 등록된다.
@ConditionalOnClass({HikariDataSource.class}) - HikariDataSource.class가 있을 경우
@ConditionalOnMissingBean - DataSource를 구현하는 빈을 사용자가 직접 등록하지 않았을 경우
*/
}
System.out.println("run 메소드 실행");
}
}
- JPA가 사용되기 위해 등록되는 Bean에는 어떤 것들이 있는가?
- -> xml 이나 java config로 관련된 Bean을 어떻게 설정하는가?
- Entity를 만들자.
- domain 패키지를 생성
- table과 매핑하는 Entity클래스를 만든다.
- @Entity
- @Table
- @Getter
- @Setter
를 추가한다. 4. 필요하면 복합키와 관련된 클래스도 작성 5. 관계 설정한다. 6. Repository를 작성한다. - @ManyToOne 에 해당하는 부분은 미리 query가 실행된다.
- @OneToMany 에 해당하는 부분은 lazy가 데이터를 읽어온다.