spring boot 에서 JPA 사용하기 with MySQL

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

반응형

spring boot에서 MySQL DB를 연결해보자. JPA를 이용해서!


1. pom.xml에 dependencies 추가하기

먼저, mysql db와 jpa를 이용하기 위한 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>
		<dependency>
		    <groupid>org.springframework.boot</groupid>
		    <artifactid>spring-boot-starter-jdbc</artifactid>
		</dependency>

mysql-connector-java, spring-boot-starter-jdbc, spring-boot-starter-data-jpa 를 추가합니다.


2. db접속정보 관련하여 프로퍼티 설정

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

spring:
  profiles:
    active: local
---
spring:
  profiles: 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: root
    password: "pwpwpw"
    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
    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. 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.Data;

@Data
@Entity
@Table(name="admin")
public class Admin {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long no;
	private String id;
	private String name;
}

lombok을 이용하면 entity생성에서 기계적으로 만들던 getter, setter, toString 등의 함수를 직접 작성하지 않고 이용할 수 있어요.

@Data 는 @Getter, @Setter, @ToString 등 기본적으로 필요한 함수를 자동 생성 및 오버라이딩 합니다.

package com.example.test.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.example.test.entities.Admin;

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

}

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

package com.example.test.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.test.entities.Admin;
import com.example.test.repositories.AdminRepository;

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

	@Autowired
	private 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 한 후
접속하면 이렇게 나와요!

05

반응형