1. pom.xml 파일에서 mysql jdbc driver를 다음과 같이 수정한다. mysql mysql-connector-java 5.1.47
  2. lombok 사용할 수 있도록 한다.

  3. DB를 생성한 후 sql을 실행한다.

예제로 생성한 DB database 이름 : hrdb 계정 : hr 암호 : hr

  1. 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
  1. 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로 설정되어 있는 설정들을 자동으로 읽어들인다.

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을 어떻게 설정하는가?
    1. Entity를 만들자.
    2. domain 패키지를 생성
    3. table과 매핑하는 Entity클래스를 만든다.
    • @Entity
    • @Table
    • @Getter
    • @Setter
      를 추가한다. 4. 필요하면 복합키와 관련된 클래스도 작성 5. 관계 설정한다. 6. Repository를 작성한다.
    • @ManyToOne 에 해당하는 부분은 미리 query가 실행된다.
    • @OneToMany 에 해당하는 부분은 lazy가 데이터를 읽어온다.