자라선

28. JPA Connection 본문

Develop/Spring Boot

28. JPA Connection

자라선 2020. 7. 27. 17:16

스프링 부트 JPA 연동

스프링 부트는 별도의 datasource 설정을 셋팅하지 않는다면 기본으로 H2를 인메모리 로 띄어준다.

설정 셋팅하면 셋팅한 대로 DB 커넥션 따라감

(물론 기본 H2도 의존성이 있어야함)

 

@Entity vo를 매핑

@Id  식별자 등록

@GeneratedValue auto Increment

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.util.Objects;
 
@Entity
public class Account {
 
    @Id
    @GeneratedValue
    private Long id;
 
    private String username;
 
    private String password;
 
<getter, setter, toString, Equals>
}

매핑한 vo를 사용할 레포지토리 생성하기 위해 인터페이스 정의 후

JpaRepository<엔티티의 타입, 식별자의 타입>으로 상속

import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
 
public interface AccountRepository extends JpaRepository<Account, Long> {
    Account findByUsername(String username);
}

사용할 DB를 연동하기 위해 아래와같이 설정

spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springboot
spring.datasource.username=keesun
spring.datasource.password=pass

테스트 생성

@DataJpaTest 어노테이션은 슬라이스 테스트 중 하나로 Repository에 관련된 모든 bean를 생성 해준다.

그렇기 때문에 datasource, JdbcTemplate, 이전에 등록한 인터페이스등 을 @Autowired 를 사용해 주입받아 테스트 가능

아래의 경우 application.properties 에서 설정한 셋팅을 받지 못하기 떄문에 H2 인메모리 DB로 테스트를 진행하게 됨

반대로 @SpringBootTest 로 통합 테스트를 진행하면 application.properties 를 읽어 설정 셋팅하기 때문에 이전에 설정한 DB를 따라간다.

@SpringBootTest(properties = {spring.datasource.url='jdbc URL'}) 과 같이 별도 셋팅도 가능

@DataJpaTest 는 자동 트랜잭션을 해주며 rollback 해줌

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
 
@RunWith(SpringRunner.class)
@DataJpaTest
public class AccountRepositoryTest {
 
    @Autowired
    DataSource dataSource;
 
    @Autowired
    JdbcTemplate jdbcTemplate;
 
    @Autowired
    AccountRepository accountRepository;
 
    @Test
    public void di() throws SQLException {
        Account account = new Account();
        account.setUsername("thkong");
        account.setPassword("123");
 
        Account newAccount = accountRepository.save(account);
        assertThat(newAccount).isNotNull();
 
        Optional<Account> exisitAccount = accountRepository.findByUsername(account.getUsername());
        assertThat(exisitAccount).isNotNull();
        System.out.println(exisitAccount);
 
        Optional<Account> nonExisitAccount = accountRepository.findByUsername("non");
        assertThat(nonExisitAccount).isEmpty();
        System.out.println(nonExisitAccount);
 
        try(Connection connection = dataSource.getConnection()){
            DatabaseMetaData databaseMetaData  = connection.getMetaData();
            System.out.println(databaseMetaData.getURL());
            System.out.println(databaseMetaData.getDriverName());
            System.out.println(databaseMetaData.getUserName());
        }
    }
}

 

'Develop > Spring Boot' 카테고리의 다른 글

30. Redis Connection  (0) 2020.07.27
29. JPA 초기화  (0) 2020.07.27
27. JPA  (0) 2020.07.27
26. Mysql, PostgreSql DB Connect  (0) 2020.07.27
25. DBCP  (0) 2020.07.27
Comments