spring boot 에서 JPA 사용하기 with MySQL

2019. 3. 6. 17:49Spring/Basic

반응형

spring data jpa를 이용하여 spring boot 환경에서 간편하게 MySQL을 연동하는 방법을 배워봅시다.

  1. pom.xml 에 dependency 추가
  2. db 접속정보를 프로퍼티에 설정
  3. database 관련 config파일 설정
  4. db 조회

1. pom.xml 에 dependency 추가

먼저, mysql db와 jpa를 이용하기 위한 dependencies를 pom.xml에 추가합니다.

		<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>

2. db 접속정보를 프로퍼티에 설정

그리고, 프로퍼티파일에 db접속정보를 설정합니다.

spring:
  profiles:
    active: local
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: "jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC"
    username: test
    password: test
    hikari:
      auto-commit: false
      connection-test-query: SELECT 1
      minimum-idle: 10
      maximum-pool-size: 50
      transaction-isolation: TRANSACTION_READ_UNCOMMITTED
      pool-name: hikari-pool-1
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      naming:
        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
        implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
    properties:
      hibernate:
        format_sql: true
    generate-ddl: false

3. database 관련 config파일 설정

예전엔 spring에서는 configuration 설정을 xml파일로 했다면, 이제는 Java코드에 작성하고 @ annotaion을 함께 이용하여 설정할 수도 있습니다.

우선, 2번에서 작성한 db구성을 그대로 당겨와서 config 설정하는 방식을 먼저 설명해볼게요.

package com.example.text.config;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.zaxxer.hikari.HikariDataSource;

@Configuration
@EnableTransactionManagement
public class DatabaseConfig {

	@Primary
	@Bean(name="dataSource")
	@ConfigurationProperties("spring.datasource")
	public DataSource dataSource() {
		return DataSourceBuilder.create().type(HikariDataSource.class).build();
	}

	@Primary
	@Bean(name="entityManagerFactory")
	public LocalContainerEntityManagerFactoryBean entityManagerFactory(
			EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource) {
		return builder.dataSource(dataSource).build();
	}

	@Bean(name="transactionManager")
	public PlatformTransactionManager transactionManager(
			@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
		JpaTransactionManager transactionManager = new JpaTransactionManager();
		transactionManager.setEntityManagerFactory(entityManagerFactory);

		return transactionManager;
	}
}

여기서 @ConfigurationProperties 에는, application.yml 에서 database에 관한 설정을 작성했던 키를 입력하면 됩니다.


4. db 조회

lombok을 이용하여 엔티티 생성하고, JpaRepository로 간단하게 db를 조회해봅시다.

package com.example.test.entities;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
@Entity
@Table(name="admin")
public class Admin {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long no;

	@Column
	private String id;

	@Column
	private String name;
}

lombok을 이용하면 entity생성에서 기계적으로 만들던 getter, setter, toString 등의 함수를 직접 작성하지 않고 이용할 수 있습니다.(컴파일시 생성해줍니다.)

직접 getter, setter 쓰는 것과 동일한 작동을 하며, 코드를 깔끔하게 만들어준다는 장점이 있습니다.

@Getter, @Setter 애너테이션을 이용하여 컬럼값들의 getter, setter를 생성합니다.


package com.example.test.repositories;

import com.example.test.entities.Admin;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface AdminRepository extends JpaRepository<Admin, Long> {

}

이렇게 JpaRepository를 상속받는 인터페이스를 이용하면
@RestController 애너테이션을 추가한 컨트롤러로

package com.example.test.controller;

import lombok.RequiredArgsConstructor;
import com.example.test.entities.Admin;
import com.example.test.repositories.AdminRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RequestMapping("/main")
@RestController
public class MainController {

  private final AdminRepository adminRepository;

  @GetMapping("")
  public String test() {
    Admin admin = adminRepository.findById(1L).orElse(new Admin());
    return admin.toString();
  }
}

adminRepository를 @Autowired 해서 PK가 1인 admin을 조회해보자.
AdminRepository에는 현재 메서드를 정의한 것이 없습니다.

위의 컨트롤러에서 이용하고 있는 'findById' 메서드는 JpaRepository가 가지고 있는 기본 메서드로, 여기서의 Id는 PK를 의미합니다.


그리고, 마지막으로 애플리케이션의 컴포넌트들을 scan하는 설정을 추가해야 합니다.

package com.example.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@ComponentScan("com.example.test.controller")
@EntityScan(basePackages = {"com.example.test.entities"})
@EnableJpaRepositories(basePackages = {"com.example.test.repositories"})
public class TestApplication {

	public static void main(String[] args) {
		SpringApplication.run(TestApplication.class, args);
	}

}

위의 설정을 모두 완료한 후 DB에 id가 1인 row를 insert 한 후

INSERT INTO admin (`id`,`name`,`username`) VALUES (1,'coco','coco');

api에 접근하면 아래와 같이 db에 저장된 값이 조회되는 것을 확인할 수 있습니다.

05
728x90
반응형