• 스프링 데이터 JPA

스프링 데이터 JPA는 JPA를 스프링에서 쉽게 사용할 수 있또록 도와주는 프레임워크로 내부적으로 하이버네이트를 이용해서 기능을 구현하고 있습니다. 

JPA(Java Persistence API)란 자바 객체와 데이터베이스 테이블 간의 매핑을 처리하는 ORM(Object Relational Mapping) 기술의 표준입니다. ORM이란 객체와 관계를 설정하는 것입니다. 객체와 관계형 데이터베이스를 매핑시킨다는 개념입니다. 

 

 

step1. 스프링 JPA 설정하기

build.gradle에 아래 코드를 추가합니다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'
implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'

 

application.properties를 쓰고 있다면 아래 코드를 추가합니다.

spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.use-new-id-generator-mappings: false

 

application.yml를 쓰고 있다면 아래 코드를 추가합니다.

spring:
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    generate-ddl: true
    database: mysql
    hibernate:
      use-new-id-generator-mappings: false

 

tmi??) 원래 properties를 사용했었는데 yml으로 설정하는 경향이 많고 구조를 알기 쉬워서 사용하는 추세여서 yml로 하고 있는데 혹시나 해서 둘다 적었습니다.

 

 

기존의 DB설정이 없으신 분을 위해 전문을 올립니다.

DATABASENAME, DBID, DBPW 만 수정하시면 됩니다.

 

spring:
  datasource:
    hikari:
      jdbc-url: jdbc:log4jdbc:mysql://localhost:3306/DATABASENAME?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
      driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
      username: DBID
      password: DBPW
      connection-test-query: SELECT 1

  thymeleaf:
    cache: false

  resources:
    cache:
      period: 0

  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    generate-ddl: true
    database: mysql
    hibernate:
      use-new-id-generator-mappings: false

mybatis:
  configuration:
    map-underscore-to-camel-case: true


 

next step. Spring Jpa설정 Bean 추가

@Configuration 이 있는 설정 java파일에 아래 코드를 추가합니다.

import java.util.Properties;

@Bean
@ConfigurationProperties(prefix="spring.jpa")
public Properties hibernateConfig(){
	return new Properties();
}

 

설정파일도 전문을 올립니다.~

import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@PropertySource("classpath:/application.yml")
public class JpaConfig {


    @Bean
    @ConfigurationProperties(prefix="spring.datasource.hikari")
    public HikariConfig hikariConfig() {
        return new HikariConfig();
    }

    @Bean
    @ConfigurationProperties(prefix="mybatis.configuration")
    public org.apache.ibatis.session.Configuration mybatisConfig(){
        return new org.apache.ibatis.session.Configuration();
    }

    @Bean
    public DataSource dataSource() throws Exception{
        DataSource dataSource = new HikariDataSource(hikariConfig());
        return dataSource;
    }

    @Bean
    @ConfigurationProperties(prefix="spring.jpa")
    public Properties hibernateConfig(){
        return new Properties();
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setConfiguration(mybatisConfig());

        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

 

 

next step. @SpringBootApplication이 있는 java파일에 아래 코드를 추가합니다.

 

@EntityScan 어노테이션은 애플리케이션이 실행될 때 basePackages로 지정된 패키지 하위에서 JPA 엔티티(@Entity 어노테이션이 설정된 도메인 클레스)를 검색합니다.  Jsr310JpaConverters를 사용하지 않으면 스프링 부트의 자동 설정에 의해서 처리될 베이스 패키지도 지정해야 하는 단점이 생긴다고 합니다.

 

import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.convert.Jsr310Converters;

@EnableJpaAuditing
@EntityScan(basePackageClasses = {Jsr310Converters.class},
			basePackages = {"org.hyunpro.webapp.dailymemo"})

 

 

next step.  JPA는 쿼리를 사용하지 않고 스프링 데이터 JPA가 제공하는 기능을 사용합니다.

데이터를 관리하는 Entity클래스를 생성합니다.

@Entity 어노테이션은 해당 클래스가 JPA의 엔티티임을 나타냅니다. 엔티티 클래스는 테이블과 매핑됩니다.

@Table(name="t_jpa_board")는 t_jpa_board 테이블과 매핑되도록 합니다.

@NoArgsConstructor는 파라미터가 없는 생성자를 자동으로 만들어 줍니다. @Data는 Getter ,Setter 등의 자주 사용되는 메소드 자동생성 기능 입니다.

@Id 는 엔티티의 기본키(Primary Key, PK)을 나타냅니다.

@GeneratedValue는 기본키의 생성 전략을 설정합니다. GenerationType.AUTO로 지정할 경우 데이터베이스에서 제공하는 기본키 생성 전략을 따르게 됩니다. 

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Collection;

@Entity // 1
@Table(name="t_jpa_board") // 2
@NoArgsConstructor // 3
@Data
public class BoardEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int boardIdx;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String contents;

    @Column(nullable = false)
    private int hitCnt = 0;

    @Column(nullable = false)
    private String creatorId;

    @Column(nullable = false)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
    private LocalDateTime createdDatetime = LocalDateTime.now();

    private String updaterId;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
    private LocalDateTime updatedDatetime;

    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinColumn(name="board_idx")
    private Collection<BoardFileEntity> fileList;
}

next step. 

수정중입니다....

'웹프로그래밍 > spring~~' 카테고리의 다른 글

오류 : cannot find symbol  (0) 2019.08.13
Spring Security를 적용해보자(2)  (0) 2019.08.13
Spring security 적용해보자(1)  (0) 2019.08.12
Spring security CSRF 프로텍션  (0) 2019.08.09
스프링 어노테이션 정리~  (0) 2019.07.22
spring project groupid, artifactid 네이밍  (0) 2019.07.15
@Data 어노테이션  (0) 2019.07.10
5장 1. Logback  (0) 2019.07.08
블로그 이미지

발전하는개발자

나의 인생에 필요한 정보들(프로그래밍, 철학, 운동...)

,